diff --git a/Common/Gmsh.cpp b/Common/Gmsh.cpp
index f7e0ef279f5b2e45e4c3aaeaf6ae4824f1ff4510..bc6454d8f13269d756f036dced1b4a1cb23f8d04 100644
--- a/Common/Gmsh.cpp
+++ b/Common/Gmsh.cpp
@@ -104,7 +104,7 @@ int GmshBatch()
   else if(CTX.batch == -1)
     CreateOutputFile(CTX.output_filename, FORMAT_GEO);
   else if(CTX.batch == -2)
-    GModel::current()->checkMeshCoherence();
+    GModel::current()->checkMeshCoherence(CTX.geom.tolerance);
 
   return 1;
 }
diff --git a/Common/Makefile b/Common/Makefile
index 6d77a59829a87167835ff3572b4097c63aa5ed5e..4261e5100ad89208de14b0f2261098d2bbbb5333 100644
--- a/Common/Makefile
+++ b/Common/Makefile
@@ -62,24 +62,25 @@ Context.o: Context.cpp ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h \
   Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h Trackball.h
 Octree.o: Octree.cpp Octree.h OctreeInternals.h
 OctreeInternals.o: OctreeInternals.cpp Message.h OctreeInternals.h
-Options.o: Options.cpp GmshUI.h GmshDefines.h Message.h \
-  ../Graphics/Draw.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
+Options.o: Options.cpp GmshUI.h GmshDefines.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
+  ../Geo/SPoint2.h ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h \
+  ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint3.h ../Geo/SPoint2.h \
+  ../Geo/GFace.h ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/GEdgeLoop.h \
+  ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h Message.h ../Graphics/Draw.h \
   ../Mesh/Generator.h Context.h ../Geo/CGNSOptions.h \
   ../Mesh/PartitionOptions.h Options.h ../Post/ColorTable.h \
-  DefaultOptions.h ../Mesh/BackgroundMesh.h ../Post/PView.h \
-  ../Post/PViewOptions.h ../Post/ColorTable.h ../Post/PViewData.h \
-  ../Post/adaptiveData.h ../Common/ListUtils.h ../Common/GmshMatrix.h \
-  ../Plugin/PluginManager.h ../Plugin/Plugin.h ../Common/Options.h \
-  ../Common/Message.h ../Post/PViewDataList.h ../Post/PViewData.h \
-  ../Fltk/Solvers.h ../Fltk/GUI.h ../Fltk/Opengl_Window.h \
-  ../Fltk/Colorbar_Window.h ../Common/GmshUI.h ../Fltk/Popup_Button.h \
-  ../Fltk/SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Common/GmshDefines.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Numeric/Numeric.h \
-  ../Numeric/NumericEmbedded.h ../Common/TreeUtils.h ../Common/avl.h \
-  ../Common/ListUtils.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h \
-  ../Common/SmoothData.h
+  DefaultOptions.h ../Mesh/Field.h ../Post/PView.h \
+  ../Mesh/BackgroundMesh.h ../Post/PViewOptions.h ../Post/ColorTable.h \
+  ../Post/PViewData.h ../Post/adaptiveData.h ../Common/ListUtils.h \
+  ../Common/GmshMatrix.h ../Plugin/PluginManager.h ../Plugin/Plugin.h \
+  ../Common/Options.h ../Common/Message.h ../Post/PViewDataList.h \
+  ../Post/PViewData.h ../Fltk/Solvers.h ../Fltk/GUI.h \
+  ../Fltk/Opengl_Window.h ../Fltk/Colorbar_Window.h ../Common/GmshUI.h \
+  ../Fltk/Popup_Button.h ../Fltk/SpherePosition_Widget.h
 CommandLine.o: CommandLine.cpp GmshUI.h GmshDefines.h GmshVersion.h \
   Message.h OpenFile.h CommandLine.h Context.h ../Geo/CGNSOptions.h \
   ../Mesh/PartitionOptions.h Options.h ../Post/ColorTable.h \
@@ -102,15 +103,11 @@ Gmsh.o: Gmsh.cpp GmshDefines.h ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/SBoundingBox3d.h Message.h OpenFile.h CreateFile.h Options.h \
   ../Post/ColorTable.h CommandLine.h OS.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Mesh/Generator.h ../Mesh/Field.h \
-  ../Geo/Geo.h ../Common/GmshDefines.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SBoundingBox3d.h ../Common/ListUtils.h ../Common/TreeUtils.h \
-  ../Common/avl.h ../Common/ListUtils.h ../Geo/SPoint2.h \
-  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Post/PView.h Context.h \
-  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h ../Mesh/Partition.h \
+  ../Post/PView.h Context.h ../Geo/CGNSOptions.h \
+  ../Mesh/PartitionOptions.h ../Mesh/Partition.h \
   ../Plugin/PluginManager.h ../Plugin/Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Post/PViewDataList.h ../Post/PViewData.h \
-  ../Common/GmshMatrix.h
+  ../Common/ListUtils.h ../Common/GmshMatrix.h
 OS.o: OS.cpp Message.h
 OpenFile.o: OpenFile.cpp Message.h ../Geo/Geo.h ../Common/GmshDefines.h \
   ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
@@ -154,14 +151,8 @@ Message.o: Message.cpp Message.h Gmsh.h Options.h ../Post/ColorTable.h \
   Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h OS.h \
   ../Fltk/GUI.h ../Fltk/Opengl_Window.h ../Fltk/Colorbar_Window.h \
   ../Common/GmshUI.h ../Fltk/Popup_Button.h \
-  ../Fltk/SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Common/GmshDefines.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h ../Fltk/GUI_Extras.h
+  ../Fltk/SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  ../Geo/SPoint3.h ../Fltk/GUI_Extras.h
 Visibility.o: Visibility.cpp Visibility.h GmshDefines.h ../Geo/GVertex.h \
   ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -174,6 +165,7 @@ Visibility.o: Visibility.cpp Visibility.h GmshDefines.h ../Geo/GVertex.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   ../Parser/Parser.h
 Trackball.o: Trackball.cpp Trackball.h
 VertexArray.o: VertexArray.cpp VertexArray.h ../Geo/SVector3.h \
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 300d2d191a5c2513ebcbe695d255d163d2043bce..9036103aeae40c7e04ded1dcb36a25de90e8e9e9 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -23,6 +23,7 @@
 #include "PViewData.h"
 #include "adaptiveData.h"
 #include "PluginManager.h"
+#include "Plugin.h"
 #endif
 
 #if defined(HAVE_FLTK)
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 417a00190f0165764e7cd7f58ea469a98025337d..02da887acf90d72bf797d6d8b2792d4809741bb5 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1838,19 +1838,55 @@ void statistics_update_cb(CALLBACK_ARGS)
 
 void statistics_histogram_cb(CALLBACK_ARGS)
 {
-  const char *name = (const char*)data;
-  int type;
-  if(!strcmp(name, "Gamma"))
-    type = 0;
-  else if(!strcmp(name, "Eta"))
-    type = 1;
-  else if(!strcmp(name, "Rho"))
-    type = 2;
-  else
-    type = 3;
+  std::string name((const char*)data);
+
   std::vector<double> x, y;
-  for(int i = 0; i < 100; i++) y.push_back(WID->quality[type][i]);
-  new PView(name, "# Elements", x, y);
+
+  if(name == "Gamma2D"){
+    for(int i = 0; i < 100; i++) y.push_back(WID->quality[0][i]);
+    new PView("Gamma", "# Elements", x, y);
+  }
+  else if(name == "Eta2D"){
+    for(int i = 0; i < 100; i++) y.push_back(WID->quality[1][i]);
+    new PView("Eta", "# Elements", x, y);
+  }
+  else if(name == "Rho2D"){
+    for(int i = 0; i < 100; i++) y.push_back(WID->quality[2][i]);
+    new PView("Rho", "# Elements", x, y);
+  }
+  else if(name == "Disto2D"){
+    for(int i = 0; i < 100; i++) y.push_back(WID->quality[3][i]);
+    new PView("Disto", "# Elements", x, y);
+  }
+  else{
+    std::vector<GEntity*> entities;
+    GModel::current()->getEntities(entities);
+    std::map<int, std::vector<double> > d;
+    for(unsigned int i = 0; i < entities.size(); i++){
+      for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
+        MElement *e = entities[i]->getMeshElement(j);
+        if(name == "Gamma3D")
+          d[e->getNum()].push_back(e->gammaShapeMeasure());
+        else if(name == "Eta3D")
+          d[e->getNum()].push_back(e->etaShapeMeasure());
+        else if(name == "Rho3D")
+          d[e->getNum()].push_back(e->rhoShapeMeasure());
+        else
+          d[e->getNum()].push_back(e->distoShapeMeasure());
+      }
+    }
+    name.resize(name.size() - 2);
+    new PView(name, "ElementData", GModel::current(), d);
+    /*
+    GMSH_PluginManager::instance()->setPluginOption("CutPlane", "A", 1.); 
+    GMSH_PluginManager::instance()->setPluginOption("CutPlane", "B", 0.); 
+    GMSH_PluginManager::instance()->setPluginOption("CutPlane", "C", 0.); 
+    GMSH_PluginManager::instance()->setPluginOption("CutPlane", "D", -0.05); 
+    GMSH_PluginManager::instance()->setPluginOption("CutPlane", "iView", 0.); 
+    GMSH_PluginManager::instance()->action("CutPlane", "Run", 0);
+    */
+  }
+
   WID->update_views();
   Draw();
 }
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 5f4b716a3355281e109ad003d67faa2d196e2c48..2790e69b995e1ae6b4cc202f92d9db6ae4f056f0 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -20,6 +20,7 @@
 #include "Generator.h"
 #include "Solvers.h"
 #include "PluginManager.h"
+#include "Plugin.h"
 #include "Shortcut_Window.h"
 #include "PView.h"
 #include "PViewOptions.h"
@@ -3755,93 +3756,100 @@ void GUI::create_plugin_window(int numview)
 
 // field window
 
-void GUI::update_fields(){
+void GUI::update_fields()
+{
   edit_field(GModel::current()->getFields()->get(field_selected_id));
 }
 
-void GUI::load_field_list(){
-  FieldManager &fields=*GModel::current()->getFields();
-  Field *selected_field=(Field*)field_editor_group->user_data();
+void GUI::load_field_list()
+{
+  FieldManager &fields = *GModel::current()->getFields();
+  Field *selected_field = (Field*)field_editor_group->user_data();
   field_browser->clear();
-  int i_entry=0;
-  for(FieldManager::iterator it=fields.begin();it!=fields.end();it++){
+  int i_entry = 0;
+  for(FieldManager::iterator it = fields.begin(); it != fields.end(); it++){
     i_entry++;
-    Field *field=it->second;
+    Field *field = it->second;
     std::ostringstream sstream;
-    if(it->first==fields.background_field)
-      sstream<<"@b";
-    sstream<<it->first<<" "<<field->get_name();
-    field_browser->add(sstream.str().c_str(),field);
-    if(it->second==selected_field)
+    if(it->first == fields.background_field)
+      sstream << "@b";
+    sstream << it->first << " " << field->get_name();
+    field_browser->add(sstream.str().c_str(), field);
+    if(it->second == selected_field)
       field_browser->select(i_entry);
   }
 }
 
-void GUI::save_field_options(){
-  std::list<Fl_Widget*>::iterator input=field_options_widget.begin();
-  Field *f=(Field*)field_editor_group->user_data();
+void GUI::save_field_options()
+{
+  std::list<Fl_Widget*>::iterator input = field_options_widget.begin();
+  Field *f = (Field*)field_editor_group->user_data();
   std::ostringstream sstream;
   int i;
   char a;
   sstream.precision(16);
-  for(std::map<std::string,FieldOption*>::iterator it=f->options.begin();it!=f->options.end();it++){
-    FieldOption *option=it->second;
+  for(std::map<std::string, FieldOption*>::iterator it = f->options.begin();
+      it != f->options.end(); it++){
+    FieldOption *option = it->second;
     sstream.str("");
     switch(option->get_type()){
     case FIELD_OPTION_STRING:
     case FIELD_OPTION_PATH:
-      sstream<<"\""<<((Fl_Input*)*input)->value()<<"\"";
+      sstream << "\"" << ((Fl_Input*)*input)->value() << "\"";
       break;
     case FIELD_OPTION_INT:
-      sstream<<(int)((Fl_Value_Input*)*input)->value();
+      sstream << (int)((Fl_Value_Input*)*input)->value();
       break;
     case FIELD_OPTION_DOUBLE:
-      sstream<<((Fl_Value_Input*)*input)->value();
+      sstream << ((Fl_Value_Input*)*input)->value();
       break;
     case FIELD_OPTION_BOOL:
-      sstream<<(bool)((Fl_Check_Button*)*input)->value();
+      sstream << (bool)((Fl_Check_Button*)*input)->value();
       break;
     case FIELD_OPTION_LIST:
-    {
-      sstream<<"{";
-      std::istringstream istream(((Fl_Input*)*input)->value());
-      while(istream>>i){
-	sstream<<i;
-	if(istream>>a){
-	  if(a!=',')
-	    Msg::Error("Unexpected character \'%c\' while parsing option '%s' of field \'%s\'",a,it->first.c_str(),f->id);
-	  sstream<<", ";
-	}
-      }
-      sstream<<"}";
+      {
+        sstream << "{";
+        std::istringstream istream(((Fl_Input*)*input)->value());
+        while(istream >> i){
+          sstream << i;
+          if(istream >> a){
+            if(a != ',')
+              Msg::Error("Unexpected character \'%c\' while parsing option '%s' of field \'%s\'",
+                         a, it->first.c_str(), f->id);
+            sstream<<", ";
+          }
+        }
+        sstream<<"}";
       }
       break;
     }
     if((*input)->changed()){
-      add_field_option(f->id,it->first.c_str(),sstream.str().c_str(),CTX.filename);
+      add_field_option(f->id, it->first.c_str(), sstream.str().c_str(), CTX.filename);
       (*input)->clear_changed();
     }
     input++;
   }
-  int is_bg_field=field_background_btn->value();
-  FieldManager &fields=*GModel::current()->getFields();
-  if(is_bg_field && fields.background_field!=f->id){
+  int is_bg_field = field_background_btn->value();
+  FieldManager &fields = *GModel::current()->getFields();
+  if(is_bg_field && fields.background_field != f->id){
     set_background_field(f->id, CTX.filename);
     load_field_list();
   }
-  if(!is_bg_field && fields.background_field==f->id){
+  if(!is_bg_field && fields.background_field == f->id){
     set_background_field(-1, CTX.filename);
     load_field_list();
   }
 }
 
-void GUI::load_field_options(){
-  Field *f=(Field*)field_editor_group->user_data();
-  std::list<Fl_Widget*>::iterator input=field_options_widget.begin();
-  for(std::map<std::string,FieldOption*>::iterator it=f->options.begin();it!=f->options.end();it++){
-    FieldOption *option=it->second;
+void GUI::load_field_options()
+{
+  Field *f = (Field*)field_editor_group->user_data();
+  std::list<Fl_Widget*>::iterator input = field_options_widget.begin();
+  for(std::map<std::string,FieldOption*>::iterator it = f->options.begin();
+      it != f->options.end(); it++){
+    FieldOption *option = it->second;
     std::ostringstream vstr;
-    std::list<int>::iterator list_it;;
+    std::list<int>::iterator list_it;
     switch(option->get_type()){
     case FIELD_OPTION_STRING:
     case FIELD_OPTION_PATH:
@@ -3856,10 +3864,10 @@ void GUI::load_field_options(){
       break;
     case FIELD_OPTION_LIST:
       vstr.str("");
-      for(list_it=option->list().begin();list_it!=option->list().end();list_it++){
+      for(list_it = option->list().begin(); list_it != option->list().end(); list_it++){
 	if(list_it!=option->list().begin())
-	  vstr<<", ";
-	vstr<<*list_it;
+	  vstr << ", ";
+	vstr << *list_it;
       }
       ((Fl_Input*)(*input))->value(vstr.str().c_str());
       break;
@@ -3867,89 +3875,86 @@ void GUI::load_field_options(){
     (*input)->clear_changed();
     input++;
   }
-  field_background_btn->value(GModel::current()->getFields()->background_field==f->id);
+  field_background_btn->value(GModel::current()->getFields()->background_field == f->id);
 }
 
-void GUI::load_field_view_list(){
+void GUI::load_field_view_list()
+{
   field_put_on_view_btn->clear();
-  if(PView::list.size()>0){
+  if(PView::list.size() > 0){
     field_put_on_view_btn->activate();
     for(unsigned int i = 0; i < PView::list.size(); i++) {
       std::ostringstream s;
-      s<<"View ["<<i<<"]";
+      s << "View [" << i << "]";
       field_put_on_view_btn->add(s.str().c_str());
     }
-  }else{
-     field_put_on_view_btn->deactivate();
+  }
+  else{
+    field_put_on_view_btn->deactivate();
   }
 }
 
-void GUI::edit_field(Field *f){
+void GUI::edit_field(Field *f)
+{
   field_editor_group->user_data(f);
   field_put_on_view_btn->deactivate();
   field_delete_btn->deactivate();
-  if(f==NULL){
-    field_selected_id=-1;
+  if(f == NULL){
+    field_selected_id = -1;
     field_editor_group->hide();
     load_field_list();
     return;
   }
-  field_selected_id=f->id;
+  field_selected_id = f->id;
   field_editor_group->show();
   field_editor_group->user_data(f);
   field_title->label(f->get_name());
   field_options_scroll->clear();
   field_options_widget.clear();
   field_options_scroll->begin();
-  int x=field_options_scroll->x();
-  int yy=field_options_scroll->y()+WB;
+  int x = field_options_scroll->x();
+  int yy = field_options_scroll->y() + WB;
   field_help_display->clear();
-  add_multiline_in_browser(field_help_display,"",f->get_description().c_str(),100);
+  add_multiline_in_browser(field_help_display, "", f->get_description().c_str(), 100);
   field_help_display->add("\n");
   field_help_display->add("@b@cOptions");
-  for(std::map<std::string,FieldOption*>::iterator it=f->options.begin();it!=f->options.end();it++){
+  for(std::map<std::string, FieldOption*>::iterator it = f->options.begin(); 
+      it != f->options.end(); it++){
     Fl_Widget *input;
-    field_help_display->add(("@b"+it->first).c_str());
-    field_help_display->add(("@i"+it->second->get_type_name()).c_str());
-  add_multiline_in_browser(field_help_display,"",it->second->get_description().c_str(),100);
-	switch(it->second->get_type()){
-	case FIELD_OPTION_INT:
-	case FIELD_OPTION_DOUBLE:
-      input=new Fl_Value_Input(x,yy,IW,BH,it->first.c_str());
-	  break;
-	case FIELD_OPTION_BOOL:
-    input=new Fl_Check_Button(x,yy,BH,BH,it->first.c_str());
-    break;
-	case FIELD_OPTION_PATH:
-    {
-    Fl_Button *b=new Fl_Button(x,yy,BH,BH,"S");
-    input=new Fl_Input(x+WB+BH,yy,IW-WB-BH,BH,it->first.c_str());
-    b->callback(view_field_select_file_cb, input);
+    field_help_display->add(("@b" + it->first).c_str());
+    field_help_display->add(("@i" + it->second->get_type_name()).c_str());
+    add_multiline_in_browser(field_help_display, "", it->second->get_description().c_str(), 100);
+    switch(it->second->get_type()){
+    case FIELD_OPTION_INT:
+    case FIELD_OPTION_DOUBLE:
+      input = new Fl_Value_Input(x, yy, IW, BH, it->first.c_str());
+      break;
+    case FIELD_OPTION_BOOL:
+      input = new Fl_Check_Button(x, yy, BH, BH, it->first.c_str());
+      break;
+    case FIELD_OPTION_PATH:
+      {
+        Fl_Button *b = new Fl_Button(x, yy, BH, BH, "S");
+        input = new Fl_Input(x + WB + BH, yy, IW - WB - BH, BH, it->first.c_str());
+        b->callback(view_field_select_file_cb, input);
+      }
+      break;
+    case FIELD_OPTION_STRING:
+      input = new Fl_Input(x, yy, IW, BH, it->first.c_str());
+      break;
+    case FIELD_OPTION_LIST:
+    default:
+      input = new Fl_Input(x, yy, IW, BH, it->first.c_str());
+      break;
     }
-    break;
-	case FIELD_OPTION_STRING:{
-	  input=new Fl_Input(x,yy,IW,BH,it->first.c_str());
-	  break;
-  }
-	case FIELD_OPTION_LIST:
-	default:
-	  //{
-	  //  Fl_Button *b=new Fl_Button(x+WB,yy,BH,BH);
-	  //  b->label("@+");
-	  //  b->callback(view_field_select_node_cb);
-	  //  }
-	  //  input=new Fl_Input(x+WB+2*BH,yy,IW-2*BH,BH,it->first.c_str());
-	  input=new Fl_Input(x,yy,IW,BH,it->first.c_str());
-	  break;
-	}
-	input->align(FL_ALIGN_RIGHT);
-	field_options_widget.push_back(input);
-	yy+=WB+BH;
+    input->align(FL_ALIGN_RIGHT);
+    field_options_widget.push_back(input);
+    yy += WB + BH;
   }
   field_options_scroll->end();
   load_field_options();
   field_options_scroll->damage(1);
-  if(PView::list.size()>0)
+  if(PView::list.size() > 0)
     field_put_on_view_btn->activate();
   field_delete_btn->activate();
   load_field_list();
@@ -3963,61 +3968,63 @@ void GUI::create_field_window()
   int height = (CTX.field_size[1] < height0) ? height0 : CTX.field_size[1];
   field_window = new Dialog_Window(width, height, CTX.non_modal_windows, "Fields");
   field_window->box(GMSH_WINDOW_BOX);
-  int x=WB;
-  int y=WB;
-  int w=1.5*BB;
-  Fl_Menu_Button *new_field_btn= new Fl_Menu_Button(x,y,w,BH,"New");
-  FieldManager &fields=*GModel::current()->getFields();
+  int x = WB;
+  int y = WB;
+  int w = 1.5 * BB;
+  Fl_Menu_Button *new_field_btn = new Fl_Menu_Button(x, y, w, BH, "New");
+  FieldManager &fields = *GModel::current()->getFields();
   std::map<std::string, FieldFactory*>::iterator it;
-  for(it=fields.map_type_name.begin();it!=fields.map_type_name.end();it++)
+  for(it = fields.map_type_name.begin(); it != fields.map_type_name.end(); it++)
     new_field_btn->add(it->first.c_str());
   new_field_btn->callback(view_field_new_cb);
-  y+=BH;
-  int h=height - 2*WB - 3*BH;
-  field_browser = new Fl_Hold_Browser(x, y+WB, w, h-2*WB);
-  y+=h; 
-  field_delete_btn = new Fl_Button(x,y,w, BH, "Delete");
-  field_delete_btn->callback(view_field_delete_cb,this);
-  y+=BH;
+  y += BH;
+  int h = height - 2 * WB - 3 * BH;
+  field_browser = new Fl_Hold_Browser(x, y + WB, w, h - 2 * WB);
+  y += h; 
+  field_delete_btn = new Fl_Button(x, y, w, BH, "Delete");
+  field_delete_btn->callback(view_field_delete_cb, this);
+  y += BH;
   field_browser->callback(view_field_browser_cb);
-  field_put_on_view_btn = new Fl_Menu_Button(x,y,w,BH,"Put on view");
-  field_put_on_view_btn->callback(view_field_put_on_view_cb,this);
-  x+=w+WB;
-  y=WB;
-  w=width-x-WB;
-  h=height-y-WB;
-  field_editor_group=new Fl_Group(x,y,w,h);
-  field_title=new Fl_Box(x,y,w,BH,"field_name");
-  y+=BH+WB;
-  h-=BH+WB;
+  field_put_on_view_btn = new Fl_Menu_Button(x, y, w, BH, "Put on view");
+  field_put_on_view_btn->callback(view_field_put_on_view_cb, this);
+  x += w + WB;
+  y = WB;
+  w = width - x - WB;
+  h = height - y - WB;
+  field_editor_group = new Fl_Group(x, y, w, h);
+  field_title = new Fl_Box(x, y, w, BH, "field_name");
+  y += BH + WB;
+  h -= BH + WB;
   field_title->labelfont(FL_BOLD);
   field_title->labelsize(18);
   Fl_Tabs *tabs = new Fl_Tabs(x, y , w, h);
-  y+=BH;
-  h-=BH;
-  x+=WB;
-  w-=2*WB;
-  Fl_Group *options_tab= new Fl_Group(x, y, w, h, "Options");
-  Fl_Scroll *options_scroll = new Fl_Scroll(x, y,w,h-BH-2*WB);
-  field_options_scroll=options_scroll;
+  y += BH;
+  h -= BH;
+  x += WB;
+  w -= 2 * WB;
+  Fl_Group *options_tab = new Fl_Group(x, y, w, h, "Options");
+  Fl_Scroll *options_scroll = new Fl_Scroll(x, y, w, h - BH - 2 * WB);
+  field_options_scroll = options_scroll;
   options_scroll->end();
-  Fl_Button* apply_btn = new Fl_Return_Button(x+w - BB ,y+h-BH-WB, BB, BH, "Apply");
-  Fl_Button *revert_btn = new Fl_Button(x+w-2*BB-WB ,y+h-BH-WB, BB, BH, "Revert");
-  field_background_btn = new Fl_Check_Button(x,y+h-BH-WB,(int)(1.5*BB),BH,"Background mesh size");
-  apply_btn->callback(view_field_apply_cb,this);
-  revert_btn->callback(view_field_revert_cb,this);
+  Fl_Button *apply_btn = new Fl_Return_Button(x + w - BB, y + h - BH - WB, BB, BH, "Apply");
+  Fl_Button *revert_btn = new Fl_Button(x + w - 2 * BB - WB, y + h - BH - WB, BB, BH, "Revert");
+  field_background_btn = new Fl_Check_Button(x, y + h - BH - WB, (int)(1.5 * BB), BH, "Background mesh size");
+  apply_btn->callback(view_field_apply_cb, this);
+  revert_btn->callback(view_field_revert_cb, this);
   options_tab->end();
   Fl_Group *help_tab= new Fl_Group(x, y, w, h, "Help");
-  field_help_display = new Fl_Browser(x, y+WB, w, h-2*WB);
+  field_help_display = new Fl_Browser(x, y + WB, w, h - 2 * WB);
   help_tab->end();
   tabs->end();
   field_editor_group->end();
-  field_window->resizable(new Dummy_Box(1.5*BB+2*WB,BH+2*WB,width-3*WB-1.5*BB,height-3*BH-5*WB));
+  field_window->resizable(new Dummy_Box(1.5 * BB + 2 * WB, BH + 2 * WB, 
+                                        width - 3 * WB - 1.5 * BB, height - 3 * BH - 5 * WB));
   field_editor_group->resizable(tabs);
   tabs->resizable(options_tab);
-  options_tab->resizable(new Dummy_Box(3*BB+4*WB,BH+2*WB,width-9*WB-5*BB,height-3*BH-5*WB));
-  /*options_tab->resizable(options_scroll);
-  field_window->resizable(field_editor_group);*/
+  options_tab->resizable(new Dummy_Box(3 * BB + 4 * WB, BH + 2 * WB,
+                                       width - 9 * WB - 5 * BB, height - 3 * BH - 5 * WB));
+  //options_tab->resizable(options_scroll);
+  //field_window->resizable(field_editor_group);
   field_window->size_range(width0, height0);
   field_window->position(CTX.field_position[0], CTX.field_position[1]);
   field_window->end();
@@ -4088,14 +4095,20 @@ void GUI::create_statistics_window()
       stat_value[num] = new Fl_Output(2 * WB, 2 * WB + 16 * BH, IW, BH, "Disto");
       stat_value[num]->tooltip("~ min (J0/J, J/J0)"); num++;
 
-      stat_butt[0] = new Fl_Button(width - BB - 5 * WB, 2 * WB + 13 * BH, BB, BH, "Graph");
-      stat_butt[0]->callback(statistics_histogram_cb, (void *)"Gamma");
-      stat_butt[1] = new Fl_Button(width - BB - 5 * WB, 2 * WB + 14 * BH, BB, BH, "Graph");
-      stat_butt[1]->callback(statistics_histogram_cb, (void *)"Eta");
-      stat_butt[2] = new Fl_Button(width - BB - 5 * WB, 2 * WB + 15 * BH, BB, BH, "Graph");
-      stat_butt[2]->callback(statistics_histogram_cb, (void *)"Rho");
-      stat_butt[3] = new Fl_Button(width - BB - 5 * WB, 2 * WB + 16 * BH, BB, BH, "Graph");
-      stat_butt[3]->callback(statistics_histogram_cb, (void *)"Disto");
+      for(int i = 0; i < 4; i++){
+        int ww = 3 * fontsize;
+        Fl_Box *b = new Fl_Box(FL_NO_BOX, width - 3 * ww - 2 * WB, 2 * WB + (13 + i) * BH, ww, BH, "Plot:");
+        stat_butt[2 * i] = new Fl_Button(width - 2 * ww - 2 * WB, 2 * WB + (13 + i) * BH, ww, BH, "2D");
+        stat_butt[2 * i + 1] = new Fl_Button(width - ww - 2 * WB, 2 * WB + (13 + i) * BH, ww, BH, "3D");
+      }
+      stat_butt[0]->callback(statistics_histogram_cb, (void *)"Gamma2D");
+      stat_butt[1]->callback(statistics_histogram_cb, (void *)"Gamma3D");
+      stat_butt[2]->callback(statistics_histogram_cb, (void *)"Eta2D");
+      stat_butt[3]->callback(statistics_histogram_cb, (void *)"Eta3D");
+      stat_butt[4]->callback(statistics_histogram_cb, (void *)"Rho2D");
+      stat_butt[5]->callback(statistics_histogram_cb, (void *)"Rho3D");
+      stat_butt[6]->callback(statistics_histogram_cb, (void *)"Disto2D");
+      stat_butt[7]->callback(statistics_histogram_cb, (void *)"Disto3D");
 
       g[1]->end();
     }
@@ -4168,7 +4181,7 @@ void GUI::set_statistics(bool compute_quality)
   sprintf(label[num], "%g", s[15]); stat_value[num]->value(label[num]); num++;
 
   if(!compute_quality){
-    for(int i = 0; i < 4; i++) stat_butt[i]->deactivate();
+    for(int i = 0; i < 8; i += 2) stat_butt[i]->deactivate();
     sprintf(label[num], "Press Update");
     stat_value[num]->deactivate();
     stat_value[num]->value(label[num]); num++;
@@ -4183,7 +4196,7 @@ void GUI::set_statistics(bool compute_quality)
     stat_value[num]->value(label[num]); num++;
   }
   else{
-    for(int i = 0; i < 4; i++) stat_butt[i]->activate();
+    for(int i = 0; i < 8; i += 2) stat_butt[i]->activate();
     sprintf(label[num], "%.4g (%.4g->%.4g)", s[17], s[18], s[19]);
     stat_value[num]->activate();
     stat_value[num]->value(label[num]); num++;
diff --git a/Fltk/GUI.h b/Fltk/GUI.h
index ef919c40b06f278bdbe79c61b23cda4610769e09..62eb30e78ffff19f864d85567f42e6b275ecee4b 100644
--- a/Fltk/GUI.h
+++ b/Fltk/GUI.h
@@ -223,7 +223,7 @@ public:
   // statistics window
   Fl_Window        *stat_window;
   Fl_Output        *stat_value[50];
-  Fl_Button        *stat_butt[4];
+  Fl_Button        *stat_butt[8];
   double            quality[4][100];
 
   // message window
diff --git a/Fltk/Makefile b/Fltk/Makefile
index aef515cae1ba855533363152963f270430e9473a..6eba8e4c4f7cb214600d2d49014310c99b6cd36d 100644
--- a/Fltk/Makefile
+++ b/Fltk/Makefile
@@ -56,68 +56,53 @@ depend:
 # DO NOT DELETE THIS LINE
 Main.o: Main.cpp GUI.h Opengl_Window.h Colorbar_Window.h \
   ../Common/GmshUI.h ../Post/ColorTable.h Popup_Button.h \
-  SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Common/GmshDefines.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h ../Common/Gmsh.h ../Common/Message.h ../Graphics/Draw.h \
+  SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  ../Geo/SPoint3.h ../Common/Gmsh.h ../Common/Message.h \
+  ../Graphics/Draw.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
   ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
   ../Common/Options.h ../Parser/Parser.h ../Common/OpenFile.h \
   ../Common/CommandLine.h Solvers.h ../Plugin/PluginManager.h \
   ../Plugin/Plugin.h ../Post/PViewDataList.h ../Post/PViewData.h \
-  ../Common/GmshMatrix.h ../Geo/GModel.h ../Geo/GVertex.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Common/ListUtils.h ../Common/GmshMatrix.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
   ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
-  ../Geo/SPoint2.h ../Geo/GFace.h ../Geo/GEntity.h ../Geo/GPoint.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Mesh/BackgroundMesh.h
+  ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/GFace.h ../Geo/GEntity.h \
+  ../Geo/GPoint.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Mesh/BackgroundMesh.h
 GUI.o: GUI.cpp ../Common/GmshUI.h ../Common/GmshDefines.h \
   ../Common/Message.h ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h \
   ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
   ../Common/Options.h ../Post/ColorTable.h ../Graphics/Draw.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h GUI.h Opengl_Window.h \
   Colorbar_Window.h Popup_Button.h SpherePosition_Widget.h \
-  ../Mesh/Field.h ../Geo/Geo.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h Callbacks.h Win32Icon.h ../Common/OpenFile.h \
-  ../Common/CommandLine.h ../Mesh/Generator.h Solvers.h \
-  ../Plugin/PluginManager.h ../Plugin/Plugin.h ../Post/PViewDataList.h \
-  ../Post/PViewData.h ../Common/GmshMatrix.h Shortcut_Window.h \
-  ../Post/PViewOptions.h ../Post/ColorTable.h ../Geo/GModel.h \
-  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
-  ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
-  ../Geo/SPoint2.h ../Geo/GFace.h ../Geo/GEntity.h ../Geo/GPoint.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
+  ../Mesh/Field.h ../Post/PView.h Callbacks.h Win32Icon.h \
+  ../Common/OpenFile.h ../Common/CommandLine.h ../Mesh/Generator.h \
+  Solvers.h ../Plugin/PluginManager.h ../Plugin/Plugin.h \
+  ../Post/PViewDataList.h ../Post/PViewData.h ../Common/ListUtils.h \
+  ../Common/GmshMatrix.h Shortcut_Window.h ../Post/PViewOptions.h \
+  ../Post/ColorTable.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h \
+  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/GPoint.h \
+  ../Geo/SPoint2.h ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h \
+  ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint3.h ../Geo/SPoint2.h \
+  ../Geo/GFace.h ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/GEdgeLoop.h \
+  ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/GeoStringInterface.h
 GUI_Extras.o: GUI_Extras.cpp ../Common/GmshUI.h ../Common/GmshDefines.h \
   ../Common/CreateFile.h ../Common/Options.h ../Post/ColorTable.h \
   ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
   ../Graphics/Draw.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h GUI.h \
   Opengl_Window.h Colorbar_Window.h Popup_Button.h \
-  SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
-  ../Geo/SPoint3.h ../Geo/SVector3.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Numeric/Numeric.h \
-  ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h Shortcut_Window.h ../Geo/GModel.h ../Geo/GVertex.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
-  ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
-  ../Geo/SPoint2.h ../Geo/GFace.h ../Geo/GEntity.h ../Geo/GPoint.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
+  SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  Shortcut_Window.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h \
+  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/GPoint.h \
+  ../Geo/SPoint2.h ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h \
+  ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint3.h ../Geo/SPoint2.h \
+  ../Geo/GFace.h ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/GEdgeLoop.h \
+  ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Mesh/Partition.h File_Picker.h
 GUI_Projection.o: GUI_Projection.cpp ../Geo/GModelIO_Fourier.h \
   ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
@@ -130,21 +115,17 @@ GUI_Projection.o: GUI_Projection.cpp ../Geo/GModelIO_Fourier.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   ../Graphics/Draw.h ../Common/Options.h ../Post/ColorTable.h \
   ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
   ../Common/StringUtils.h ../Graphics/SelectBuffer.h GUI_Projection.h \
   ../Common/GmshUI.h ../Geo/fourierProjectionFace.h ../Geo/GModel.h \
   ../Geo/Range.h GUI.h Opengl_Window.h Colorbar_Window.h Popup_Button.h \
-  SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
-  ../Geo/SPoint3.h ../Geo/SVector3.h ../Geo/SBoundingBox3d.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h Shortcut_Window.h GUI_Extras.h ../Geo/fourierFace.h \
-  ../Geo/GFace.h ../Geo/GModel.h ../Geo/Range.h ../Geo/fourierEdge.h \
-  ../Geo/GEdge.h ../Geo/GModel.h ../Geo/fourierVertex.h ../Geo/GModel.h \
-  ../Geo/GVertex.h ../Geo/MVertex.h ../Common/Message.h
+  SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  Shortcut_Window.h GUI_Extras.h ../Geo/fourierFace.h ../Geo/GFace.h \
+  ../Geo/GModel.h ../Geo/Range.h ../Geo/fourierEdge.h ../Geo/GEdge.h \
+  ../Geo/GModel.h ../Geo/fourierVertex.h ../Geo/GModel.h ../Geo/GVertex.h \
+  ../Geo/MVertex.h
 GUI_Classifier.o: GUI_Classifier.cpp GUI_Classifier.h ../Common/GmshUI.h \
   ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
@@ -156,18 +137,15 @@ GUI_Classifier.o: GUI_Classifier.cpp GUI_Classifier.h ../Common/GmshUI.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   GUI.h Opengl_Window.h Colorbar_Window.h ../Post/ColorTable.h \
-  Popup_Button.h SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
-  ../Geo/SPoint3.h ../Geo/SVector3.h ../Geo/SBoundingBox3d.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h Shortcut_Window.h ../Graphics/Draw.h \
-  ../Common/Options.h ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h ../Graphics/SelectBuffer.h GUI_Projection.h \
+  Popup_Button.h SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  Shortcut_Window.h ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h \
+  ../Graphics/Draw.h ../Common/Options.h ../Common/Context.h \
+  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
+  ../Graphics/SelectBuffer.h GUI_Projection.h \
   ../Geo/fourierProjectionFace.h ../Geo/GModel.h ../Geo/Range.h \
-  GUI_Extras.h ../Common/Message.h ../Mesh/meshGFaceDelaunayInsertion.h \
+  GUI_Extras.h ../Mesh/meshGFaceDelaunayInsertion.h \
   ../Mesh/meshGFaceOptimize.h ../Mesh/meshGFaceDelaunayInsertion.h \
   ../Geo/discreteEdge.h ../Geo/GModel.h ../Geo/GEdge.h \
   ../Geo/discreteFace.h ../Geo/GModel.h ../Geo/GFace.h
@@ -183,6 +161,7 @@ Callbacks.o: Callbacks.cpp ../Common/GmshUI.h ../Common/Message.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   ../Geo/GeoStringInterface.h ../Geo/findLinks.h ../Mesh/Generator.h \
   ../Mesh/HighOrder.h ../Graphics/Draw.h ../Graphics/SelectBuffer.h \
   ../Post/PView.h ../Post/PViewOptions.h ../Post/ColorTable.h \
@@ -190,16 +169,11 @@ Callbacks.o: Callbacks.cpp ../Common/GmshUI.h ../Common/Message.h \
   ../Common/CommandLine.h ../Common/Context.h ../Geo/CGNSOptions.h \
   ../Mesh/PartitionOptions.h ../Common/Options.h GUI.h Opengl_Window.h \
   Colorbar_Window.h Popup_Button.h SpherePosition_Widget.h \
-  ../Mesh/Field.h ../Geo/Geo.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SBoundingBox3d.h ../Numeric/Numeric.h \
-  ../Numeric/NumericEmbedded.h ../Common/TreeUtils.h ../Common/avl.h \
-  ../Common/ListUtils.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h \
-  ../Common/SmoothData.h GUI_Extras.h Callbacks.h ../Plugin/Plugin.h \
-  ../Post/PViewDataList.h ../Post/PViewData.h ../Common/GmshMatrix.h \
-  ../Plugin/PluginManager.h ../Plugin/Plugin.h ../Common/Visibility.h \
-  ../Common/GmshDefines.h Solvers.h ../Common/OS.h \
-  ../Mesh/BackgroundMesh.h
+  ../Mesh/Field.h GUI_Extras.h Callbacks.h ../Plugin/Plugin.h \
+  ../Post/PViewDataList.h ../Post/PViewData.h ../Plugin/PluginManager.h \
+  ../Plugin/Plugin.h ../Common/Visibility.h ../Common/GmshDefines.h \
+  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h Solvers.h \
+  ../Common/OS.h ../Mesh/BackgroundMesh.h
 Opengl.o: Opengl.cpp ../Common/GmshUI.h ../Common/GmshDefines.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/Context.h \
   ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h ../Graphics/Draw.h \
@@ -212,12 +186,7 @@ Opengl.o: Opengl.cpp ../Common/GmshUI.h ../Common/GmshDefines.h \
   ../Geo/SVector3.h ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h \
   ../Common/StringUtils.h GUI.h Opengl_Window.h Colorbar_Window.h \
   ../Post/ColorTable.h Popup_Button.h SpherePosition_Widget.h \
-  ../Mesh/Field.h ../Geo/Geo.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SBoundingBox3d.h ../Common/ListUtils.h ../Common/TreeUtils.h \
-  ../Common/avl.h ../Common/ListUtils.h ../Geo/SPoint2.h \
-  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Post/PView.h \
-  ../Graphics/gl2ps.h
+  ../Mesh/Field.h ../Post/PView.h ../Graphics/gl2ps.h
 Opengl_Window.o: Opengl_Window.cpp ../Common/GmshUI.h \
   ../Common/GmshDefines.h ../Common/Message.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Common/Context.h ../Geo/CGNSOptions.h \
@@ -230,34 +199,19 @@ Opengl_Window.o: Opengl_Window.cpp ../Common/GmshUI.h \
   ../Geo/GPoint.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/SPoint2.h \
   ../Geo/SVector3.h ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h GUI.h \
   Opengl_Window.h Colorbar_Window.h ../Post/ColorTable.h Popup_Button.h \
-  SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
-  ../Geo/SPoint3.h ../Geo/SVector3.h ../Geo/SBoundingBox3d.h \
-  ../Common/ListUtils.h ../Common/TreeUtils.h ../Common/avl.h \
-  ../Common/ListUtils.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h \
-  ../Common/SmoothData.h ../Post/PView.h ../Geo/MElement.h \
-  ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h
+  SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  ../Geo/MElement.h ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h \
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h \
+  ../Geo/SVector3.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h
 Colorbar_Window.o: Colorbar_Window.cpp ../Common/GmshUI.h GUI.h \
   Opengl_Window.h Colorbar_Window.h ../Post/ColorTable.h Popup_Button.h \
-  SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Common/GmshDefines.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h ../Common/Context.h ../Geo/CGNSOptions.h \
+  SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  ../Geo/SPoint3.h ../Common/Context.h ../Geo/CGNSOptions.h \
   ../Mesh/PartitionOptions.h
 Solvers.o: Solvers.cpp ../Common/Message.h ../Common/StringUtils.h \
   Solvers.h GmshServer.h ../Common/OpenFile.h ../Common/GmshUI.h GUI.h \
   Opengl_Window.h Colorbar_Window.h ../Post/ColorTable.h Popup_Button.h \
-  SpherePosition_Widget.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Common/GmshDefines.h ../Geo/gmshSurface.h ../Geo/Pair.h \
-  ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
-  ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h ../Graphics/Draw.h ../Common/Context.h \
-  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
+  SpherePosition_Widget.h ../Mesh/Field.h ../Post/PView.h \
+  ../Geo/SPoint3.h ../Graphics/Draw.h ../Geo/SBoundingBox3d.h \
+  ../Geo/SPoint3.h ../Common/Context.h ../Geo/CGNSOptions.h \
+  ../Mesh/PartitionOptions.h
diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp
index 5f99653d94777412a5fda8dbbeb9c451f6d6702b..103b6454510a071e58f30d81e5be4513d8e3db53 100644
--- a/Geo/GEdge.cpp
+++ b/Geo/GEdge.cpp
@@ -29,11 +29,15 @@ GEdge::~GEdge()
   if(v0) v0->delEdge(this);
   if(v1 && v1 != v0) v1->delEdge(this);
 
-  for(unsigned int i = 0; i < mesh_vertices.size(); i++)
-    delete mesh_vertices[i];
+  deleteMesh();
+}
 
-  for(unsigned int i = 0; i < lines.size(); i++)
-    delete lines[i];
+void GEdge::deleteMesh()
+{
+  for(unsigned int i = 0; i < mesh_vertices.size(); i++) delete mesh_vertices[i];
+  mesh_vertices.clear();
+  for(unsigned int i = 0; i < lines.size(); i++) delete lines[i];
+  lines.clear();
 }
 
 unsigned int GEdge::getNumMeshElements()
diff --git a/Geo/GEdge.h b/Geo/GEdge.h
index 5eff3e278394cfebc0d7ad9a08a8c7941567bb71..d9cf68151692dab28178c81d296cb5a9b6141cbf 100644
--- a/Geo/GEdge.h
+++ b/Geo/GEdge.h
@@ -30,6 +30,9 @@ class GEdge : public GEntity {
   GEdge(GModel *model, int tag, GVertex *_v0, GVertex *_v1);
   virtual ~GEdge();
 
+  // delete mesh data
+  virtual void deleteMesh();
+
   // get the start/end vertices of the edge
   GVertex *getBeginVertex() const { return v0; }
   GVertex *getEndVertex() const { return v1; }
diff --git a/Geo/GEntity.h b/Geo/GEntity.h
index 5476df2cc76743168e27147a15c5af73b4c5be5f..f686071539f4339bc526c5cded596c18e64f5edc 100644
--- a/Geo/GEntity.h
+++ b/Geo/GEntity.h
@@ -144,6 +144,9 @@ class GEntity {
 
   virtual ~GEntity();
 
+  // delete the mesh data
+  virtual void deleteMesh(){}
+
   // delete the vertex arrays, used to to draw the mesh efficiently
   void deleteVertexArrays();
 
diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp
index 32b67ec52388cdd22996016c902fe1543552922d..619cc9727011381c3db74599a441f1ae17aebace 100644
--- a/Geo/GFace.cpp
+++ b/Geo/GFace.cpp
@@ -47,19 +47,23 @@ GFace::~GFace()
     ++it;
   }
 
-  for(unsigned int i = 0; i < mesh_vertices.size(); i++)
-    delete mesh_vertices[i];
-
-  for(unsigned int i = 0; i < triangles.size(); i++)
-    delete triangles[i];
-
-  for(unsigned int i = 0; i < quadrangles.size(); i++)
-    delete quadrangles[i];
+  deleteMesh();
 
   if(va_geom_triangles)
     delete va_geom_triangles;
 }
 
+void GFace::deleteMesh()
+{
+  for(unsigned int i = 0; i < mesh_vertices.size(); i++) delete mesh_vertices[i];
+  mesh_vertices.clear();
+  transfinite_vertices.clear();
+  for(unsigned int i = 0; i < triangles.size(); i++) delete triangles[i];
+  triangles.clear();
+  for(unsigned int i = 0; i < quadrangles.size(); i++) delete quadrangles[i];
+  quadrangles.clear();
+}
+
 unsigned int GFace::getNumMeshElements()
 { 
   return triangles.size() + quadrangles.size(); 
diff --git a/Geo/GFace.h b/Geo/GFace.h
index 0c569cdc5bda9cb1b96390a9966a339f7c0b0b99..a0d7ced0fd0a94aa151cb8d480e5dde57f105c83 100644
--- a/Geo/GFace.h
+++ b/Geo/GFace.h
@@ -49,11 +49,15 @@ class GFace : public GEntity
   // outer contour of the face.
   void resolveWires();
 
+ public: // this will become protected or private
+  std::list<GEdgeLoop> edgeLoops;
+
  public:
   GFace(GModel *model, int tag);
   virtual ~GFace();
 
-  std::list<GEdgeLoop> edgeLoops;
+  // delete mesh data
+  virtual void deleteMesh();
 
   // add/delete regions that are bounded by the face
   void addRegion(GRegion *r){ r1 ? r2 = r : r1 = r; }
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index e87abab66952f006f200f3de3c08093d9d71c5c6..42bce53adc45d42f82333658a85b8b8d60582b29 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -613,78 +613,6 @@ void GModel::deleteMeshPartitions()
   meshPartitions.clear();
 }
 
-void GModel::checkMeshCoherence()
-{
-  int numEle = getNumMeshElements();
-  if(!numEle) return;
-
-  Msg::Info("Checking mesh coherence (%d elements)", numEle);
-
-  SBoundingBox3d bb = bounds();
-  double lc = bb.empty() ? 1. : norm(SVector3(bb.max(), bb.min()));
-  double tol = CTX.geom.tolerance * lc;
-
-  std::vector<GEntity*> entities;
-  getEntities(entities);
-
-  // check for duplicate mesh vertices
-  {
-    double old_tol = MVertexLessThanLexicographic::tolerance;
-    MVertexLessThanLexicographic::tolerance = tol;
-    std::set<MVertex*, MVertexLessThanLexicographic> pos;
-    int num = 0;
-    for(unsigned int i = 0; i < entities.size(); i++){
-      for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++){
-	MVertex *v = entities[i]->mesh_vertices[j];
-	std::set<MVertex*, MVertexLessThanLexicographic>::iterator it = pos.find(v);
-	if(it == pos.end()){
-	  pos.insert(v);
-	}
-	else{
-	  Msg::Info("Vertices %d and %d have identical position (%g, %g, %g)",
-		    (*it)->getNum(), v->getNum(), v->x(), v->y(), v->z());
-	  num++;
-	}
-      }
-    }
-    if(num) Msg::Warning("%d duplicate vertices", num);
-    MVertexLessThanLexicographic::tolerance = old_tol;
-  }
-
-  // check for duplicate elements
-  {
-    double old_tol = MElementLessThanLexicographic::tolerance;
-    MElementLessThanLexicographic::tolerance = tol;
-    std::set<MElement*, MElementLessThanLexicographic> pos;
-    int num = 0;
-    for(unsigned int i = 0; i < entities.size(); i++){
-      for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
-	MElement *e = entities[i]->getMeshElement(j);
-	std::set<MElement*, MElementLessThanLexicographic>::iterator it = pos.find(e);
-	if(it == pos.end()){
-	  pos.insert(e);
-	}
-	else{
-	  std::ostringstream sstream;
-	  sstream << "Element " << e->getNum() << " [ ";
-	  for (int k = 0; k < e->getNumVertices(); k++)
-	    sstream << e->getVertex(k)->getNum() << " ";
-	  sstream << "] on entity " << entities[i]->tag() 
-		  << " has same barycenter as element " << (*it)->getNum() 
-		  << " [ ";
-	  for (int k = 0; k < (*it)->getNumVertices(); k++)
-	    sstream << (*it)->getVertex(k)->getNum() << " ";
-	  sstream << "]";
-	  Msg::Info("%s", sstream.str().c_str());
-	  num++;
-	}
-      }
-    }
-    if(num) Msg::Warning("%d duplicate elements", num);
-    MElementLessThanLexicographic::tolerance = old_tol;
-  }
-}
-
 template<class T>
 static void _addElements(std::vector<T*> &dst, const std::vector<MElement*> &src)
 {
@@ -811,3 +739,154 @@ void GModel::_storeVerticesInEntities(std::vector<MVertex*> &vertices)
     }
   }
 }
+
+void GModel::checkMeshCoherence(double tolerance)
+{
+  int numEle = getNumMeshElements();
+  if(!numEle) return;
+
+  Msg::Info("Checking mesh coherence (%d elements)", numEle);
+
+  SBoundingBox3d bbox = bounds();
+  double lc = bbox.empty() ? 1. : norm(SVector3(bbox.max(), bbox.min()));
+
+  std::vector<GEntity*> entities;
+  getEntities(entities);
+
+  // check for duplicate mesh vertices
+  {
+    double old_tol = MVertexLessThanLexicographic::tolerance;
+    MVertexLessThanLexicographic::tolerance = tolerance * lc;
+    std::set<MVertex*, MVertexLessThanLexicographic> pos;
+    int num = 0;
+    for(unsigned int i = 0; i < entities.size(); i++){
+      for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++){
+	MVertex *v = entities[i]->mesh_vertices[j];
+	std::set<MVertex*, MVertexLessThanLexicographic>::iterator it = pos.find(v);
+	if(it == pos.end()){
+	  pos.insert(v);
+	}
+	else{
+	  Msg::Info("Vertices %d and %d have identical position (%g, %g, %g)",
+		    (*it)->getNum(), v->getNum(), v->x(), v->y(), v->z());
+	  num++;
+	}
+      }
+    }
+    if(num) Msg::Warning("%d duplicate vertices", num);
+    MVertexLessThanLexicographic::tolerance = old_tol;
+  }
+
+  // check for duplicate elements
+  {
+    double old_tol = MElementLessThanLexicographic::tolerance;
+    MElementLessThanLexicographic::tolerance = tolerance * lc;
+    std::set<MElement*, MElementLessThanLexicographic> pos;
+    int num = 0;
+    for(unsigned int i = 0; i < entities.size(); i++){
+      for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
+	MElement *e = entities[i]->getMeshElement(j);
+	std::set<MElement*, MElementLessThanLexicographic>::iterator it = pos.find(e);
+	if(it == pos.end()){
+	  pos.insert(e);
+	}
+	else{
+	  std::ostringstream sstream;
+	  sstream << "Element " << e->getNum() << " [ ";
+	  for (int k = 0; k < e->getNumVertices(); k++)
+	    sstream << e->getVertex(k)->getNum() << " ";
+	  sstream << "] on entity " << entities[i]->tag() 
+		  << " has same barycenter as element " << (*it)->getNum() 
+		  << " [ ";
+	  for (int k = 0; k < (*it)->getNumVertices(); k++)
+	    sstream << (*it)->getVertex(k)->getNum() << " ";
+	  sstream << "]";
+	  Msg::Info("%s", sstream.str().c_str());
+	  num++;
+	}
+      }
+    }
+    if(num) Msg::Warning("%d duplicate elements", num);
+    MElementLessThanLexicographic::tolerance = old_tol;
+  }
+}
+
+int GModel::removeDuplicateMeshVertices(double tolerance)
+{
+  SBoundingBox3d bbox = bounds();
+  double lc = bbox.empty() ? 1. : norm(SVector3(bbox.max(), bbox.min()));
+
+  std::vector<GEntity*> entities;
+  getEntities(entities);
+
+  double old_tol = MVertexLessThanLexicographic::tolerance;
+  MVertexLessThanLexicographic::tolerance = tolerance * lc;
+  std::set<MVertex*, MVertexLessThanLexicographic> pos;
+
+  for(unsigned int i = 0; i < entities.size(); i++){
+    for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++){
+      MVertex *v = entities[i]->mesh_vertices[j];
+      MVertex w(v->x(), v->y(), v->z());
+      std::set<MVertex*, MVertexLessThanLexicographic>::iterator it = pos.find(&w);
+      if(it == pos.end())
+        pos.insert(new MVertex(v->x(), v->y(), v->z()));
+    }
+  }
+
+  int diff = getNumMeshVertices() - pos.size();
+  if(!diff){
+    for(std::set<MVertex*, MVertexLessThanLexicographic>::iterator it = pos.begin();
+        it != pos.end(); it++)
+      delete *it;
+    Msg::Info("No duplicate vertices found");
+    return 0;
+  }
+
+  std::map<int, std::vector<MElement*> > elements[8];
+  for(unsigned int i = 0; i < entities.size(); i++){
+    for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
+      MElement *e = entities[i]->getMeshElement(j);
+      std::vector<MVertex*> verts;
+      for(int k = 0; k < e->getNumVertices(); k++){
+        MVertex *v = e->getVertex(k);
+        std::set<MVertex*, MVertexLessThanLexicographic>::iterator it = pos.find(v);
+        if(it != pos.end())
+          verts.push_back(*it);
+        else
+          Msg::Error("Could not find unique vertex (%g,%g,%g)", v->x(), v->y(), v->z());
+      }
+      MElementFactory factory;
+      MElement *e2 = factory.create(e->getTypeForMSH(), verts, e->getNum(), 
+                                    e->getPartition());
+      switch(e2->getNumEdges()){
+      case 0: elements[0][entities[i]->tag()].push_back(e2); break;
+      case 1: elements[1][entities[i]->tag()].push_back(e2); break;
+      case 3: elements[2][entities[i]->tag()].push_back(e2); break;
+      case 4: elements[3][entities[i]->tag()].push_back(e2); break;
+      case 6: elements[4][entities[i]->tag()].push_back(e2); break;
+      case 12: elements[5][entities[i]->tag()].push_back(e2); break;
+      case 9: elements[6][entities[i]->tag()].push_back(e2); break;
+      case 8: elements[7][entities[i]->tag()].push_back(e2); break;
+      }
+    }
+  }
+
+  for(unsigned int i = 0; i < entities.size(); i++)
+    entities[i]->deleteMesh();
+
+  std::vector<MVertex*> vertices;
+  for(std::set<MVertex*, MVertexLessThanLexicographic>::iterator it = pos.begin();
+      it != pos.end(); it++)
+    vertices.push_back(*it);
+
+  for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) 
+    _storeElementsInEntities(elements[i]);
+  _associateEntityWithMeshVertices();
+  _storeVerticesInEntities(vertices);
+
+  MVertexLessThanLexicographic::tolerance = old_tol;
+
+  Msg::Info("Removed %d duplicate mesh vertices", diff);
+    
+  return diff;
+}
diff --git a/Geo/GModel.h b/Geo/GModel.h
index 394ccd78077eedc110803eb597004f4a060ea451..df1c3860eab179140aa989ec45f872dbe5bce158 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -91,7 +91,7 @@ class GModel
   // the static list of all loaded models
   static std::vector<GModel*> list;
 
-  // returns the current model, and sets the current model index if
+  // return the current model, and sets the current model index if
   // index >= 0
   static GModel *current(int index=-1);
 
@@ -155,60 +155,60 @@ class GModel
   void remove(GEdge *e);
   void remove(GVertex *v);
 
-  // Snap vertices on model edges by using geometry tolerance
+  // snap vertices on model edges by using geometry tolerance
   void snapVertices();
 
-  // Fill a vector containing all the entities in the model
+  // fill a vector containing all the entities in the model
   void getEntities(std::vector<GEntity*> &entities);
 
-  // Checks if there are no physical entities in the model
+  // check if there are no physical entities in the model
   bool noPhysicalGroups();
 
-  // Returns all physical groups (one map per dimension: 0-D to 3-D)
+  // return all physical groups (one map per dimension: 0-D to 3-D)
   void getPhysicalGroups(std::map<int, std::vector<GEntity*> > groups[4]);
 
-  // Deletes physical groups in the model
+  // delete physical groups in the model
   void deletePhysicalGroups();
   void deletePhysicalGroup(int dim, int num);
 
-  // Returns the highest number associated with a physical entity
+  // return the highest number associated with a physical entity
   int getMaxPhysicalNumber();
 
-  // Get an iterator on the elementary/physical names
+  // get an iterator on the elementary/physical names
   piter firstPhysicalName() { return physicalNames.begin(); }
   piter lastPhysicalName() { return physicalNames.end(); }
   piter firstElementaryName() { return elementaryNames.begin(); }
   piter lastElementaryName() { return elementaryNames.end(); }
 
-  // Get the number of physical names
+  // get the number of physical names
   int numPhysicalNames(){ return physicalNames.size(); }
 
-  // Associate a name with a physical number (returns new id if number==0)
+  // associate a name with a physical number (returns new id if number==0)
   int setPhysicalName(std::string name, int number=0);
 
-  // Get the name (if any) of a given physical group
+  // get the name (if any) of a given physical group
   std::string getPhysicalName(int number);
 
-  // The bounding box
+  // the bounding box
   SBoundingBox3d bounds();
 
-  // Returns the mesh status for the entire model
+  // return the mesh status for the entire model
   int getMeshStatus(bool countDiscrete=true);
 
-  // Returns the total number of elements in the mesh
+  // return the total number of elements in the mesh
   int getNumMeshElements();
 
-  // Get the number of each type of element in the mesh at the largest
+  // get the number of each type of element in the mesh at the largest
   // dimension and return the dimension
   int getNumMeshElements(unsigned c[4]);
 
-  // Access a mesh element by coordinates
+  // access a mesh element by coordinates
   MElement *getMeshElementByCoord(SPoint3 &p);
 
-  // Returns the total number of vertices in the mesh
+  // return the total number of vertices in the mesh
   int getNumMeshVertices();
 
-  // Access a mesh vertex by tag, using the vertex cache
+  // access a mesh vertex by tag, using the vertex cache
   MVertex *getMeshVertexByTag(int n);
 
   // get all the mesh vertices associated with the physical group
@@ -226,29 +226,32 @@ class GModel
   void setCurrentMeshEntity(GEntity *e){ _currentMeshEntity = e; }
   GEntity *getCurrentMeshEntity(){ return _currentMeshEntity; }
 
-  // Deletes all invisble mesh elements
+  // delete all invisble mesh elements
   void removeInvisibleElements();
 
-  // The list of partitions
+  // the list of partitions
   std::set<int> &getMeshPartitions() { return meshPartitions; }
   void recomputeMeshPartitions();
 
-  // Deletes all the partitions
+  // delete all the partitions
   void deleteMeshPartitions();
 
-  // Store/recall min and max partitions size
+  // store/recall min and max partitions size
   void setMinPartitionSize(const int pSize) { partitionSize[0] = pSize; }
   void setMaxPartitionSize(const int pSize) { partitionSize[1] = pSize; }
   int getMinPartitionSize() const { return partitionSize[0]; }
   int getMaxPartitionSize() const { return partitionSize[1]; }
 
-  // Performs various coherence tests on the mesh
-  void checkMeshCoherence();
+  // perform various coherence tests on the mesh
+  void checkMeshCoherence(double tolerance);
 
-  // A container for smooth normals
+  // remove duplicate mesh vertices
+  int removeDuplicateMeshVertices(double tolerance);
+
+  // a container for smooth normals
   smooth_normals *normals;
 
-  // Mesh the model
+  // mesh the model
   int mesh(int dimension);
 
   // Gmsh native CAD format
diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index 3360314969a55f3c1f91beab4c4d71702e0d1c60..652ed99793eca712c3c45854e30db88771327492 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -13,8 +13,6 @@
 #include "SBoundingBox3d.h"
 #include "discreteRegion.h"
 #include "discreteFace.h"
-#include "discreteEdge.h"
-#include "discreteVertex.h"
 #include "StringUtils.h"
 #include "Message.h"
 
@@ -81,21 +79,19 @@ static void createElementMSH(GModel *m, int num, int type, int physical,
     return;
   }
 
-  int dim = e->getDim();
-  int idx;
   switch(e->getNumEdges()){
-  case 0 : idx = 0; break;
-  case 1 : idx = 1; break;
-  case 3 : idx = 2; break;
-  case 4 : idx = 3; break;
-  case 6 : idx = 4; break;
-  case 12 : idx = 5; break;
-  case 9 : idx = 6; break;
-  case 8 : idx = 7; break;
+  case 0 : elements[0][reg].push_back(e); break;
+  case 1 : elements[1][reg].push_back(e); break;
+  case 3 : elements[2][reg].push_back(e); break;
+  case 4 : elements[3][reg].push_back(e); break;
+  case 6 : elements[4][reg].push_back(e); break;
+  case 12 : elements[5][reg].push_back(e); break;
+  case 9 : elements[6][reg].push_back(e); break;
+  case 8 : elements[7][reg].push_back(e); break;
   default : Msg::Error("Wrong number of edges in element"); return;
   }
-  elements[idx][reg].push_back(e);
   
+  int dim = e->getDim();
   if(physical && (!physicals[dim].count(reg) || !physicals[dim][reg].count(physical)))
     physicals[dim][reg][physical] = "unnamed";
   
@@ -606,6 +602,9 @@ int GModel::writePOS(const std::string &name, bool printElementary,
 
 int GModel::readSTL(const std::string &name, double tolerance)
 {
+  // Note: this routine only reads a single "solid" (not sure if the
+  // spec allows to read multiple solids in a single file)
+
   FILE *fp = fopen(name.c_str(), "rb");
   if(!fp){
     Msg::Error("Unable to open file '%s'", name.c_str());
@@ -696,6 +695,7 @@ int GModel::readSTL(const std::string &name, double tolerance)
 
   // create (unique) vertices and triangles
   double lc = norm(SVector3(bbox.max(), bbox.min()));
+  double old_tol = MVertexLessThanLexicographic::tolerance;
   MVertexLessThanLexicographic::tolerance = lc * tolerance;
   std::set<MVertex*, MVertexLessThanLexicographic> vertices;
   for(unsigned int i = 0; i < points.size(); i += 3){
@@ -716,6 +716,8 @@ int GModel::readSTL(const std::string &name, double tolerance)
     face->triangles.push_back(new MTriangle(v[0], v[1], v[2]));
   }
 
+  MVertexLessThanLexicographic::tolerance = old_tol;
+
   fclose(fp);
   return 1;
 }
@@ -923,7 +925,7 @@ int GModel::readVRML(const std::string &name)
     }
   }
 
-  for(int i = 0; i < (int)(sizeof(elements)/sizeof(elements[0])); i++) 
+  for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) 
     _storeElementsInEntities(elements[i]);
   _associateEntityWithMeshVertices();
   _storeVerticesInEntities(allVertexVector);
@@ -1126,7 +1128,7 @@ int GModel::readUNV(const std::string &name)
     }
   }
   
-  for(int i = 0; i < (int)(sizeof(elements)/sizeof(elements[0])); i++) 
+  for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) 
     _storeElementsInEntities(elements[i]);
   _associateEntityWithMeshVertices();
   _storeVerticesInEntities(vertexMap);
@@ -1357,7 +1359,7 @@ int GModel::readMESH(const std::string &name)
     }
   }
 
-  for(int i = 0; i < (int)(sizeof(elements)/sizeof(elements[0])); i++) 
+  for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) 
     _storeElementsInEntities(elements[i]);
   _associateEntityWithMeshVertices();
   _storeVerticesInEntities(vertexVector);
@@ -1707,7 +1709,7 @@ int GModel::readBDF(const std::string &name)
     }
   }
   
-  for(int i = 0; i < (int)(sizeof(elements)/sizeof(elements[0])); i++) 
+  for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) 
     _storeElementsInEntities(elements[i]);
   _associateEntityWithMeshVertices();
   _storeVerticesInEntities(vertexMap);
@@ -2130,7 +2132,7 @@ int GModel::readVTK(const std::string &name, bool bigEndian)
     }
   }  
   
-  for(int i = 0; i < (int)(sizeof(elements)/sizeof(elements[0])); i++) 
+  for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) 
     _storeElementsInEntities(elements[i]);
   _associateEntityWithMeshVertices();
   _storeVerticesInEntities(vertices);
diff --git a/Geo/GRegion.cpp b/Geo/GRegion.cpp
index ec47ece13763c3bac04628666319e2718f5357be..0bc651bc910888eb122c2b6d3cbb5f05f9d53cf7 100644
--- a/Geo/GRegion.cpp
+++ b/Geo/GRegion.cpp
@@ -23,20 +23,22 @@ GRegion::~GRegion()
     ++it;
   }
 
-  for(unsigned int i = 0; i < mesh_vertices.size(); i++)
-    delete mesh_vertices[i];
-
-  for(unsigned int i = 0; i < tetrahedra.size(); i++)
-    delete tetrahedra[i];
-
-  for(unsigned int i = 0; i < hexahedra.size(); i++)
-    delete hexahedra[i];
-
-  for(unsigned int i = 0; i < prisms.size(); i++)
-    delete prisms[i];
+  deleteMesh();
+}
 
-  for(unsigned int i = 0; i < pyramids.size(); i++)
-    delete pyramids[i];
+void GRegion::deleteMesh()
+{
+  for(unsigned int i = 0; i < mesh_vertices.size(); i++) delete mesh_vertices[i];
+  mesh_vertices.clear();
+  transfinite_vertices.clear();
+  for(unsigned int i = 0; i < tetrahedra.size(); i++) delete tetrahedra[i];
+  tetrahedra.clear();
+  for(unsigned int i = 0; i < hexahedra.size(); i++) delete hexahedra[i];
+  hexahedra.clear();
+  for(unsigned int i = 0; i < prisms.size(); i++) delete prisms[i];
+  prisms.clear();
+  for(unsigned int i = 0; i < pyramids.size(); i++) delete pyramids[i];
+  pyramids.clear();
 }
 
 unsigned int GRegion::getNumMeshElements()
diff --git a/Geo/GRegion.h b/Geo/GRegion.h
index 3fb32d99953c936f56d823ada8eaf6a5837d0421..556f3682baecd2e6a0e6bd98a80836a80ebfb93e 100644
--- a/Geo/GRegion.h
+++ b/Geo/GRegion.h
@@ -25,6 +25,9 @@ class GRegion : public GEntity {
   GRegion(GModel *model, int tag);
   virtual ~GRegion();
 
+  // delete mesh data
+  virtual void deleteMesh();
+
   // get the dimension of the region (3)
   virtual int dim() const { return 3; }
 
diff --git a/Geo/GVertex.cpp b/Geo/GVertex.cpp
index 286273461f6bda4fd3d8d198a4ef924bfaa7fbfd..3663213518baa548009fc59df29f3b5b6be39ba6 100644
--- a/Geo/GVertex.cpp
+++ b/Geo/GVertex.cpp
@@ -16,11 +16,15 @@ GVertex::GVertex(GModel *m, int tag, double ms) : GEntity(m, tag), meshSize(ms)
 
 GVertex::~GVertex()
 {
-  for(unsigned int i = 0; i < mesh_vertices.size(); i++)
-    delete mesh_vertices[i];
+  deleteMesh();
+}
 
-  for(unsigned int i = 0; i < points.size(); i++)
-    delete points[i];
+void GVertex::deleteMesh()
+{
+  for(unsigned int i = 0; i < mesh_vertices.size(); i++) delete mesh_vertices[i];
+  mesh_vertices.clear();
+  for(unsigned int i = 0; i < points.size(); i++) delete points[i];
+  points.clear();
 }
 
 void GVertex::setPosition(GPoint &p)
diff --git a/Geo/GVertex.h b/Geo/GVertex.h
index 2d3a2419036f816225e6c36c6a70737195d14201..370d3a609f8f0f890498584dc81654041942a3b8 100644
--- a/Geo/GVertex.h
+++ b/Geo/GVertex.h
@@ -25,6 +25,9 @@ class GVertex : public GEntity
   GVertex(GModel *m, int tag, double ms=MAX_LC);
   virtual ~GVertex();
 
+  // delete mesh data
+  virtual void deleteMesh();
+
   // get/set the coordinates of the vertex
   virtual GPoint point() const = 0;
   virtual double x() const = 0;
diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 7a46276fb45b9df09154d50d719b65970211b6e7..faff1b1e966a71213ab8b27848d106babac69675 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -94,238 +94,22 @@ double MElement::rhoShapeMeasure()
     return 0.;
 }
 
-void MElement::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+void MElement::getShapeFunctions(double u, double v, double w, double s[], int o)
 {
-  Msg::Error("No integration points defined for this type of element");
-}
-
-void MElement::getShapeFunction(int num,double u,double v,double w,double &s) {
-#if !defined(HAVE_GMSH_EMBEDDED)
-  double sf[256];
-  getFunctionSpace()->f(u,v,w,sf);
-  s = sf[num];
-#endif
-}
-
-void MElement::getGradShapeFunction(int num,double uu,double vv,double ww,double s[3]) {
 #if !defined(HAVE_GMSH_EMBEDDED)
-  double sf[256][3];
-  getFunctionSpace()->df(uu, vv, ww, sf);
-  for (int i=0;i<3;i++) s[i] = sf[num][i];
-#endif
-}
-
-
-SPoint3 MTriangle::circumcenter()
-{
-#if defined(HAVE_GMSH_EMBEDDED)
-  return SPoint3();
-#else
-  double p1[3] = {_v[0]->x(),_v[0]->y(),_v[0]->z()};
-  double p2[3] = {_v[1]->x(),_v[1]->y(),_v[1]->z()};
-  double p3[3] = {_v[2]->x(),_v[2]->y(),_v[2]->z()};
-  double res[3];
-  circumCenterXYZ(p1,p2,p3,res);
-  return SPoint3(res[0],res[1],res[2]);
-#endif
-}
-
-SPoint3 MTetrahedron::circumcenter()
-{
-#if defined(HAVE_GMSH_EMBEDDED)
-  return SPoint3();
-#else
-  MTet4 t(this,0);
-  double res[3];
-  t.circumcenter(res);
-  return SPoint3(res[0],res[1],res[2]);
-#endif
-}
-
-
-double MTriangle::distoShapeMeasure()
-{
-#if defined(HAVE_GMSH_EMBEDDED)
-  return 1.;
-#else
-  return qmDistorsionOfMapping(this);
-#endif
-}
-
-double MTetrahedron::distoShapeMeasure()
-{
-#if defined(HAVE_GMSH_EMBEDDED)
-  return 1.;
-#else
-  return qmDistorsionOfMapping(this);
-#endif
-}
-
-double MTetrahedronN::distoShapeMeasure()
-{
-#if defined(HAVE_GMSH_EMBEDDED)
-  return 1.;
-#else
-  if (_disto < -1.e21)_disto = qmDistorsionOfMapping(this);
-  return _disto;
+  const gmshFunctionSpace* fs = getFunctionSpace(o);
+  if(fs) fs->f(u, v, w, s);
 #endif
 }
 
-
-double MTriangle::gammaShapeMeasure()
+void MElement::getGradShapeFunctions(double u, double v, double w, double s[][3], int o)
 {
-#if defined(HAVE_GMSH_EMBEDDED)
-  return 0.;
-#else
-  return qmTriangle(this, QMTRI_RHO);
-#endif
-}
-
-const gmshFunctionSpace* MTriangle::getFunctionSpace(int o) const {
-
-  int order = (o == -1) ? getPolynomialOrder() : o;
-
-  int nf = getNumFaceVertices();  
-
-  if ((nf ==0) && (o == -1)) {
-    switch (order) {
-    case 1: return &gmshFunctionSpaces::find(MSH_TRI_3); break;
-    case 2: return &gmshFunctionSpaces::find(MSH_TRI_6); break;
-    case 3: return &gmshFunctionSpaces::find(MSH_TRI_9); break;
-    case 4: return &gmshFunctionSpaces::find(MSH_TRI_12); break;
-    case 5: return &gmshFunctionSpaces::find(MSH_TRI_15I); break;
-    default: Msg::Error("Order %d triangle function space not implemented", order); break;
-    }
-  }
-  else { 
-    switch (order) {
-    case 1: return &gmshFunctionSpaces::find(MSH_TRI_3); break;
-    case 2: return &gmshFunctionSpaces::find(MSH_TRI_6); break;
-    case 3: return &gmshFunctionSpaces::find(MSH_TRI_10); break;
-    case 4: return &gmshFunctionSpaces::find(MSH_TRI_15); break;
-    case 5: return &gmshFunctionSpaces::find(MSH_TRI_21); break;
-    default: Msg::Error("Order %d triangle function space implemented", order); break;
-    }
-  }
-  return NULL;
-}
-
-double MTetrahedron::gammaShapeMeasure()
-{
-#if defined(HAVE_GMSH_EMBEDDED)
-  return 0.;
-#else
-  double vol;
-  return qmTet(this, QMTET_2, &vol);
-#endif
-}
-
-
-double MTetrahedron::etaShapeMeasure()
-{
-#if defined(HAVE_GMSH_EMBEDDED)
-  return 0.;
-#else
-  double vol;
-  return qmTet(this, QMTET_3, &vol);
+#if !defined(HAVE_GMSH_EMBEDDED)
+  const gmshFunctionSpace* fs = getFunctionSpace(o);
+  if(fs) fs->df(u, v, w, s);
 #endif
 }
 
-double MTetrahedron::getVolume()
-{
-  double mat[3][3];
-  getMat(mat);
-  return det3x3(mat) / 6.;
-}
-
-void MTetrahedron::xyz2uvw(double xyz[3], double uvw[3])
-{
-  double mat[3][3], b[3], det;
-  getMat(mat);
-  b[0] = xyz[0] - getVertex(0)->x();
-  b[1] = xyz[1] - getVertex(0)->y();
-  b[2] = xyz[2] - getVertex(0)->z();
-  sys3x3(mat, b, uvw, &det);
-}
-
-
-const gmshFunctionSpace* MTetrahedron::getFunctionSpace(int o) const {
-
-  int order = (o == -1) ? getPolynomialOrder() : o;
-
-  int nv = getNumVolumeVertices();
-  
-  
-  if ((nv == 0) && (o == -1)) {
-    switch (order) {
-    case 1: return &gmshFunctionSpaces::find(MSH_TET_4); break;
-    case 2: return &gmshFunctionSpaces::find(MSH_TET_10); break;
-    case 3: return &gmshFunctionSpaces::find(MSH_TET_20); break;
-    case 4: return &gmshFunctionSpaces::find(MSH_TET_34); break;
-    case 5: return &gmshFunctionSpaces::find(MSH_TET_52); break;
-    default: Msg::Error("Order %d tetrahedron function space not implemented", order); break;
-    }
-  }
-  else { 
-    switch (order) {
-    case 1: return &gmshFunctionSpaces::find(MSH_TET_4); break;
-    case 2: return &gmshFunctionSpaces::find(MSH_TET_10); break;
-    case 3: return &gmshFunctionSpaces::find(MSH_TET_20); break;
-    case 4: return &gmshFunctionSpaces::find(MSH_TET_35); break;
-    case 5: return &gmshFunctionSpaces::find(MSH_TET_56); break;
-    default: Msg::Error("Order %d tetrahedron function space implemented", order); break;
-    }
-  }
-  return NULL;
-}
-
-
-
-int MHexahedron::getVolumeSign()
-{ 
-  double mat[3][3];
-  mat[0][0] = _v[1]->x() - _v[0]->x();
-  mat[0][1] = _v[3]->x() - _v[0]->x();
-  mat[0][2] = _v[4]->x() - _v[0]->x();
-  mat[1][0] = _v[1]->y() - _v[0]->y();
-  mat[1][1] = _v[3]->y() - _v[0]->y();
-  mat[1][2] = _v[4]->y() - _v[0]->y();
-  mat[2][0] = _v[1]->z() - _v[0]->z();
-  mat[2][1] = _v[3]->z() - _v[0]->z();
-  mat[2][2] = _v[4]->z() - _v[0]->z();
-  return sign(det3x3(mat));
-}
-
-int MPrism::getVolumeSign()
-{ 
-  double mat[3][3];
-  mat[0][0] = _v[1]->x() - _v[0]->x();
-  mat[0][1] = _v[2]->x() - _v[0]->x();
-  mat[0][2] = _v[3]->x() - _v[0]->x();
-  mat[1][0] = _v[1]->y() - _v[0]->y();
-  mat[1][1] = _v[2]->y() - _v[0]->y();
-  mat[1][2] = _v[3]->y() - _v[0]->y();
-  mat[2][0] = _v[1]->z() - _v[0]->z();
-  mat[2][1] = _v[2]->z() - _v[0]->z();
-  mat[2][2] = _v[3]->z() - _v[0]->z();
-  return sign(det3x3(mat));
-}
-
-int MPyramid::getVolumeSign()
-{ 
-  double mat[3][3];
-  mat[0][0] = _v[1]->x() - _v[0]->x();
-  mat[0][1] = _v[3]->x() - _v[0]->x();
-  mat[0][2] = _v[4]->x() - _v[0]->x();
-  mat[1][0] = _v[1]->y() - _v[0]->y();
-  mat[1][1] = _v[3]->y() - _v[0]->y();
-  mat[1][2] = _v[4]->y() - _v[0]->y();
-  mat[2][0] = _v[1]->z() - _v[0]->z();
-  mat[2][1] = _v[3]->z() - _v[0]->z();
-  mat[2][2] = _v[4]->z() - _v[0]->z();
-  return sign(det3x3(mat));
-}
-
 SPoint3 MElement::barycenter()
 {
   SPoint3 p(0., 0., 0.);
@@ -408,14 +192,12 @@ static double _computeDeterminantAndRegularize(MElement *ele, double jac[3][3])
 
 double MElement::getJacobian(double u, double v, double w, double jac[3][3])
 {
-  const gmshFunctionSpace* fs = getFunctionSpace();
-  
   jac[0][0] = jac[0][1] = jac[0][2] = 0.;
   jac[1][0] = jac[1][1] = jac[1][2] = 0.;
   jac[2][0] = jac[2][1] = jac[2][2] = 0.;
 
   double gsf[256][3];
-  fs->df(u, v, w, gsf);
+  getGradShapeFunctions(u, v, w, gsf);
   for (int i = 0; i < getNumVertices(); i++) {
     const MVertex* v = getVertex(i);
     double* gg = gsf[i];
@@ -431,14 +213,12 @@ double MElement::getJacobian(double u, double v, double w, double jac[3][3])
 
 double MElement::getPrimaryJacobian(double u, double v, double w, double jac[3][3])
 {
-  const gmshFunctionSpace* fs = getFunctionSpace(1);
-  
   jac[0][0] = jac[0][1] = jac[0][2] = 0.;
   jac[1][0] = jac[1][1] = jac[1][2] = 0.;
   jac[2][0] = jac[2][1] = jac[2][2] = 0.;
 
   double gsf[256][3];
-  fs->df(u, v, w, gsf);
+  getGradShapeFunctions(u, v, w, gsf, 1);
   for(int i = 0; i < getNumPrimaryVertices(); i++) {
     const MVertex* v = getVertex(i);
     double* gg = gsf[i];
@@ -452,40 +232,30 @@ double MElement::getPrimaryJacobian(double u, double v, double w, double jac[3][
   return _computeDeterminantAndRegularize(this, jac);
 }
 
-void MElement::pnt(double uu, double vv, double ww, SPoint3 &p)
+void MElement::pnt(double u, double v, double w, SPoint3 &p)
 {
   double x = 0., y = 0., z = 0.;
-  const gmshFunctionSpace* fs = getFunctionSpace();
-  if(fs){
-    double sf[256];
-    fs->f(uu, vv, ww, sf);
-    for (int j = 0; j < getNumVertices(); j++) {
-      const MVertex* v = getVertex(j);
-      x += sf[j] * v->x();
-      y += sf[j] * v->y();
-      z += sf[j] * v->z();
-    } 
-  }
-  else 
-    Msg::Error("Could not find function space");
+  double sf[256];
+  getShapeFunctions(u, v, w, sf);
+  for (int j = 0; j < getNumVertices(); j++) {
+    const MVertex* v = getVertex(j);
+    x += sf[j] * v->x();
+    y += sf[j] * v->y();
+    z += sf[j] * v->z();
+  } 
   p = SPoint3(x, y, z);
 }
 
-void MElement::primaryPnt(double uu, double vv, double ww, SPoint3 &p)
+void MElement::primaryPnt(double u, double v, double w, SPoint3 &p)
 {
   double x = 0., y = 0., z = 0.;
-  const gmshFunctionSpace* fs = getFunctionSpace(1);
-  if(fs){
-    double sf[256];
-    fs->f(uu, vv, ww, sf);
-    if (getNumPrimaryVertices() != 4) 
-      Msg::Error("Incorrect number of vertices %d", getNumPrimaryVertices());
-    for (int j = 0; j < getNumPrimaryVertices(); j++) {
-      const MVertex* v = getVertex(j);
-      x += sf[j] * v->x();
-      y += sf[j] * v->y();
-      z += sf[j] * v->z();
-    } 
+  double sf[256];
+  getShapeFunctions(u, v, w, sf, 1);
+  for (int j = 0; j < getNumPrimaryVertices(); j++) {
+    const MVertex* v = getVertex(j);
+    x += sf[j] * v->x();
+    y += sf[j] * v->y();
+    z += sf[j] * v->z();
   }
   p = SPoint3(x,y,z);
 }
@@ -503,13 +273,13 @@ void MElement::xyz2uvw(double xyz[3], double uvw[3])
     double jac[3][3];
     if(!getJacobian(uvw[0], uvw[1], uvw[2], jac)) break;
     double xn = 0., yn = 0., zn = 0.;
+    double sf[256];
+    getShapeFunctions(uvw[0], uvw[1], uvw[2], sf);
     for (int i = 0; i < getNumVertices(); i++) {
-      double s;
-      getShapeFunction(i, uvw[0], uvw[1], uvw[2], s);
       MVertex *v = getVertex(i);
-      xn += v->x() * s;
-      yn += v->y() * s;
-      zn += v->z() * s;
+      xn += v->x() * sf[i];
+      yn += v->y() * sf[i];
+      zn += v->z() * sf[i];
     }
     double inv[3][3];
     inv3x3(jac, inv);
@@ -527,30 +297,31 @@ void MElement::xyz2uvw(double xyz[3], double uvw[3])
   }
 }
 
-double MElement::interpolate(double val[], double u, double v, double w, int stride)
+double MElement::interpolate(double val[], double u, double v, double w, int stride,
+                             int order)
 {
   double sum = 0;
   int j = 0;
+  double sf[256];
+  getShapeFunctions(u, v, w, sf, order);
   for(int i = 0; i < getNumVertices(); i++){
-    double s;
-    getShapeFunction(i, u, v, w, s);
-    sum += val[j] * s;
+    sum += val[j] * sf[i];
     j += stride;
   }
   return sum;
 }
 
 void MElement::interpolateGrad(double val[], double u, double v, double w, double f[3],
-                               int stride, double invjac[3][3])
+                               int stride, double invjac[3][3], int order)
 {
   double dfdu[3] = {0., 0., 0.};
   int j = 0;
+  double gsf[256][3];
+  getGradShapeFunctions(u, v, w, gsf, order);
   for(int i = 0; i < getNumVertices(); i++){
-    double s[3];
-    getGradShapeFunction(i, u, v, w, s);
-    dfdu[0] += val[j] * s[0];
-    dfdu[1] += val[j] * s[1];
-    dfdu[2] += val[j] * s[2];
+    dfdu[0] += val[j] * gsf[i][0];
+    dfdu[1] += val[j] * gsf[i][1];
+    dfdu[2] += val[j] * gsf[i][2];
     j += stride;
   }
   if(invjac){
@@ -565,27 +336,28 @@ void MElement::interpolateGrad(double val[], double u, double v, double w, doubl
 }
 
 void MElement::interpolateCurl(double val[], double u, double v, double w, double f[3],
-                               int stride)
+                               int stride, int order)
 {
   double fx[3], fy[3], fz[3], jac[3][3], inv[3][3];
   getJacobian(u, v, w, jac);
   inv3x3(jac, inv);
-  interpolateGrad(&val[0], u, v, w, fx, stride, inv);
-  interpolateGrad(&val[1], u, v, w, fy, stride, inv);
-  interpolateGrad(&val[2], u, v, w, fz, stride, inv);
+  interpolateGrad(&val[0], u, v, w, fx, stride, inv, order);
+  interpolateGrad(&val[1], u, v, w, fy, stride, inv, order);
+  interpolateGrad(&val[2], u, v, w, fz, stride, inv, order);
   f[0] = fz[1] - fy[2];
   f[1] = -(fz[0] - fx[2]);
   f[2] = fy[0] - fx[1];
 }
 
-double MElement::interpolateDiv(double val[], double u, double v, double w, int stride)
+double MElement::interpolateDiv(double val[], double u, double v, double w, int stride,
+                                int order)
 {
   double fx[3], fy[3], fz[3], jac[3][3], inv[3][3];
   getJacobian(u, v, w, jac);
   inv3x3(jac, inv);
-  interpolateGrad(&val[0], u, v, w, fx, stride, inv);
-  interpolateGrad(&val[1], u, v, w, fy, stride, inv);
-  interpolateGrad(&val[2], u, v, w, fz, stride, inv);
+  interpolateGrad(&val[0], u, v, w, fx, stride, inv, order);
+  interpolateGrad(&val[1], u, v, w, fy, stride, inv, order);
+  interpolateGrad(&val[2], u, v, w, fz, stride, inv, order);
   return fx[0] + fy[1] + fz[2];
 }
 
@@ -889,22 +661,139 @@ int MElement::getInfoMSH(const int typeMSH, const char **const name)
   }               
 }
 
-const gmshFunctionSpace* MLine::getFunctionSpace(int o) const {
+MElement *MElementFactory::create(int type, std::vector<MVertex*> &v, 
+				  int num, int part)
+{
+  switch (type) {
+  case MSH_PNT:    return new MPoint(v, num, part);
+  case MSH_LIN_2:  return new MLine(v, num, part);
+  case MSH_LIN_3:  return new MLine3(v, num, part);
+  case MSH_LIN_4:  return new MLineN(v, num, part);
+  case MSH_LIN_5:  return new MLineN(v, num, part);
+  case MSH_LIN_6:  return new MLineN(v, num, part);
+  case MSH_TRI_3:  return new MTriangle(v, num, part);
+  case MSH_TRI_6:  return new MTriangle6(v, num, part);
+  case MSH_TRI_9:  return new MTriangleN(v, 3, num, part);
+  case MSH_TRI_10: return new MTriangleN(v, 3, num, part);
+  case MSH_TRI_12: return new MTriangleN(v, 4, num, part);
+  case MSH_TRI_15: return new MTriangleN(v, 4, num, part);
+  case MSH_TRI_15I:return new MTriangleN(v, 5, num, part);
+  case MSH_TRI_21: return new MTriangleN(v, 5, num, part);
+  case MSH_QUA_4:  return new MQuadrangle(v, num, part);
+  case MSH_QUA_8:  return new MQuadrangle8(v, num, part);
+  case MSH_QUA_9:  return new MQuadrangle9(v, num, part);
+  case MSH_TET_4:  return new MTetrahedron(v, num, part);
+  case MSH_TET_10: return new MTetrahedron10(v, num, part);
+  case MSH_HEX_8:  return new MHexahedron(v, num, part);
+  case MSH_HEX_20: return new MHexahedron20(v, num, part);
+  case MSH_HEX_27: return new MHexahedron27(v, num, part);
+  case MSH_PRI_6:  return new MPrism(v, num, part);
+  case MSH_PRI_15: return new MPrism15(v, num, part);
+  case MSH_PRI_18: return new MPrism18(v, num, part);
+  case MSH_PYR_5:  return new MPyramid(v, num, part);
+  case MSH_PYR_13: return new MPyramid13(v, num, part);
+  case MSH_PYR_14: return new MPyramid14(v, num, part);
+  case MSH_TET_20: return new MTetrahedronN(v, 3, num, part);
+  case MSH_TET_34: return new MTetrahedronN(v, 3, num, part);
+  case MSH_TET_35: return new MTetrahedronN(v, 4, num, part);
+  case MSH_TET_52: return new MTetrahedronN(v, 5, num, part);
+  case MSH_TET_56: return new MTetrahedronN(v, 5, num, part);
+  default:         return 0;
+  }
+}
 
+const gmshFunctionSpace* MLine::getFunctionSpace(int o) const
+{
   int order = o == -1 ? getPolynomialOrder() : o;
   
   switch (order) {
-  case 1: return &gmshFunctionSpaces::find(MSH_LIN_2); break;
-  case 2: return &gmshFunctionSpaces::find(MSH_LIN_3); break;
-  case 3: return &gmshFunctionSpaces::find(MSH_LIN_4); break;
-  case 4: return &gmshFunctionSpaces::find(MSH_LIN_5); break;
-  case 5: return &gmshFunctionSpaces::find(MSH_LIN_6); break;
-  default: 
-    Msg::Error("Order %d line point interpolation not implemented",
-	       getPolynomialOrder()); 
-    break;
+  case 1: return &gmshFunctionSpaces::find(MSH_LIN_2);
+  case 2: return &gmshFunctionSpaces::find(MSH_LIN_3);
+  case 3: return &gmshFunctionSpaces::find(MSH_LIN_4);
+  case 4: return &gmshFunctionSpaces::find(MSH_LIN_5);
+  case 5: return &gmshFunctionSpaces::find(MSH_LIN_6);
+  default: Msg::Error("Order %d line function space not implemented", order);
   }
-  return NULL;
+  return 0;
+}
+
+void MLine::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+{
+#if !defined(HAVE_GMSH_EMBEDDED)
+  static IntPt GQL[100]; 
+  double *t, *w;
+  int nbP = pOrder / 2 + 1;
+  gmshGaussLegendre1D(nbP, &t, &w);
+  for (int i = 0; i < nbP; i++){
+    GQL[i].pt[0] = t[i];
+    GQL[i].pt[1] = 0;
+    GQL[i].pt[2] = 0;
+    GQL[i].weight = w[i];
+  }
+  *npts = nbP;
+  *pts = GQL;
+#endif
+}
+
+SPoint3 MTriangle::circumcenter()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return SPoint3();
+#else
+  double p1[3] = {_v[0]->x(), _v[0]->y(), _v[0]->z()};
+  double p2[3] = {_v[1]->x(), _v[1]->y(), _v[1]->z()};
+  double p3[3] = {_v[2]->x(), _v[2]->y(), _v[2]->z()};
+  double res[3];
+  circumCenterXYZ(p1, p2, p3, res);
+  return SPoint3(res[0], res[1], res[2]);
+#endif
+}
+
+double MTriangle::distoShapeMeasure()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return 1.;
+#else
+  return qmDistorsionOfMapping(this);
+#endif
+}
+
+double MTriangle::gammaShapeMeasure()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return 0.;
+#else
+  return qmTriangle(this, QMTRI_RHO);
+#endif
+}
+
+const gmshFunctionSpace* MTriangle::getFunctionSpace(int o) const
+{
+  int order = (o == -1) ? getPolynomialOrder() : o;
+
+  int nf = getNumFaceVertices();  
+
+  if ((nf == 0) && (o == -1)) {
+    switch (order) {
+    case 1: return &gmshFunctionSpaces::find(MSH_TRI_3);
+    case 2: return &gmshFunctionSpaces::find(MSH_TRI_6);
+    case 3: return &gmshFunctionSpaces::find(MSH_TRI_9);
+    case 4: return &gmshFunctionSpaces::find(MSH_TRI_12);
+    case 5: return &gmshFunctionSpaces::find(MSH_TRI_15I);
+    default: Msg::Error("Order %d triangle function space not implemented", order);
+    }
+  }
+  else { 
+    switch (order) {
+    case 1: return &gmshFunctionSpaces::find(MSH_TRI_3);
+    case 2: return &gmshFunctionSpaces::find(MSH_TRI_6);
+    case 3: return &gmshFunctionSpaces::find(MSH_TRI_10);
+    case 4: return &gmshFunctionSpaces::find(MSH_TRI_15);
+    case 5: return &gmshFunctionSpaces::find(MSH_TRI_21);
+    default: Msg::Error("Order %d triangle function space not implemented", order);
+    }
+  }
+  return 0;
 }
 
 const int numSubEdges = 12;
@@ -1008,6 +897,123 @@ void MTriangleN::getEdgeRep(int num, double *x, double *y, double *z, SVector3 *
   }
 }
 
+void MTriangle::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+{
+#if !defined(HAVE_GMSH_EMBEDDED)
+  extern int getNGQTPts(int order);
+  extern IntPt *getGQTPts (int order);
+  *npts = getNGQTPts(pOrder);
+  *pts = getGQTPts(pOrder);
+#endif
+}
+
+void MQuadrangle::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+{
+#if !defined(HAVE_GMSH_EMBEDDED)
+  extern int getNGQQPts(int order);
+  extern IntPt *getGQQPts(int order);
+  *npts = getNGQQPts(pOrder);
+  *pts = getGQQPts(pOrder);
+#endif
+}
+
+SPoint3 MTetrahedron::circumcenter()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return SPoint3();
+#else
+  MTet4 t(this,0);
+  double res[3];
+  t.circumcenter(res);
+  return SPoint3(res[0],res[1],res[2]);
+#endif
+}
+
+double MTetrahedron::distoShapeMeasure()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return 1.;
+#else
+  return qmDistorsionOfMapping(this);
+#endif
+}
+
+double MTetrahedronN::distoShapeMeasure()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return 1.;
+#else
+  if (_disto < -1.e21)_disto = qmDistorsionOfMapping(this);
+  return _disto;
+#endif
+}
+
+double MTetrahedron::gammaShapeMeasure()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return 0.;
+#else
+  double vol;
+  return qmTet(this, QMTET_2, &vol);
+#endif
+}
+
+double MTetrahedron::etaShapeMeasure()
+{
+#if defined(HAVE_GMSH_EMBEDDED)
+  return 0.;
+#else
+  double vol;
+  return qmTet(this, QMTET_3, &vol);
+#endif
+}
+
+double MTetrahedron::getVolume()
+{
+  double mat[3][3];
+  getMat(mat);
+  return det3x3(mat) / 6.;
+}
+
+void MTetrahedron::xyz2uvw(double xyz[3], double uvw[3])
+{
+  double mat[3][3], b[3], det;
+  getMat(mat);
+  b[0] = xyz[0] - getVertex(0)->x();
+  b[1] = xyz[1] - getVertex(0)->y();
+  b[2] = xyz[2] - getVertex(0)->z();
+  sys3x3(mat, b, uvw, &det);
+}
+
+const gmshFunctionSpace* MTetrahedron::getFunctionSpace(int o) const
+{
+  int order = (o == -1) ? getPolynomialOrder() : o;
+
+  int nv = getNumVolumeVertices();
+  
+  if ((nv == 0) && (o == -1)) {
+    switch (order) {
+    case 1: return &gmshFunctionSpaces::find(MSH_TET_4);
+    case 2: return &gmshFunctionSpaces::find(MSH_TET_10);
+    case 3: return &gmshFunctionSpaces::find(MSH_TET_20);
+    case 4: return &gmshFunctionSpaces::find(MSH_TET_34);
+    case 5: return &gmshFunctionSpaces::find(MSH_TET_52);
+    default: Msg::Error("Order %d tetrahedron function space not implemented", order);
+    }
+  }
+  else { 
+    switch (order) {
+    case 1: return &gmshFunctionSpaces::find(MSH_TET_4);
+    case 2: return &gmshFunctionSpaces::find(MSH_TET_10);
+    case 3: return &gmshFunctionSpaces::find(MSH_TET_20);
+    case 4: return &gmshFunctionSpaces::find(MSH_TET_35);
+    case 5: return &gmshFunctionSpaces::find(MSH_TET_56);
+    default: Msg::Error("Order %d tetrahedron function space not implemented", order);
+    }
+  }
+  return 0;
+}
+
 int MTetrahedronN::getNumEdgesRep(){ return 6 * numSubEdges; }
 
 void MTetrahedronN::getEdgeRep(int num, double *x, double *y, double *z, SVector3 *n)
@@ -1142,103 +1148,68 @@ void MTetrahedronN::getFaceRep(int num, double *x, double *y, double *z, SVector
   }
 }
 
-MElement *MElementFactory::create(int type, std::vector<MVertex*> &v, 
-				  int num, int part)
-{
-  switch (type) {
-  case MSH_PNT:    return new MPoint(v, num, part);
-  case MSH_LIN_2:  return new MLine(v, num, part);
-  case MSH_LIN_3:  return new MLine3(v, num, part);
-  case MSH_LIN_4:  return new MLineN(v, num, part);
-  case MSH_LIN_5:  return new MLineN(v, num, part);
-  case MSH_LIN_6:  return new MLineN(v, num, part);
-  case MSH_TRI_3:  return new MTriangle(v, num, part);
-  case MSH_TRI_6:  return new MTriangle6(v, num, part);
-  case MSH_TRI_9:  return new MTriangleN(v, 3, num, part);
-  case MSH_TRI_10: return new MTriangleN(v, 3, num, part);
-  case MSH_TRI_12: return new MTriangleN(v, 4, num, part);
-  case MSH_TRI_15: return new MTriangleN(v, 4, num, part);
-  case MSH_TRI_15I:return new MTriangleN(v, 5, num, part);
-  case MSH_TRI_21: return new MTriangleN(v, 5, num, part);
-  case MSH_QUA_4:  return new MQuadrangle(v, num, part);
-  case MSH_QUA_8:  return new MQuadrangle8(v, num, part);
-  case MSH_QUA_9:  return new MQuadrangle9(v, num, part);
-  case MSH_TET_4:  return new MTetrahedron(v, num, part);
-  case MSH_TET_10: return new MTetrahedron10(v, num, part);
-  case MSH_HEX_8:  return new MHexahedron(v, num, part);
-  case MSH_HEX_20: return new MHexahedron20(v, num, part);
-  case MSH_HEX_27: return new MHexahedron27(v, num, part);
-  case MSH_PRI_6:  return new MPrism(v, num, part);
-  case MSH_PRI_15: return new MPrism15(v, num, part);
-  case MSH_PRI_18: return new MPrism18(v, num, part);
-  case MSH_PYR_5:  return new MPyramid(v, num, part);
-  case MSH_PYR_13: return new MPyramid13(v, num, part);
-  case MSH_PYR_14: return new MPyramid14(v, num, part);
-  case MSH_TET_20: return new MTetrahedronN(v, 3, num, part);
-  case MSH_TET_34: return new MTetrahedronN(v, 3, num, part);
-  case MSH_TET_35: return new MTetrahedronN(v, 4, num, part);
-  case MSH_TET_52: return new MTetrahedronN(v, 5, num, part);
-  case MSH_TET_56: return new MTetrahedronN(v, 5, num, part);
-  default:         return 0;
-  }
-}
-
-extern int getNGQTPts(int order);
-extern IntPt *getGQTPts (int order);
-extern int getNGQTetPts(int order);
-extern IntPt *getGQTetPts(int order);
-extern int getNGQQPts(int order);
-extern IntPt *getGQQPts(int order);
-extern int getNGQHPts(int order);
-extern IntPt *getGQHPts(int order);
-
-IntPt GQL[100]; 
-
-void MLine::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
-{
-#if !defined(HAVE_GMSH_EMBEDDED)
-  double *t, *w;
-  int nbP = pOrder / 2 + 1;
-  gmshGaussLegendre1D(nbP, &t, &w);
-  for (int i = 0; i < nbP; i++){
-    GQL[i].pt[0] = t[i];
-    GQL[i].pt[1] = 0;
-    GQL[i].pt[2] = 0;
-    GQL[i].weight = w[i];
-  }
-  *npts = nbP;
-  *pts = GQL;
-#endif
-}
-
-void MTriangle:: getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
-{
-#if !defined(HAVE_GMSH_EMBEDDED)
-  *npts = getNGQTPts(pOrder);
-  *pts = getGQTPts(pOrder);
-#endif
-}
 
 void MTetrahedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
 {
 #if !defined(HAVE_GMSH_EMBEDDED)
+  extern int getNGQTetPts(int order);
+  extern IntPt *getGQTetPts(int order);
   *npts = getNGQTetPts(pOrder);
   *pts = getGQTetPts(pOrder);
 #endif
 }
 
+int MHexahedron::getVolumeSign()
+{ 
+  double mat[3][3];
+  mat[0][0] = _v[1]->x() - _v[0]->x();
+  mat[0][1] = _v[3]->x() - _v[0]->x();
+  mat[0][2] = _v[4]->x() - _v[0]->x();
+  mat[1][0] = _v[1]->y() - _v[0]->y();
+  mat[1][1] = _v[3]->y() - _v[0]->y();
+  mat[1][2] = _v[4]->y() - _v[0]->y();
+  mat[2][0] = _v[1]->z() - _v[0]->z();
+  mat[2][1] = _v[3]->z() - _v[0]->z();
+  mat[2][2] = _v[4]->z() - _v[0]->z();
+  return sign(det3x3(mat));
+}
+
 void MHexahedron::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
 {
 #if !defined(HAVE_GMSH_EMBEDDED)
+  extern int getNGQHPts(int order);
+  extern IntPt *getGQHPts(int order);
   *npts = getNGQHPts(pOrder);
   *pts = getGQHPts(pOrder);
 #endif
 }
 
-void MQuadrangle::getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
-{
-#if !defined(HAVE_GMSH_EMBEDDED)
-  *npts = getNGQQPts(pOrder);
-  *pts = getGQQPts(pOrder);
-#endif
+int MPrism::getVolumeSign()
+{ 
+  double mat[3][3];
+  mat[0][0] = _v[1]->x() - _v[0]->x();
+  mat[0][1] = _v[2]->x() - _v[0]->x();
+  mat[0][2] = _v[3]->x() - _v[0]->x();
+  mat[1][0] = _v[1]->y() - _v[0]->y();
+  mat[1][1] = _v[2]->y() - _v[0]->y();
+  mat[1][2] = _v[3]->y() - _v[0]->y();
+  mat[2][0] = _v[1]->z() - _v[0]->z();
+  mat[2][1] = _v[2]->z() - _v[0]->z();
+  mat[2][2] = _v[3]->z() - _v[0]->z();
+  return sign(det3x3(mat));
+}
+
+int MPyramid::getVolumeSign()
+{ 
+  double mat[3][3];
+  mat[0][0] = _v[1]->x() - _v[0]->x();
+  mat[0][1] = _v[3]->x() - _v[0]->x();
+  mat[0][2] = _v[4]->x() - _v[0]->x();
+  mat[1][0] = _v[1]->y() - _v[0]->y();
+  mat[1][1] = _v[3]->y() - _v[0]->y();
+  mat[1][2] = _v[4]->y() - _v[0]->y();
+  mat[2][0] = _v[1]->z() - _v[0]->z();
+  mat[2][1] = _v[3]->z() - _v[0]->z();
+  mat[2][2] = _v[4]->z() - _v[0]->z();
+  return sign(det3x3(mat));
 }
diff --git a/Geo/MElement.h b/Geo/MElement.h
index 4a7be4599d9f02f0539fa48532851f53ed269662..9368ed4c179f08a785b06021615d11678af56a71 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -160,20 +160,23 @@ class MElement
   virtual std::string getInfoString();
 
   // get the function space for the element
-  virtual const gmshFunctionSpace* getFunctionSpace(int ord = -1) const 
+  virtual const gmshFunctionSpace* getFunctionSpace(int order=-1) const
   {
-    Msg::Fatal("Function space not implemented for element %s", getStringForPOS());
+    Msg::Error("Function space not implemented for this type of element");
     return 0;
   }
   
-  // return the interpolating nodal shape function associated with
-  // node num, evaluated at point (u,v,w) in parametric coordinates
-  virtual void getShapeFunction(int num, double u, double v, double w, double &s);
-
-  // return the gradient of of the nodal shape function associated
-  // with node num, evaluated at point (u,v,w) in parametric
-  // coordinates
-  virtual void getGradShapeFunction(int num, double u, double v, double w, double s[3]);
+  // return the interpolating nodal shape functions evaluated at point
+  // (u,v,w) in parametric coordinates (if order == -1, use the
+  // polynomial order of the element)
+  virtual void getShapeFunctions(double u, double v, double w, double s[],
+                                 int order=-1);
+
+  // return the gradient of of the nodal shape functions evaluated at
+  // point (u,v,w) in parametric coordinates (if order == -1, use the
+  // polynomial order of the element)
+  virtual void getGradShapeFunctions(double u, double v, double w, double s[][3],
+                                     int order=-1);
   
   // return the Jacobian of the element evaluated at point (u,v,w) in
   // parametric coordinates
@@ -194,16 +197,21 @@ class MElement
 
   // interpolate the given nodal data (resp. its gradient, curl and
   // divergence) at point (u,v,w) in parametric coordinates
-  double interpolate(double val[], double u, double v, double w, int stride=1);
+  double interpolate(double val[], double u, double v, double w, int stride=1, 
+                     int order=-1);
   void interpolateGrad(double val[], double u, double v, double w, double f[3],
-                       int stride=1, double invjac[3][3]=0);
+                       int stride=1, double invjac[3][3]=0, int order=-1);
   void interpolateCurl(double val[], double u, double v, double w, double f[3],
-                       int stride=3);
-  double interpolateDiv(double val[], double u, double v, double w, int stride=3);
+                       int stride=3, int order=-1);
+  double interpolateDiv(double val[], double u, double v, double w, int stride=3,
+                        int order=-1);
 
   // integration routine 
-  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const;
-  
+  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts) const
+  {
+    Msg::Error("No integration points defined for this type of element");
+  }
+
   // IO routines
   virtual void writeMSH(FILE *fp, double version=1.0, bool binary=false, 
                         int num=0, int elementary=1, int physical=1);
@@ -227,7 +235,7 @@ class MElement
 
   // return the number of vertices, as well as the element name if
   // 'name' != 0
-  static int getInfoMSH(const int typeMSH, const char **const name = 0);
+  static int getInfoMSH(const int typeMSH, const char **const name=0);
 };
 
 class MElementLessThanLexicographic{
@@ -284,13 +292,13 @@ class MPoint : public MElement {
   virtual int getTypeForMSH() const { return MSH_PNT; }
   virtual int getTypeForVTK() const { return 1; }
   virtual const char *getStringForPOS() const { return "SP"; }
-  virtual void getShapeFunction(int num, double u, double v, double w, double &s) 
+  virtual void getShapeFunctions(double u, double v, double w, double s[], int o) 
   {
-    s = 1.;
+    s[0] = 1.;
   }
-  virtual void getGradShapeFunction(int num, double u, double v, double w, double s[3]) 
+  virtual void getGradShapeFunctions(double u, double v, double w, double s[][3], int o) 
   {
-    s[0] = s[1] = s[2] = 0.;
+    s[0][0] = s[0][1] = s[0][2] = 0.;
   }
   virtual bool isInside(double u, double v, double w, double tol=1.e-8)
   {
@@ -860,6 +868,20 @@ class MQuadrangle : public MElement {
   {
     MVertex *tmp = _v[1]; _v[1] = _v[3]; _v[3] = tmp;
   }
+  virtual void getShapeFunctions(double u, double v, double w, double s[], int o) 
+  {
+    s[0] = (1. - u) * (1. - v) * 0.25;
+    s[1] = (1. + u) * (1. - v) * 0.25;
+    s[2] = (1. + u) * (1. + v) * 0.25;
+    s[3] = (1. - u) * (1. + v) * 0.25;
+  }
+  virtual void getGradShapeFunctions(double u, double v, double w, double s[][3], int o) 
+  {
+    s[0][0] = -0.25 * (1. - v); s[0][1] = -0.25 * (1. - u); s[0][2] = 0.;
+    s[1][0] =  0.25 * (1. - v); s[1][1] = -0.25 * (1. + u); s[1][2] = 0.;
+    s[2][0] =  0.25 * (1. + v); s[2][1] =  0.25 * (1. + u); s[2][2] = 0.;
+    s[3][0] = -0.25 * (1. + v); s[3][1] =  0.25 * (1. - u); s[3][2] = 0.;
+  }
   virtual bool isInside(double u, double v, double w, double tol=1.e-8)
   {
     if(u < -(1. + tol) || v < -(1. + tol) || u > (1. + tol) || v > (1. + tol))
@@ -1492,7 +1514,7 @@ class MTetrahedronN : public MTetrahedron {
     default:
       {
         Msg::Error("Reversion of %d order tetrahedron (type %d) not implemented\n",
-                   _order,getTypeForMSH());
+                   _order, getTypeForMSH());
         break;
       }
     }
@@ -1613,49 +1635,43 @@ class MHexahedron : public MElement {
     tmp = _v[4]; _v[4] = _v[6]; _v[6] = tmp;
   }
   virtual int getVolumeSign();
-  virtual void getShapeFunction(int num, double u, double v, double w, double &s) 
-  {
-    switch(num) {
-    case 0  : s = (1. - u) * (1. - v) * (1. - w) * 0.125; break;
-    case 1  : s = (1. + u) * (1. - v) * (1. - w) * 0.125; break;
-    case 2  : s = (1. + u) * (1. + v) * (1. - w) * 0.125; break;
-    case 3  : s = (1. - u) * (1. + v) * (1. - w) * 0.125; break;
-    case 4  : s = (1. - u) * (1. - v) * (1. + w) * 0.125; break;
-    case 5  : s = (1. + u) * (1. - v) * (1. + w) * 0.125; break;
-    case 6  : s = (1. + u) * (1. + v) * (1. + w) * 0.125; break;
-    case 7  : s = (1. - u) * (1. + v) * (1. + w) * 0.125; break;
-    default : s = 0.; break;
-    }
-  }
-  virtual void getGradShapeFunction(int num, double u, double v, double w, double s[3]) 
-  {
-    switch(num) {
-    case 0  : s[0] = -0.125 * (1. - v) * (1. - w);
-              s[1] = -0.125 * (1. - u) * (1. - w);
-              s[2] = -0.125 * (1. - u) * (1. - v); break;
-    case 1  : s[0] =  0.125 * (1. - v) * (1. - w);
-              s[1] = -0.125 * (1. + u) * (1. - w);
-              s[2] = -0.125 * (1. + u) * (1. - v); break;
-    case 2  : s[0] =  0.125 * (1. + v) * (1. - w);
-              s[1] =  0.125 * (1. + u) * (1. - w);
-              s[2] = -0.125 * (1. + u) * (1. + v); break;
-    case 3  : s[0] = -0.125 * (1. + v) * (1. - w);
-              s[1] =  0.125 * (1. - u) * (1. - w);
-              s[2] = -0.125 * (1. - u) * (1. + v); break;
-    case 4  : s[0] = -0.125 * (1. - v) * (1. + w);
-              s[1] = -0.125 * (1. - u) * (1. + w);
-              s[2] =  0.125 * (1. - u) * (1. - v); break;
-    case 5  : s[0] =  0.125 * (1. - v) * (1. + w);
-              s[1] = -0.125 * (1. + u) * (1. + w);
-              s[2] =  0.125 * (1. + u) * (1. - v); break;
-    case 6  : s[0] =  0.125 * (1. + v) * (1. + w);
-              s[1] =  0.125 * (1. + u) * (1. + w);
-              s[2] =  0.125 * (1. + u) * (1. + v); break;
-    case 7  : s[0] = -0.125 * (1. + v) * (1. + w);
-              s[1] =  0.125 * (1. - u) * (1. + w);
-              s[2] =  0.125 * (1. - u) * (1. + v); break;
-    default : s[0] = s[1] = s[2] = 0.; break;
-    }
+  virtual void getShapeFunctions(double u, double v, double w, double s[], int o) 
+  {
+    s[0] = (1. - u) * (1. - v) * (1. - w) * 0.125;
+    s[1] = (1. + u) * (1. - v) * (1. - w) * 0.125;
+    s[2] = (1. + u) * (1. + v) * (1. - w) * 0.125;
+    s[3] = (1. - u) * (1. + v) * (1. - w) * 0.125;
+    s[4] = (1. - u) * (1. - v) * (1. + w) * 0.125;
+    s[5] = (1. + u) * (1. - v) * (1. + w) * 0.125;
+    s[6] = (1. + u) * (1. + v) * (1. + w) * 0.125;
+    s[7] = (1. - u) * (1. + v) * (1. + w) * 0.125;
+  }
+  virtual void getGradShapeFunctions(double u, double v, double w, double s[][3], int o) 
+  {
+    s[0][0] = -0.125 * (1. - v) * (1. - w);
+    s[0][1] = -0.125 * (1. - u) * (1. - w);
+    s[0][2] = -0.125 * (1. - u) * (1. - v);
+    s[1][0] =  0.125 * (1. - v) * (1. - w);
+    s[1][1] = -0.125 * (1. + u) * (1. - w);
+    s[1][2] = -0.125 * (1. + u) * (1. - v);
+    s[2][0] =  0.125 * (1. + v) * (1. - w);
+    s[2][1] =  0.125 * (1. + u) * (1. - w);
+    s[2][2] = -0.125 * (1. + u) * (1. + v);
+    s[3][0] = -0.125 * (1. + v) * (1. - w);
+    s[3][1] =  0.125 * (1. - u) * (1. - w);
+    s[3][2] = -0.125 * (1. - u) * (1. + v);
+    s[4][0] = -0.125 * (1. - v) * (1. + w);
+    s[4][1] = -0.125 * (1. - u) * (1. + w);
+    s[4][2] =  0.125 * (1. - u) * (1. - v);
+    s[5][0] =  0.125 * (1. - v) * (1. + w);
+    s[5][1] = -0.125 * (1. + u) * (1. + w);
+    s[5][2] =  0.125 * (1. + u) * (1. - v);
+    s[6][0] =  0.125 * (1. + v) * (1. + w);
+    s[6][1] =  0.125 * (1. + u) * (1. + w);
+    s[6][2] =  0.125 * (1. + u) * (1. + v);
+    s[7][0] = -0.125 * (1. + v) * (1. + w);
+    s[7][1] =  0.125 * (1. - u) * (1. + w);
+    s[7][2] =  0.125 * (1. - u) * (1. + v);
   }
   virtual bool isInside(double u, double v, double w, double tol=1.e-8)
   {
@@ -2087,41 +2103,35 @@ class MPrism : public MElement {
     tmp = _v[3]; _v[3] = _v[4]; _v[4] = tmp;
   }
   virtual int getVolumeSign();
-  virtual void getShapeFunction(int num, double u, double v, double w, double &s) 
-  {
-    switch(num) {
-    case 0  : s = (1. - u - v) * (1. - w) * 0.5; break;
-    case 1  : s =       u      * (1. - w) * 0.5; break;
-    case 2  : s =           v  * (1. - w) * 0.5; break;
-    case 3  : s = (1. - u - v) * (1. + w) * 0.5; break;
-    case 4  : s =       u      * (1. + w) * 0.5; break;
-    case 5  : s =           v  * (1. + w) * 0.5; break;
-    default : s = 0.; break;
-    }
-  }
-  virtual void getGradShapeFunction(int num, double u, double v, double w, double s[3]) 
-  {
-    switch(num) {
-    case 0  : s[0] = -0.5 * (1. - w)    ; 
-              s[1] = -0.5 * (1. - w)    ;
-              s[2] = -0.5 * (1. - u - v); break;
-    case 1  : s[0] =  0.5 * (1. - w)    ; 
-              s[1] =  0.                ;
-              s[2] = -0.5 * u           ; break;
-    case 2  : s[0] =  0.                ; 
-              s[1] =  0.5 * (1. - w)    ;
-              s[2] = -0.5 * v           ; break;
-    case 3  : s[0] = -0.5 * (1. + w)    ; 
-              s[1] = -0.5 * (1. + w)    ;
-              s[2] =  0.5 * (1. - u - v); break;
-    case 4  : s[0] =  0.5 * (1. + w)    ; 
-              s[1] =  0.                ;
-              s[2] =  0.5 * u           ; break;
-    case 5  : s[0] =  0.                ; 
-              s[1] =  0.5 * (1. + w)    ;
-              s[2] =  0.5 * v           ; break;
-    default : s[0] = s[1] = s[2] = 0.; break;
-    }
+  virtual void getShapeFunctions(double u, double v, double w, double s[], int o) 
+  {
+    s[0] = (1. - u - v) * (1. - w) * 0.5;
+    s[1] =       u      * (1. - w) * 0.5;
+    s[2] =           v  * (1. - w) * 0.5;
+    s[3] = (1. - u - v) * (1. + w) * 0.5;
+    s[4] =       u      * (1. + w) * 0.5;
+    s[5] =           v  * (1. + w) * 0.5;
+  }
+  virtual void getGradShapeFunctions(double u, double v, double w, double s[][3], int o) 
+  {
+    s[0][0] = -0.5 * (1. - w)    ;
+    s[0][1] = -0.5 * (1. - w)    ;
+    s[0][2] = -0.5 * (1. - u - v);
+    s[1][0] =  0.5 * (1. - w)    ;
+    s[1][1] =  0.                ;
+    s[1][2] = -0.5 * u           ;
+    s[2][0] =  0.                ;
+    s[2][1] =  0.5 * (1. - w)    ;
+    s[2][2] = -0.5 * v           ;
+    s[3][0] = -0.5 * (1. + w)    ;
+    s[3][1] = -0.5 * (1. + w)    ;
+    s[3][2] =  0.5 * (1. - u - v);
+    s[4][0] =  0.5 * (1. + w)    ;
+    s[4][1] =  0.                ;
+    s[4][2] =  0.5 * u           ;
+    s[5][0] =  0.                ;
+    s[5][1] =  0.5 * (1. + w)    ;
+    s[5][2] =  0.5 * v           ;
   }
   virtual bool isInside(double u, double v, double w, double tol=1.e-8)
   {
@@ -2526,47 +2536,41 @@ class MPyramid : public MElement {
     MVertex *tmp = _v[0]; _v[0] = _v[2]; _v[2] = tmp;
   }
   virtual int getVolumeSign();
-  virtual void getShapeFunction(int num, double u, double v, double w, double &s) 
-  {
-    double r;
-    if(w != 1. && num != 4) r = u * v * w / (1. - w);
-    else                    r = 0.;
-    switch(num) {
-    case 0  : s = 0.25 * ((1. - u) * (1. - v) - w + r); break;
-    case 1  : s = 0.25 * ((1. + u) * (1. - v) - w - r); break;
-    case 2  : s = 0.25 * ((1. + u) * (1. + v) - w + r); break;
-    case 3  : s = 0.25 * ((1. - u) * (1. + v) - w - r); break;
-    case 4  : s = w; break;
-    default : s = 0.; break;
-    }
-  }
-  virtual void getGradShapeFunction(int num, double u, double v, double w, double s[3]) 
-  {
-    if(w == 1. && num != 4) {
-      s[0] =  0.25; 
-      s[1] =  0.25;
-      s[2] = -0.25; 
+  virtual void getShapeFunctions(double u, double v, double w, double s[], int o) 
+  {
+    double r = (w != 1.) ? (u * v * w / (1. - w)) : 0.;
+    s[0] = 0.25 * ((1. - u) * (1. - v) - w + r);
+    s[1] = 0.25 * ((1. + u) * (1. - v) - w - r);
+    s[2] = 0.25 * ((1. + u) * (1. + v) - w + r);
+    s[3] = 0.25 * ((1. - u) * (1. + v) - w - r);
+    s[4] = w;
+  }
+  virtual void getGradShapeFunctions(double u, double v, double w, double s[][3], int o) 
+  {
+    if(w == 1.) {
+      for(int i = 0; i < 4; i++){
+        s[i][0] =  0.25; 
+        s[i][1] =  0.25;
+        s[i][2] = -0.25; 
+      }
     }
     else{
-      switch(num) {
-      case 0  : s[0] = 0.25 * (-(1. - v) + v * w / (1. - w));
-                s[1] = 0.25 * (-(1. - u) + u * w / (1. - w));
-                s[2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w)); break;
-      case 1  : s[0] = 0.25 * ( (1. - v) + v * w / (1. - w));
-                s[1] = 0.25 * (-(1. + u) + u * w / (1. - w));
-                s[2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w)); break;
-      case 2  : s[0] = 0.25 * ( (1. + v) + v * w / (1. - w));
-                s[1] = 0.25 * ( (1. + u) + u * w / (1. - w));
-                s[2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w)); break;
-      case 3  : s[0] = 0.25 * (-(1. + v) + v * w / (1. - w));
-                s[1] = 0.25 * ( (1. - u) + u * w / (1. - w));
-                s[2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w)); break;
-      case 4  : s[0] = 0.; 
-                s[1] = 0.;
-                s[2] = 1.; break;
-      default : s[0] = s[1] = s[2] = 0.; break;
-      }
+      s[0][0] = 0.25 * (-(1. - v) + v * w / (1. - w));
+      s[0][1] = 0.25 * (-(1. - u) + u * w / (1. - w));
+      s[0][2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w));
+      s[1][0] = 0.25 * ( (1. - v) + v * w / (1. - w));
+      s[1][1] = 0.25 * (-(1. + u) + u * w / (1. - w));
+      s[1][2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w));
+      s[2][0] = 0.25 * ( (1. + v) + v * w / (1. - w));
+      s[2][1] = 0.25 * ( (1. + u) + u * w / (1. - w));
+      s[2][2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w));
+      s[3][0] = 0.25 * (-(1. + v) + v * w / (1. - w));
+      s[3][1] = 0.25 * ( (1. - u) + u * w / (1. - w));
+      s[3][2] = 0.25 * (-1.       + u * v / (1. - w) / (1. - w));
     }
+    s[4][0] = 0.; 
+    s[4][1] = 0.;
+    s[4][2] = 1.;
   }
   virtual bool isInside(double u, double v, double w, double tol=1.e-8)
   {
diff --git a/Geo/Makefile b/Geo/Makefile
index 0f673e99f95eb329fe7788caff1e781b0e396f57..b09968effaaaa1acc0db2d04b820e56b13d8ffcc 100644
--- a/Geo/Makefile
+++ b/Geo/Makefile
@@ -70,16 +70,20 @@ depend:
 GEntity.o: GEntity.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
   GEdgeLoop.h Pair.h GRegion.h MElement.h ../Common/GmshDefines.h \
-  MVertex.h MEdge.h MFace.h ../Common/VertexArray.h ../Geo/SVector3.h \
-  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
+  MVertex.h MEdge.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
+  ../Common/VertexArray.h ../Geo/SVector3.h ../Common/Context.h \
+  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 GVertex.o: GVertex.cpp GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GFace.h GEdgeLoop.h GEdge.h \
   SVector3.h Pair.h MElement.h ../Common/GmshDefines.h MVertex.h MEdge.h \
-  MFace.h ../Common/Message.h
+  MFace.h ../Common/Message.h ../Numeric/FunctionSpace.h \
+  ../Common/GmshMatrix.h
 GEdge.o: GEdge.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
   GEdgeLoop.h Pair.h GRegion.h MElement.h ../Common/GmshDefines.h \
   MVertex.h MEdge.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   ../Numeric/GaussLegendre1D.h
 GEdgeLoop.o: GEdgeLoop.cpp GEdgeLoop.h GEdge.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h GVertex.h GPoint.h SPoint2.h SVector3.h \
@@ -87,14 +91,16 @@ GEdgeLoop.o: GEdgeLoop.cpp GEdgeLoop.h GEdge.h GEntity.h Range.h \
 GFace.o: GFace.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
   GEdgeLoop.h Pair.h GRegion.h MElement.h ../Common/GmshDefines.h \
-  MVertex.h MEdge.h MFace.h ../Common/Message.h ../Numeric/Numeric.h \
+  MVertex.h MEdge.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
+  ../Common/VertexArray.h ../Geo/SVector3.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Numeric/GaussLegendre1D.h \
-  ../Common/VertexArray.h ../Geo/SVector3.h ../Common/Context.h \
-  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
+  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 GRegion.o: GRegion.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
   GEdgeLoop.h Pair.h GRegion.h MElement.h ../Common/GmshDefines.h \
-  MVertex.h MEdge.h MFace.h ../Common/Message.h
+  MVertex.h MEdge.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h
 gmshVertex.o: gmshVertex.cpp GFace.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h GEdgeLoop.h GEdge.h GVertex.h SPoint2.h \
   SVector3.h Pair.h gmshVertex.h Geo.h ../Common/GmshDefines.h \
@@ -102,7 +108,7 @@ gmshVertex.o: gmshVertex.cpp GFace.h GEntity.h Range.h SPoint3.h \
   ../Common/ListUtils.h ../Common/TreeUtils.h ../Common/avl.h \
   ../Common/ListUtils.h ExtrudeParams.h ../Common/SmoothData.h \
   GeoInterpolation.h ../Common/Message.h MVertex.h MElement.h MEdge.h \
-  MFace.h
+  MFace.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h
 gmshEdge.o: gmshEdge.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
   GEdgeLoop.h Pair.h GRegion.h gmshEdge.h Geo.h ../Common/GmshDefines.h \
@@ -131,8 +137,10 @@ gmshSurface.o: gmshSurface.cpp gmshSurface.h Pair.h Range.h SPoint2.h \
   ../Numeric/NumericEmbedded.h ../Common/Message.h
 OCCVertex.o: OCCVertex.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
-  GEdgeLoop.h Pair.h GRegion.h OCCVertex.h OCCIncludes.h OCCEdge.h \
-  OCCFace.h MVertex.h MElement.h ../Common/GmshDefines.h MEdge.h MFace.h
+  GEdgeLoop.h Pair.h GRegion.h MVertex.h MElement.h \
+  ../Common/GmshDefines.h MEdge.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h OCCVertex.h \
+  OCCIncludes.h OCCEdge.h OCCFace.h
 OCCEdge.o: OCCEdge.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
   GEdgeLoop.h Pair.h GRegion.h ../Common/Message.h OCCEdge.h OCCVertex.h \
@@ -150,18 +158,18 @@ OCCRegion.o: OCCRegion.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   OCCFace.h OCCRegion.h ../Common/Message.h
 discreteEdge.o: discreteEdge.cpp discreteEdge.h GModel.h GVertex.h \
   GEntity.h Range.h SPoint3.h SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h \
-  SVector3.h GFace.h GEdgeLoop.h Pair.h GRegion.h Geo.h \
-  ../Common/GmshDefines.h gmshSurface.h ../Numeric/Numeric.h \
+  SVector3.h GFace.h GEdgeLoop.h Pair.h GRegion.h ../Common/Message.h \
+  Geo.h ../Common/GmshDefines.h gmshSurface.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
   ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ExtrudeParams.h ../Common/SmoothData.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h
 discreteFace.o: discreteFace.cpp discreteFace.h GModel.h GVertex.h \
   GEntity.h Range.h SPoint3.h SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h \
-  SVector3.h GFace.h GEdgeLoop.h Pair.h GRegion.h Geo.h \
-  ../Common/GmshDefines.h gmshSurface.h ../Numeric/Numeric.h \
+  SVector3.h GFace.h GEdgeLoop.h Pair.h GRegion.h ../Common/Message.h \
+  Geo.h ../Common/GmshDefines.h gmshSurface.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
   ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
-  ExtrudeParams.h ../Common/SmoothData.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h
 discreteRegion.o: discreteRegion.cpp discreteRegion.h GModel.h GVertex.h \
   GEntity.h Range.h SPoint3.h SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h \
   SVector3.h GFace.h GEdgeLoop.h Pair.h GRegion.h Geo.h \
@@ -184,15 +192,13 @@ fourierProjectionFace.o: fourierProjectionFace.cpp \
 GModel.o: GModel.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h GFace.h \
   GEdgeLoop.h Pair.h GRegion.h MElement.h ../Common/GmshDefines.h \
-  MVertex.h MEdge.h MFace.h discreteRegion.h discreteFace.h \
-  discreteEdge.h discreteVertex.h ../Common/Message.h gmshSurface.h \
+  MVertex.h MEdge.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h discreteRegion.h \
+  discreteFace.h discreteEdge.h discreteVertex.h gmshSurface.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/Octree.h \
-  ../Common/OctreeInternals.h ../Mesh/Field.h ../Geo/Geo.h \
-  ../Geo/gmshSurface.h ../Common/ListUtils.h ../Common/TreeUtils.h \
-  ../Common/avl.h ../Common/ListUtils.h ../Geo/SPoint2.h \
-  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Post/PView.h \
-  ../Geo/SPoint3.h ../Mesh/Generator.h ../Common/Context.h \
-  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
+  ../Common/OctreeInternals.h ../Common/SmoothData.h ../Mesh/Field.h \
+  ../Post/PView.h ../Geo/SPoint3.h ../Mesh/Generator.h \
+  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 GModelIO_Geo.o: GModelIO_Geo.cpp GModel.h GVertex.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h \
   GFace.h GEdgeLoop.h Pair.h GRegion.h Geo.h ../Common/GmshDefines.h \
@@ -200,21 +206,21 @@ GModelIO_Geo.o: GModelIO_Geo.cpp GModel.h GVertex.h GEntity.h Range.h \
   ../Common/ListUtils.h ../Common/TreeUtils.h ../Common/avl.h \
   ../Common/ListUtils.h ExtrudeParams.h ../Common/SmoothData.h \
   ../Common/OpenFile.h ../Common/Message.h gmshVertex.h gmshFace.h \
-  gmshEdge.h gmshRegion.h ../Mesh/Field.h ../Geo/Geo.h ../Post/PView.h \
+  gmshEdge.h gmshRegion.h ../Mesh/Field.h ../Post/PView.h \
   ../Geo/SPoint3.h ../Parser/Parser.h
 GModelIO_Mesh.o: GModelIO_Mesh.cpp GModel.h GVertex.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h SVector3.h \
   GFace.h GEdgeLoop.h Pair.h GRegion.h ../Common/GmshDefines.h MElement.h \
-  MVertex.h MEdge.h MFace.h discreteRegion.h discreteFace.h \
-  discreteEdge.h discreteVertex.h ../Common/StringUtils.h \
-  ../Common/Message.h
+  MVertex.h MEdge.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h discreteRegion.h \
+  discreteFace.h ../Common/StringUtils.h
 GModelIO_OCC.o: GModelIO_OCC.cpp GModelIO_OCC.h GModel.h GVertex.h \
   GEntity.h Range.h SPoint3.h SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h \
   SVector3.h GFace.h GEdgeLoop.h Pair.h GRegion.h OCCIncludes.h \
   ../Common/Message.h ../Common/Context.h ../Geo/CGNSOptions.h \
   ../Mesh/PartitionOptions.h OCCVertex.h OCCEdge.h OCCFace.h OCCRegion.h \
   MElement.h ../Common/GmshDefines.h MVertex.h MEdge.h MFace.h \
-  ../Common/OpenFile.h
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h ../Common/OpenFile.h
 GModelIO_Fourier.o: GModelIO_Fourier.cpp GModel.h GVertex.h GEntity.h \
   Range.h SPoint3.h SBoundingBox3d.h GPoint.h SPoint2.h GEdge.h \
   SVector3.h GFace.h GEdgeLoop.h Pair.h GRegion.h ../Common/Message.h \
@@ -239,8 +245,8 @@ Geo.o: Geo.cpp ../Common/Message.h ../Numeric/Numeric.h \
   ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
   ExtrudeParams.h ../Common/SmoothData.h GModel.h GVertex.h GEntity.h \
   GPoint.h GEdge.h GFace.h GEdgeLoop.h GRegion.h GeoInterpolation.h \
-  ../Mesh/Field.h ../Geo/Geo.h ../Post/PView.h ../Geo/SPoint3.h \
-  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
+  ../Mesh/Field.h ../Post/PView.h ../Geo/SPoint3.h ../Common/Context.h \
+  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 GeoStringInterface.o: GeoStringInterface.cpp ../Common/Message.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h \
   ../Common/StringUtils.h Geo.h ../Common/GmshDefines.h gmshSurface.h \
@@ -264,32 +270,37 @@ findLinks.o: findLinks.cpp ../Common/Message.h GModel.h GVertex.h \
   ../Common/avl.h ../Common/ListUtils.h
 MVertex.o: MVertex.cpp MVertex.h SPoint3.h GEdge.h GEntity.h Range.h \
   SBoundingBox3d.h GVertex.h GPoint.h SPoint2.h SVector3.h GFace.h \
-  GEdgeLoop.h Pair.h ../Common/Message.h
+  GEdgeLoop.h Pair.h ../Common/Message.h ../Common/StringUtils.h
 GaussQuadratureTri.o: GaussQuadratureTri.cpp MElement.h \
   ../Common/GmshDefines.h MVertex.h SPoint3.h MEdge.h SVector3.h MFace.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   GaussLegendreSimplex.h
 GaussQuadratureQuad.o: GaussQuadratureQuad.cpp MElement.h \
   ../Common/GmshDefines.h MVertex.h SPoint3.h MEdge.h SVector3.h MFace.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   GaussLegendreSimplex.h ../Numeric/GaussLegendre1D.h
 GaussQuadratureTet.o: GaussQuadratureTet.cpp MElement.h \
   ../Common/GmshDefines.h MVertex.h SPoint3.h MEdge.h SVector3.h MFace.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   GaussLegendreSimplex.h
 GaussQuadratureHex.o: GaussQuadratureHex.cpp MElement.h \
   ../Common/GmshDefines.h MVertex.h SPoint3.h MEdge.h SVector3.h MFace.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   GaussLegendreSimplex.h ../Numeric/GaussLegendre1D.h
 GaussLegendreSimplex.o: GaussLegendreSimplex.cpp MElement.h \
   ../Common/GmshDefines.h MVertex.h SPoint3.h MEdge.h SVector3.h MFace.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   GaussLegendreSimplex.h ../Numeric/GaussLegendre1D.h
 MFace.o: MFace.cpp MFace.h MVertex.h SPoint3.h SVector3.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/Context.h \
   ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 MElement.o: MElement.cpp MElement.h ../Common/GmshDefines.h MVertex.h \
-  SPoint3.h MEdge.h SVector3.h MFace.h GEntity.h Range.h SBoundingBox3d.h \
-  GFace.h GPoint.h GEdgeLoop.h GEdge.h GVertex.h SPoint2.h Pair.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h \
-  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
-  ../Numeric/GaussLegendre1D.h ../Common/Message.h ../Common/Context.h \
-  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
+  SPoint3.h MEdge.h SVector3.h MFace.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h GEntity.h Range.h \
+  SBoundingBox3d.h GFace.h GPoint.h GEdgeLoop.h GEdge.h GVertex.h \
+  SPoint2.h Pair.h ../Common/StringUtils.h ../Numeric/Numeric.h \
+  ../Numeric/NumericEmbedded.h ../Numeric/GaussLegendre1D.h \
+  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
   ../Mesh/qualityMeasures.h ../Mesh/meshGFaceDelaunayInsertion.h \
   ../Geo/MElement.h ../Mesh/meshGRegionDelaunayInsertion.h \
   ../Mesh/BackgroundMesh.h ../Mesh/qualityMeasures.h
diff --git a/Graphics/Makefile b/Graphics/Makefile
index 413f850ee34e569f352a6df4dcd663c3c832b56f..0664926a2667e8cbfdaf8481c5d645362e29a64e 100644
--- a/Graphics/Makefile
+++ b/Graphics/Makefile
@@ -80,10 +80,10 @@ Mesh.o: Mesh.cpp ../Common/Message.h ../Common/GmshUI.h ../Geo/GModel.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  Draw.h ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h ../Common/OS.h gl2ps.h \
-  ../Common/VertexArray.h ../Common/SmoothData.h ../Post/PView.h \
-  ../Post/PViewData.h
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h Draw.h \
+  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
+  ../Common/OS.h gl2ps.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Post/PView.h ../Post/PViewData.h
 Geom.o: Geom.cpp ../Common/GmshUI.h Draw.h ../Geo/SBoundingBox3d.h \
   ../Geo/SPoint3.h ../Common/Context.h ../Geo/CGNSOptions.h \
   ../Mesh/PartitionOptions.h gl2ps.h ../Common/VertexArray.h \
@@ -113,7 +113,8 @@ SelectBuffer.o: SelectBuffer.cpp ../Common/Message.h ../Common/GmshUI.h \
   ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h Draw.h \
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h Draw.h \
   ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
   SelectBuffer.h ../Common/VertexArray.h
 Iso.o: Iso.cpp ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h
diff --git a/Makefile b/Makefile
index af9da7bfce71e209d6a73cd513eb576fe18f0139..91ba705f8cb5802be0c97a12e05c6e217dd5af0d 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ GMSH_API = Geo/GModel.h Geo/GEntity.h Geo/GPoint.h\
            Geo/discreteVertex.h Geo/discreteEdge.h Geo/discreteFace.h Geo/discreteRegion.h\
            Geo/SPoint2.h Geo/SPoint3.h Geo/SVector3.h Geo/SBoundingBox3d.h\
            Geo/Pair.h Geo/Range.h\
-           Post/PView.h Post/PViewData.h Post/PViewDataGModel.h\
+           Post/PView.h Post/PViewData.h Plugin/PluginManager.h\
            Common/VertexArray.h Common/Message.h\
            Common/Gmsh.h Common/GmshDefines.h Common/GmshVersion.h Common/GmshMatrix.h
 
diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp
index fa4f1515ea973839fc349824b9ec0109fe978b1d..598aabc4fc080771b01ef3533c4a18cef713ac23 100644
--- a/Mesh/Field.cpp
+++ b/Mesh/Field.cpp
@@ -1217,9 +1217,8 @@ class AttractorField : public Field
         }
       }
       // This can lead to weird results as we generate attractors over
-      // the whole parametric plane (We should really use a
-      // mesh... but none is available before 1D & 2D meshing. Or we
-      // should provide a better containsParam() implementation.)
+      // the whole parametric plane (we should really use a mesh,
+      // e.g. a refined STL.)
       for(std::list<int>::iterator it = faces_id.begin();
           it != faces_id.end(); ++it) {
         Surface *s = FindSurface(*it);
diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp
index 5790393e32031139354713f339035f296051787c..ab6093049b45a8e081a956646b914c88b03e8f16 100644
--- a/Mesh/HighOrder.cpp
+++ b/Mesh/HighOrder.cpp
@@ -775,18 +775,18 @@ void getFaceVertices(GFace *gf,
             
             
 	    double X(0),Y(0),Z(0),GUESS[2]={0,0};
-
+            double sf[256] ; incomplete->getShapeFunctions(t1,t2,0,sf);
 	    for (int j=0; j<incomplete->getNumVertices(); j++){
               
-	      double sf ; incomplete->getShapeFunction(j,t1,t2,0,sf);
+
 	      MVertex *vt = incomplete->getVertex(j);
               
-	      X += sf * vt->x();
-	      Y += sf * vt->y();
-	      Z += sf * vt->z();
+	      X += sf[j] * vt->x();
+	      Y += sf[j] * vt->y();
+	      Z += sf[j] * vt->z();
 	      if (reparamOK){
-		GUESS[0] += sf * pts[j][0];
-		GUESS[1] += sf * pts[j][1];
+		GUESS[0] += sf[j] * pts[j][0];
+		GUESS[1] += sf[j] * pts[j][1];
 	      }
 	    }
 	    if (reparamOK){
diff --git a/Mesh/Makefile b/Mesh/Makefile
index a20b72c509ff4fb88a3da6065ab5abb668596ee1..3e8d0ba0767d8a48f89b139c700a628e0f6c54b6 100644
--- a/Mesh/Makefile
+++ b/Mesh/Makefile
@@ -86,26 +86,27 @@ Generator.o: Generator.cpp ../Common/Message.h ../Numeric/Numeric.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  meshGEdge.h meshGFace.h meshGFaceBDS.h meshGRegion.h BackgroundMesh.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h meshGEdge.h \
+  meshGFace.h meshGFaceBDS.h meshGRegion.h BackgroundMesh.h \
   BoundaryLayers.h HighOrder.h ../Post/PView.h ../Post/PViewData.h
 Field.o: Field.cpp ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h Field.h ../Geo/Geo.h ../Common/GmshDefines.h \
+  ../Mesh/PartitionOptions.h Field.h ../Post/PView.h ../Geo/SPoint3.h \
+  ../Geo/GeoInterpolation.h ../Geo/Geo.h ../Common/GmshDefines.h \
   ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
   ../Geo/SPoint3.h ../Geo/SVector3.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Common/ListUtils.h \
   ../Common/TreeUtils.h ../Common/avl.h ../Common/ListUtils.h \
   ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  ../Post/PView.h ../Geo/GeoInterpolation.h ../Geo/Geo.h ../Geo/GModel.h \
-  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
-  ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
-  ../Geo/SPoint2.h ../Geo/GFace.h ../Geo/GEntity.h ../Geo/GPoint.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Common/Message.h ../Post/OctreePost.h \
-  ../Common/Octree.h ../Common/OctreeInternals.h ../Post/PViewDataList.h \
-  ../Post/PViewData.h
+  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
+  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/GPoint.h \
+  ../Geo/SPoint2.h ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h \
+  ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/GFace.h \
+  ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
+  ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/GRegion.h \
+  ../Geo/GEntity.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
+  ../Common/Message.h ../Post/OctreePost.h ../Common/Octree.h \
+  ../Common/OctreeInternals.h ../Post/PViewDataList.h ../Post/PViewData.h
 meshGEdge.o: meshGEdge.cpp ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -117,9 +118,10 @@ meshGEdge.o: meshGEdge.cpp ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/SBoundingBox3d.h meshGEdge.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h BackgroundMesh.h \
-  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/Message.h \
-  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h BackgroundMesh.h \
+  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/Context.h \
+  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 meshGEdgeExtruded.o: meshGEdgeExtruded.cpp ../Geo/GModel.h \
   ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -131,12 +133,14 @@ meshGEdgeExtruded.o: meshGEdgeExtruded.cpp ../Geo/GModel.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Common/Message.h
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h
 meshGFace.o: meshGFace.cpp meshGFace.h meshGFaceBDS.h \
   meshGFaceDelaunayInsertion.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/MFace.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h meshGFaceQuadrilateralize.h meshGFaceOptimize.h \
+  ../Geo/SVector3.h ../Common/Message.h ../Numeric/FunctionSpace.h \
+  ../Common/GmshMatrix.h meshGFaceQuadrilateralize.h meshGFaceOptimize.h \
   DivideAndConquer.h BackgroundMesh.h ../Geo/GVertex.h ../Geo/GEntity.h \
   ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
   ../Geo/SPoint3.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
@@ -146,13 +150,9 @@ meshGFace.o: meshGFace.cpp meshGFace.h meshGFaceBDS.h \
   ../Geo/Pair.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEdge.h \
   ../Geo/GFace.h ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h ../Common/Message.h ../Numeric/Numeric.h \
+  ../Mesh/PartitionOptions.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h BDS.h ../Post/PView.h qualityMeasures.h \
-  Field.h ../Geo/Geo.h ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h \
-  ../Geo/SPoint2.h ../Geo/SPoint3.h ../Geo/SVector3.h \
-  ../Geo/SBoundingBox3d.h ../Common/ListUtils.h ../Common/TreeUtils.h \
-  ../Common/avl.h ../Common/ListUtils.h ../Geo/SPoint2.h \
-  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Common/OS.h
+  Field.h ../Common/OS.h
 meshGFaceTransfinite.o: meshGFaceTransfinite.cpp meshGFace.h \
   ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -163,8 +163,9 @@ meshGFaceTransfinite.o: meshGFaceTransfinite.cpp meshGFace.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/MEdge.h \
   ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h ../Common/Message.h ../Numeric/Numeric.h \
+  ../Geo/SVector3.h ../Common/Message.h ../Numeric/FunctionSpace.h \
+  ../Common/GmshMatrix.h ../Common/Context.h ../Geo/CGNSOptions.h \
+  ../Mesh/PartitionOptions.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h
 meshGFaceExtruded.o: meshGFaceExtruded.cpp ../Geo/GModel.h \
   ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
@@ -177,12 +178,14 @@ meshGFaceExtruded.o: meshGFaceExtruded.cpp ../Geo/GModel.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Common/Context.h \
-  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h ../Common/Message.h
+  ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 meshGFaceBDS.o: meshGFaceBDS.cpp meshGFace.h meshGFaceOptimize.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/SPoint3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   meshGFaceDelaunayInsertion.h BackgroundMesh.h ../Geo/GVertex.h \
   ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -193,13 +196,8 @@ meshGFaceBDS.o: meshGFaceBDS.cpp meshGFace.h meshGFaceOptimize.h \
   ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h ../Geo/GModel.h \
   ../Geo/GVertex.h ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h \
   ../Geo/GEntity.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
-  ../Common/Message.h ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h \
-  BDS.h ../Post/PView.h qualityMeasures.h Field.h ../Geo/Geo.h \
-  ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
-  ../Geo/SPoint3.h ../Geo/SVector3.h ../Geo/SBoundingBox3d.h \
-  ../Common/ListUtils.h ../Common/TreeUtils.h ../Common/avl.h \
-  ../Common/ListUtils.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h \
-  ../Common/SmoothData.h ../Common/OS.h
+  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h BDS.h ../Post/PView.h \
+  qualityMeasures.h Field.h ../Common/OS.h
 meshGFaceDelaunayInsertion.o: meshGFaceDelaunayInsertion.cpp BDS.h \
   ../Geo/GFace.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -210,38 +208,41 @@ meshGFaceDelaunayInsertion.o: meshGFaceDelaunayInsertion.cpp BDS.h \
   BackgroundMesh.h meshGFaceDelaunayInsertion.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h meshGFaceOptimize.h meshGFace.h \
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/FunctionSpace.h \
+  ../Common/GmshMatrix.h meshGFaceOptimize.h meshGFace.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h ../Common/Context.h \
   ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 meshGFaceOptimize.o: meshGFaceOptimize.cpp meshGFaceOptimize.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/SPoint3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   meshGFaceDelaunayInsertion.h qualityMeasures.h ../Geo/GFace.h \
   ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
   ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h \
   ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/SVector3.h \
   ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h BackgroundMesh.h ../Common/Message.h
+  ../Geo/Pair.h BackgroundMesh.h
 meshGFaceQuadrilateralize.o: meshGFaceQuadrilateralize.cpp \
   meshGFaceQuadrilateralize.h ../Common/Message.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h meshGFaceDelaunayInsertion.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/SPoint3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  meshGFaceOptimize.h meshGFaceBDS.h BDS.h ../Geo/GFace.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h \
-  ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Post/PView.h
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h meshGFaceOptimize.h \
+  meshGFaceBDS.h BDS.h ../Geo/GFace.h ../Geo/GEntity.h ../Geo/Range.h \
+  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
+  ../Geo/GPoint.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/GEntity.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Post/PView.h
 meshGRegion.o: meshGRegion.cpp meshGRegion.h \
   meshGRegionDelaunayInsertion.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
-  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h BackgroundMesh.h qualityMeasures.h \
   ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
@@ -256,14 +257,14 @@ meshGRegion.o: meshGRegion.cpp meshGRegion.h \
   ../Common/ListUtils.h ../Common/TreeUtils.h ../Common/avl.h \
   ../Common/ListUtils.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h \
   ../Common/SmoothData.h ../Geo/GRegion.h BDS.h ../Post/PView.h \
-  ../Common/Message.h ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h
+  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 meshGRegionDelaunayInsertion.o: meshGRegionDelaunayInsertion.cpp \
   ../Common/OS.h BackgroundMesh.h meshGRegion.h meshGRegionLocalMeshMod.h \
   meshGRegionDelaunayInsertion.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
-  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h qualityMeasures.h ../Geo/GModel.h \
   ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -271,8 +272,7 @@ meshGRegionDelaunayInsertion.o: meshGRegionDelaunayInsertion.cpp \
   ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/GFace.h \
   ../Geo/GEntity.h ../Geo/GPoint.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
   ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
-  ../Common/Message.h
+  ../Geo/GEntity.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h
 meshGRegionTransfinite.o: meshGRegionTransfinite.cpp meshGFace.h \
   ../Geo/GFace.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -283,8 +283,9 @@ meshGRegionTransfinite.o: meshGRegionTransfinite.cpp meshGFace.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/MEdge.h \
   ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h ../Common/Message.h
+  ../Geo/SVector3.h ../Common/Message.h ../Numeric/FunctionSpace.h \
+  ../Common/GmshMatrix.h ../Common/Context.h ../Geo/CGNSOptions.h \
+  ../Mesh/PartitionOptions.h
 meshGRegionExtruded.o: meshGRegionExtruded.cpp ../Geo/GModel.h \
   ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -296,9 +297,9 @@ meshGRegionExtruded.o: meshGRegionExtruded.cpp ../Geo/GModel.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   ../Geo/ExtrudeParams.h ../Common/SmoothData.h meshGFace.h meshGRegion.h \
-  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
-  ../Common/Message.h
+  ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h
 meshGRegionCarveHole.o: meshGRegionCarveHole.cpp ../Geo/GModel.h \
   ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -310,16 +311,17 @@ meshGRegionCarveHole.o: meshGRegionCarveHole.cpp ../Geo/GModel.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Common/Message.h
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h
 meshGRegionLocalMeshMod.o: meshGRegionLocalMeshMod.cpp \
   meshGRegionLocalMeshMod.h meshGRegionDelaunayInsertion.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/SPoint3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h BackgroundMesh.h \
   qualityMeasures.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Common/Message.h
+  ../Geo/GEntity.h
 DivideAndConquer.o: DivideAndConquer.cpp ../Common/Message.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h DivideAndConquer.h \
   ../Common/MallocUtils.h
@@ -334,12 +336,7 @@ BackgroundMesh.o: BackgroundMesh.cpp ../Common/Message.h BackgroundMesh.h \
   ../Geo/GEdge.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
   ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEdge.h ../Geo/GFace.h \
   ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h Field.h ../Geo/Geo.h ../Common/GmshDefines.h \
-  ../Geo/gmshSurface.h ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h \
-  ../Geo/SPoint3.h ../Geo/SVector3.h ../Geo/SBoundingBox3d.h \
-  ../Common/ListUtils.h ../Common/TreeUtils.h ../Common/avl.h \
-  ../Common/ListUtils.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h \
-  ../Common/SmoothData.h ../Post/PView.h
+  ../Geo/SBoundingBox3d.h Field.h ../Post/PView.h
 qualityMeasures.o: qualityMeasures.cpp qualityMeasures.h BDS.h \
   ../Geo/GFace.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -350,7 +347,8 @@ qualityMeasures.o: qualityMeasures.cpp qualityMeasures.h BDS.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/MEdge.h \
   ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h
+  ../Geo/SVector3.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
+  ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h
 BoundaryLayers.o: BoundaryLayers.cpp ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -362,8 +360,9 @@ BoundaryLayers.o: BoundaryLayers.cpp ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/SBoundingBox3d.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Message.h ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
   BoundaryLayers.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
-  meshGEdge.h meshGFace.h ../Common/Message.h
+  meshGEdge.h meshGFace.h
 BDS.o: BDS.cpp ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h BDS.h \
   ../Geo/GFace.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -374,7 +373,7 @@ BDS.o: BDS.cpp ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h BDS.h \
   meshGFaceDelaunayInsertion.h ../Geo/MElement.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  qualityMeasures.h
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h qualityMeasures.h
 HighOrder.o: HighOrder.cpp HighOrder.h ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -386,11 +385,11 @@ HighOrder.o: HighOrder.cpp HighOrder.h ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/SBoundingBox3d.h meshGFaceOptimize.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h meshGFaceDelaunayInsertion.h \
-  ../Common/Message.h ../Common/OS.h ../Numeric/Numeric.h \
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h \
+  meshGFaceDelaunayInsertion.h ../Common/OS.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Common/Context.h ../Geo/CGNSOptions.h \
-  ../Mesh/PartitionOptions.h ../Common/GmshMatrix.h \
-  ../Numeric/FunctionSpace.h
+  ../Mesh/PartitionOptions.h
 Partition.o: Partition.cpp ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/GPoint.h \
@@ -403,4 +402,4 @@ Partition.o: Partition.cpp ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Message.h \
-  PartitionOptions.h
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h PartitionOptions.h
diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp
index 6302508a5aabf07f72f15f9738662200b79a7e90..3a55d93127bee90dd9e64e3bbbc2ffeda68225f5 100644
--- a/Mesh/meshGEdge.cpp
+++ b/Mesh/meshGEdge.cpp
@@ -252,12 +252,7 @@ void deMeshGEdge::operator() (GEdge *ge)
 {
   if(ge->geomType() == GEntity::DiscreteCurve) return;
 
-  for (unsigned int i = 0; i < ge->mesh_vertices.size(); i++) 
-    delete ge->mesh_vertices[i];
-  ge->mesh_vertices.clear();
-  for (unsigned int i = 0; i < ge->lines.size(); i++) 
-    delete ge->lines[i];
-  ge->lines.clear();
+  ge->deleteMesh();
   ge->deleteVertexArrays();
   ge->model()->destroyMeshCaches();
 }
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 56a079d37b5e03bebba0372a08d632eded9390dd..03bf5c2761550e2c4548abb2cbcea80b0a7a5a37 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1285,13 +1285,7 @@ void deMeshGFace::operator() (GFace *gf)
 {
   if(gf->geomType() == GEntity::DiscreteSurface) return;
 
-  for (unsigned int i=0;i<gf->mesh_vertices.size();i++) delete gf->mesh_vertices[i];
-  gf->mesh_vertices.clear();
-  gf->transfinite_vertices.clear();
-  for (unsigned int i=0;i<gf->triangles.size();i++) delete gf->triangles[i];
-  gf->triangles.clear();
-  for (unsigned int i=0;i<gf->quadrangles.size();i++) delete gf->quadrangles[i];
-  gf->quadrangles.clear();
+  gf->deleteMesh();
   gf->deleteVertexArrays();
   gf->model()->destroyMeshCaches();
 
diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp
index 78b33d9cabe625d85627ea9d789eeb717ebc04e0..1a2bd0669a5df9eca2602a9c8a06472659c56d3e 100644
--- a/Mesh/meshGRegion.cpp
+++ b/Mesh/meshGRegion.cpp
@@ -425,22 +425,7 @@ void deMeshGRegion::operator() (GRegion *gr)
 {
   if(gr->geomType() == GEntity::DiscreteVolume) return;
 
-  for(unsigned int i = 0; i < gr->mesh_vertices.size(); i++)
-    delete gr->mesh_vertices[i];
-  gr->mesh_vertices.clear();
-  gr->transfinite_vertices.clear();
-  for(unsigned int i = 0; i < gr->tetrahedra.size(); i++)
-    delete gr->tetrahedra[i];
-  gr->tetrahedra.clear();
-  for(unsigned int i = 0; i < gr->hexahedra.size(); i++) 
-    delete gr->hexahedra[i];
-  gr->hexahedra.clear();
-  for(unsigned int i = 0; i < gr->prisms.size(); i++) 
-    delete gr->prisms[i];
-  gr->prisms.clear();
-  for(unsigned int i = 0; i < gr->pyramids.size(); i++)
-    delete gr->pyramids[i];
-  gr->pyramids.clear();
+  gr->deleteMesh();
   gr->deleteVertexArrays();
   gr->model()->destroyMeshCaches();
 }
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 07c5b3f14b341f76a7f02afb67f786a4b71d9232..d6e51979133181b3f7bd21b729251b8a75c43471 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -425,7 +425,7 @@ typedef union YYSTYPE
   Shape s;
   List_T *l;
 }
-/* Line 187 of yacc.c.  */
+/* Line 193 of yacc.c.  */
 #line 430 "Gmsh.tab.cpp"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -489,7 +489,7 @@ typedef short int yytype_int16;
 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
 
 #ifndef YY_
-# if YYENABLE_NLS
+# if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -654,16 +654,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  5
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   6315
+#define YYLAST   6381
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  144
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  68
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  351
+#define YYNRULES  352
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  1247
+#define YYNSTATES  1249
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -742,20 +742,20 @@ static const yytype_uint16 yyprhs[] =
     1187,  1204,  1205,  1222,  1223,  1240,  1241,  1260,  1261,  1280,
     1281,  1300,  1302,  1305,  1311,  1319,  1329,  1332,  1342,  1349,
     1359,  1369,  1378,  1388,  1397,  1406,  1413,  1418,  1425,  1436,
-    1447,  1458,  1469,  1472,  1474,  1478,  1481,  1484,  1487,  1491,
+    1447,  1458,  1469,  1472,  1476,  1478,  1482,  1485,  1488,  1491,
     1495,  1499,  1503,  1507,  1511,  1515,  1519,  1523,  1527,  1531,
-    1535,  1539,  1543,  1549,  1554,  1559,  1564,  1569,  1574,  1579,
-    1584,  1589,  1594,  1599,  1606,  1611,  1616,  1621,  1626,  1631,
-    1636,  1643,  1650,  1657,  1662,  1667,  1672,  1677,  1682,  1687,
-    1692,  1697,  1702,  1707,  1712,  1719,  1724,  1729,  1734,  1739,
-    1744,  1749,  1756,  1763,  1770,  1775,  1777,  1779,  1781,  1783,
-    1785,  1787,  1789,  1791,  1797,  1802,  1807,  1810,  1816,  1820,
-    1827,  1832,  1840,  1847,  1849,  1852,  1855,  1859,  1863,  1875,
-    1885,  1893,  1901,  1903,  1907,  1909,  1911,  1914,  1918,  1923,
-    1929,  1932,  1936,  1940,  1946,  1951,  1953,  1955,  1959,  1966,
-    1968,  1970,  1974,  1978,  1988,  1996,  1998,  2004,  2008,  2015,
-    2017,  2021,  2023,  2025,  2029,  2036,  2038,  2040,  2047,  2052,
-    2057,  2062
+    1535,  1539,  1543,  1547,  1553,  1558,  1563,  1568,  1573,  1578,
+    1583,  1588,  1593,  1598,  1603,  1610,  1615,  1620,  1625,  1630,
+    1635,  1640,  1647,  1654,  1661,  1666,  1671,  1676,  1681,  1686,
+    1691,  1696,  1701,  1706,  1711,  1716,  1723,  1728,  1733,  1738,
+    1743,  1748,  1753,  1760,  1767,  1774,  1779,  1781,  1783,  1785,
+    1787,  1789,  1791,  1793,  1795,  1801,  1806,  1811,  1814,  1820,
+    1824,  1831,  1836,  1844,  1851,  1853,  1856,  1859,  1863,  1867,
+    1879,  1889,  1897,  1905,  1907,  1911,  1913,  1915,  1918,  1922,
+    1927,  1933,  1936,  1940,  1944,  1950,  1955,  1957,  1959,  1963,
+    1970,  1972,  1974,  1978,  1982,  1992,  2000,  2002,  2008,  2012,
+    2019,  2021,  2025,  2027,  2029,  2033,  2040,  2042,  2044,  2051,
+    2056,  2061,  2066
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -908,66 +908,67 @@ static const yytype_int16 yyrhs[] =
       96,    49,   141,   199,   142,     6,    -1,    46,   141,   206,
      142,    96,    51,   141,   199,   142,     6,    -1,    49,   141,
      206,   142,    96,    51,   141,   199,   142,     6,    -1,    76,
-       6,    -1,   200,    -1,   134,   199,   135,    -1,   125,   199,
-      -1,   124,   199,    -1,   129,   199,    -1,   199,   125,   199,
-      -1,   199,   124,   199,    -1,   199,   126,   199,    -1,   199,
-     127,   199,    -1,   199,   128,   199,    -1,   199,   133,   199,
-      -1,   199,   120,   199,    -1,   199,   121,   199,    -1,   199,
-     123,   199,    -1,   199,   122,   199,    -1,   199,   119,   199,
-      -1,   199,   118,   199,    -1,   199,   117,   199,    -1,   199,
-     116,   199,    -1,   199,   115,   199,     8,   199,    -1,    14,
-     134,   199,   135,    -1,    15,   134,   199,   135,    -1,    16,
-     134,   199,   135,    -1,    17,   134,   199,   135,    -1,    18,
-     134,   199,   135,    -1,    19,   134,   199,   135,    -1,    20,
-     134,   199,   135,    -1,    21,   134,   199,   135,    -1,    22,
-     134,   199,   135,    -1,    24,   134,   199,   135,    -1,    25,
-     134,   199,   140,   199,   135,    -1,    26,   134,   199,   135,
-      -1,    27,   134,   199,   135,    -1,    28,   134,   199,   135,
-      -1,    29,   134,   199,   135,    -1,    30,   134,   199,   135,
-      -1,    31,   134,   199,   135,    -1,    32,   134,   199,   140,
-     199,   135,    -1,    33,   134,   199,   140,   199,   135,    -1,
-      34,   134,   199,   140,   199,   135,    -1,    23,   134,   199,
-     135,    -1,    14,   136,   199,   137,    -1,    15,   136,   199,
-     137,    -1,    16,   136,   199,   137,    -1,    17,   136,   199,
-     137,    -1,    18,   136,   199,   137,    -1,    19,   136,   199,
-     137,    -1,    20,   136,   199,   137,    -1,    21,   136,   199,
-     137,    -1,    22,   136,   199,   137,    -1,    24,   136,   199,
-     137,    -1,    25,   136,   199,   140,   199,   137,    -1,    26,
-     136,   199,   137,    -1,    27,   136,   199,   137,    -1,    28,
-     136,   199,   137,    -1,    29,   136,   199,   137,    -1,    30,
-     136,   199,   137,    -1,    31,   136,   199,   137,    -1,    32,
-     136,   199,   140,   199,   137,    -1,    33,   136,   199,   140,
-     199,   137,    -1,    34,   136,   199,   140,   199,   137,    -1,
-      23,   136,   199,   137,    -1,     3,    -1,     9,    -1,    10,
-      -1,    11,    -1,   108,    -1,   109,    -1,   110,    -1,     4,
-      -1,     4,   143,   141,   199,   142,    -1,     4,   136,   199,
-     137,    -1,   139,     4,   136,   137,    -1,     4,   167,    -1,
-       4,   136,   199,   137,   167,    -1,     4,   138,     4,    -1,
-       4,   136,   199,   137,   138,     4,    -1,     4,   138,     4,
-     167,    -1,     4,   136,   199,   137,   138,     4,   167,    -1,
-     107,   134,     5,   140,   199,   135,    -1,   202,    -1,   125,
-     201,    -1,   124,   201,    -1,   201,   125,   201,    -1,   201,
-     124,   201,    -1,   141,   199,   140,   199,   140,   199,   140,
-     199,   140,   199,   142,    -1,   141,   199,   140,   199,   140,
-     199,   140,   199,   142,    -1,   141,   199,   140,   199,   140,
-     199,   142,    -1,   134,   199,   140,   199,   140,   199,   135,
-      -1,   204,    -1,   203,   140,   204,    -1,   199,    -1,   205,
-      -1,   141,   142,    -1,   141,   206,   142,    -1,   125,   141,
-     206,   142,    -1,   199,   126,   141,   206,   142,    -1,   125,
-     205,    -1,   199,   126,   205,    -1,   199,     8,   199,    -1,
-     199,     8,   199,     8,   199,    -1,    43,   141,   199,   142,
-      -1,   172,    -1,   180,    -1,     4,   136,   137,    -1,     4,
-     136,   141,   206,   142,   137,    -1,   199,    -1,   205,    -1,
-     206,   140,   199,    -1,   206,   140,   205,    -1,   141,   199,
-     140,   199,   140,   199,   140,   199,   142,    -1,   141,   199,
-     140,   199,   140,   199,   142,    -1,     4,    -1,     4,   138,
-      93,   138,     4,    -1,   141,   209,   142,    -1,     4,   136,
-     199,   137,   138,    94,    -1,   207,    -1,   209,   140,   207,
-      -1,   211,    -1,     4,    -1,     4,   138,     4,    -1,     4,
-     136,   199,   137,   138,     4,    -1,     5,    -1,    42,    -1,
-      37,   134,   210,   140,   210,   135,    -1,    38,   134,   210,
-     135,    -1,    39,   134,   210,   135,    -1,    36,   134,   210,
-     135,    -1,    36,   134,   210,   140,   206,   135,    -1
+       6,    -1,    76,     4,     6,    -1,   200,    -1,   134,   199,
+     135,    -1,   125,   199,    -1,   124,   199,    -1,   129,   199,
+      -1,   199,   125,   199,    -1,   199,   124,   199,    -1,   199,
+     126,   199,    -1,   199,   127,   199,    -1,   199,   128,   199,
+      -1,   199,   133,   199,    -1,   199,   120,   199,    -1,   199,
+     121,   199,    -1,   199,   123,   199,    -1,   199,   122,   199,
+      -1,   199,   119,   199,    -1,   199,   118,   199,    -1,   199,
+     117,   199,    -1,   199,   116,   199,    -1,   199,   115,   199,
+       8,   199,    -1,    14,   134,   199,   135,    -1,    15,   134,
+     199,   135,    -1,    16,   134,   199,   135,    -1,    17,   134,
+     199,   135,    -1,    18,   134,   199,   135,    -1,    19,   134,
+     199,   135,    -1,    20,   134,   199,   135,    -1,    21,   134,
+     199,   135,    -1,    22,   134,   199,   135,    -1,    24,   134,
+     199,   135,    -1,    25,   134,   199,   140,   199,   135,    -1,
+      26,   134,   199,   135,    -1,    27,   134,   199,   135,    -1,
+      28,   134,   199,   135,    -1,    29,   134,   199,   135,    -1,
+      30,   134,   199,   135,    -1,    31,   134,   199,   135,    -1,
+      32,   134,   199,   140,   199,   135,    -1,    33,   134,   199,
+     140,   199,   135,    -1,    34,   134,   199,   140,   199,   135,
+      -1,    23,   134,   199,   135,    -1,    14,   136,   199,   137,
+      -1,    15,   136,   199,   137,    -1,    16,   136,   199,   137,
+      -1,    17,   136,   199,   137,    -1,    18,   136,   199,   137,
+      -1,    19,   136,   199,   137,    -1,    20,   136,   199,   137,
+      -1,    21,   136,   199,   137,    -1,    22,   136,   199,   137,
+      -1,    24,   136,   199,   137,    -1,    25,   136,   199,   140,
+     199,   137,    -1,    26,   136,   199,   137,    -1,    27,   136,
+     199,   137,    -1,    28,   136,   199,   137,    -1,    29,   136,
+     199,   137,    -1,    30,   136,   199,   137,    -1,    31,   136,
+     199,   137,    -1,    32,   136,   199,   140,   199,   137,    -1,
+      33,   136,   199,   140,   199,   137,    -1,    34,   136,   199,
+     140,   199,   137,    -1,    23,   136,   199,   137,    -1,     3,
+      -1,     9,    -1,    10,    -1,    11,    -1,   108,    -1,   109,
+      -1,   110,    -1,     4,    -1,     4,   143,   141,   199,   142,
+      -1,     4,   136,   199,   137,    -1,   139,     4,   136,   137,
+      -1,     4,   167,    -1,     4,   136,   199,   137,   167,    -1,
+       4,   138,     4,    -1,     4,   136,   199,   137,   138,     4,
+      -1,     4,   138,     4,   167,    -1,     4,   136,   199,   137,
+     138,     4,   167,    -1,   107,   134,     5,   140,   199,   135,
+      -1,   202,    -1,   125,   201,    -1,   124,   201,    -1,   201,
+     125,   201,    -1,   201,   124,   201,    -1,   141,   199,   140,
+     199,   140,   199,   140,   199,   140,   199,   142,    -1,   141,
+     199,   140,   199,   140,   199,   140,   199,   142,    -1,   141,
+     199,   140,   199,   140,   199,   142,    -1,   134,   199,   140,
+     199,   140,   199,   135,    -1,   204,    -1,   203,   140,   204,
+      -1,   199,    -1,   205,    -1,   141,   142,    -1,   141,   206,
+     142,    -1,   125,   141,   206,   142,    -1,   199,   126,   141,
+     206,   142,    -1,   125,   205,    -1,   199,   126,   205,    -1,
+     199,     8,   199,    -1,   199,     8,   199,     8,   199,    -1,
+      43,   141,   199,   142,    -1,   172,    -1,   180,    -1,     4,
+     136,   137,    -1,     4,   136,   141,   206,   142,   137,    -1,
+     199,    -1,   205,    -1,   206,   140,   199,    -1,   206,   140,
+     205,    -1,   141,   199,   140,   199,   140,   199,   140,   199,
+     142,    -1,   141,   199,   140,   199,   140,   199,   142,    -1,
+       4,    -1,     4,   138,    93,   138,     4,    -1,   141,   209,
+     142,    -1,     4,   136,   199,   137,   138,    94,    -1,   207,
+      -1,   209,   140,   207,    -1,   211,    -1,     4,    -1,     4,
+     138,     4,    -1,     4,   136,   199,   137,   138,     4,    -1,
+       5,    -1,    42,    -1,    37,   134,   210,   140,   210,   135,
+      -1,    38,   134,   210,   135,    -1,    39,   134,   210,   135,
+      -1,    36,   134,   210,   135,    -1,    36,   134,   210,   140,
+     206,   135,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -995,20 +996,20 @@ static const yytype_uint16 yyrline[] =
     2276,  2288,  2287,  2299,  2298,  2310,  2309,  2321,  2320,  2332,
     2331,  2346,  2349,  2355,  2364,  2384,  2407,  2411,  2435,  2453,
     2471,  2489,  2518,  2553,  2558,  2585,  2599,  2612,  2629,  2635,
-    2641,  2644,  2653,  2663,  2664,  2665,  2666,  2667,  2668,  2669,
-    2670,  2671,  2678,  2679,  2680,  2681,  2682,  2683,  2684,  2685,
-    2686,  2687,  2688,  2689,  2690,  2691,  2692,  2693,  2694,  2695,
-    2696,  2697,  2698,  2699,  2700,  2701,  2702,  2703,  2704,  2705,
-    2706,  2707,  2708,  2709,  2711,  2712,  2713,  2714,  2715,  2716,
-    2717,  2718,  2719,  2720,  2721,  2722,  2723,  2724,  2725,  2726,
-    2727,  2728,  2729,  2730,  2731,  2740,  2741,  2742,  2743,  2744,
-    2745,  2746,  2750,  2763,  2775,  2790,  2800,  2810,  2828,  2833,
-    2838,  2848,  2858,  2866,  2870,  2874,  2878,  2882,  2889,  2893,
-    2897,  2901,  2908,  2913,  2920,  2925,  2929,  2934,  2938,  2946,
-    2957,  2965,  2973,  2979,  2990,  3010,  3020,  3030,  3040,  3060,
-    3065,  3069,  3073,  3085,  3089,  3101,  3108,  3118,  3122,  3137,
-    3142,  3149,  3153,  3166,  3174,  3185,  3189,  3197,  3205,  3219,
-    3233,  3237
+    2641,  2644,  2653,  2657,  2673,  2674,  2675,  2676,  2677,  2678,
+    2679,  2680,  2681,  2688,  2689,  2690,  2691,  2692,  2693,  2694,
+    2695,  2696,  2697,  2698,  2699,  2700,  2701,  2702,  2703,  2704,
+    2705,  2706,  2707,  2708,  2709,  2710,  2711,  2712,  2713,  2714,
+    2715,  2716,  2717,  2718,  2719,  2721,  2722,  2723,  2724,  2725,
+    2726,  2727,  2728,  2729,  2730,  2731,  2732,  2733,  2734,  2735,
+    2736,  2737,  2738,  2739,  2740,  2741,  2750,  2751,  2752,  2753,
+    2754,  2755,  2756,  2760,  2773,  2785,  2800,  2810,  2820,  2838,
+    2843,  2848,  2858,  2868,  2876,  2880,  2884,  2888,  2892,  2899,
+    2903,  2907,  2911,  2918,  2923,  2930,  2935,  2939,  2944,  2948,
+    2956,  2967,  2975,  2983,  2989,  3000,  3020,  3030,  3040,  3050,
+    3070,  3075,  3079,  3083,  3095,  3099,  3111,  3118,  3128,  3132,
+    3147,  3152,  3159,  3163,  3176,  3184,  3195,  3199,  3207,  3215,
+    3229,  3243,  3247
 };
 #endif
 
@@ -1104,20 +1105,20 @@ static const yytype_uint8 yyr1[] =
      180,   189,   180,   190,   180,   191,   180,   192,   180,   193,
      180,   194,   194,   195,   195,   195,   195,   195,   196,   196,
      196,   196,   196,   196,   196,   196,   196,   196,   197,   197,
-     197,   197,   198,   199,   199,   199,   199,   199,   199,   199,
+     197,   197,   198,   198,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
-     199,   199,   199,   199,   199,   200,   200,   200,   200,   200,
+     199,   199,   199,   199,   199,   199,   200,   200,   200,   200,
      200,   200,   200,   200,   200,   200,   200,   200,   200,   200,
-     200,   200,   200,   201,   201,   201,   201,   201,   202,   202,
-     202,   202,   203,   203,   204,   204,   204,   204,   204,   204,
-     205,   205,   205,   205,   205,   205,   205,   205,   205,   206,
-     206,   206,   206,   207,   207,   207,   207,   208,   208,   209,
-     209,   210,   210,   210,   210,   211,   211,   211,   211,   211,
-     211,   211
+     200,   200,   200,   200,   201,   201,   201,   201,   201,   202,
+     202,   202,   202,   203,   203,   204,   204,   204,   204,   204,
+     204,   205,   205,   205,   205,   205,   205,   205,   205,   205,
+     206,   206,   206,   206,   207,   207,   207,   207,   208,   208,
+     209,   209,   210,   210,   210,   210,   211,   211,   211,   211,
+     211,   211,   211
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1145,20 +1146,20 @@ static const yytype_uint8 yyr2[] =
       16,     0,    16,     0,    16,     0,    18,     0,    18,     0,
       18,     1,     2,     5,     7,     9,     2,     9,     6,     9,
        9,     8,     9,     8,     8,     6,     4,     6,    10,    10,
-      10,    10,     2,     1,     3,     2,     2,     2,     3,     3,
+      10,    10,     2,     3,     1,     3,     2,     2,     2,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     5,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,     4,     6,     4,     4,     4,     4,     4,     4,
-       6,     6,     6,     4,     4,     4,     4,     4,     4,     4,
+       3,     3,     3,     5,     4,     4,     4,     4,     4,     4,
        4,     4,     4,     4,     6,     4,     4,     4,     4,     4,
-       4,     6,     6,     6,     4,     1,     1,     1,     1,     1,
-       1,     1,     1,     5,     4,     4,     2,     5,     3,     6,
-       4,     7,     6,     1,     2,     2,     3,     3,    11,     9,
-       7,     7,     1,     3,     1,     1,     2,     3,     4,     5,
-       2,     3,     3,     5,     4,     1,     1,     3,     6,     1,
-       1,     3,     3,     9,     7,     1,     5,     3,     6,     1,
-       3,     1,     1,     3,     6,     1,     1,     6,     4,     4,
-       4,     6
+       4,     6,     6,     6,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,     4,     4,     6,     4,     4,     4,     4,
+       4,     4,     6,     6,     6,     4,     1,     1,     1,     1,
+       1,     1,     1,     1,     5,     4,     4,     2,     5,     3,
+       6,     4,     7,     6,     1,     2,     2,     3,     3,    11,
+       9,     7,     7,     1,     3,     1,     1,     2,     3,     4,
+       5,     2,     3,     3,     5,     4,     1,     1,     3,     6,
+       1,     1,     3,     3,     9,     7,     1,     5,     3,     6,
+       1,     3,     1,     1,     3,     6,     1,     1,     6,     4,
+       4,     4,     6
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1173,280 +1174,280 @@ static const yytype_uint16 yydefact[] =
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,   157,     0,   162,     0,     0,   159,     0,     0,     0,
        0,     5,     7,     6,     8,     9,    10,    11,    12,    13,
-      19,    18,    14,    15,    16,    17,   285,   292,   345,    54,
-     286,   287,   288,     0,     0,     0,     0,     0,     0,     0,
+      19,    18,    14,    15,    16,    17,   286,   293,   346,    54,
+     287,   288,   289,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   346,     0,
-       0,   289,   290,   291,    58,    57,    56,    55,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   347,     0,
+       0,   290,   291,   292,    58,    57,    56,    55,     0,     0,
        0,    60,    59,     0,     0,     0,     0,     0,     0,     0,
-     223,     0,     0,     0,     0,   150,     0,   152,     0,     0,
+     224,     0,     0,     0,     0,   150,     0,   152,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   303,     0,     0,     0,     0,     0,   127,     0,
-     127,     0,     0,     0,     0,     0,   127,   222,     0,   127,
-       0,     0,     0,     0,     0,     0,   335,     0,     0,     0,
-       0,     0,   149,     0,     0,   158,   342,   345,   127,     0,
-     341,   127,     0,     0,     0,     0,     0,   296,    29,     0,
+       0,     0,   304,     0,     0,     0,     0,     0,   127,     0,
+     127,     0,     0,     0,     0,     0,   127,     0,   222,     0,
+     127,     0,     0,     0,     0,     0,     0,   336,     0,     0,
+       0,     0,     0,   149,     0,     0,   158,   343,   346,   127,
+       0,   342,   127,     0,     0,     0,     0,     0,   297,    29,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   292,   226,
-     225,   227,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    66,   146,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   143,   107,
-       0,     0,     0,     0,   292,     0,     0,   325,   326,   329,
-     330,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   314,     0,   315,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   293,
+     227,   226,   228,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    66,   146,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   143,
+     107,     0,     0,     0,     0,   293,     0,     0,   326,   327,
+     330,   331,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   315,     0,   316,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   305,   304,     0,     0,     0,     0,   127,
-     127,     0,     0,     0,     0,     0,     0,     0,   172,     0,
-     127,   126,     0,   125,     0,     0,     0,     0,   136,     0,
-       0,     0,     0,     0,     0,     0,   148,     0,     0,     0,
-       0,     0,   127,     0,     0,     0,     0,   160,     0,     0,
-       0,   139,     0,   140,     0,     0,   298,     0,     0,    68,
+       0,     0,     0,     0,   306,   305,     0,     0,     0,     0,
+     127,   127,     0,     0,     0,     0,     0,     0,     0,   172,
+       0,   127,   126,     0,   125,     0,     0,     0,     0,   136,
+       0,     0,     0,   223,     0,     0,     0,     0,   148,     0,
+       0,     0,     0,     0,   127,     0,     0,     0,     0,   160,
+       0,     0,     0,   139,     0,   140,     0,     0,   299,     0,
+       0,    68,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   224,
-       0,     0,     0,     0,    54,     0,     0,     0,     0,     0,
-      61,     0,   241,   240,   239,   238,   234,   235,   237,   236,
-     229,   228,   230,   231,   232,   233,   108,     0,     0,     0,
-       0,     0,     0,   225,   320,     0,     0,     0,     0,     0,
+       0,   225,     0,     0,     0,     0,    54,     0,     0,     0,
+       0,     0,    61,     0,   242,   241,   240,   239,   235,   236,
+     238,   237,   230,   229,   231,   232,   233,   234,   108,     0,
+       0,     0,     0,     0,     0,   226,   321,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   316,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    86,    87,     0,     0,     0,
-       0,     0,     0,     0,   307,   306,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   128,     0,     0,
-     166,   121,   216,     0,     0,     0,   137,     0,     0,   133,
-       0,   124,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   161,     0,     0,   343,   141,   142,     0,   294,
-     300,     0,    39,     0,     0,     0,    52,     0,    30,    31,
-      32,    33,    34,   243,   264,   244,   265,   245,   266,   246,
+       0,     0,     0,   317,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    86,    87,     0,
+       0,     0,     0,     0,     0,     0,   308,   307,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   128,
+       0,     0,   166,   121,   216,     0,     0,     0,   137,     0,
+       0,   133,     0,   124,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   161,     0,     0,   344,   141,   142,
+       0,   295,   301,     0,    39,     0,     0,     0,    52,     0,
+      30,    31,    32,    33,    34,   244,   265,   245,   266,   246,
      267,   247,   268,   248,   269,   249,   270,   250,   271,   251,
-     272,   263,   284,   252,   273,     0,     0,   254,   275,   255,
-     276,   256,   277,   257,   278,   258,   279,   259,   280,     0,
-       0,     0,     0,     0,     0,   350,     0,     0,   348,   349,
-      79,     0,     0,     0,     0,     0,    54,     0,     0,     0,
-       0,     0,    73,     0,     0,     0,     0,   295,     0,    22,
-      20,     0,     0,     0,     0,   327,     0,     0,   322,   230,
-     321,   331,   332,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   317,     0,     0,     0,
+     272,   252,   273,   264,   285,   253,   274,     0,     0,   255,
+     276,   256,   277,   257,   278,   258,   279,   259,   280,   260,
+     281,     0,     0,     0,     0,     0,     0,   351,     0,     0,
+     349,   350,    79,     0,     0,     0,     0,     0,    54,     0,
+       0,     0,     0,     0,    73,     0,     0,     0,     0,   296,
+       0,    22,    20,     0,     0,     0,     0,   328,     0,     0,
+     323,   231,   322,   332,   333,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   318,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   117,   119,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   117,   119,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     201,     0,   163,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   138,     0,     0,
-       0,     0,     0,     0,     0,   297,     0,   293,     0,     0,
-       0,     0,     0,    26,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   294,    64,    65,     0,     0,
-       0,     0,     0,    67,    69,    71,     0,     0,   339,     0,
-      77,   242,    21,     0,     0,     0,     0,     0,   324,     0,
+       0,     0,   201,     0,   163,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   138,
+       0,     0,     0,     0,     0,     0,     0,   298,     0,   294,
+       0,     0,     0,     0,     0,    26,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   295,    64,    65,
+       0,     0,     0,     0,     0,    67,    69,    71,     0,     0,
+     340,     0,    77,   243,    21,     0,     0,     0,     0,     0,
+     325,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   319,     0,    92,     0,     0,
+       0,     0,     0,   208,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   318,     0,    92,     0,     0,     0,     0,
-       0,   208,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   206,     0,     0,   173,   202,     0,     0,   215,
-     217,     0,   135,   134,     0,    27,    28,     0,     0,     0,
-     336,     0,     0,     0,   153,     0,     0,     0,   145,   299,
-     144,     0,     0,     0,     0,   312,     0,   253,   274,   260,
-     281,   261,   282,   262,   283,   351,   347,   302,     0,    54,
-       0,     0,     0,     0,    62,     0,     0,     0,   337,    23,
-      24,     0,     0,    90,     0,   323,     0,    95,     0,    97,
-       0,     0,    93,     0,     0,   110,   111,     0,     0,    94,
-     115,   319,     0,     0,     0,     0,    88,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   147,     0,     0,     0,
-       0,   127,     0,   183,     0,   185,     0,   187,     0,     0,
-       0,     0,   314,     0,     0,     0,     0,   167,     0,     0,
-     100,   101,     0,     0,     0,     0,    80,     0,   344,   301,
-       0,    35,     0,     0,     0,     0,     0,    37,     0,     0,
-       0,    74,     0,     0,    75,     0,   340,     0,     0,   328,
-       0,     0,     0,   103,     0,     0,   112,     0,     0,     0,
-     213,   105,     0,     0,     0,     0,     0,   211,   214,   114,
-      91,   104,   113,   116,     0,     0,     0,   311,     0,   310,
-       0,     0,   174,     0,     0,   175,     0,     0,   176,     0,
-     129,   130,   131,   132,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   334,     0,   155,   154,     0,     0,     0,
-      40,     0,     0,     0,   313,     0,     0,     0,    63,    70,
-      72,     0,    78,     0,    25,     0,     0,    96,    98,     0,
-       0,     0,     0,     0,     0,   106,   210,   209,   212,    84,
-      85,   127,     0,   120,     0,     0,     0,     0,     0,     0,
-     203,     0,     0,   127,     0,   123,   122,     0,     0,     0,
-       0,    81,    82,     0,    36,     0,     0,     0,    38,    53,
-       0,   338,     0,   218,   219,   220,   221,   109,     0,     0,
-       0,     0,   309,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   168,     0,     0,   333,   156,
-       0,     0,     0,     0,     0,    76,     0,     0,     0,   118,
-       0,   189,     0,     0,   191,     0,     0,   193,     0,     0,
-       0,   204,     0,   164,     0,   127,   102,    83,     0,    44,
-       0,    50,     0,     0,     0,    89,   308,   177,     0,     0,
-     184,   178,     0,     0,   186,   179,     0,     0,   188,     0,
-       0,     0,   170,     0,     0,     0,     0,     0,     0,     0,
-     195,     0,   197,     0,   199,   205,   207,   169,   165,     0,
-      41,     0,    48,     0,     0,     0,     0,   180,     0,     0,
-     181,     0,     0,   182,     0,     0,     0,    42,     0,     0,
-     151,     0,     0,     0,     0,     0,     0,     0,   171,     0,
-       0,     0,     0,     0,   190,     0,   192,     0,   194,     0,
-      43,    45,     0,    46,     0,    99,     0,     0,     0,     0,
-       0,    51,   196,   198,   200,    47,    49
+       0,     0,     0,     0,   206,     0,     0,   173,   202,     0,
+       0,   215,   217,     0,   135,   134,     0,    27,    28,     0,
+       0,     0,   337,     0,     0,     0,   153,     0,     0,     0,
+     145,   300,   144,     0,     0,     0,     0,   313,     0,   254,
+     275,   261,   282,   262,   283,   263,   284,   352,   348,   303,
+       0,    54,     0,     0,     0,     0,    62,     0,     0,     0,
+     338,    23,    24,     0,     0,    90,     0,   324,     0,    95,
+       0,    97,     0,     0,    93,     0,     0,   110,   111,     0,
+       0,    94,   115,   320,     0,     0,     0,     0,    88,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   147,     0,
+       0,     0,     0,   127,     0,   183,     0,   185,     0,   187,
+       0,     0,     0,     0,   315,     0,     0,     0,     0,   167,
+       0,     0,   100,   101,     0,     0,     0,     0,    80,     0,
+     345,   302,     0,    35,     0,     0,     0,     0,     0,    37,
+       0,     0,     0,    74,     0,     0,    75,     0,   341,     0,
+       0,   329,     0,     0,     0,   103,     0,     0,   112,     0,
+       0,     0,   213,   105,     0,     0,     0,     0,     0,   211,
+     214,   114,    91,   104,   113,   116,     0,     0,     0,   312,
+       0,   311,     0,     0,   174,     0,     0,   175,     0,     0,
+     176,     0,   129,   130,   131,   132,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   335,     0,   155,   154,     0,
+       0,     0,    40,     0,     0,     0,   314,     0,     0,     0,
+      63,    70,    72,     0,    78,     0,    25,     0,     0,    96,
+      98,     0,     0,     0,     0,     0,     0,   106,   210,   209,
+     212,    84,    85,   127,     0,   120,     0,     0,     0,     0,
+       0,     0,   203,     0,     0,   127,     0,   123,   122,     0,
+       0,     0,     0,    81,    82,     0,    36,     0,     0,     0,
+      38,    53,     0,   339,     0,   218,   219,   220,   221,   109,
+       0,     0,     0,     0,   310,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   168,     0,     0,
+     334,   156,     0,     0,     0,     0,     0,    76,     0,     0,
+       0,   118,     0,   189,     0,     0,   191,     0,     0,   193,
+       0,     0,     0,   204,     0,   164,     0,   127,   102,    83,
+       0,    44,     0,    50,     0,     0,     0,    89,   309,   177,
+       0,     0,   184,   178,     0,     0,   186,   179,     0,     0,
+     188,     0,     0,     0,   170,     0,     0,     0,     0,     0,
+       0,     0,   195,     0,   197,     0,   199,   205,   207,   169,
+     165,     0,    41,     0,    48,     0,     0,     0,     0,   180,
+       0,     0,   181,     0,     0,   182,     0,     0,     0,    42,
+       0,     0,   151,     0,     0,     0,     0,     0,     0,     0,
+     171,     0,     0,     0,     0,     0,   190,     0,   192,     0,
+     194,     0,    43,    45,     0,    46,     0,    99,     0,     0,
+       0,     0,     0,    51,   196,   198,   200,    47,    49
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     2,     3,    61,   651,    62,    63,   398,   950,   956,
-     578,   738,  1083,  1206,   579,  1174,  1232,   580,  1208,   581,
-     582,   742,   127,   217,    64,   514,   983,   537,   307,   362,
-     363,    67,    68,    69,    70,    71,   308,   713,  1144,  1189,
-     538,  1003,  1006,  1009,  1158,  1162,  1166,  1198,  1201,  1204,
-     709,   710,    73,    74,    75,   325,   130,   343,   172,   854,
-     855,   327,   311,   198,   646,   769,   209,   210
+      -1,     2,     3,    61,   653,    62,    63,   400,   952,   958,
+     580,   740,  1085,  1208,   581,  1176,  1234,   582,  1210,   583,
+     584,   744,   127,   218,    64,   516,   985,   539,   308,   363,
+     364,    67,    68,    69,    70,    71,   309,   715,  1146,  1191,
+     540,  1005,  1008,  1011,  1160,  1164,  1168,  1200,  1203,  1206,
+     711,   712,    73,    74,    75,   326,   130,   344,   172,   856,
+     857,   328,   312,   199,   648,   771,   210,   211
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -1032
+#define YYPACT_NINF -1035
 static const yytype_int16 yypact[] =
 {
-    2859,    31,    74,  2938, -1032, -1032,  2048,    38,    67,    -2,
-      21,   123,   -55,    19,    52,   -54,    53,    57,   -29,    60,
-      63,   148,   -25,   165,   221,   253,   162,   259,   581,   187,
-     183,   338,   338,   205,   257,   214,   325,   362,   341,    16,
-     417,   394,   303,   444,   448,   454,   327,   344,   349,    14,
-      24, -1032,   360, -1032,   496,   339, -1032,   502,   512,    11,
-      27, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032,
-   -1032, -1032, -1032, -1032, -1032, -1032, -1032,    18,   371,   380,
-   -1032, -1032, -1032,    76,   137,   254,   266,   278,   305,   377,
-     398,   451,   476,   508,   511,   533,   542,   545,   583,   590,
-     594,   597,   618,   630,   385,   395,   403,   415, -1032,   558,
-     418, -1032, -1032, -1032, -1032, -1032, -1032, -1032,  2257,  2257,
-    2257, -1032, -1032,  2257,  1686,     9,   566,  2257,   567,  1986,
-   -1032,   576,   591,  2257,   608, -1032,  2257, -1032,  2257,  2185,
-    2257,  2257,   468,  2257,  2185,  2257,  2257,   488,  2185,  2257,
-    2257,  1348,   491,  2257,   500,   515,   572,  1348,   532,   571,
-     573,   582,   587,   593,   598,   711,   338,   338,   338,  2257,
-    2257,   -41, -1032,   -30,   338,   596,   612,   619,  1915,   218,
-     691,  1348,  1348,   633,     6,   627, -1032, -1032,   634,   691,
-     653,   664,   798,  2257,  2257,  2257,   667,  2257,   668,   721,
-    2257,  2257, -1032,  2257,   818, -1032,   160, -1032, -1032,   829,
-   -1032, -1032,   838,   724,  2257,   859,   723, -1032, -1032,   864,
-    2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,
-    2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,
-    2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,
-    2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257,
-    2257,  2257,   368,   368,   368,   368,  2257,   870,   539,   746,
-     746,   746,  5174,    23,  2185,  4438,   163,   748,   877,   754,
-    2114, -1032, -1032,  2257,  2257,  2257,  2257,  2257,  2257,  2257,
-    2257,  2257,  2257,  2257,  2257,  2257,  2257,  2257, -1032, -1032,
-    2290,   124,  3684,  5195,   655,   750,  2185, -1032, -1032,  2627,
-   -1032,   157,  5216,  5237,  2257,  5258,   450,  5279,  5300,  2257,
-     465,  5321,  5342,  1481,  1214,  2646,   887, -1032,  2257,  5363,
-    2257,  2257,  2257,   888,  2257,  2257,  2257,  2312,  2312,  2312,
-    2312,   761,   -81, -1032, -1032,  3710,  3736,   338,   338,   691,
-     691,   -70,  2257,  2257,  2257,  1915,  1915,  2257,  1106,   220,
-   -1032, -1032,   755,  1106,   256,   892,  2257,   894, -1032,  2257,
-    2257,   996,  2185,   759,  2257,  2257, -1032,  5384,  5405,  5426,
-     811,  3762, -1032,   764,  2665,  5447,  4461, -1032,  2257,   902,
-    1252, -1032,  1386, -1032,  2257,  4484,   333,  2257,     5, -1032,
-    5468,  4507,  5489,  4530,  5510,  4553,  5531,  4576,  5552,  4599,
-    5573,  4622,  5594,  4645,  5615,  4668,  5636,  4691,  5657,  4714,
-    5678,  4737,  3788,  3814,  5699,  4760,  5720,  4783,  5741,  4806,
-    5762,  4829,  5783,  4852,  5804,  4875,  3840,  3866,  3892,  3918,
-    3944,  3970,   176,   768,   774,   775,  2341,   771,  2257, -1032,
-    1348,  1348,   631,   265,   380,  2257,   908,   911,    22,   780,
-   -1032,  2684,  1545,   622,   657,   657,   364,   364,   364,   364,
-     -51,   -51,   746,   746,   746,   746, -1032,    51,  2185,  2257,
-     912,  1880,  2257,   746, -1032,  2257,  2185,  2185,   822,   913,
-     914,  5825,   915,   827,   917,   919,  5846,   831,   923,   924,
-    2185, -1032,   654,  1614,  2257,  5867,   925,  2759,  5888,  5909,
-    2257,  2986,  3014,  5930,   801,  6182, -1032,   802,   808,   809,
-     795,   338,  2257,  2257, -1032, -1032,   803,   807,  2257,  3996,
-    4022,  4048,  3658,   -33,   -42,    10,   -14, -1032,   188,   338,
-    1519, -1032, -1032,  2257,  2257,  5951, -1032,  4898,  4921, -1032,
-     661, -1032,  4944,  4967,   943,   944,   945,   819,  2257,  1785,
-    2257,  2257, -1032,    33,  4990, -1032, -1032, -1032,  5013,    68,
-   -1032,  3042, -1032,   824,   825,   820, -1032,   954, -1032, -1032,
-   -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032,
-   -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032,
-   -1032, -1032, -1032, -1032, -1032,  2257,  2257, -1032, -1032, -1032,
-   -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032,  2257,
-    2257,  2257,  2257,  2257,  2257, -1032,  2185,   368, -1032, -1032,
-   -1032,  2257,  5036,   956,   958,   828, -1032,    89,  2257,   960,
-     961,  2362, -1032,   964,   832,    14,   966, -1032,  2257, -1032,
-     852,   368,   228,  4074,   338, -1032,  2185,  3070,  2708,   746,
-   -1032,  2627, -1032,   926,  1348,  1348,   969,  1348,   599,  1348,
-    1348,   970,   927,  1348,  1348,   670, -1032,  2185,  2381,   972,
-     842,   977,   978,   979,  1065,   980,   981,   982,   983,   984,
-     985,  1003,  1007,   422,  4100,  4126, -1032, -1032,  3098,   338,
-     338,   338,  2185,  2185,  2185,  2185,  1008,   874,   882,   -12,
-   -1032,   459, -1032,   188,  2418,  2437,   883,  1012,  1014,   974,
-    1019,  1021,  1348,  1348,  1348,  1024,  4152, -1032,  2729,  1858,
-    1025,  1026,   895,  1028,  1031, -1032,  1030, -1032,   898,  2257,
-    2257,  1348,   896, -1032,  5972,  5059,  5993,  5082,  6014,  5105,
-    6035,  5128,   231,   903,  6056,   -86, -1032, -1032,    12,   355,
-     916,  1042,  2464, -1032, -1032, -1032,    14,  2257, -1032,   673,
-   -1032,  6182, -1032,  1045,    55,  2257,    35,   674, -1032,  2257,
-     921,    15,    29,  1348,  1051,   928,   929,  1052,  1054,  1348,
-     932,  1058,  1060, -1032,   688, -1032,  1063,  2257,  1348,  1348,
-    1348, -1032,   481,  1348,  1348,  1348,  1348,  1348,  1348,  1348,
-     629,  2257,  2257,  2257,   933,   180,   216,   464,   689,   692,
-     699,   700, -1032,  1348,  2257, -1032, -1032,  1915,   186, -1032,
-   -1032,  2185, -1032, -1032,   934, -1032, -1032,  1070,  1071,   986,
-   -1032,  2257,  2257,  2257, -1032,  1073,  1076,  1084, -1032,   333,
-   -1032,  2257,  4178,  4204,   703, -1032,  2257, -1032, -1032, -1032,
-   -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032,  1348,   380,
-    2257,  1083,  1086,    22, -1032,  1085,  5151,    14, -1032, -1032,
-   -1032,   368,  4230, -1032,   955,  6182,  2257, -1032,   338, -1032,
-     338,  1087, -1032,  2257,  2257, -1032, -1032,  1089,  2257, -1032,
-   -1032, -1032,  1092,  4256,  1093,  1094,  1002,  2257,  2257,   791,
-    1095,  1096,  1097,  1098,  1099,  1100, -1032,  2312,  3126,  6077,
-     568,   691,   338,  1101,   338,  1103,   338,  1104,  1105,  1107,
-    1108,  1109,   309,   988,  6098,  3154,   469, -1032,   707,  2257,
-   -1032, -1032,  1348,  2930,   879,  6119, -1032,  1747, -1032, -1032,
-     280,  6182,  2257,  2257,  1348,   971,   708,  6182,  1111,  1114,
-    2485, -1032,  1115,  1117, -1032,   987, -1032,  1118,  2257, -1032,
-    3182,    50,    56, -1032,  3210,  3238, -1032,  3266,  1116,  2257,
-   -1032, -1032,  1082,  1126,  2504,  2523,  1128, -1032, -1032, -1032,
-   -1032, -1032, -1032, -1032,  2542,  1129,   995, -1032,  2257, -1032,
-     997,   471, -1032,   999,   514, -1032,  1000,   528, -1032,  1001,
-   -1032, -1032, -1032, -1032,  1137,  1348,  1139,  1006,  2257,  1138,
-    3294,  1077,  2257, -1032,  2257, -1032, -1032,  2185,  2561,  1158,
-   -1032,  2257,  4282,  4308, -1032,  1348,  2257,  1161, -1032, -1032,
-   -1032,    14, -1032,  1078, -1032,  4334,  1164, -1032, -1032,  1167,
-    1168,  1169,  1170,  4360,  1036, -1032, -1032, -1032, -1032, -1032,
-   -1032,   691,  2958, -1032,  1915,   188,  1915,   188,  1915,   188,
-   -1032,   712,  1348, -1032,  3322, -1032, -1032,  2257,  3350,  3378,
-     713, -1032, -1032,  1037,  6182,  2257,  2257,   716,  6182, -1032,
-    1191, -1032,  2257, -1032, -1032, -1032, -1032, -1032,  1194,  2257,
-    1059,  2257, -1032,  3406,   534,   314,  3434,   578,   329,  3462,
-     580,   366,  1348,  1196,  1143,  1908,  1067,  2587, -1032, -1032,
-    1200,  2257,  6140,  4386,    28, -1032,  4412,  1069,  3490, -1032,
-    3518,  1204,  2257,  1205,  1206,  2257,  1207,  1208,  2257,  1209,
-    1074, -1032,  2257, -1032,   188, -1032, -1032, -1032,   727, -1032,
-    2257, -1032,  1348,  2257,  1195, -1032, -1032, -1032,  1079,  3546,
-   -1032, -1032,  1080,  3574, -1032, -1032,  1081,  3602, -1032,  1213,
-    2608,   421,  2079,  1220,  1110,  6161,   731,  3630,  1112,   188,
-    1221,   188,  1243,   188,  1244, -1032, -1032, -1032, -1032,   188,
-   -1032,   368, -1032,  1113,  1247,  1250,   424, -1032,  1119,   435,
-   -1032,  1120,   456, -1032,  1121,   461,   734, -1032,  1125,  1348,
-   -1032,  1127,  1253,   188,  1261,   188,  1262,   188, -1032,   368,
-    1264,   368,   740,  1265, -1032,   478, -1032,   489, -1032,   492,
-   -1032, -1032,   743, -1032,  1266, -1032,  1267,  1268,  1269,   368,
-    1270, -1032, -1032, -1032, -1032, -1032, -1032
+    2871,    37,    77,  2950, -1035, -1035,  2016,    82,    61,    29,
+      12,   162,   -66,    41,    64,   -45,   131,   134,   -44,   179,
+     191,   139,   -35,   146,   210,   280,    -7,   160,    78,   236,
+     157,   249,   249,   202,   268,   243,   338,   356,   405,     5,
+     402,   410,   321,   463,   464,   473,   351,   355,   371,    13,
+       8, -1035,   382, -1035,   517,   403, -1035,   540,   544,    11,
+      20, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035,    19,   420,    46,
+   -1035, -1035, -1035,   337,   362,   379,   393,   411,   416,   428,
+     439,   440,   449,   465,   474,   508,   516,   537,   560,   569,
+     572,   580,   621,   626,   417,   434,   445,   461, -1035,   597,
+     478, -1035, -1035, -1035, -1035, -1035, -1035, -1035,  2225,  2225,
+    2225, -1035, -1035,  2225,  1654,     9,   588,  2225,   601,  1098,
+   -1035,   609,   616,  2225,   628, -1035,  2225, -1035,  2225,  2153,
+    2225,  2225,   492,  2225,  2153,  2225,  2225,   502,  2153,  2225,
+    2225,  1316,   512,  2225,   500,   521,   538,  1316,   510,   552,
+     563,   564,   581,   600,   631,   715,   249,   249,   249,  2225,
+    2225,   -70, -1035,   220,   249,   594,   613,   632,  1883,   222,
+     701,  1316,  1316,   640,    34,   641, -1035,   774, -1035,   643,
+     701,   654,   666,   800,  2225,  2225,  2225,   669,  2225,   678,
+     730,  2225,  2225, -1035,  2225,   816, -1035,   625, -1035, -1035,
+     831, -1035, -1035,   835,   729,  2225,   842,   740, -1035, -1035,
+     845,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,
+    2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,
+    2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,
+    2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,
+    2225,  2225,  2225,   620,   620,   620,   620,  2225,   871,   298,
+     755,   755,   755,  5240,    58,  2153,  4504,   164,   759,   886,
+     764,  1954, -1035, -1035,  2225,  2225,  2225,  2225,  2225,  2225,
+    2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225,  2225, -1035,
+   -1035,  2082,   -68,  3750,  5261,   650,   760,  2153, -1035, -1035,
+    2651, -1035,   302,  5282,  5303,  2225,  5324,   645,  5345,  5366,
+    2225,   649,  5387,  5408,  1449,  1169,  2670,   895, -1035,  2225,
+    5429,  2225,  2225,  2225,   896,  2225,  2225,  2225,  2280,  2280,
+    2280,  2280,   771,    -8, -1035, -1035,  3776,  3802,   249,   249,
+     701,   701,   264,  2225,  2225,  2225,  1883,  1883,  2225,  3017,
+     300, -1035, -1035,   765,  3017,    80,   901,  2225,   903, -1035,
+    2225,  2225,   957, -1035,  2153,   768,  2225,  2225, -1035,  5450,
+    5471,  5492,   818,  3828, -1035,   775,  2692,  5513,  4527, -1035,
+    2225,   908,  1354, -1035,  1487, -1035,  2225,  4550,    83,  2225,
+       7, -1035,  5534,  4573,  5555,  4596,  5576,  4619,  5597,  4642,
+    5618,  4665,  5639,  4688,  5660,  4711,  5681,  4734,  5702,  4757,
+    5723,  4780,  5744,  4803,  3854,  3880,  5765,  4826,  5786,  4849,
+    5807,  4872,  5828,  4895,  5849,  4918,  5870,  4941,  3906,  3932,
+    3958,  3984,  4010,  4036,   159,   777,   780,   784,  2325,   781,
+    2225, -1035,  1316,  1316,   655,    69,    46,  2225,   914,   918,
+      17,   786, -1035,  2722,   623,   736,   863,   863,   585,   585,
+     585,   585,   542,   542,   755,   755,   755,   755, -1035,    16,
+    2153,  2225,   917,  1848,  2225,   755, -1035,  2225,  2153,  2153,
+     829,   919,   921,  5891,   922,   837,   927,   928,  5912,   841,
+     931,   932,  2153, -1035,   658,  1582,  2225,  5933,   933,  2251,
+    5954,  5975,  2225,  3052,  3080,  5996,   806,  6248, -1035,   807,
+     808,   810,   809,   249,  2225,  2225, -1035, -1035,   804,   811,
+    2225,  4062,  4088,  4114,  3724,   -36,   -34,   -40,   -11, -1035,
+      -6,   249,  1753, -1035, -1035,  2225,  2225,  6017, -1035,  4964,
+    4987, -1035,   659, -1035,  5010,  5033,   944,   945,   947,   817,
+    2225,  1876,  2225,  2225, -1035,    22,  5056, -1035, -1035, -1035,
+    5079,   422, -1035,  3108, -1035,   822,   823,   819, -1035,   953,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035,  2225,  2225, -1035,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035,
+   -1035,  2225,  2225,  2225,  2225,  2225,  2225, -1035,  2153,   620,
+   -1035, -1035, -1035,  2225,  5102,   955,   956,   826, -1035,    15,
+    2225,   958,   960,  2355, -1035,   961,   838,    13,   973, -1035,
+    2225, -1035,   846,   620,   242,  4140,   249, -1035,  2153,  3136,
+    2741,   755, -1035,  2651, -1035,   943,  1316,  1316,   986,  1316,
+     754,  1316,  1316,   987,   929,  1316,  1316,   671, -1035,  2153,
+    2374,   990,   857,   992,  1003,  1005,   605,  1011,  1013,  1015,
+    1016,  1018,  1019,  1020,  1025,   329,  4166,  4192, -1035, -1035,
+    3164,   249,   249,   249,  2153,  2153,  2153,  2153,  1028,   894,
+     902,    32, -1035,   341, -1035,    -6,  2407,  2426,   897,  1031,
+    1033,   991,  1035,  1036,  1316,  1316,  1316,  1039,  4218, -1035,
+    2772,  1826,  1040,  1044,   911,  1045,  1046, -1035,  1047, -1035,
+     920,  2225,  2225,  1316,   915, -1035,  6038,  5125,  6059,  5148,
+    6080,  5171,  6101,  5194,   261,   924,  6122,   -86, -1035, -1035,
+     195,   267,   926,  1048,  2448, -1035, -1035, -1035,    13,  2225,
+   -1035,   672, -1035,  6248, -1035,  1051,    55,  2225,    54,   675,
+   -1035,  2225,   925,    14,    24,  1316,  1054,   930,   934,  1056,
+    1062,  1316,   935,  1063,  1064, -1035,   676, -1035,  1067,  2225,
+    1316,  1316,  1316, -1035,   209,  1316,  1316,  1316,  1316,  1316,
+    1316,  1316,   119,  2225,  2225,  2225,   936,   -61,   176,   217,
+     685,   693,   694,   702, -1035,  1316,  2225, -1035, -1035,  1883,
+     225, -1035, -1035,  2153, -1035, -1035,   937, -1035, -1035,  1073,
+    1074,   981, -1035,  2225,  2225,  2225, -1035,  1075,  1077,  1081,
+   -1035,    83, -1035,  2225,  4244,  4270,   703, -1035,  2225, -1035,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035,
+    1316,    46,  2225,  1080,  1083,    17, -1035,  1082,  5217,    13,
+   -1035, -1035, -1035,   620,  4296, -1035,   963,  6248,  2225, -1035,
+     249, -1035,   249,  1084, -1035,  2225,  2225, -1035, -1035,  1086,
+    2225, -1035, -1035, -1035,  1088,  4322,  1089,  1095,   998,  2225,
+    2225,   843,  1096,  1097,  1099,  1103,  1104,  1114, -1035,  2280,
+    3192,  6143,  2968,   701,   249,  1116,   249,  1117,   249,  1118,
+    1119,  1120,  1121,  1122,   295,   912,  6164,  3220,   447, -1035,
+     710,  2225, -1035, -1035,  1316,  2996,   562,  6185, -1035,  1715,
+   -1035, -1035,   308,  6248,  2225,  2225,  1316,   989,   726,  6248,
+    1128,  1130,  2478, -1035,  1131,  1134, -1035,   999, -1035,  1135,
+    2225, -1035,  3248,    63,    88, -1035,  3276,  3304, -1035,  3332,
+    1137,  2225, -1035, -1035,  1101,  1138,  2497,  2530,  1139, -1035,
+   -1035, -1035, -1035, -1035, -1035, -1035,  2549,  1140,  1002, -1035,
+    2225, -1035,  1007,   457, -1035,  1010,   507, -1035,  1017,   514,
+   -1035,  1021, -1035, -1035, -1035, -1035,  1146,  1316,  1149,  1023,
+    2225,  1153,  3360,  1069,  2225, -1035,  2225, -1035, -1035,  2153,
+    2571,  1159, -1035,  2225,  4348,  4374, -1035,  1316,  2225,  1160,
+   -1035, -1035, -1035,    13, -1035,  1076, -1035,  4400,  1161, -1035,
+   -1035,  1162,  1163,  1165,  1168,  4426,  1034, -1035, -1035, -1035,
+   -1035, -1035, -1035,   701,  3024, -1035,  1883,    -6,  1883,    -6,
+    1883,    -6, -1035,   731,  1316, -1035,  3388, -1035, -1035,  2225,
+    3416,  3444,   732, -1035, -1035,  1041,  6248,  2225,  2225,   735,
+    6248, -1035,  1171, -1035,  2225, -1035, -1035, -1035, -1035, -1035,
+    1199,  2225,  1065,  2225, -1035,  3472,   524,   296,  3500,   536,
+     367,  3528,   567,   414,  1316,  1200,  1144,  2047,  1068,  2601,
+   -1035, -1035,  1202,  2225,  6206,  4452,    28, -1035,  4478,  1070,
+    3556, -1035,  3584,  1205,  2225,  1221,  1222,  2225,  1223,  1224,
+    2225,  1226,  1091, -1035,  2225, -1035,    -6, -1035, -1035, -1035,
+     738, -1035,  2225, -1035,  1316,  2225,  1235, -1035, -1035, -1035,
+    1100,  3612, -1035, -1035,  1107,  3640, -1035, -1035,  1108,  3668,
+   -1035,  1236,  2620,   423,  2379,  1238,  1110,  6227,   742,  3696,
+    1105,    -6,  1246,    -6,  1247,    -6,  1248, -1035, -1035, -1035,
+   -1035,    -6, -1035,   620, -1035,  1115,  1249,  1252,   438, -1035,
+    1123,   442, -1035,  1124,   452, -1035,  1125,   454,   747, -1035,
+    1126,  1316, -1035,  1127,  1253,    -6,  1254,    -6,  1255,    -6,
+   -1035,   620,  1257,   620,   752,  1262, -1035,   456, -1035,   458,
+   -1035,   487, -1035, -1035,   756, -1035,  1264, -1035,  1265,  1266,
+    1267,   620,  1268, -1035, -1035, -1035, -1035, -1035, -1035
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-   -1032, -1032, -1032, -1032,   482, -1032, -1032, -1032, -1032,   156,
-   -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032,
-   -1032, -1032,  -274,    17, -1032,  -242, -1032,  1255,     4,  -183,
-    -175, -1032, -1032, -1032, -1032, -1032,  1282, -1032, -1032, -1032,
-   -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032, -1032,
-    -356,  -651, -1032, -1032, -1032,    -5, -1032,   281, -1032, -1031,
-    -143,   236,   251,  -620,   413, -1032,   -60,    -1
+   -1035, -1035, -1035, -1035,   482, -1035, -1035, -1035, -1035,   152,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035,
+   -1035, -1035,  -269,    35, -1035,   -18, -1035,  1277,     4,  -184,
+    -176, -1035, -1035, -1035, -1035, -1035,  1278, -1035, -1035, -1035,
+   -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035, -1035,
+    -711,  -564, -1035, -1035, -1035,    -5, -1035,   229, -1035, -1034,
+     306,   125,  -116,  -612,   407, -1035,   -60,    -1
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -1456,958 +1457,966 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -5
 static const yytype_int16 yytable[] =
 {
-     212,   129,   455,   358,  1087,   131,   373,    66,   326,   572,
-     367,   371,   368,   276,   333,   206,   207,   142,   196,   636,
-     184,   887,   213,   128,   152,   768,   644,   135,   199,   142,
-     450,   206,   207,   390,  1151,   889,   392,     4,   364,   365,
-     730,   883,   147,   347,   348,   121,   122,   104,   105,   106,
-     107,   132,   734,   108,   347,   348,  1047,   649,   826,   521,
-     706,   880,  1048,   104,   105,   106,   107,   707,   708,   108,
-     528,   888,   206,   207,     5,   294,   295,   296,   219,   138,
-     143,   147,   297,   347,   348,   890,   139,   144,   573,   574,
-     575,   576,   143,   759,   347,   348,   517,   518,   519,   703,
-     349,   138,   277,   278,   104,   105,   106,   107,   702,   153,
-     108,   350,   148,   269,   270,   271,   133,   185,   272,   275,
-     150,  1176,   280,   114,   115,   116,   117,   705,   300,   137,
-     825,   302,   134,   303,   309,   312,   313,   451,   315,   309,
-     317,   318,   369,   309,   321,   322,   875,   577,   329,   121,
-     122,   704,   208,   140,   214,   197,   215,   186,   200,   347,
-     348,   216,   136,   645,   345,   346,   526,   527,   211,  1152,
-     454,   731,   650,   346,   347,   348,   650,   826,  1222,   638,
-     347,   348,   760,   761,   361,   540,   141,   145,   377,   378,
-     379,   146,   381,   361,   149,   384,   385,   150,   386,   121,
-     122,   151,   442,   443,   444,   445,   734,   559,   157,   395,
-     220,   158,   221,   159,   154,   400,   401,   402,   403,   404,
-     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
-     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
-     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
-     435,   436,   437,   438,   439,   440,   441,   966,   706,   477,
-     706,   446,   542,   543,   478,   707,   708,   707,   708,   309,
-     155,   222,   636,   223,   114,   115,   116,   117,   461,   462,
-     463,   464,   465,   466,   467,   468,   469,   470,   471,   472,
-     473,   474,   475,   456,   121,   122,   388,   487,   389,   488,
-     175,   483,   156,   176,   347,   348,   177,   633,   634,   491,
-     160,   625,   171,   173,   496,   179,   626,   485,   483,   309,
-     922,   165,   923,   505,   166,   507,   508,   509,   937,   511,
-     512,   513,   515,   515,   515,   515,   516,   516,   516,   516,
-     347,   348,   347,   348,   347,   348,   174,   529,   530,   531,
-     269,   270,   532,   361,   361,   180,   924,   828,   925,   360,
-     539,   545,   869,   774,   547,   548,   865,   309,   487,   552,
-     553,   487,   206,   207,   181,   310,   114,   115,   116,   117,
-     310,   167,   168,   564,   310,   207,   706,   183,   224,   568,
-     225,   169,   571,   707,   708,   316,   121,   122,   178,   320,
-     226,   706,   227,   637,   104,   105,   106,   107,   707,   708,
-     108,   182,   228,   570,   229,  1030,   104,   105,   106,   107,
-    1031,  1090,   108,   187,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   503,   295,   296,   706,   230,
-     188,   231,   297,   632,   189,   707,   708,   342,   190,   344,
-     641,  1014,   191,   640,   826,   351,  1133,   826,   192,   359,
-     826,   193,   167,   168,   121,   122,   114,   115,   116,   117,
-     639,  1136,   169,   309,   653,   203,   632,   657,   194,   170,
-     658,   659,   661,   195,   868,   870,   121,   122,   292,   293,
-     294,   295,   296,   706,   201,   309,   706,   297,   659,   678,
-     707,   708,   202,   707,   708,   684,   204,   706,  1139,   736,
-     310,   232,   218,   233,   707,   708,   205,   694,   695,   262,
-     826,   781,   782,   698,   784,   452,   787,   788,   706,   263,
-     791,   792,   234,   706,   235,   707,   708,   264,   714,   715,
-     707,   708,   484,   907,   908,   826,   347,   348,   826,   265,
-     706,   826,   267,   726,   826,   728,   729,   707,   708,   484,
-     310,   706,   811,  1187,   706,   266,  1212,   753,   707,   708,
-     279,   707,   708,   281,   826,   502,   826,  1214,   826,   837,
-     838,   839,   298,   347,   348,   236,   735,   237,   347,   348,
-     487,   773,   493,   347,   348,   347,   348,   299,  1216,   827,
-     744,   745,   314,  1218,   926,   487,   927,   497,   310,  1018,
-     238,  1064,   239,   301,   746,   747,   748,   749,   750,   751,
-    1236,   309,   319,   550,   161,   328,   754,   162,   524,   525,
-     163,  1237,   164,   762,  1238,   916,   917,   344,   347,   348,
-     891,   330,   240,   771,   241,   242,   897,   243,   785,   331,
-     786,   309,   347,   348,  1066,   904,   905,   906,   347,   348,
-     909,   910,   911,   912,   913,   914,   915,   244,  1068,   245,
-     121,   122,   309,   334,  1132,   448,   246,   215,   247,   248,
-     933,   249,   216,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,   309,   309,   309,
-     309,   297,   347,   348,   347,   348,   332,   336,   998,  1105,
-     999,  1108,   335,  1111,   310,   341,   337,   250,  1135,   251,
-    1138,   338,   660,   662,   252,   958,   253,   339,   254,   652,
-     255,   256,   340,   257,   852,   853,   310,   352,  1000,   660,
+     213,   129,   359,  1089,   830,   131,   375,    66,   457,   184,
+     372,   574,   200,   277,   152,   207,   208,   197,   135,   761,
+     889,   646,   651,   214,   207,   208,   142,   147,   317,   732,
+     891,   147,   321,   392,  1153,   770,   394,   142,   368,   157,
+     369,   128,   158,     4,   159,   121,   122,   104,   105,   106,
+     107,   208,   736,   108,   348,   349,   104,   105,   106,   107,
+     885,   882,   108,   348,   349,   452,   708,   479,   138,  1049,
+     890,   350,   480,   709,   710,   139,   638,     5,   220,   924,
+     892,   925,   104,   105,   106,   107,   544,   545,   108,   143,
+     575,   576,   577,   578,  1050,   132,   144,   148,   138,   153,
+     143,   706,   278,   279,   708,   704,   185,   705,   762,   763,
+     133,   709,   710,   270,   271,   272,   348,   349,   273,   276,
+    1178,   161,   281,   150,   162,   918,   919,   163,   301,   164,
+     707,   303,   523,   304,   310,   313,   314,   652,   316,   310,
+     318,   319,   201,   310,   322,   323,   186,   828,   330,   579,
+     121,   122,   209,   136,   198,   215,   877,   216,   647,   454,
+     733,   212,   217,   134,   346,   347,   528,   529,   137,  1154,
+     370,   456,   453,   347,   827,   140,   652,  1224,   348,   349,
+     114,   115,   116,   117,   362,   542,   640,   348,   349,   379,
+     380,   381,   151,   383,   362,   154,   386,   387,   141,   388,
+     121,   122,   638,   444,   445,   446,   447,   639,   561,   504,
+     397,   160,   348,   349,   121,   122,   402,   403,   404,   405,
+     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,
+     416,   417,   418,   419,   420,   421,   422,   423,   424,   425,
+     426,   427,   428,   429,   430,   431,   432,   433,   434,   435,
+     436,   437,   438,   439,   440,   441,   442,   443,   552,   155,
+     171,   173,   448,   179,   311,   145,   828,   968,   146,   311,
+     310,   909,   910,   311,   871,   114,   115,   116,   117,   463,
+     464,   465,   466,   467,   468,   469,   470,   471,   472,   473,
+     474,   475,   476,   477,   627,   121,   122,   708,   166,   628,
+     348,   349,   485,   487,   709,   710,   114,   115,   116,   117,
+     493,   175,   458,   149,   176,   498,   926,   177,   927,   485,
+     310,   519,   520,   521,   507,   150,   509,   510,   511,   156,
+     513,   514,   515,   517,   517,   517,   517,   518,   518,   518,
+     518,   348,   349,   174,   348,   349,   348,   349,   531,   532,
+     533,   270,   271,   534,   362,   362,  1107,   928,  1110,   929,
+    1113,   351,   547,   361,   654,   549,   550,   939,   708,   310,
+     165,   554,   555,   167,   168,   709,   710,   776,   114,   115,
+     116,   117,   489,   169,   180,   566,   677,   181,   348,   349,
+     170,   570,   167,   168,   573,   343,   867,   345,   121,   122,
+     311,   489,   169,   352,   530,   182,   187,   360,   188,   178,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   505,   296,   297,   348,   349,   207,   208,   298,   121,
+     122,  1092,   486,   572,   450,  1173,   216,  1016,  1135,   708,
+     541,   217,   489,  1032,   490,   634,   709,   710,  1033,   486,
+     311,   183,   643,   348,   349,   642,   189,   327,   104,   105,
+     106,   107,   190,   334,   108,   348,   349,   191,   192,   813,
+    1198,   221,  1201,   222,  1204,   310,   655,   193,   634,   659,
+    1207,   829,   660,   661,   663,   194,   708,   365,   366,   195,
+     641,   870,   872,   709,   710,   708,   223,   310,   224,   311,
+     661,   680,   709,   710,  1227,   196,  1229,   686,  1231,  1138,
+     708,   738,   754,   225,   708,   226,   202,   709,   710,   696,
+     697,   709,   710,   203,   708,   700,   708,   227,   708,   228,
+     708,   709,   710,   709,   710,   709,   710,   709,   710,   204,
+     716,   717,   779,   828,   205,   229,   828,   230,   206,   828,
+     231,   263,   232,   121,   122,   728,  1141,   730,   731,   708,
+     736,   219,   233,   796,   234,  1189,   709,   710,   264,   755,
+    1026,   348,   349,   235,   237,   236,   238,   526,   527,   265,
+    1214,   348,   349,   239,  1216,   240,   345,  1020,   820,   821,
+     822,   823,   280,   775,  1218,   266,  1220,  1066,  1238,   241,
+    1239,   242,   746,   747,   267,   311,   737,   282,   243,   828,
+     244,   803,   268,   662,   664,   299,   748,   749,   750,   751,
+     752,   753,   300,   310,   207,   208,   315,   311,   756,  1240,
+     662,   348,   349,   302,   828,   764,   320,   828,   348,   349,
+     828,   331,   245,   828,   246,   773,   329,  1068,   348,   349,
+     247,   335,   248,   310,  1070,   332,   104,   105,   106,   107,
+     348,   349,   108,   828,  1134,   828,   804,   828,   295,   296,
+     297,   249,   333,   250,   310,   298,  1137,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   348,   349,   336,   251,   298,   252,   337,   338,   310,
+     310,   310,   310,   253,  1027,   254,   255,  1140,   256,   293,
+     294,   295,   296,   297,   257,   339,   258,   940,   298,   342,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   340,   353,   854,   855,   298,  1002,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,   675,   258,   353,   259,   297,    30,    31,    32,    33,
-     354,    35,   876,   370,   260,    38,   261,   366,    41,    42,
-     882,   487,   735,   635,   885,   372,   871,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,   121,   122,  1171,   374,
-     297,   481,   903,   215,   487,   986,   676,   987,   216,  1021,
-     375,   487,   693,   719,   376,   380,   918,   919,   920,   382,
-     487,  1034,   793,   877,   487,   878,   884,   383,   932,   934,
-     711,   967,   935,  1196,   387,  1199,   309,  1202,   487,   487,
-     901,   928,   487,  1205,   929,   391,   943,   944,   945,   487,
-     487,   930,   931,   954,   393,   955,   951,   487,  1036,  1019,
-    1037,   957,  1112,   487,  1113,  1120,   954,  1225,  1124,  1227,
-     394,  1229,   310,   396,   397,   960,   949,  1036,   959,  1173,
-     399,   954,  1071,  1193,  1219,   447,  1220,   752,  1100,   297,
-     954,   970,  1234,  1239,   458,  1240,   457,  1024,   974,   975,
-     459,   482,   310,   977,   504,   510,   520,   541,  1115,   544,
-     546,   551,   984,   985,   557,   560,   565,   777,   627,   628,
-     629,   631,   994,   310,   642,   643,   995,   647,   663,   654,
-     664,   665,   667,   668,   669,   361,   670,   672,   794,  1114,
-     673,   674,   680,   692,  1020,   776,   688,   689,   310,   310,
-     310,   310,  1028,   690,   691,   696,  1029,  1032,  1033,   697,
-     722,   723,   724,   818,   819,   820,   821,   725,   739,   740,
-     743,   741,   756,  1045,   757,   758,   763,   764,   767,  1140,
-    1172,   766,   770,   772,  1053,   780,   783,   789,   790,   796,
-     815,   816,   817,   797,   798,   799,   800,   803,   804,   805,
-     806,   807,   808,  1062,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     7,     8,
-     809,   810,   297,  1074,   822,   823,   824,  1078,   832,  1079,
-     833,  1025,   309,   834,   831,   835,  1084,   836,   840,   845,
-     846,  1088,   851,   847,   848,   849,   850,   856,   866,   533,
-      13,    14,   534,    16,    17,   535,    19,   536,    21,   873,
-      22,   879,    24,    25,   872,    27,    28,   892,   895,  1103,
-     896,  1106,   886,  1109,   899,   361,   900,   310,   902,   893,
-     894,   801,  1117,   898,   921,   939,   940,   941,   942,   946,
-    1122,  1123,   938,   947,    46,    47,    48,  1126,   948,   961,
-     962,   964,   969,   973,  1128,   976,  1130,   978,   982,   980,
-     981,   988,   989,   990,   991,   992,   993,  1002,   936,  1005,
-    1008,  1010,  1035,  1011,  1012,  1013,   957,  1038,     7,     8,
-    1039,  1052,  1041,  1042,  1044,  1043,   802,  1159,  1015,  1054,
-    1163,  1207,  1055,  1167,  1058,  1060,  1061,  1170,   549,  1063,
-    1065,  1067,  1069,  1070,  1075,  1175,  1072,  1073,  1177,   533,
-      13,    14,   534,    16,    17,   535,    19,   536,    21,  1230,
-      22,  1233,    24,    25,  1082,    27,    28,  1089,  1077,   971,
-    1093,   972,  1091,  1094,  1095,  1096,  1097,  1099,  1121,  1245,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,    46,    47,    48,  1125,   297,  1127,
-    1178,  1129,  1141,  1001,  1142,  1004,  1147,  1007,  1145,  1154,
-    1157,  1160,  1161,  1164,  1165,  1168,  1169,    76,   304,  1185,
-    1179,  1181,  1183,    80,    81,    82,  1190,  1197,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,  1200,
-    1203,  1191,  1195,  1210,  1209,  1211,   881,   305,    65,  1224,
-    1213,  1215,  1217,   310,     7,     8,  1221,  1226,  1228,  1223,
-    1231,  1235,  1241,  1242,  1243,  1244,  1246,  1148,  1080,    30,
-      31,    32,    33,    34,    35,    72,   963,     0,    38,     0,
-       0,    41,    42,     0,     0,   533,    13,    14,   534,    16,
-      17,   535,    19,   536,    21,     0,    22,     0,    24,    25,
-       0,    27,    28,     0,     0,     0,     0,     0,     0,     0,
-       0,   110,   111,   112,   113,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   118,   306,
-      46,    47,    48,   120,     0,  1104,     0,  1107,   123,  1110,
-       0,    76,   304,   126,     0,     0,   501,    80,    81,    82,
-       0,     0,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,     0,     0,     0,     0,     0,     0,     0,
-       0,   305,     0,     0,   566,     0,     0,     0,     7,     8,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    30,    31,    32,    33,    34,    35,     0,
-       0,     0,    38,     0,     0,    41,    42,     0,     0,   533,
-      13,    14,   534,    16,    17,   535,    19,   536,    21,     0,
-      22,     0,    24,    25,     0,    27,    28,     0,     0,     0,
-       0,     0,     0,     0,     0,   110,   111,   112,   113,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   118,   323,    46,    47,    48,   120,     0,     0,
-       0,     0,   123,     0,    76,   304,     0,   126,     0,   324,
-      80,    81,    82,     0,     0,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,     0,     0,     0,     0,
-       0,     0,     0,     0,   305,     0,     0,     0,   567,     0,
-       0,     7,     8,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    30,    31,    32,    33,
-      34,    35,     0,     0,     0,    38,     0,     0,    41,    42,
-       0,     0,   533,    13,    14,   534,    16,    17,   535,    19,
-     536,    21,     0,    22,     0,    24,    25,     0,    27,    28,
-       0,     0,     0,     0,     0,     0,     0,     0,   110,   111,
-     112,   113,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   118,   306,    46,    47,    48,
-     120,     0,     0,     0,     0,   123,     0,    76,   304,     0,
-     126,     0,   500,    80,    81,    82,     0,     0,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,     0,
-       0,     0,     0,     0,     0,     0,     0,   305,     0,     0,
-       0,   712,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,    30,
-      31,    32,    33,    34,    35,     0,     0,     0,    38,    76,
-     268,    41,    42,     0,     0,    80,    81,    82,     0,     0,
+     296,   297,   695,   311,   354,   259,   298,   260,   635,   636,
+     261,   390,   262,   391,   878,   341,    30,    31,    32,    33,
+     713,    35,   884,   355,   367,    38,   887,   371,    41,    42,
+     373,   121,   122,   311,   374,   489,   483,   495,   216,   489,
+     376,   499,   737,   217,   905,   489,   873,   637,   489,   489,
+     678,   721,   377,   787,   311,   788,   378,   382,   920,   921,
+     922,   489,   879,   795,   880,   489,   489,   886,   903,   384,
+     934,   936,   389,   969,   937,   489,   385,   930,   310,   311,
+     311,   311,   311,   489,   489,   931,   932,   393,   945,   946,
+     947,   395,   489,   956,   933,   957,   398,   988,   953,   989,
+     489,   401,  1021,   959,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   396,  1038,   962,  1039,   298,
+     961,  1114,   489,  1115,  1122,   956,   449,  1126,  1038,  1102,
+    1175,   399,   956,   972,  1195,   778,   951,  1221,   298,  1222,
+     976,   977,   956,   460,  1236,   979,  1241,   459,  1242,  1117,
+     461,   484,   506,   512,   986,   987,   522,   543,   546,   548,
+     553,   559,   567,  1082,   996,   630,   562,   629,   997,   631,
+     644,   633,   645,   649,   656,   665,   666,   362,   667,   669,
+     817,   818,   819,   670,   671,   672,  1022,   674,   675,   676,
+     682,   690,   691,   692,  1030,   693,   698,   694,  1031,  1034,
+    1035,   724,   725,   699,   726,   727,   741,   742,   311,   745,
+     743,   758,   759,   760,   765,  1047,   766,   774,   768,     7,
+       8,  1174,   783,   784,   769,   786,  1055,   789,   790,   772,
+     792,   793,   794,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   782,   785,   791,  1064,   298,   798,   799,   800,
+     535,    13,    14,   536,    16,    17,   537,    19,   538,    21,
+     801,    22,   802,    24,    25,  1076,    27,    28,   805,  1080,
+     806,  1081,   807,   808,   310,   809,   810,   811,  1086,   812,
+     839,   840,   841,  1090,   824,   825,   826,   834,   833,   835,
+     836,   837,   838,   842,   847,    46,    47,    48,   848,   849,
+     851,   850,  1017,   852,   853,   875,   858,   881,   938,   868,
+     894,  1105,   897,  1108,   874,  1111,   888,   362,   898,   901,
+     902,   895,   904,   944,  1119,   896,   900,   923,   941,   942,
+     943,   948,  1124,  1125,   949,   950,   963,   964,   966,  1128,
+     975,   893,   978,   980,   984,   982,  1130,   899,  1132,   551,
+     971,   983,   990,   991,   283,   992,   906,   907,   908,   993,
+     994,   911,   912,   913,   914,   915,   916,   917,   959,   973,
+     995,   974,  1004,  1007,  1010,  1012,  1013,  1014,  1015,  1161,
+    1037,   935,  1165,  1209,  1040,  1169,  1041,  1045,  1043,  1172,
+    1044,  1046,  1054,  1063,  1057,  1060,  1062,  1177,  1056,  1065,
+    1179,  1067,  1072,  1003,   311,  1006,  1074,  1009,  1069,  1077,
+    1079,  1232,  1071,  1235,  1075,  1084,  1091,  1095,  1096,  1097,
+    1093,  1098,    76,   305,  1099,  1101,   960,  1127,    80,    81,
+      82,  1247,  1123,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,  1129,  1144,  1143,  1131,  1149,  1147,
+    1156,  1159,   306,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,  1162,  1163,  1166,
+    1167,   298,  1170,  1171,    30,    31,    32,    33,    34,    35,
+    1180,  1181,  1187,    38,  1192,  1197,    41,    42,  1183,  1185,
+    1023,  1193,  1199,  1202,  1205,  1212,  1211,  1213,   883,  1226,
+    1228,  1230,  1036,  1233,  1215,  1217,  1219,  1223,  1237,  1225,
+    1243,  1244,  1245,  1246,  1248,  1150,   110,   111,   112,   113,
+      65,    72,   965,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   118,   307,  1106,     0,  1109,   120,  1112,
+       0,     0,     0,   123,     0,     0,     0,     0,   126,     0,
+       0,   503,     0,     0,     0,     0,     0,     0,     0,    76,
+     305,     0,     0,  1073,     0,    80,    81,    82,     0,     0,
       83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
       93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   110,   111,   112,   113,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   118,   306,
-       0,     0,     0,   120,     0,     0,     0,     0,   123,     0,
-      76,   268,   207,   126,     0,   677,    80,    81,    82,     0,
-       0,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,     0,   104,   105,   106,   107,     0,     0,   108,
-       0,     0,     0,   110,   111,   112,   113,     7,     8,     0,
+     103,     0,     0,     0,     0,     0,     0,     0,     0,   306,
+       0,     0,     0,     0,     0,     0,     7,     8,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     118,   119,     0,     0,     0,   120,     0,     0,     0,     0,
-     123,     0,     0,   273,     0,   126,     0,   274,   533,    13,
-      14,   534,    16,    17,   535,    19,   536,    21,     0,    22,
-       0,    24,    25,     0,    27,    28,     0,     0,     0,     0,
-       0,     0,     0,     0,   110,   111,   112,   113,     0,     0,
-       0,     0,     0,     0,     0,     0,   843,     0,     0,     0,
-       0,   118,   119,    46,    47,    48,   120,     0,     0,     0,
-       0,   123,     0,    76,   268,     0,   126,     0,  1027,    80,
-      81,    82,     0,     0,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,     0,     0,     0,    76,   268,
-       7,     8,     0,     0,    80,    81,    82,   727,     0,    83,
+    1116,    30,    31,    32,    33,    34,    35,     0,     0,     0,
+      38,     0,     0,    41,    42,     0,     0,   535,    13,    14,
+     536,    16,    17,   537,    19,   538,    21,     0,    22,     0,
+      24,    25,     0,    27,    28,     0,     0,     0,     0,     0,
+    1142,     0,     0,   110,   111,   112,   113,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     118,   324,    46,    47,    48,   120,     0,     0,     0,     0,
+     123,     0,    76,   305,     0,   126,     0,   325,    80,    81,
+      82,     0,     0,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,     0,     0,     0,     0,     0,     0,
+       0,     0,   306,     0,     0,     0,   568,     0,     0,     7,
+       8,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    30,    31,    32,    33,    34,    35,
+       0,     0,     0,    38,     0,     0,    41,    42,     0,     0,
+     535,    13,    14,   536,    16,    17,   537,    19,   538,    21,
+       0,    22,     0,    24,    25,     0,    27,    28,     0,     0,
+       0,     0,     0,     0,     0,     0,   110,   111,   112,   113,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   118,   307,    46,    47,    48,   120,     0,
+       0,     0,     0,   123,     0,    76,   305,     0,   126,     0,
+     502,    80,    81,    82,     0,     0,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,     0,     0,     0,
+       0,     0,     0,     0,     0,   306,     0,     0,     0,   569,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    30,    31,    32,
+      33,    34,    35,     0,     0,     0,    38,    76,   269,    41,
+      42,     0,     0,    80,    81,    82,     0,     0,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   110,
+     111,   112,   113,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   118,   307,     0,     0,
+       0,   120,     0,     0,     0,     0,   123,     0,    76,   269,
+     208,   126,     0,   679,    80,    81,    82,     0,     0,    83,
       84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
       94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-       0,   533,    13,    14,   534,    16,    17,   535,    19,   536,
-      21,     0,    22,     0,    24,    25,     0,    27,    28,     0,
-       0,     0,     0,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,   110,   111,   112,
-     113,   297,   282,   844,     0,     0,    46,    47,    48,     0,
-       0,     0,     0,     0,   118,   119,     0,     0,     0,   120,
-       0,     0,     0,     0,   123,     0,     0,   655,     0,   126,
-       0,   656,   110,   111,   112,   113,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   355,
-     356,     0,     0,     0,   120,     0,     0,     0,     0,   357,
-    1143,    76,    77,    78,   126,    79,   170,    80,    81,    82,
+       0,   104,   105,   106,   107,     0,     0,   108,     0,     0,
+       0,   110,   111,   112,   113,     7,     8,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   118,   119,
+       0,     0,     0,   120,     0,     0,     0,     0,   123,     0,
+       0,   274,     0,   126,     0,   275,   535,    13,    14,   536,
+      16,    17,   537,    19,   538,    21,     0,    22,     0,    24,
+      25,     0,    27,    28,     0,     0,     0,     0,     0,     0,
+       0,     0,   110,   111,   112,   113,     0,     0,     0,     0,
+       0,     0,     0,     0,   845,     0,     0,     0,     0,   118,
+     119,    46,    47,    48,   120,     0,     0,     0,     0,   123,
+       0,    76,   269,     0,   126,     0,  1029,    80,    81,    82,
        0,     0,    83,    84,    85,    86,    87,    88,    89,    90,
       91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,     0,   104,   105,   106,   107,     0,     0,
-     108,     7,     8,     0,     0,     0,     0,     0,     0,     0,
-       0,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-     460,     0,   533,    13,    14,   534,    16,    17,   535,    19,
-     536,    21,     0,    22,     0,    24,    25,     0,    27,    28,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   109,
-       0,     0,     0,     0,     0,   110,   111,   112,   113,   114,
-     115,   116,   117,     0,     0,     0,     0,    46,    47,    48,
-       0,     0,   118,   119,     0,     0,     0,   120,     0,   121,
-     122,     0,   123,     0,   124,     0,   125,   126,    76,   304,
-       0,     0,     0,     0,    80,    81,    82,     0,     0,    83,
+     101,   102,   103,     0,     0,     0,    76,   269,     7,     8,
+       0,     0,    80,    81,    82,   714,     0,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,     0,   535,
+      13,    14,   536,    16,    17,   537,    19,   538,    21,     0,
+      22,     0,    24,    25,     0,    27,    28,     0,     0,     0,
+       0,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   110,   111,   112,   113,   298,
+     462,   846,     0,     0,    46,    47,    48,     0,     0,     0,
+       0,     0,   118,   119,     0,     0,     0,   120,     0,     0,
+       0,     0,   123,     0,     0,   657,     0,   126,     0,   658,
+     110,   111,   112,   113,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   356,   357,     0,
+       0,     0,   120,     0,     0,     0,     0,   358,   729,    76,
+      77,    78,   126,    79,   170,    80,    81,    82,     0,     0,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,     0,   104,   105,   106,   107,     0,     0,   108,     7,
+       8,     0,     0,     0,     0,     0,     0,     0,     0,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,   478,     0,
+     535,    13,    14,   536,    16,    17,   537,    19,   538,    21,
+       0,    22,     0,    24,    25,     0,    27,    28,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   109,     0,     0,
+       0,     0,     0,   110,   111,   112,   113,   114,   115,   116,
+     117,     0,     0,     0,     0,    46,    47,    48,     0,     0,
+     118,   119,     0,     0,     0,   120,     0,   121,   122,     0,
+     123,     0,   124,     0,   125,   126,    76,   305,     0,     0,
+       0,     0,    80,    81,    82,     0,     0,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,     0,  1145,
+       0,     0,     0,     0,     0,     0,   306,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,    30,    31,
+      32,    33,    34,    35,     0,     0,     0,    38,    76,   269,
+      41,    42,     0,     0,    80,    81,    82,     0,     0,    83,
       84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
       94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-       0,  1188,     0,     0,     0,     0,     0,     0,   305,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-      30,    31,    32,    33,    34,    35,     0,     0,     0,    38,
-      76,   268,    41,    42,     0,     0,    80,    81,    82,     0,
-       0,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   110,   111,   112,   113,   476,     0,     0,     0,
+     110,   111,   112,   113,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   118,   307,     0,
+       0,     0,   120,    76,   269,   208,     0,   123,     0,    80,
+      81,    82,   126,     0,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,     0,   104,   105,   106,   107,
+       0,     0,   108,     0,     0,     0,     0,     0,     0,     0,
+       0,   632,   110,   111,   112,   113,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,   118,
-     306,     0,     0,     0,   120,    76,   268,   207,     0,   123,
-       0,    80,    81,    82,   126,     0,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   630,   104,   105,
-     106,   107,     0,     0,   108,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   110,   111,   112,   113,   765,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   118,   119,     0,     0,     0,   120,   795,     0,     0,
-       0,   123,     0,     0,     0,     0,   126,     0,     0,     0,
-       0,     0,     0,     0,     0,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,   110,
-     111,   112,   113,   297,   829,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   118,   119,     0,     0,
-       0,   120,     0,   830,     0,     0,   123,     0,     0,     0,
-       0,   126,     0,     0,     0,     0,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-     874,     0,     0,     0,   297,     0,     0,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,  1040,     0,     0,     0,   297,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-    1056,     0,     0,     0,   297,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1057,
-       0,     0,     0,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,  1059,     0,
-       0,   297,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,  1081,     0,     0,
-     297,     0,     0,     0,     0,     0,     0,     0,     0,   283,
+     119,     0,     0,     0,   120,     0,     0,     0,     0,   123,
+       0,   767,     0,     0,   126,     0,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     797,     0,     0,     0,   298,     0,     0,   110,   111,   112,
+     113,     7,     8,   683,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   118,   119,     0,     0,     0,   120,
+       0,     0,     0,   831,   123,     0,     0,     0,     0,   126,
+       0,     0,   535,    13,    14,   536,    16,    17,   537,    19,
+     538,    21,   832,    22,     0,    24,    25,     0,    27,    28,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,  1146,     0,     0,     0,   297,     0,     0,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,  1186,     0,     0,     0,   297,   283,
+     294,   295,   296,   297,   876,     0,     0,     0,   298,     0,
+       0,     0,     0,     0,     0,     0,     0,    46,    47,    48,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,   485,     0,   297,   283,   284,
+     294,   295,   296,   297,  1042,     0,     0,     0,   298,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,   485,     0,   297,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,   561,     0,   297,   283,   284,   285,   286,
+     295,   296,   297,  1058,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1190,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,  1059,     0,     0,     0,
+     298,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,  1061,     0,     0,     0,   298,
+       0,     0,     0,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,  1083,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,  1148,     0,     0,
+       0,   298,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,  1188,     0,     0,     0,
+     298,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   487,
+       0,     0,     0,   298,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   487,     0,
+       0,     0,   298,     0,     0,     0,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     563,     0,     0,     0,   298,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     650,     0,     0,     0,   298,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   781,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   488,   296,   297,
+     844,     0,     0,     0,   298,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   505,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,   648,     0,   297,     0,     0,     0,     0,     0,
-       0,     0,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,   779,     0,     0,     0,
-     297,     0,     0,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,   842,     0,     0,
-       0,   297,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   486,   295,   296,     0,     0,     0,     0,
-     297,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   503,   295,   296,     0,     0,     0,     0,   297,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,    -4,
-       1,     0,   297,    -4,     0,     0,     0,     0,     0,     0,
-       0,    -4,    -4,     0,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,    -4,     0,     0,     0,     0,    -4,
-      -4,   681,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,    -4,     1,     0,   298,    -4,     0,     0,     0,     0,
+       0,     0,     0,    -4,    -4,     0,     0,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,    -4,     0,     0,     0,
+       0,    -4,    -4,     0,    -4,    -4,    -4,    -4,    -4,    -4,
+      -4,    -4,    -4,    -4,     0,    -4,    -4,    -4,    -4,    -4,
+      -4,    -4,     0,     0,     0,    -4,    -4,    -4,    -4,    -4,
       -4,    -4,     0,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
-       0,     0,     0,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
-       0,    -4,    -4,    -4,    -4,    -4,    -4,    -4,     0,     0,
-      -4,    -4,     6,     0,     0,     0,    -4,    -4,    -4,    -4,
-       7,     8,    -4,     0,    -4,     0,    -4,    -4,    -4,    -4,
-      -4,    -4,    -4,    -4,    -4,    -4,     0,     0,     0,     0,
-       0,     0,     0,     9,     0,     0,     0,     0,    10,    11,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,     0,    22,    23,    24,    25,    26,    27,    28,     0,
-       0,     0,    29,    30,    31,    32,    33,    34,    35,     0,
-      36,    37,    38,    39,    40,    41,    42,     0,     0,    43,
-      44,     0,     0,     0,     0,    45,    46,    47,    48,     0,
-       0,    49,     0,    50,     0,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-    1022,     0,  1023,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,  1101,     0,
-    1102,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,     0,     0,   685,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,     0,     0,   686,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,     0,     0,   737,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-       0,     0,   778,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,     0,     0,
-     814,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,     0,     0,   996,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,     0,     0,  1017,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,     0,     0,  1046,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-       0,     0,  1049,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,     0,     0,
-    1050,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,     0,     0,  1051,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,     0,     0,  1076,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,     0,     0,  1116,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-       0,     0,  1118,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,     0,     0,
-    1119,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,     0,     0,  1131,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,     0,     0,  1134,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,     0,     0,  1137,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-       0,     0,  1155,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,     0,     0,
-    1156,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,     0,     0,  1180,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,     0,     0,  1182,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,     0,     0,  1184,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-       0,     0,  1194,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,   449,     0,     0,     0,     0,   522,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,   479,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-     522,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,   523,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,   558,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,   605,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,   606,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-     619,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,   620,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,   621,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,   622,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,   623,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-     624,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,   699,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,   700,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,   701,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,   775,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-     812,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,   813,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,   841,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,   952,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,   953,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-     968,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,   979,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,  1085,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,     0,     0,     0,  1086,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,     0,     0,     0,  1092,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,     0,     0,     0,
-    1098,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,     0,     0,     0,  1150,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,     0,
-       0,     0,  1153,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,   453,   283,   284,   285,   286,
+       0,     0,    -4,    -4,     6,     0,     0,     0,    -4,    -4,
+      -4,    -4,     7,     8,    -4,     0,    -4,     0,    -4,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,     0,     0,
+       0,     0,     0,     0,     0,     9,     0,     0,     0,     0,
+      10,    11,     0,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,     0,    22,    23,    24,    25,    26,    27,
+      28,     0,     0,     0,    29,    30,    31,    32,    33,    34,
+      35,     0,    36,    37,    38,    39,    40,    41,    42,     7,
+       8,    43,    44,     0,     0,     0,     0,    45,    46,    47,
+      48,     0,     0,    49,     0,    50,     0,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,     0,     0,     0,
+     535,    13,    14,   536,    16,    17,   537,    19,   538,    21,
+       0,    22,     0,    24,    25,     0,    27,    28,     0,     0,
+       0,     0,     0,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,    46,    47,    48,  1000,     0,
+    1001,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,  1024,     0,  1025,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,  1103,     0,  1104,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,     0,     0,   563,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,   569,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,     0,     0,   584,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,   586,   283,   284,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,     0,     0,   687,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+       0,     0,   688,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
+     739,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,     0,     0,   780,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,     0,     0,   816,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,     0,     0,   998,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+       0,     0,  1019,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
+    1048,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,     0,     0,  1051,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,     0,     0,   297,     0,     0,     0,
-     588,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,   590,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,     0,     0,   592,   283,   284,   285,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,     0,     0,  1052,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,     0,     0,  1053,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+       0,     0,  1078,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
+    1118,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,     0,     0,  1120,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,     0,     0,  1121,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,     0,     0,  1133,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+       0,     0,  1136,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
+    1139,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,     0,     0,  1157,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,     0,     0,  1158,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,     0,     0,  1182,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+       0,     0,  1184,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
+    1186,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,     0,     0,  1196,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,   451,
+       0,     0,     0,     0,   524,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+     481,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,   524,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,   525,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,   560,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,   607,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+     608,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,   621,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,   622,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,   623,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,   624,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+     625,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,   626,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,   701,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,   702,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,   703,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+     777,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,   814,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,   815,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,   843,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,   954,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+     955,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,   970,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,   981,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,  1087,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,     0,     0,     0,  1088,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,     0,     0,     0,
+    1094,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,     0,     0,     0,  1100,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,  1152,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,     0,     0,     0,  1155,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,   455,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,     0,     0,   565,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,   571,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,   594,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-       0,     0,   596,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,   598,   283,   284,   285,   286,
+     296,   297,     0,     0,     0,     0,   298,     0,     0,     0,
+     586,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,   588,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,     0,     0,
+       0,     0,   298,     0,     0,     0,   590,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,     0,     0,   600,   283,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,   592,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,   602,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,     0,     0,   604,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,   608,   283,   284,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+       0,     0,   594,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,   596,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,     0,     0,   598,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,     0,     0,   297,     0,     0,     0,
-     610,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,   612,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,     0,     0,   614,   283,   284,   285,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,   600,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,     0,     0,   602,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,   604,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,   616,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-       0,     0,   618,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,   717,   283,   284,   285,   286,
+     296,   297,     0,     0,     0,     0,   298,     0,     0,     0,
+     606,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,   610,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,     0,     0,
+       0,     0,   298,     0,     0,     0,   612,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,     0,     0,   718,   283,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,   614,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,     0,
-       0,   720,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,     0,     0,   721,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,     0,     0,   732,   283,   284,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+       0,     0,   616,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,   618,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,     0,     0,   620,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,     0,     0,   297,     0,     0,     0,
-     733,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,     0,     0,   755,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,     0,     0,   858,   283,   284,   285,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,   719,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,     0,     0,   720,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,     0,     0,   722,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,     0,     0,   860,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-       0,     0,   862,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,     0,     0,   864,   283,   284,   285,   286,
+     296,   297,     0,     0,     0,     0,   298,     0,     0,     0,
+     723,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,     0,     0,   734,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,     0,     0,
+       0,     0,   298,     0,     0,     0,   735,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,     0,     0,   965,   283,
+     297,     0,     0,     0,     0,   298,     0,     0,     0,   757,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,   449,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-     480,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,   489,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,   490,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,   492,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,   494,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,   495,   283,   284,   285,   286,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+       0,     0,   860,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,     0,     0,   862,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,     0,     0,   864,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,     0,
+       0,   866,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,     0,     0,   967,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,   451,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,   482,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,   498,   283,   284,   285,
+     297,     0,     0,     0,     0,   298,     0,   491,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,   499,   283,   284,
+     296,   297,     0,     0,     0,     0,   298,     0,   492,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,     0,     0,   297,     0,   506,   283,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,   494,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,   554,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-     555,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,   556,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,   562,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,   583,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,   585,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,   587,   283,   284,   285,   286,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+     496,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,   497,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,   500,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,   501,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,     0,     0,
+       0,     0,   298,     0,   508,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,   556,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,   557,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,   589,   283,   284,   285,
+     297,     0,     0,     0,     0,   298,     0,   558,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,   591,   283,   284,
+     296,   297,     0,     0,     0,     0,   298,     0,   564,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,     0,     0,   297,     0,   593,   283,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,   585,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,   595,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-     597,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,   599,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,   601,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,   603,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,   607,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,   609,   283,   284,   285,   286,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+     587,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,   589,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,   591,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,   593,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,     0,     0,
+       0,     0,   298,     0,   595,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,   597,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,   599,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,   611,   283,   284,   285,
+     297,     0,     0,     0,     0,   298,     0,   601,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,   613,   283,   284,
+     296,   297,     0,     0,     0,     0,   298,     0,   603,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,     0,     0,   297,     0,   615,   283,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,   605,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,   617,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-     666,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,   671,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,   679,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,   682,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,   683,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,   687,   283,   284,   285,   286,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+     609,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,   611,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,   613,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,   615,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,     0,     0,
+       0,     0,   298,     0,   617,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,   619,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,   668,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,   716,   283,   284,   285,
+     297,     0,     0,     0,     0,   298,     0,   673,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297,     0,   857,   283,   284,
+     296,   297,     0,     0,     0,     0,   298,     0,   681,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,     0,     0,     0,     0,   297,     0,   859,   283,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,   684,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   295,   296,     0,     0,     0,     0,   297,     0,   861,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   295,   296,     0,     0,     0,     0,   297,     0,
-     863,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   295,   296,     0,     0,     0,     0,   297,
-       0,   867,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,   295,   296,     0,     0,     0,     0,
-     297,     0,   997,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,   295,   296,     0,     0,     0,
-       0,   297,     0,  1016,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,   295,   296,     0,     0,
-       0,     0,   297,     0,  1026,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,   295,   296,     0,
-       0,     0,     0,   297,     0,  1149,   283,   284,   285,   286,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+     685,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,   689,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,   718,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298,     0,   859,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,     0,     0,
+       0,     0,   298,     0,   861,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,     0,
+       0,     0,     0,   298,     0,   863,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+       0,     0,     0,     0,   298,     0,   865,   284,   285,   286,
      287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
-       0,     0,     0,     0,   297,     0,  1192,   283,   284,   285,
+     297,     0,     0,     0,     0,   298,     0,   869,   284,   285,
      286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     296,     0,     0,     0,     0,   297
+     296,   297,     0,     0,     0,     0,   298,     0,   999,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,     0,     0,     0,     0,   298,     0,  1018,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,     0,     0,     0,     0,   298,     0,
+    1028,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,     0,     0,     0,     0,   298,
+       0,  1151,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,     0,     0,     0,     0,
+     298,     0,  1194,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,     0,     0,     0,
+       0,   298
 };
 
 static const yytype_int16 yycheck[] =
 {
-      60,     6,   276,   178,  1035,     6,   189,     3,   151,     4,
-       4,   186,     6,     4,   157,     4,     5,    71,     4,     7,
-       4,     6,     4,     6,    49,   645,     4,     6,     4,    71,
-       7,     4,     5,   208,     6,     6,   211,     6,   181,   182,
-       7,     6,    71,   124,   125,   131,   132,    36,    37,    38,
-      39,    13,   138,    42,   124,   125,     6,     6,   709,   140,
-      72,     6,     6,    36,    37,    38,    39,    79,    80,    42,
-     140,    56,     4,     5,     0,   126,   127,   128,    79,   134,
-     134,    71,   133,   124,   125,    56,   141,   141,    83,    84,
-      85,    86,   134,     4,   124,   125,   338,   339,   340,   141,
-     141,   134,    93,    94,    36,    37,    38,    39,   141,   134,
-      42,   141,   141,   118,   119,   120,    49,   101,   123,   124,
-     134,  1152,   127,   111,   112,   113,   114,   141,   133,     6,
-     142,   136,   134,   138,   139,   140,   141,   114,   143,   144,
-     145,   146,   136,   148,   149,   150,   766,   142,   153,   131,
-     132,   141,   141,   134,   136,   141,   138,   141,   134,   124,
-     125,   143,   141,   141,   169,   170,   349,   350,   141,   141,
-       7,   138,   121,   178,   124,   125,   121,   828,  1209,   453,
-     124,   125,    93,    94,   180,   360,   134,   134,   193,   194,
-     195,   134,   197,   189,   134,   200,   201,   134,   203,   131,
-     132,    53,   262,   263,   264,   265,   138,   382,    46,   214,
-     134,    49,   136,    51,    49,   220,   221,   222,   223,   224,
+      60,     6,   178,  1037,   715,     6,   190,     3,   277,     4,
+     186,     4,     4,     4,    49,     4,     5,     4,     6,     4,
+       6,     4,     6,     4,     4,     5,    71,    71,   144,     7,
+       6,    71,   148,   209,     6,   647,   212,    71,     4,    46,
+       6,     6,    49,     6,    51,   131,   132,    36,    37,    38,
+      39,     5,   138,    42,   124,   125,    36,    37,    38,    39,
+       6,     6,    42,   124,   125,     7,    72,   135,   134,     6,
+      56,   141,   140,    79,    80,   141,     7,     0,    79,   140,
+      56,   142,    36,    37,    38,    39,     6,     7,    42,   134,
+      83,    84,    85,    86,     6,    13,   141,   141,   134,   134,
+     134,   141,    93,    94,    72,   141,   101,   141,    93,    94,
+      49,    79,    80,   118,   119,   120,   124,   125,   123,   124,
+    1154,    43,   127,   134,    46,     6,     7,    49,   133,    51,
+     141,   136,   140,   138,   139,   140,   141,   121,   143,   144,
+     145,   146,   134,   148,   149,   150,   141,   711,   153,   142,
+     131,   132,   141,   141,   141,   136,   768,   138,   141,   275,
+     138,   141,   143,   134,   169,   170,   350,   351,     6,   141,
+     136,     7,   114,   178,   142,   134,   121,  1211,   124,   125,
+     111,   112,   113,   114,   180,   361,   455,   124,   125,   194,
+     195,   196,    53,   198,   190,    49,   201,   202,   134,   204,
+     131,   132,     7,   263,   264,   265,   266,   138,   384,   325,
+     215,    51,   124,   125,   131,   132,   221,   222,   223,   224,
      225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
      235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
      245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
-     255,   256,   257,   258,   259,   260,   261,   877,    72,   135,
-      72,   266,     6,     7,   140,    79,    80,    79,    80,   274,
-      49,   134,     7,   136,   111,   112,   113,   114,   283,   284,
+     255,   256,   257,   258,   259,   260,   261,   262,   374,    49,
+      31,    32,   267,    34,   139,   134,   830,   879,   134,   144,
+     275,    62,    63,   148,     7,   111,   112,   113,   114,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   276,   131,   132,   136,   140,   138,   142,
-      43,   306,    49,    46,   124,   125,    49,   450,   451,   314,
-      51,   135,    31,    32,   319,    34,   140,     8,   323,   324,
-     140,   134,   142,   328,   141,   330,   331,   332,   142,   334,
-     335,   336,   337,   338,   339,   340,   337,   338,   339,   340,
-     124,   125,   124,   125,   124,   125,   141,   352,   353,   354,
-     355,   356,   357,   349,   350,   141,   140,   713,   142,   141,
-     140,   366,     7,   135,   369,   370,   135,   372,   140,   374,
-     375,   140,     4,     5,    49,   139,   111,   112,   113,   114,
-     144,   124,   125,   388,   148,     5,    72,    46,   134,   394,
-     136,   134,   397,    79,    80,   144,   131,   132,   141,   148,
-     134,    72,   136,   138,    36,    37,    38,    39,    79,    80,
-      42,    49,   134,   396,   136,   135,    36,    37,    38,    39,
-     140,  1041,    42,     6,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,    72,   134,
-      46,   136,   133,   448,   141,    79,    80,   166,     4,   168,
-     455,   142,     4,   454,  1105,   174,   142,  1108,     4,   178,
-    1111,   134,   124,   125,   131,   132,   111,   112,   113,   114,
-     453,   142,   134,   478,   479,   136,   481,   482,   134,   141,
-     485,   486,   487,   134,   758,   759,   131,   132,   124,   125,
-     126,   127,   128,    72,   134,   500,    72,   133,   503,   504,
-      79,    80,     6,    79,    80,   510,     4,    72,   142,   569,
-     274,   134,   141,   136,    79,    80,     4,   522,   523,   134,
-    1171,   664,   665,   528,   667,   274,   669,   670,    72,   134,
-     673,   674,   134,    72,   136,    79,    80,   134,   543,   544,
-      79,    80,   306,    62,    63,  1196,   124,   125,  1199,   134,
-      72,  1202,   134,   558,  1205,   560,   561,    79,    80,   323,
-     324,    72,   140,   142,    72,     7,   142,   627,    79,    80,
-       4,    79,    80,     6,  1225,   324,  1227,   142,  1229,   722,
-     723,   724,     6,   124,   125,   134,   569,   136,   124,   125,
-     140,   651,   142,   124,   125,   124,   125,     6,   142,   140,
-     605,   606,   134,   142,   140,   140,   142,   142,   372,   140,
-     134,   140,   136,     5,   619,   620,   621,   622,   623,   624,
-     142,   626,   134,   372,    43,   134,   631,    46,   347,   348,
-      49,   142,    51,   638,   142,     6,     7,   356,   124,   125,
-     783,   141,   134,   648,   136,   134,   789,   136,    49,   134,
-      51,   656,   124,   125,   140,   798,   799,   800,   124,   125,
-     803,   804,   805,   806,   807,   808,   809,   134,   140,   136,
-     131,   132,   677,   141,   140,   136,   134,   138,   136,   134,
-     823,   136,   143,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   702,   703,   704,
-     705,   133,   124,   125,   124,   125,   134,   134,   140,  1065,
-     142,  1067,   141,  1069,   478,     4,   134,   134,   140,   136,
-     140,   134,   486,   487,   134,   868,   136,   134,   134,   478,
-     136,   134,   134,   136,   739,   740,   500,   141,   921,   503,
+     295,   296,   297,   298,   135,   131,   132,    72,   141,   140,
+     124,   125,   307,     8,    79,    80,   111,   112,   113,   114,
+     315,    43,   277,   134,    46,   320,   140,    49,   142,   324,
+     325,   339,   340,   341,   329,   134,   331,   332,   333,    49,
+     335,   336,   337,   338,   339,   340,   341,   338,   339,   340,
+     341,   124,   125,   141,   124,   125,   124,   125,   353,   354,
+     355,   356,   357,   358,   350,   351,  1067,   140,  1069,   142,
+    1071,   141,   367,   141,   480,   370,   371,   142,    72,   374,
+     134,   376,   377,   124,   125,    79,    80,   135,   111,   112,
+     113,   114,   140,   134,   141,   390,   502,    49,   124,   125,
+     141,   396,   124,   125,   399,   166,   135,   168,   131,   132,
+     275,   140,   134,   174,   140,    49,     4,   178,     6,   141,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   124,   125,     4,     5,   133,   131,
+     132,  1043,   307,   398,   136,  1146,   138,   142,   142,    72,
+     140,   143,   140,   135,   142,   450,    79,    80,   140,   324,
+     325,    46,   457,   124,   125,   456,    46,   151,    36,    37,
+      38,    39,   141,   157,    42,   124,   125,     4,     4,   140,
+    1181,   134,  1183,   136,  1185,   480,   481,     4,   483,   484,
+    1191,   140,   487,   488,   489,   134,    72,   181,   182,   134,
+     455,   760,   761,    79,    80,    72,   134,   502,   136,   374,
+     505,   506,    79,    80,  1215,   134,  1217,   512,  1219,   142,
+      72,   571,   628,   134,    72,   136,   134,    79,    80,   524,
+     525,    79,    80,     6,    72,   530,    72,   134,    72,   136,
+      72,    79,    80,    79,    80,    79,    80,    79,    80,   136,
+     545,   546,   658,  1107,     4,   134,  1110,   136,     4,  1113,
+     134,   134,   136,   131,   132,   560,   142,   562,   563,    72,
+     138,   141,   134,   679,   136,   142,    79,    80,   134,   629,
+       8,   124,   125,   134,   134,   136,   136,   348,   349,   134,
+     142,   124,   125,   134,   142,   136,   357,   140,   704,   705,
+     706,   707,     4,   653,   142,   134,   142,   140,   142,   134,
+     142,   136,   607,   608,     7,   480,   571,     6,   134,  1173,
+     136,     6,   134,   488,   489,     6,   621,   622,   623,   624,
+     625,   626,     6,   628,     4,     5,   134,   502,   633,   142,
+     505,   124,   125,     5,  1198,   640,   134,  1201,   124,   125,
+    1204,   141,   134,  1207,   136,   650,   134,   140,   124,   125,
+     134,   141,   136,   658,   140,   134,    36,    37,    38,    39,
+     124,   125,    42,  1227,   140,  1229,    61,  1231,   126,   127,
+     128,   134,   134,   136,   679,   133,   140,   115,   116,   117,
      118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   500,   134,   141,   136,   133,    65,    66,    67,    68,
-     141,    70,   767,   136,   134,    74,   136,   134,    77,    78,
-     775,   140,   755,   142,   779,   141,   759,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   131,   132,  1144,   136,
-     133,   136,   797,   138,   140,     4,   142,     6,   143,   942,
-     136,   140,   521,   142,     6,   138,   811,   812,   813,   141,
-     140,   954,   142,   140,   140,   142,   142,    96,   823,   824,
-     539,   881,   827,  1179,     6,  1181,   831,  1183,   140,   140,
-     142,   142,   140,  1189,   142,     6,   841,   842,   843,   140,
-     140,   142,   142,   140,     6,   142,   851,   140,   140,   142,
-     142,   856,   140,   140,   142,   142,   140,  1213,   142,  1215,
-     136,  1217,   626,     4,   141,   870,   849,   140,   869,   142,
-       6,   140,  1015,   142,   140,     5,   142,   626,  1061,   133,
-     140,   886,   142,   140,     7,   142,   138,     8,   893,   894,
-     136,   141,   656,   898,     7,     7,   135,   142,  1073,     7,
-       6,   142,   907,   908,    93,   141,     4,   656,   140,   135,
-     135,   140,   917,   677,     6,     4,   917,   137,    96,     7,
-       7,     7,     7,    96,     7,   921,     7,    96,   677,  1072,
-       7,     7,     7,   138,   939,   654,   135,   135,   702,   703,
-     704,   705,   947,   135,   135,   142,   947,   952,   953,   142,
-       7,     7,     7,   702,   703,   704,   705,   138,   134,   134,
-       6,   141,     6,   968,     6,   137,     6,     6,   136,  1112,
-    1145,     7,     6,   121,   979,    49,     7,     7,    51,     7,
-     699,   700,   701,   141,     7,     7,     7,     7,     7,     7,
-       7,     7,     7,   998,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,    12,    13,
-       7,     4,   133,  1018,     6,   141,   134,  1022,     6,  1024,
-       6,   142,  1027,    49,   141,     6,  1031,     6,     4,     4,
-       4,  1036,   134,   138,     6,     4,     6,   141,   135,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,     7,
-      54,     6,    56,    57,   138,    59,    60,     6,     6,  1064,
-       6,  1066,   141,  1068,     6,  1061,     6,   831,     5,   141,
-     141,     6,  1077,   141,   141,   141,     6,     6,    92,     6,
-    1085,  1086,   831,     7,    88,    89,    90,  1092,     4,     6,
-       4,     6,   137,     6,  1099,     6,  1101,     5,    96,     6,
-       6,     6,     6,     6,     6,     6,     6,     6,   827,     6,
-       6,     6,   141,     6,     6,     6,  1121,     6,    12,    13,
-       6,     5,     7,     6,     6,   138,    61,  1132,   140,    47,
-    1135,  1191,     6,  1138,     6,     6,   141,  1142,   142,   142,
-     141,   141,   141,     6,     6,  1150,     7,   141,  1153,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,  1219,
-      54,  1221,    56,    57,     6,    59,    60,     6,    91,   888,
-       6,   890,    94,     6,     6,     6,     6,   141,   141,  1239,
+     128,   124,   125,   141,   134,   133,   136,   134,   134,   704,
+     705,   706,   707,   134,   142,   136,   134,   140,   136,   124,
+     125,   126,   127,   128,   134,   134,   136,   833,   133,     4,
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,    88,    89,    90,     6,   133,     5,
-       5,   142,     6,   922,    61,   924,     6,   926,   141,   140,
-       6,     6,     6,     6,     6,     6,   142,     3,     4,     6,
-     141,   141,   141,     9,    10,    11,     6,     6,    14,    15,
+     125,   126,   127,   128,   134,   141,   741,   742,   133,   923,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   523,   628,   141,   134,   133,   136,   452,   453,
+     134,   136,   136,   138,   769,   134,    65,    66,    67,    68,
+     541,    70,   777,   141,   134,    74,   781,   136,    77,    78,
+       6,   131,   132,   658,   141,   140,   136,   142,   138,   140,
+     136,   142,   757,   143,   799,   140,   761,   142,   140,   140,
+     142,   142,   136,    49,   679,    51,     6,   138,   813,   814,
+     815,   140,   140,   142,   142,   140,   140,   142,   142,   141,
+     825,   826,     6,   883,   829,   140,    96,   142,   833,   704,
+     705,   706,   707,   140,   140,   142,   142,     6,   843,   844,
+     845,     6,   140,   140,   142,   142,     4,     4,   853,     6,
+     140,     6,   142,   858,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   136,   140,   872,   142,   133,
+     871,   140,   140,   142,   142,   140,     5,   142,   140,  1063,
+     142,   141,   140,   888,   142,   656,   851,   140,   133,   142,
+     895,   896,   140,     7,   142,   900,   140,   138,   142,  1075,
+     136,   141,     7,     7,   909,   910,   135,   142,     7,     6,
+     142,    93,     4,  1029,   919,   135,   141,   140,   919,   135,
+       6,   140,     4,   137,     7,    96,     7,   923,     7,     7,
+     701,   702,   703,    96,     7,     7,   941,    96,     7,     7,
+       7,   135,   135,   135,   949,   135,   142,   138,   949,   954,
+     955,     7,     7,   142,     7,   138,   134,   134,   833,     6,
+     141,     6,     6,   137,     6,   970,     6,   121,     7,    12,
+      13,  1147,   666,   667,   136,   669,   981,   671,   672,     6,
+      51,   675,   676,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,    49,     7,     7,  1000,   133,     7,   141,     7,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+       7,    54,     7,    56,    57,  1020,    59,    60,     7,  1024,
+       7,  1026,     7,     7,  1029,     7,     7,     7,  1033,     4,
+     724,   725,   726,  1038,     6,   141,   134,     6,   141,     6,
+      49,     6,     6,     4,     4,    88,    89,    90,     4,   138,
+       4,     6,   140,     6,   134,     7,   141,     6,   829,   135,
+       6,  1066,     6,  1068,   138,  1070,   141,  1063,     6,     6,
+       6,   141,     5,    92,  1079,   141,   141,   141,   141,     6,
+       6,     6,  1087,  1088,     7,     4,     6,     4,     6,  1094,
+       6,   785,     6,     5,    96,     6,  1101,   791,  1103,   142,
+     137,     6,     6,     6,     6,     6,   800,   801,   802,     6,
+       6,   805,   806,   807,   808,   809,   810,   811,  1123,   890,
+       6,   892,     6,     6,     6,     6,     6,     6,     6,  1134,
+     141,   825,  1137,  1193,     6,  1140,     6,   138,     7,  1144,
+       6,     6,     5,   141,     6,     6,     6,  1152,    47,   142,
+    1155,   141,     6,   924,  1029,   926,     7,   928,   141,     6,
+      91,  1221,   141,  1223,   141,     6,     6,     6,     6,     6,
+      94,     6,     3,     4,     6,   141,   870,     6,     9,    10,
+      11,  1241,   141,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,     5,    61,     6,   142,     6,   141,
+     140,     6,    43,   115,   116,   117,   118,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,     6,     6,     6,
+       6,   133,     6,   142,    65,    66,    67,    68,    69,    70,
+       5,   141,     6,    74,     6,   140,    77,    78,   141,   141,
+     944,   141,     6,     6,     6,     6,   141,     5,   776,     6,
+       6,     6,   956,     6,   141,   141,   141,   141,     6,   142,
+       6,     6,     6,     6,     6,  1123,   107,   108,   109,   110,
+       3,     3,   875,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   124,   125,  1066,    -1,  1068,   129,  1070,
+      -1,    -1,    -1,   134,    -1,    -1,    -1,    -1,   139,    -1,
+      -1,   142,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
+       4,    -1,    -1,  1017,    -1,     9,    10,    11,    -1,    -1,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    43,
+      -1,    -1,    -1,    -1,    -1,    -1,    12,    13,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1074,    65,    66,    67,    68,    69,    70,    -1,    -1,    -1,
+      74,    -1,    -1,    77,    78,    -1,    -1,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    -1,    54,    -1,
+      56,    57,    -1,    59,    60,    -1,    -1,    -1,    -1,    -1,
+    1114,    -1,    -1,   107,   108,   109,   110,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     124,   125,    88,    89,    90,   129,    -1,    -1,    -1,    -1,
+     134,    -1,     3,     4,    -1,   139,    -1,   141,     9,    10,
+      11,    -1,    -1,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    43,    -1,    -1,    -1,   142,    -1,    -1,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    65,    66,    67,    68,    69,    70,
+      -1,    -1,    -1,    74,    -1,    -1,    77,    78,    -1,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      -1,    54,    -1,    56,    57,    -1,    59,    60,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   107,   108,   109,   110,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   124,   125,    88,    89,    90,   129,    -1,
+      -1,    -1,    -1,   134,    -1,     3,     4,    -1,   139,    -1,
+     141,     9,    10,    11,    -1,    -1,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    43,    -1,    -1,    -1,   142,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    65,    66,    67,
+      68,    69,    70,    -1,    -1,    -1,    74,     3,     4,    77,
+      78,    -1,    -1,     9,    10,    11,    -1,    -1,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,     6,
-       6,   141,   140,     6,   141,     5,   774,    43,     3,     6,
-     141,   141,   141,  1027,    12,    13,   141,     6,     6,   142,
-       6,     6,     6,     6,     6,     6,     6,  1121,  1027,    65,
-      66,    67,    68,    69,    70,     3,   873,    -1,    74,    -1,
-      -1,    77,    78,    -1,    -1,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    -1,    54,    -1,    56,    57,
-      -1,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   107,   108,   109,   110,    -1,    -1,    -1,    -1,    -1,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,   107,
+     108,   109,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   124,   125,    -1,    -1,
+      -1,   129,    -1,    -1,    -1,    -1,   134,    -1,     3,     4,
+       5,   139,    -1,   141,     9,    10,    11,    -1,    -1,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      -1,    36,    37,    38,    39,    -1,    -1,    42,    -1,    -1,
+      -1,   107,   108,   109,   110,    12,    13,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   124,   125,
-      88,    89,    90,   129,    -1,  1064,    -1,  1066,   134,  1068,
-      -1,     3,     4,   139,    -1,    -1,   142,     9,    10,    11,
+      -1,    -1,    -1,   129,    -1,    -1,    -1,    -1,   134,    -1,
+      -1,   137,    -1,   139,    -1,   141,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    -1,    54,    -1,    56,
+      57,    -1,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   107,   108,   109,   110,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,     8,    -1,    -1,    -1,    -1,   124,
+     125,    88,    89,    90,   129,    -1,    -1,    -1,    -1,   134,
+      -1,     3,     4,    -1,   139,    -1,   141,     9,    10,    11,
       -1,    -1,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    43,    -1,    -1,   142,    -1,    -1,    -1,    12,    13,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    65,    66,    67,    68,    69,    70,    -1,
-      -1,    -1,    74,    -1,    -1,    77,    78,    -1,    -1,    43,
+      32,    33,    34,    -1,    -1,    -1,     3,     4,    12,    13,
+      -1,    -1,     9,    10,    11,   142,    -1,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    -1,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    -1,
       54,    -1,    56,    57,    -1,    59,    60,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   107,   108,   109,   110,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   124,   125,    88,    89,    90,   129,    -1,    -1,
-      -1,    -1,   134,    -1,     3,     4,    -1,   139,    -1,   141,
-       9,    10,    11,    -1,    -1,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    43,    -1,    -1,    -1,   142,    -1,
-      -1,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    65,    66,    67,    68,
-      69,    70,    -1,    -1,    -1,    74,    -1,    -1,    77,    78,
-      -1,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    -1,    54,    -1,    56,    57,    -1,    59,    60,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   107,   108,
-     109,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   124,   125,    88,    89,    90,
-     129,    -1,    -1,    -1,    -1,   134,    -1,     3,     4,    -1,
-     139,    -1,   141,     9,    10,    11,    -1,    -1,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    43,    -1,    -1,
-      -1,   142,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,    -1,    -1,    -1,    -1,   133,    65,
-      66,    67,    68,    69,    70,    -1,    -1,    -1,    74,     3,
-       4,    77,    78,    -1,    -1,     9,    10,    11,    -1,    -1,
+      -1,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   107,   108,   109,   110,   133,
+       6,   135,    -1,    -1,    88,    89,    90,    -1,    -1,    -1,
+      -1,    -1,   124,   125,    -1,    -1,    -1,   129,    -1,    -1,
+      -1,    -1,   134,    -1,    -1,   137,    -1,   139,    -1,   141,
+     107,   108,   109,   110,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   124,   125,    -1,
+      -1,    -1,   129,    -1,    -1,    -1,    -1,   134,   142,     3,
+       4,     5,   139,     7,   141,     9,    10,    11,    -1,    -1,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,   107,   108,   109,   110,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   124,   125,
-      -1,    -1,    -1,   129,    -1,    -1,    -1,    -1,   134,    -1,
-       3,     4,     5,   139,    -1,   141,     9,    10,    11,    -1,
-      -1,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    -1,    36,    37,    38,    39,    -1,    -1,    42,
-      -1,    -1,    -1,   107,   108,   109,   110,    12,    13,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     124,   125,    -1,    -1,    -1,   129,    -1,    -1,    -1,    -1,
-     134,    -1,    -1,   137,    -1,   139,    -1,   141,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    -1,    54,
-      -1,    56,    57,    -1,    59,    60,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   107,   108,   109,   110,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     8,    -1,    -1,    -1,
-      -1,   124,   125,    88,    89,    90,   129,    -1,    -1,    -1,
-      -1,   134,    -1,     3,     4,    -1,   139,    -1,   141,     9,
-      10,    11,    -1,    -1,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    -1,    -1,    -1,     3,     4,
-      12,    13,    -1,    -1,     9,    10,    11,   142,    -1,    14,
+      34,    -1,    36,    37,    38,    39,    -1,    -1,    42,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,    -1,    -1,    -1,    -1,   133,     6,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      -1,    54,    -1,    56,    57,    -1,    59,    60,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   101,    -1,    -1,
+      -1,    -1,    -1,   107,   108,   109,   110,   111,   112,   113,
+     114,    -1,    -1,    -1,    -1,    88,    89,    90,    -1,    -1,
+     124,   125,    -1,    -1,    -1,   129,    -1,   131,   132,    -1,
+     134,    -1,   136,    -1,   138,   139,     3,     4,    -1,    -1,
+      -1,    -1,     9,    10,    11,    -1,    -1,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    -1,   142,
+      -1,    -1,    -1,    -1,    -1,    -1,    43,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,    -1,    -1,    -1,    -1,   133,    -1,    -1,    65,    66,
+      67,    68,    69,    70,    -1,    -1,    -1,    74,     3,     4,
+      77,    78,    -1,    -1,     9,    10,    11,    -1,    -1,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    -1,    54,    -1,    56,    57,    -1,    59,    60,    -1,
-      -1,    -1,    -1,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   107,   108,   109,
-     110,   133,     6,   135,    -1,    -1,    88,    89,    90,    -1,
-      -1,    -1,    -1,    -1,   124,   125,    -1,    -1,    -1,   129,
-      -1,    -1,    -1,    -1,   134,    -1,    -1,   137,    -1,   139,
-      -1,   141,   107,   108,   109,   110,    -1,    -1,    -1,    -1,
+     107,   108,   109,   110,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   124,   125,    -1,
+      -1,    -1,   129,     3,     4,     5,    -1,   134,    -1,     9,
+      10,    11,   139,    -1,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    -1,    36,    37,    38,    39,
+      -1,    -1,    42,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,     6,   107,   108,   109,   110,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   124,
      125,    -1,    -1,    -1,   129,    -1,    -1,    -1,    -1,   134,
-     142,     3,     4,     5,   139,     7,   141,     9,    10,    11,
-      -1,    -1,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    -1,    36,    37,    38,    39,    -1,    -1,
-      42,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,   133,
-       6,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    -1,    54,    -1,    56,    57,    -1,    59,    60,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   101,
-      -1,    -1,    -1,    -1,    -1,   107,   108,   109,   110,   111,
-     112,   113,   114,    -1,    -1,    -1,    -1,    88,    89,    90,
-      -1,    -1,   124,   125,    -1,    -1,    -1,   129,    -1,   131,
-     132,    -1,   134,    -1,   136,    -1,   138,   139,     3,     4,
-      -1,    -1,    -1,    -1,     9,    10,    11,    -1,    -1,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      -1,   142,    -1,    -1,    -1,    -1,    -1,    -1,    43,   115,
+      -1,     6,    -1,    -1,   139,    -1,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+       6,    -1,    -1,    -1,   133,    -1,    -1,   107,   108,   109,
+     110,    12,    13,   142,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   124,   125,    -1,    -1,    -1,   129,
+      -1,    -1,    -1,     6,   134,    -1,    -1,    -1,    -1,   139,
+      -1,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,     6,    54,    -1,    56,    57,    -1,    59,    60,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,     6,    -1,    -1,    -1,   133,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    90,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,     6,    -1,    -1,    -1,   133,   115,
      116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,    -1,
-      65,    66,    67,    68,    69,    70,    -1,    -1,    -1,    74,
-       3,     4,    77,    78,    -1,    -1,     9,    10,    11,    -1,
-      -1,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,   107,   108,   109,   110,     6,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   124,
-     125,    -1,    -1,    -1,   129,     3,     4,     5,    -1,   134,
-      -1,     9,    10,    11,   139,    -1,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,     6,    36,    37,
-      38,    39,    -1,    -1,    42,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   107,   108,   109,   110,     6,    -1,
+     126,   127,   128,     6,    -1,    -1,    -1,   133,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   124,   125,    -1,    -1,    -1,   129,     6,    -1,    -1,
-      -1,   134,    -1,    -1,    -1,    -1,   139,    -1,    -1,    -1,
+      -1,   142,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,     6,    -1,    -1,    -1,
+     133,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,     6,    -1,    -1,    -1,   133,
+      -1,    -1,    -1,   115,   116,   117,   118,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,     6,    -1,    -1,
+      -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   115,   116,   117,   118,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,     6,    -1,    -1,
+      -1,   133,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,     6,    -1,    -1,    -1,
+     133,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   107,
-     108,   109,   110,   133,     6,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   124,   125,    -1,    -1,
-      -1,   129,    -1,     6,    -1,    -1,   134,    -1,    -1,    -1,
-      -1,   139,    -1,    -1,    -1,    -1,   115,   116,   117,   118,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,     8,
+      -1,    -1,    -1,   133,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,     8,    -1,
+      -1,    -1,   133,    -1,    -1,    -1,   115,   116,   117,   118,
      119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-       6,    -1,    -1,    -1,   133,    -1,    -1,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,     6,    -1,    -1,    -1,   133,   115,   116,   117,   118,
+       8,    -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   115,   116,   117,   118,
      119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-       6,    -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     6,
-      -1,    -1,    -1,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,    -1,     6,    -1,
-      -1,   133,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,    -1,     6,    -1,    -1,
-     133,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,     6,    -1,    -1,    -1,   133,    -1,    -1,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,     6,    -1,    -1,    -1,   133,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,    -1,    -1,     8,    -1,   133,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,    -1,    -1,     8,    -1,   133,   115,   116,   117,
+       8,    -1,    -1,    -1,   133,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,     8,
+      -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+       8,    -1,    -1,    -1,   133,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
+      -1,    -1,    -1,   133,    -1,    -1,    -1,   115,   116,   117,
      118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,    -1,    -1,     8,    -1,   133,   115,   116,   117,   118,
+     128,    -1,    -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,    -1,    -1,    -1,    -1,   133,   115,   116,   117,   118,
      119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-      -1,    -1,     8,    -1,   133,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,     8,    -1,    -1,    -1,
-     133,    -1,    -1,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,     8,    -1,    -1,
-      -1,   133,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,
-     133,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,   133,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,    -1,    -1,    -1,    -1,   133,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,    -1,
+      -1,     0,     1,    -1,   133,     4,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    12,    13,    -1,    -1,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,    -1,    -1,    -1,    -1,   133,    35,    -1,    -1,    -1,
+      -1,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    -1,    54,    55,    56,    57,    58,
+      59,    60,    -1,    -1,    -1,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    75,    76,    77,    78,
+      -1,    -1,    81,    82,     4,    -1,    -1,    -1,    87,    88,
+      89,    90,    12,    13,    93,    -1,    95,    -1,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    35,    -1,    -1,    -1,    -1,
+      40,    41,    -1,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    -1,    54,    55,    56,    57,    58,    59,
+      60,    -1,    -1,    -1,    64,    65,    66,    67,    68,    69,
+      70,    -1,    72,    73,    74,    75,    76,    77,    78,    12,
+      13,    81,    82,    -1,    -1,    -1,    -1,    87,    88,    89,
+      90,    -1,    -1,    93,    -1,    95,    -1,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,    -1,    -1,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      -1,    54,    -1,    56,    57,    -1,    59,    60,    -1,    -1,
       -1,    -1,    -1,   115,   116,   117,   118,   119,   120,   121,
      122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
-      -1,   133,    -1,    -1,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,    -1,     0,
-       1,    -1,   133,     4,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    12,    13,    -1,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,    -1,    -1,
-      -1,    -1,   133,    -1,    35,    -1,    -1,    -1,    -1,    40,
-      41,   142,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    -1,    54,    55,    56,    57,    58,    59,    60,
-      -1,    -1,    -1,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    75,    76,    77,    78,    -1,    -1,
-      81,    82,     4,    -1,    -1,    -1,    87,    88,    89,    90,
-      12,    13,    93,    -1,    95,    -1,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    35,    -1,    -1,    -1,    -1,    40,    41,
-      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    -1,    54,    55,    56,    57,    58,    59,    60,    -1,
-      -1,    -1,    64,    65,    66,    67,    68,    69,    70,    -1,
-      72,    73,    74,    75,    76,    77,    78,    -1,    -1,    81,
-      82,    -1,    -1,    -1,    -1,    87,    88,    89,    90,    -1,
-      -1,    93,    -1,    95,    -1,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
-      -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,
-     140,    -1,   142,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
-      -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,   140,    -1,
+      -1,   133,    -1,    -1,    -1,    88,    89,    90,   140,    -1,
      142,   115,   116,   117,   118,   119,   120,   121,   122,   123,
      124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,   133,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   142,   115,
+      -1,    -1,    -1,    -1,    -1,    -1,   140,    -1,   142,   115,
      116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
      126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   142,   115,   116,   117,
+      -1,    -1,    -1,    -1,   140,    -1,   142,   115,   116,   117,
      118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
      128,    -1,    -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,   142,   115,   116,   117,   118,   119,
@@ -2471,9 +2480,12 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,   142,   115,   116,   117,   118,   119,   120,   121,
      122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
-      -1,   133,    -1,   135,    -1,    -1,    -1,    -1,   140,   115,
+      -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     142,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,   133,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   142,   115,
      116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,    -1,
+     126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,   135,
       -1,    -1,    -1,    -1,   140,   115,   116,   117,   118,   119,
      120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
       -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -2549,9 +2561,7 @@ static const yytype_int16 yycheck[] =
      128,    -1,    -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,
       -1,    -1,   140,   115,   116,   117,   118,   119,   120,   121,
      122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
-      -1,   133,    -1,    -1,    -1,   137,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-      -1,    -1,    -1,    -1,   133,    -1,    -1,    -1,   137,   115,
+      -1,   133,    -1,    -1,    -1,    -1,    -1,    -1,   140,   115,
      116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
      126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,    -1,
       -1,   137,   115,   116,   117,   118,   119,   120,   121,   122,
@@ -2622,6 +2632,19 @@ static const yytype_int16 yycheck[] =
      119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
       -1,    -1,    -1,    -1,   133,    -1,    -1,    -1,   137,   115,
      116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,    -1,
+      -1,   137,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,
+     133,    -1,    -1,    -1,   137,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
+      -1,    -1,    -1,   133,    -1,   135,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+      -1,    -1,    -1,    -1,   133,    -1,   135,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,    -1,    -1,    -1,    -1,   133,    -1,   135,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,    -1,    -1,    -1,    -1,   133,    -1,   135,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
      126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,   135,
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
      125,   126,   127,   128,    -1,    -1,    -1,    -1,   133,    -1,
@@ -2715,15 +2738,7 @@ static const yytype_int16 yycheck[] =
      123,   124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,
      133,    -1,   135,   115,   116,   117,   118,   119,   120,   121,
      122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
-      -1,   133,    -1,   135,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,    -1,    -1,
-      -1,    -1,   133,    -1,   135,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
-      -1,    -1,    -1,   133,    -1,   135,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-      -1,    -1,    -1,    -1,   133,    -1,   135,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,    -1,    -1,    -1,    -1,   133
+      -1,   133
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -2748,113 +2763,113 @@ static const yytype_uint8 yystos[] =
      134,    53,    49,   134,    49,    49,    49,    46,    49,    51,
       51,    43,    46,    49,    51,   134,   141,   124,   125,   134,
      141,   201,   202,   201,   141,    43,    46,    49,   141,   201,
-     141,    49,    49,    46,     4,   101,   141,     6,    46,   141,
-       4,     4,     4,   134,   134,   134,     4,   141,   207,     4,
-     134,   134,     6,   136,     4,     4,     4,     5,   141,   210,
-     211,   141,   210,     4,   136,   138,   143,   167,   141,   211,
-     134,   136,   134,   136,   134,   136,   134,   136,   134,   136,
-     134,   136,   134,   136,   134,   136,   134,   136,   134,   136,
-     134,   136,   134,   136,   134,   136,   134,   136,   134,   136,
-     134,   136,   134,   136,   134,   136,   134,   136,   134,   136,
-     134,   136,   134,   134,   134,   134,     7,   134,     4,   199,
-     199,   199,   199,   137,   141,   199,     4,    93,    94,     4,
-     199,     6,     6,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   133,     6,     6,
-     199,     5,   199,   199,     4,    43,   125,   172,   180,   199,
-     205,   206,   199,   199,   134,   199,   206,   199,   199,   134,
-     206,   199,   199,   125,   141,   199,   204,   205,   134,   199,
-     141,   134,   134,   204,   141,   141,   134,   134,   134,   134,
-     134,     4,   201,   201,   201,   199,   199,   124,   125,   141,
-     141,   201,   141,   141,   141,   124,   125,   134,   174,   201,
-     141,   172,   173,   174,   204,   204,   134,     4,     6,   136,
-     136,   174,   141,   173,   136,   136,     6,   199,   199,   199,
-     138,   199,   141,    96,   199,   199,   199,     6,   136,   138,
-     174,     6,   174,     6,   136,   199,     4,   141,   151,     6,
-     199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
+     141,    49,    49,    46,     4,   101,   141,     4,     6,    46,
+     141,     4,     4,     4,   134,   134,   134,     4,   141,   207,
+       4,   134,   134,     6,   136,     4,     4,     4,     5,   141,
+     210,   211,   141,   210,     4,   136,   138,   143,   167,   141,
+     211,   134,   136,   134,   136,   134,   136,   134,   136,   134,
+     136,   134,   136,   134,   136,   134,   136,   134,   136,   134,
+     136,   134,   136,   134,   136,   134,   136,   134,   136,   134,
+     136,   134,   136,   134,   136,   134,   136,   134,   136,   134,
+     136,   134,   136,   134,   134,   134,   134,     7,   134,     4,
+     199,   199,   199,   199,   137,   141,   199,     4,    93,    94,
+       4,   199,     6,     6,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   133,     6,
+       6,   199,     5,   199,   199,     4,    43,   125,   172,   180,
+     199,   205,   206,   199,   199,   134,   199,   206,   199,   199,
+     134,   206,   199,   199,   125,   141,   199,   204,   205,   134,
+     199,   141,   134,   134,   204,   141,   141,   134,   134,   134,
+     134,   134,     4,   201,   201,   201,   199,   199,   124,   125,
+     141,   141,   201,   141,   141,   141,   124,   125,   134,   174,
+     201,   141,   172,   173,   174,   204,   204,   134,     4,     6,
+     136,   136,   174,     6,   141,   173,   136,   136,     6,   199,
+     199,   199,   138,   199,   141,    96,   199,   199,   199,     6,
+     136,   138,   174,     6,   174,     6,   136,   199,     4,   141,
+     151,     6,   199,   199,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
      199,   199,   199,   199,   199,   199,   199,   199,   199,   199,
-     199,   199,   210,   210,   210,   210,   199,     5,   136,   135,
-       7,   114,   206,   137,     7,   166,   167,   138,     7,   136,
-       6,   199,   199,   199,   199,   199,   199,   199,   199,   199,
-     199,   199,   199,   199,   199,   199,     6,   135,   140,   140,
-     135,   136,   141,   199,   205,     8,   126,   140,   142,   135,
-     135,   199,   135,   142,   135,   135,   199,   142,   135,   135,
-     141,   142,   206,   126,     7,   199,   135,   199,   199,   199,
-       7,   199,   199,   199,   169,   199,   211,   169,   169,   169,
-     135,   140,   140,   140,   201,   201,   173,   173,   140,   199,
-     199,   199,   199,    43,    46,    49,    51,   171,   184,   140,
-     174,   142,     6,     7,     7,   199,     6,   199,   199,   142,
-     206,   142,   199,   199,   135,   135,   135,    93,   140,   174,
-     141,     8,   135,   137,   199,     4,   142,   142,   199,   137,
-     167,   199,     4,    83,    84,    85,    86,   142,   154,   158,
-     161,   163,   164,   135,   137,   135,   137,   135,   137,   135,
+     199,   199,   199,   199,   210,   210,   210,   210,   199,     5,
+     136,   135,     7,   114,   206,   137,     7,   166,   167,   138,
+       7,   136,     6,   199,   199,   199,   199,   199,   199,   199,
+     199,   199,   199,   199,   199,   199,   199,   199,     6,   135,
+     140,   140,   135,   136,   141,   199,   205,     8,   126,   140,
+     142,   135,   135,   199,   135,   142,   135,   135,   199,   142,
+     135,   135,   141,   142,   206,   126,     7,   199,   135,   199,
+     199,   199,     7,   199,   199,   199,   169,   199,   211,   169,
+     169,   169,   135,   140,   140,   140,   201,   201,   173,   173,
+     140,   199,   199,   199,   199,    43,    46,    49,    51,   171,
+     184,   140,   174,   142,     6,     7,     7,   199,     6,   199,
+     199,   142,   206,   142,   199,   199,   135,   135,   135,    93,
+     140,   174,   141,     8,   135,   137,   199,     4,   142,   142,
+     199,   137,   167,   199,     4,    83,    84,    85,    86,   142,
+     154,   158,   161,   163,   164,   135,   137,   135,   137,   135,
      137,   135,   137,   135,   137,   135,   137,   135,   137,   135,
-     137,   135,   137,   135,   137,   140,   140,   135,   137,   135,
-     137,   135,   137,   135,   137,   135,   137,   135,   137,   140,
-     140,   140,   140,   140,   140,   135,   140,   140,   135,   135,
-       6,   140,   199,   204,   204,   142,     7,   138,   166,   167,
-     211,   199,     6,     4,     4,   141,   208,   137,     8,     6,
-     121,   148,   206,   199,     7,   137,   141,   199,   199,   199,
-     205,   199,   205,    96,     7,     7,   135,     7,    96,     7,
-       7,   135,    96,     7,     7,   206,   142,   141,   199,   135,
-       7,   142,   135,   135,   199,   142,   142,   135,   135,   135,
-     135,   135,   138,   201,   199,   199,   142,   142,   199,   140,
-     140,   140,   141,   141,   141,   141,    72,    79,    80,   194,
-     195,   201,   142,   181,   199,   199,   135,   137,   137,   142,
-     137,   137,     7,     7,     7,   138,   199,   142,   199,   199,
-       7,   138,   137,   137,   138,   167,   210,   142,   155,   134,
-     134,   141,   165,     6,   199,   199,   199,   199,   199,   199,
-     199,   199,   206,   210,   199,   137,     6,     6,   137,     4,
-      93,    94,   199,     6,     6,     6,     7,   136,   207,   209,
-       6,   199,   121,   210,   135,   140,   201,   206,   142,     8,
-      49,   204,   204,     7,   204,    49,    51,   204,   204,     7,
-      51,   204,   204,   142,   206,     6,     7,   141,     7,     7,
-       7,     6,    61,     7,     7,     7,     7,     7,     7,     7,
-       4,   140,   140,   140,   142,   201,   201,   201,   206,   206,
-     206,   206,     6,   141,   134,   142,   195,   140,   194,     6,
-       6,   141,     6,     6,    49,     6,     6,   204,   204,   204,
-       4,   140,     8,     8,   135,     4,     4,   138,     6,     4,
-       6,   134,   199,   199,   203,   204,   141,   135,   137,   135,
-     137,   135,   137,   135,   137,   135,   135,   135,   166,     7,
-     166,   167,   138,     7,     6,   207,   199,   140,   142,     6,
-       6,   148,   199,     6,   142,   199,   141,     6,    56,     6,
-      56,   204,     6,   141,   141,     6,     6,   204,   141,     6,
-       6,   142,     5,   199,   204,   204,   204,    62,    63,   204,
-     204,   204,   204,   204,   204,   204,     6,     7,   199,   199,
-     199,   141,   140,   142,   140,   142,   140,   142,   142,   142,
-     142,   142,   199,   204,   199,   199,   201,   142,   206,   141,
-       6,     6,    92,   199,   199,   199,     6,     7,     4,   167,
-     152,   199,   140,   140,   140,   142,   153,   199,   204,   211,
-     199,     6,     4,   208,     6,   137,   207,   210,   140,   137,
-     199,   201,   201,     6,   199,   199,     6,   199,     5,   140,
-       6,     6,    96,   170,   199,   199,     4,     6,     6,     6,
-       6,     6,     6,     6,   199,   211,   142,   135,   140,   142,
-     173,   201,     6,   185,   201,     6,   186,   201,     6,   187,
-       6,     6,     6,     6,   142,   140,   135,   142,   140,   142,
-     199,   204,   140,   142,     8,   142,   135,   141,   199,   211,
-     135,   140,   199,   199,   204,   141,   140,   142,     6,     6,
-       6,     7,     6,   138,     6,   199,   142,     6,     6,   142,
-     142,   142,     5,   199,    47,     6,     6,     6,     6,     6,
-       6,   141,   199,   142,   140,   141,   140,   141,   140,   141,
-       6,   204,     7,   141,   199,     6,   142,    91,   199,   199,
-     206,     6,     6,   156,   199,   140,   140,   203,   199,     6,
-     207,    94,   140,     6,     6,     6,     6,     6,   140,   141,
-     173,   140,   142,   199,   201,   194,   199,   201,   194,   199,
-     201,   194,   140,   142,   204,   174,   142,   199,   142,   142,
-     142,   141,   199,   199,   142,     6,   199,     5,   199,   142,
-     199,   142,   140,   142,   142,   140,   142,   142,   140,   142,
-     204,     6,    61,   142,   182,   141,     6,     6,   153,   135,
-     140,     6,   141,   140,   140,   142,   142,     6,   188,   199,
-       6,     6,   189,   199,     6,     6,   190,   199,     6,   142,
-     199,   194,   174,   142,   159,   199,   203,   199,     5,   141,
-     142,   141,   142,   141,   142,     6,     6,   142,   142,   183,
-       6,   141,   135,   142,   142,   140,   194,     6,   191,   194,
-       6,   192,   194,     6,   193,   194,   157,   210,   162,   141,
-       6,     5,   142,   141,   142,   141,   142,   141,   142,   140,
-     142,   141,   203,   142,     6,   194,     6,   194,     6,   194,
-     210,     6,   160,   210,   142,     6,   142,   142,   142,   140,
-     142,     6,     6,     6,     6,   210,     6
+     137,   135,   137,   135,   137,   135,   137,   140,   140,   135,
+     137,   135,   137,   135,   137,   135,   137,   135,   137,   135,
+     137,   140,   140,   140,   140,   140,   140,   135,   140,   140,
+     135,   135,     6,   140,   199,   204,   204,   142,     7,   138,
+     166,   167,   211,   199,     6,     4,     4,   141,   208,   137,
+       8,     6,   121,   148,   206,   199,     7,   137,   141,   199,
+     199,   199,   205,   199,   205,    96,     7,     7,   135,     7,
+      96,     7,     7,   135,    96,     7,     7,   206,   142,   141,
+     199,   135,     7,   142,   135,   135,   199,   142,   142,   135,
+     135,   135,   135,   135,   138,   201,   199,   199,   142,   142,
+     199,   140,   140,   140,   141,   141,   141,   141,    72,    79,
+      80,   194,   195,   201,   142,   181,   199,   199,   135,   137,
+     137,   142,   137,   137,     7,     7,     7,   138,   199,   142,
+     199,   199,     7,   138,   137,   137,   138,   167,   210,   142,
+     155,   134,   134,   141,   165,     6,   199,   199,   199,   199,
+     199,   199,   199,   199,   206,   210,   199,   137,     6,     6,
+     137,     4,    93,    94,   199,     6,     6,     6,     7,   136,
+     207,   209,     6,   199,   121,   210,   135,   140,   201,   206,
+     142,     8,    49,   204,   204,     7,   204,    49,    51,   204,
+     204,     7,    51,   204,   204,   142,   206,     6,     7,   141,
+       7,     7,     7,     6,    61,     7,     7,     7,     7,     7,
+       7,     7,     4,   140,   140,   140,   142,   201,   201,   201,
+     206,   206,   206,   206,     6,   141,   134,   142,   195,   140,
+     194,     6,     6,   141,     6,     6,    49,     6,     6,   204,
+     204,   204,     4,   140,     8,     8,   135,     4,     4,   138,
+       6,     4,     6,   134,   199,   199,   203,   204,   141,   135,
+     137,   135,   137,   135,   137,   135,   137,   135,   135,   135,
+     166,     7,   166,   167,   138,     7,     6,   207,   199,   140,
+     142,     6,     6,   148,   199,     6,   142,   199,   141,     6,
+      56,     6,    56,   204,     6,   141,   141,     6,     6,   204,
+     141,     6,     6,   142,     5,   199,   204,   204,   204,    62,
+      63,   204,   204,   204,   204,   204,   204,   204,     6,     7,
+     199,   199,   199,   141,   140,   142,   140,   142,   140,   142,
+     142,   142,   142,   142,   199,   204,   199,   199,   201,   142,
+     206,   141,     6,     6,    92,   199,   199,   199,     6,     7,
+       4,   167,   152,   199,   140,   140,   140,   142,   153,   199,
+     204,   211,   199,     6,     4,   208,     6,   137,   207,   210,
+     140,   137,   199,   201,   201,     6,   199,   199,     6,   199,
+       5,   140,     6,     6,    96,   170,   199,   199,     4,     6,
+       6,     6,     6,     6,     6,     6,   199,   211,   142,   135,
+     140,   142,   173,   201,     6,   185,   201,     6,   186,   201,
+       6,   187,     6,     6,     6,     6,   142,   140,   135,   142,
+     140,   142,   199,   204,   140,   142,     8,   142,   135,   141,
+     199,   211,   135,   140,   199,   199,   204,   141,   140,   142,
+       6,     6,     6,     7,     6,   138,     6,   199,   142,     6,
+       6,   142,   142,   142,     5,   199,    47,     6,     6,     6,
+       6,     6,     6,   141,   199,   142,   140,   141,   140,   141,
+     140,   141,     6,   204,     7,   141,   199,     6,   142,    91,
+     199,   199,   206,     6,     6,   156,   199,   140,   140,   203,
+     199,     6,   207,    94,   140,     6,     6,     6,     6,     6,
+     140,   141,   173,   140,   142,   199,   201,   194,   199,   201,
+     194,   199,   201,   194,   140,   142,   204,   174,   142,   199,
+     142,   142,   142,   141,   199,   199,   142,     6,   199,     5,
+     199,   142,   199,   142,   140,   142,   142,   140,   142,   142,
+     140,   142,   204,     6,    61,   142,   182,   141,     6,     6,
+     153,   135,   140,     6,   141,   140,   140,   142,   142,     6,
+     188,   199,     6,     6,   189,   199,     6,     6,   190,   199,
+       6,   142,   199,   194,   174,   142,   159,   199,   203,   199,
+       5,   141,   142,   141,   142,   141,   142,     6,     6,   142,
+     142,   183,     6,   141,   135,   142,   142,   140,   194,     6,
+     191,   194,     6,   192,   194,     6,   193,   194,   157,   210,
+     162,   141,     6,     5,   142,   141,   142,   141,   142,   141,
+     142,   140,   142,   141,   203,   142,     6,   194,     6,   194,
+       6,   194,   210,     6,   160,   210,   142,     6,   142,   142,
+     142,   140,   142,     6,     6,     6,     6,   210,     6
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -2928,7 +2943,7 @@ while (YYID (0))
    we won't break user code: when these are the locations we know.  */
 
 #ifndef YY_LOCATION_PRINT
-# if YYLTYPE_IS_TRIVIAL
+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)			\
      fprintf (File, "%d.%d-%d.%d",			\
 	      (Loc).first_line, (Loc).first_column,	\
@@ -5713,7 +5728,7 @@ yyreduce:
 	SleepInSeconds((yyvsp[(2) - (3)].d));
       }
       else if(!strcmp((yyvsp[(1) - (3)].c), "Remesh")){
-	Msg::Error("Surface remeshing must be reinterfaced");
+	yymsg(0, "Surface remeshing must be reinterfaced");
       }
       else if(!strcmp((yyvsp[(1) - (3)].c), "Mesh")){
 	int lock = CTX.threads_lock;
@@ -6665,47 +6680,60 @@ yyreduce:
     break;
 
   case 223:
-#line 2663 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
+#line 2658 "Gmsh.y"
+    { 
+      if(!strcmp((yyvsp[(2) - (3)].c), "Geometry"))
+        ReplaceAllDuplicates();
+      else if(!strcmp((yyvsp[(2) - (3)].c), "Mesh"))
+        GModel::current()->removeDuplicateMeshVertices(CTX.geom.tolerance);
+      else
+        yymsg(0, "Unknown coherence command");
+      Free((yyvsp[(2) - (3)].c));
+    ;}
     break;
 
   case 224:
-#line 2664 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
+#line 2673 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
   case 225:
-#line 2665 "Gmsh.y"
-    { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
+#line 2674 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
   case 226:
-#line 2666 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
+#line 2675 "Gmsh.y"
+    { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 227:
-#line 2667 "Gmsh.y"
-    { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
+#line 2676 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
   case 228:
-#line 2668 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
+#line 2677 "Gmsh.y"
+    { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 229:
-#line 2669 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
+#line 2678 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 230:
-#line 2670 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
+#line 2679 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 231:
-#line 2672 "Gmsh.y"
+#line 2680 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
+    break;
+
+  case 232:
+#line 2682 "Gmsh.y"
     { 
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -6714,308 +6742,308 @@ yyreduce:
     ;}
     break;
 
-  case 232:
-#line 2678 "Gmsh.y"
+  case 233:
+#line 2688 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
     break;
 
-  case 233:
-#line 2679 "Gmsh.y"
+  case 234:
+#line 2689 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
-  case 234:
-#line 2680 "Gmsh.y"
+  case 235:
+#line 2690 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
-  case 235:
-#line 2681 "Gmsh.y"
+  case 236:
+#line 2691 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
-  case 236:
-#line 2682 "Gmsh.y"
+  case 237:
+#line 2692 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 237:
-#line 2683 "Gmsh.y"
+  case 238:
+#line 2693 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 238:
-#line 2684 "Gmsh.y"
+  case 239:
+#line 2694 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 239:
-#line 2685 "Gmsh.y"
+  case 240:
+#line 2695 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 240:
-#line 2686 "Gmsh.y"
+  case 241:
+#line 2696 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 241:
-#line 2687 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
-    break;
-
   case 242:
-#line 2688 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
+#line 2697 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 243:
-#line 2689 "Gmsh.y"
-    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
+#line 2698 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
   case 244:
-#line 2690 "Gmsh.y"
-    { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
+#line 2699 "Gmsh.y"
+    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 245:
-#line 2691 "Gmsh.y"
-    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
+#line 2700 "Gmsh.y"
+    { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 246:
-#line 2692 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
+#line 2701 "Gmsh.y"
+    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 247:
-#line 2693 "Gmsh.y"
-    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
+#line 2702 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 248:
-#line 2694 "Gmsh.y"
-    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
+#line 2703 "Gmsh.y"
+    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 249:
-#line 2695 "Gmsh.y"
-    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
+#line 2704 "Gmsh.y"
+    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 250:
-#line 2696 "Gmsh.y"
-    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
+#line 2705 "Gmsh.y"
+    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 251:
-#line 2697 "Gmsh.y"
-    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
+#line 2706 "Gmsh.y"
+    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 252:
-#line 2698 "Gmsh.y"
-    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
+#line 2707 "Gmsh.y"
+    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 253:
-#line 2699 "Gmsh.y"
-    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
+#line 2708 "Gmsh.y"
+    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 254:
-#line 2700 "Gmsh.y"
-    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
+#line 2709 "Gmsh.y"
+    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 255:
-#line 2701 "Gmsh.y"
-    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
+#line 2710 "Gmsh.y"
+    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 256:
-#line 2702 "Gmsh.y"
-    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
+#line 2711 "Gmsh.y"
+    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 257:
-#line 2703 "Gmsh.y"
-    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
+#line 2712 "Gmsh.y"
+    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 258:
-#line 2704 "Gmsh.y"
-    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
+#line 2713 "Gmsh.y"
+    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 259:
-#line 2705 "Gmsh.y"
-    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
+#line 2714 "Gmsh.y"
+    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 260:
-#line 2706 "Gmsh.y"
-    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
+#line 2715 "Gmsh.y"
+    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 261:
-#line 2707 "Gmsh.y"
+#line 2716 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 262:
-#line 2708 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
+#line 2717 "Gmsh.y"
+    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 263:
-#line 2709 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
+#line 2718 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 264:
-#line 2711 "Gmsh.y"
-    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
+#line 2719 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 265:
-#line 2712 "Gmsh.y"
-    { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
+#line 2721 "Gmsh.y"
+    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 266:
-#line 2713 "Gmsh.y"
-    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
+#line 2722 "Gmsh.y"
+    { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 267:
-#line 2714 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
+#line 2723 "Gmsh.y"
+    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 268:
-#line 2715 "Gmsh.y"
-    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
+#line 2724 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 269:
-#line 2716 "Gmsh.y"
-    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
+#line 2725 "Gmsh.y"
+    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 270:
-#line 2717 "Gmsh.y"
-    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
+#line 2726 "Gmsh.y"
+    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 271:
-#line 2718 "Gmsh.y"
-    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
+#line 2727 "Gmsh.y"
+    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 272:
-#line 2719 "Gmsh.y"
-    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
+#line 2728 "Gmsh.y"
+    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 273:
-#line 2720 "Gmsh.y"
-    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
+#line 2729 "Gmsh.y"
+    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 274:
-#line 2721 "Gmsh.y"
-    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
+#line 2730 "Gmsh.y"
+    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 275:
-#line 2722 "Gmsh.y"
-    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
+#line 2731 "Gmsh.y"
+    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 276:
-#line 2723 "Gmsh.y"
-    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
+#line 2732 "Gmsh.y"
+    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 277:
-#line 2724 "Gmsh.y"
-    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
+#line 2733 "Gmsh.y"
+    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 278:
-#line 2725 "Gmsh.y"
-    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
+#line 2734 "Gmsh.y"
+    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 279:
-#line 2726 "Gmsh.y"
-    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
+#line 2735 "Gmsh.y"
+    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 280:
-#line 2727 "Gmsh.y"
-    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
+#line 2736 "Gmsh.y"
+    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 281:
-#line 2728 "Gmsh.y"
-    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
+#line 2737 "Gmsh.y"
+    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 282:
-#line 2729 "Gmsh.y"
+#line 2738 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 283:
-#line 2730 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
+#line 2739 "Gmsh.y"
+    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 284:
-#line 2731 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
+#line 2740 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 285:
-#line 2740 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
+#line 2741 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 286:
-#line 2741 "Gmsh.y"
-    { (yyval.d) = 3.141592653589793; ;}
+#line 2750 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 287:
-#line 2742 "Gmsh.y"
-    { (yyval.d) = Msg::GetCommRank(); ;}
+#line 2751 "Gmsh.y"
+    { (yyval.d) = 3.141592653589793; ;}
     break;
 
   case 288:
-#line 2743 "Gmsh.y"
-    { (yyval.d) = Msg::GetCommSize(); ;}
+#line 2752 "Gmsh.y"
+    { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
   case 289:
-#line 2744 "Gmsh.y"
-    { (yyval.d) = Get_GmshMajorVersion(); ;}
+#line 2753 "Gmsh.y"
+    { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
   case 290:
-#line 2745 "Gmsh.y"
-    { (yyval.d) = Get_GmshMinorVersion(); ;}
+#line 2754 "Gmsh.y"
+    { (yyval.d) = Get_GmshMajorVersion(); ;}
     break;
 
   case 291:
-#line 2746 "Gmsh.y"
-    { (yyval.d) = Get_GmshPatchVersion(); ;}
+#line 2755 "Gmsh.y"
+    { (yyval.d) = Get_GmshMinorVersion(); ;}
     break;
 
   case 292:
-#line 2751 "Gmsh.y"
+#line 2756 "Gmsh.y"
+    { (yyval.d) = Get_GmshPatchVersion(); ;}
+    break;
+
+  case 293:
+#line 2761 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (1)].c));
@@ -7027,8 +7055,8 @@ yyreduce:
     ;}
     break;
 
-  case 293:
-#line 2764 "Gmsh.y"
+  case 294:
+#line 2774 "Gmsh.y"
     {
       char tmpstring[1024];
       sprintf(tmpstring, "%s_%d", (yyvsp[(1) - (5)].c), (int)(yyvsp[(4) - (5)].d)) ;
@@ -7042,8 +7070,8 @@ yyreduce:
     ;}
     break;
 
-  case 294:
-#line 2776 "Gmsh.y"
+  case 295:
+#line 2786 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -7060,8 +7088,8 @@ yyreduce:
     ;}
     break;
 
-  case 295:
-#line 2791 "Gmsh.y"
+  case 296:
+#line 2801 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(2) - (4)].c));
@@ -7073,8 +7101,8 @@ yyreduce:
     ;}
     break;
 
-  case 296:
-#line 2801 "Gmsh.y"
+  case 297:
+#line 2811 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -7086,8 +7114,8 @@ yyreduce:
     ;}
     break;
 
-  case 297:
-#line 2811 "Gmsh.y"
+  case 298:
+#line 2821 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -7104,24 +7132,24 @@ yyreduce:
     ;}
     break;
 
-  case 298:
-#line 2829 "Gmsh.y"
+  case 299:
+#line 2839 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), (yyval.d));
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
     ;}
     break;
 
-  case 299:
-#line 2834 "Gmsh.y"
+  case 300:
+#line 2844 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d));
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
     ;}
     break;
 
-  case 300:
-#line 2839 "Gmsh.y"
+  case 301:
+#line 2849 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -7133,8 +7161,8 @@ yyreduce:
     ;}
     break;
 
-  case 301:
-#line 2849 "Gmsh.y"
+  case 302:
+#line 2859 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -7146,124 +7174,124 @@ yyreduce:
     ;}
     break;
 
-  case 302:
-#line 2859 "Gmsh.y"
+  case 303:
+#line 2869 "Gmsh.y"
     { 
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
     ;}
     break;
 
-  case 303:
-#line 2867 "Gmsh.y"
+  case 304:
+#line 2877 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
     break;
 
-  case 304:
-#line 2871 "Gmsh.y"
+  case 305:
+#line 2881 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
-  case 305:
-#line 2875 "Gmsh.y"
+  case 306:
+#line 2885 "Gmsh.y"
     { 
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
-  case 306:
-#line 2879 "Gmsh.y"
+  case 307:
+#line 2889 "Gmsh.y"
     { 
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
-  case 307:
-#line 2883 "Gmsh.y"
+  case 308:
+#line 2893 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
-  case 308:
-#line 2890 "Gmsh.y"
+  case 309:
+#line 2900 "Gmsh.y"
     { 
       (yyval.v)[0] = (yyvsp[(2) - (11)].d);  (yyval.v)[1] = (yyvsp[(4) - (11)].d);  (yyval.v)[2] = (yyvsp[(6) - (11)].d);  (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d);
     ;}
     break;
 
-  case 309:
-#line 2894 "Gmsh.y"
+  case 310:
+#line 2904 "Gmsh.y"
     { 
       (yyval.v)[0] = (yyvsp[(2) - (9)].d);  (yyval.v)[1] = (yyvsp[(4) - (9)].d);  (yyval.v)[2] = (yyvsp[(6) - (9)].d);  (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0;
     ;}
     break;
 
-  case 310:
-#line 2898 "Gmsh.y"
+  case 311:
+#line 2908 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
-  case 311:
-#line 2902 "Gmsh.y"
+  case 312:
+#line 2912 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
-  case 312:
-#line 2909 "Gmsh.y"
+  case 313:
+#line 2919 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
     ;}
     break;
 
-  case 313:
-#line 2914 "Gmsh.y"
+  case 314:
+#line 2924 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
     break;
 
-  case 314:
-#line 2921 "Gmsh.y"
+  case 315:
+#line 2931 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
     ;}
     break;
 
-  case 315:
-#line 2926 "Gmsh.y"
+  case 316:
+#line 2936 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
-  case 316:
-#line 2930 "Gmsh.y"
+  case 317:
+#line 2940 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
     ;}
     break;
 
-  case 317:
-#line 2935 "Gmsh.y"
+  case 318:
+#line 2945 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
-  case 318:
-#line 2939 "Gmsh.y"
+  case 319:
+#line 2949 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7273,8 +7301,8 @@ yyreduce:
     ;}
     break;
 
-  case 319:
-#line 2947 "Gmsh.y"
+  case 320:
+#line 2957 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7284,8 +7312,8 @@ yyreduce:
     ;}
     break;
 
-  case 320:
-#line 2958 "Gmsh.y"
+  case 321:
+#line 2968 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7295,8 +7323,8 @@ yyreduce:
     ;}
     break;
 
-  case 321:
-#line 2966 "Gmsh.y"
+  case 322:
+#line 2976 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7306,8 +7334,8 @@ yyreduce:
     ;}
     break;
 
-  case 322:
-#line 2974 "Gmsh.y"
+  case 323:
+#line 2984 "Gmsh.y"
     { 
       (yyval.l) = List_Create(2, 1, sizeof(double)); 
       for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d)); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d += 1.) : (d -= 1.)) 
@@ -7315,8 +7343,8 @@ yyreduce:
     ;}
     break;
 
-  case 323:
-#line 2980 "Gmsh.y"
+  case 324:
+#line 2990 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double)); 
       if(!(yyvsp[(5) - (5)].d) || ((yyvsp[(1) - (5)].d) < (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) < 0) || ((yyvsp[(1) - (5)].d) > (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) > 0)){
@@ -7329,8 +7357,8 @@ yyreduce:
    ;}
     break;
 
-  case 324:
-#line 2991 "Gmsh.y"
+  case 325:
+#line 3001 "Gmsh.y"
     {
       // Returns the coordinates of a point and fills a list with it.
       // This allows to ensure e.g. that relative point positions are
@@ -7352,8 +7380,8 @@ yyreduce:
     ;}
     break;
 
-  case 325:
-#line 3011 "Gmsh.y"
+  case 326:
+#line 3021 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -7365,8 +7393,8 @@ yyreduce:
     ;}
     break;
 
-  case 326:
-#line 3021 "Gmsh.y"
+  case 327:
+#line 3031 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -7378,8 +7406,8 @@ yyreduce:
     ;}
     break;
 
-  case 327:
-#line 3031 "Gmsh.y"
+  case 328:
+#line 3041 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -7391,8 +7419,8 @@ yyreduce:
     ;}
     break;
 
-  case 328:
-#line 3041 "Gmsh.y"
+  case 329:
+#line 3051 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -7411,30 +7439,30 @@ yyreduce:
     ;}
     break;
 
-  case 329:
-#line 3061 "Gmsh.y"
+  case 330:
+#line 3071 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
     ;}
     break;
 
-  case 330:
-#line 3066 "Gmsh.y"
+  case 331:
+#line 3076 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
-  case 331:
-#line 3070 "Gmsh.y"
+  case 332:
+#line 3080 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
-  case 332:
-#line 3074 "Gmsh.y"
+  case 333:
+#line 3084 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -7445,22 +7473,22 @@ yyreduce:
     ;}
     break;
 
-  case 333:
-#line 3086 "Gmsh.y"
+  case 334:
+#line 3096 "Gmsh.y"
     {
       (yyval.u) = CTX.PACK_COLOR((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d));
     ;}
     break;
 
-  case 334:
-#line 3090 "Gmsh.y"
+  case 335:
+#line 3100 "Gmsh.y"
     {
       (yyval.u) = CTX.PACK_COLOR((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     ;}
     break;
 
-  case 335:
-#line 3102 "Gmsh.y"
+  case 336:
+#line 3112 "Gmsh.y"
     {
       int flag;
       (yyval.u) = Get_ColorForString(ColorString, -1, (yyvsp[(1) - (1)].c), &flag);
@@ -7469,8 +7497,8 @@ yyreduce:
     ;}
     break;
 
-  case 336:
-#line 3109 "Gmsh.y"
+  case 337:
+#line 3119 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -7479,15 +7507,15 @@ yyreduce:
     ;}
     break;
 
-  case 337:
-#line 3119 "Gmsh.y"
+  case 338:
+#line 3129 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
-  case 338:
-#line 3123 "Gmsh.y"
+  case 339:
+#line 3133 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = Get_ColorTable((int)(yyvsp[(3) - (6)].d));
@@ -7501,30 +7529,30 @@ yyreduce:
     ;}
     break;
 
-  case 339:
-#line 3138 "Gmsh.y"
+  case 340:
+#line 3148 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
     ;}
     break;
 
-  case 340:
-#line 3143 "Gmsh.y"
+  case 341:
+#line 3153 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
-  case 341:
-#line 3150 "Gmsh.y"
+  case 342:
+#line 3160 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
-  case 342:
-#line 3154 "Gmsh.y"
+  case 343:
+#line 3164 "Gmsh.y"
     {
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown string variable '%s'", (yyvsp[(1) - (1)].c));
@@ -7539,8 +7567,8 @@ yyreduce:
     ;}
     break;
 
-  case 343:
-#line 3167 "Gmsh.y"
+  case 344:
+#line 3177 "Gmsh.y"
     { 
       const char *val = "";
       StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), val);
@@ -7550,8 +7578,8 @@ yyreduce:
     ;}
     break;
 
-  case 344:
-#line 3175 "Gmsh.y"
+  case 345:
+#line 3185 "Gmsh.y"
     { 
       const char *val = "";
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), val);
@@ -7561,15 +7589,15 @@ yyreduce:
     ;}
     break;
 
-  case 345:
-#line 3186 "Gmsh.y"
+  case 346:
+#line 3196 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
-  case 346:
-#line 3190 "Gmsh.y"
+  case 347:
+#line 3200 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -7579,8 +7607,8 @@ yyreduce:
     ;}
     break;
 
-  case 347:
-#line 3198 "Gmsh.y"
+  case 348:
+#line 3208 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (6)].c)) + strlen((yyvsp[(5) - (6)].c)) + 1) * sizeof(char));
       strcpy((yyval.c), (yyvsp[(3) - (6)].c));
@@ -7590,8 +7618,8 @@ yyreduce:
     ;}
     break;
 
-  case 348:
-#line 3206 "Gmsh.y"
+  case 349:
+#line 3216 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -7607,8 +7635,8 @@ yyreduce:
     ;}
     break;
 
-  case 349:
-#line 3220 "Gmsh.y"
+  case 350:
+#line 3230 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -7624,15 +7652,15 @@ yyreduce:
     ;}
     break;
 
-  case 350:
-#line 3234 "Gmsh.y"
+  case 351:
+#line 3244 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
-  case 351:
-#line 3238 "Gmsh.y"
+  case 352:
+#line 3248 "Gmsh.y"
     {
       char tmpstring[1024];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -7655,7 +7683,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 7659 "Gmsh.tab.cpp"
+#line 7687 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -7869,7 +7897,7 @@ yyreturn:
 }
 
 
-#line 3258 "Gmsh.y"
+#line 3268 "Gmsh.y"
 
 
 int PrintListOfDouble(char *format, List_T *list, char *buffer)
diff --git a/Parser/Gmsh.tab.hpp b/Parser/Gmsh.tab.hpp
index bac7f5a1e4fdbfd8c32477ec5f38c7a0216b6e29..551489bcd77e13ee16e9074b982449270ecbd39e 100644
--- a/Parser/Gmsh.tab.hpp
+++ b/Parser/Gmsh.tab.hpp
@@ -300,7 +300,7 @@ typedef union YYSTYPE
   Shape s;
   List_T *l;
 }
-/* Line 1489 of yacc.c.  */
+/* Line 1529 of yacc.c.  */
 #line 305 "Gmsh.tab.hpp"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index a0a5430d8d2740cf2d7ed114a634ed42357333ee..742d061c5e8008ce9c2b2837c1b597fff1b8dd1a 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1895,7 +1895,7 @@ Command :
 	SleepInSeconds($2);
       }
       else if(!strcmp($1, "Remesh")){
-	Msg::Error("Surface remeshing must be reinterfaced");
+	yymsg(0, "Surface remeshing must be reinterfaced");
       }
       else if(!strcmp($1, "Mesh")){
 	int lock = CTX.threads_lock;
@@ -2654,6 +2654,16 @@ Coherence :
     { 
       ReplaceAllDuplicates();
     }
+  | tCoherence tSTRING tEND
+    { 
+      if(!strcmp($2, "Geometry"))
+        ReplaceAllDuplicates();
+      else if(!strcmp($2, "Mesh"))
+        GModel::current()->removeDuplicateMeshVertices(CTX.geom.tolerance);
+      else
+        yymsg(0, "Unknown coherence command");
+      Free($2);
+    }
 ;
 
 
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index aec9b517e3ddaf6149b9ccca9bf4929a1aadbf54..254930872ab9c0e5e569fcb2f248ab5058885038 100644
--- a/Parser/Gmsh.yy.cpp
+++ b/Parser/Gmsh.yy.cpp
@@ -6,29 +6,10 @@
 
 /* A lexical scanner generated by flex */
 
-#define yy_create_buffer gmsh_yy_create_buffer
-#define yy_delete_buffer gmsh_yy_delete_buffer
-#define yy_flex_debug gmsh_yy_flex_debug
-#define yy_init_buffer gmsh_yy_init_buffer
-#define yy_flush_buffer gmsh_yy_flush_buffer
-#define yy_load_buffer_state gmsh_yy_load_buffer_state
-#define yy_switch_to_buffer gmsh_yy_switch_to_buffer
-#define yyin gmsh_yyin
-#define yyleng gmsh_yyleng
-#define yylex gmsh_yylex
-#define yylineno gmsh_yylineno
-#define yyout gmsh_yyout
-#define yyrestart gmsh_yyrestart
-#define yytext gmsh_yytext
-#define yywrap gmsh_yywrap
-#define yyalloc gmsh_yyalloc
-#define yyrealloc gmsh_yyrealloc
-#define yyfree gmsh_yyfree
-
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
+#define YY_FLEX_SUBMINOR_VERSION 33
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -50,7 +31,7 @@
 
 /* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
 
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#if __STDC_VERSION__ >= 199901L
 
 /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
  * if you want the limit (max/min) macros for int types. 
@@ -113,12 +94,11 @@ typedef unsigned int flex_uint32_t;
 
 #else	/* ! __cplusplus */
 
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
+#if __STDC__
 
 #define YY_USE_CONST
 
-#endif	/* defined (__STDC__) */
+#endif	/* __STDC__ */
 #endif	/* ! __cplusplus */
 
 #ifdef YY_USE_CONST
@@ -198,9 +178,14 @@ extern FILE *gmsh_yyin, *gmsh_yyout;
 
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
 #ifndef YY_TYPEDEF_YY_SIZE_T
 #define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
+typedef unsigned int yy_size_t;
 #endif
 
 #ifndef YY_STRUCT_YY_BUFFER_STATE
@@ -888,7 +873,7 @@ void   skipline(void);
 #define YY_NO_UNISTD_H
 #endif
 
-#line 892 "Gmsh.yy.cpp"
+#line 877 "Gmsh.yy.cpp"
 
 #define INITIAL 0
 
@@ -906,35 +891,6 @@ void   skipline(void);
 
 static int yy_init_globals (void );
 
-/* Accessor methods to globals.
-   These are made visible to non-reentrant scanners for convenience. */
-
-int gmsh_yylex_destroy (void );
-
-int gmsh_yyget_debug (void );
-
-void gmsh_yyset_debug (int debug_flag  );
-
-YY_EXTRA_TYPE gmsh_yyget_extra (void );
-
-void gmsh_yyset_extra (YY_EXTRA_TYPE user_defined  );
-
-FILE *gmsh_yyget_in (void );
-
-void gmsh_yyset_in  (FILE * in_str  );
-
-FILE *gmsh_yyget_out (void );
-
-void gmsh_yyset_out  (FILE * out_str  );
-
-int gmsh_yyget_leng (void );
-
-char *gmsh_yyget_text (void );
-
-int gmsh_yyget_lineno (void );
-
-void gmsh_yyset_lineno (int line_number  );
-
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
  */
@@ -977,7 +933,7 @@ static int input (void );
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO fwrite( gmsh_yytext, gmsh_yyleng, 1, gmsh_yyout )
+#define ECHO (void) fwrite( gmsh_yytext, gmsh_yyleng, 1, gmsh_yyout )
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -988,7 +944,7 @@ static int input (void );
 	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
 		{ \
 		int c = '*'; \
-		int n; \
+		size_t n; \
 		for ( n = 0; n < max_size && \
 			     (c = getc( gmsh_yyin )) != EOF && c != '\n'; ++n ) \
 			buf[n] = (char) c; \
@@ -1073,7 +1029,7 @@ YY_DECL
 #line 49 "Gmsh.l"
 
 
-#line 1077 "Gmsh.yy.cpp"
+#line 1033 "Gmsh.yy.cpp"
 
 	if ( !(yy_init) )
 		{
@@ -1878,7 +1834,7 @@ YY_RULE_SETUP
 #line 221 "Gmsh.l"
 ECHO;
 	YY_BREAK
-#line 1882 "Gmsh.yy.cpp"
+#line 1838 "Gmsh.yy.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2109,7 +2065,7 @@ static int yy_get_next_buffer (void)
 
 		/* Read in more data. */
 		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), (size_t) num_to_read );
+			(yy_n_chars), num_to_read );
 
 		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
 		}
@@ -2133,14 +2089,6 @@ static int yy_get_next_buffer (void)
 	else
 		ret_val = EOB_ACT_CONTINUE_SCAN;
 
-	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
-		/* Extend the array by 50%, plus the number we really need. */
-		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
-		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) gmsh_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
-		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
-	}
-
 	(yy_n_chars) += number_to_move;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
@@ -2292,7 +2240,7 @@ static int yy_get_next_buffer (void)
 				case EOB_ACT_END_OF_FILE:
 					{
 					if ( gmsh_yywrap( ) )
-						return EOF;
+						return 0;
 
 					if ( ! (yy_did_buffer_switch_on_eof) )
 						YY_NEW_FILE;
@@ -2428,19 +2376,9 @@ static void gmsh_yy_load_buffer_state  (void)
 	gmsh_yyfree((void *) b  );
 }
 
-#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */
-#ifdef __cplusplus
-extern "C" {
-#endif
-#ifdef __THROW /* this is a gnuism */
-extern int isatty (int ) __THROW;
-#else
+#ifndef __cplusplus
 extern int isatty (int );
-#endif
-#ifdef __cplusplus
-}
-#endif
-#endif
+#endif /* __cplusplus */
     
 /* Initializes or reinitializes a buffer.
  * This function is sometimes called more than once on the same buffer,
@@ -2566,9 +2504,7 @@ static void gmsh_yyensure_buffer_stack (void)
 		(yy_buffer_stack) = (struct yy_buffer_state**)gmsh_yyalloc
 								(num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
-		if ( ! (yy_buffer_stack) )
-			YY_FATAL_ERROR( "out of dynamic memory in gmsh_yyensure_buffer_stack()" );
-								  
+		
 		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
 				
 		(yy_buffer_stack_max) = num_to_alloc;
@@ -2586,8 +2522,6 @@ static void gmsh_yyensure_buffer_stack (void)
 								((yy_buffer_stack),
 								num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
-		if ( ! (yy_buffer_stack) )
-			YY_FATAL_ERROR( "out of dynamic memory in gmsh_yyensure_buffer_stack()" );
 
 		/* zero only the new slots.*/
 		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -2632,7 +2566,7 @@ YY_BUFFER_STATE gmsh_yy_scan_buffer  (char * base, yy_size_t  size )
 
 /** Setup the input buffer state to scan a string. The next call to gmsh_yylex() will
  * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
+ * @param str a NUL-terminated string to scan
  * 
  * @return the newly allocated buffer state object.
  * @note If you want to scan bytes that may contain NUL values, then use
diff --git a/Plugin/Makefile b/Plugin/Makefile
index 38e21e1c5b7df26652efd10868f803611e0d8324..0b3f27f9ce928e24353f80a373540852971b2584 100644
--- a/Plugin/Makefile
+++ b/Plugin/Makefile
@@ -116,7 +116,7 @@ CutParametric.o: CutParametric.cpp ../Post/OctreePost.h \
   ../Post/PViewData.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
   ../Common/ListUtils.h ../Common/GmshMatrix.h ../Common/Context.h \
   ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h ../Common/GmshUI.h \
-  ../Graphics/Draw.h ../contrib/MathEval/matheval.h
+  ../Graphics/Draw.h
 Lambda2.o: Lambda2.cpp Lambda2.h Plugin.h ../Common/Options.h \
   ../Post/ColorTable.h ../Common/Message.h ../Post/PView.h \
   ../Geo/SPoint3.h ../Post/PViewDataList.h ../Post/PViewData.h \
@@ -210,7 +210,7 @@ Extract.o: Extract.cpp Extract.h Plugin.h ../Common/Options.h \
   ../Post/ColorTable.h ../Common/Message.h ../Post/PView.h \
   ../Geo/SPoint3.h ../Post/PViewDataList.h ../Post/PViewData.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/ListUtils.h \
-  ../Common/GmshMatrix.h ../contrib/MathEval/matheval.h
+  ../Common/GmshMatrix.h
 ExtractElements.o: ExtractElements.cpp ExtractElements.h Plugin.h \
   ../Common/Options.h ../Post/ColorTable.h ../Common/Message.h \
   ../Post/PView.h ../Geo/SPoint3.h ../Post/PViewDataList.h \
@@ -238,7 +238,7 @@ Evaluate.o: Evaluate.cpp Evaluate.h Plugin.h ../Common/Options.h \
   ../Geo/SPoint3.h ../Post/PViewDataList.h ../Post/PViewData.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/ListUtils.h \
   ../Common/GmshMatrix.h ../Post/OctreePost.h ../Common/Octree.h \
-  ../Common/OctreeInternals.h ../contrib/MathEval/matheval.h
+  ../Common/OctreeInternals.h
 FieldView.o: FieldView.cpp FieldView.h Plugin.h ../Common/Options.h \
   ../Post/ColorTable.h ../Common/Message.h ../Post/PView.h \
   ../Geo/SPoint3.h ../Post/PViewDataList.h ../Post/PViewData.h \
diff --git a/Plugin/PluginManager.h b/Plugin/PluginManager.h
index 47cd935a286722b27cd624c11c8d9b57511bb9f3..1633ba0b59775c83119c9627fa6c74a0b5e4e1b5 100644
--- a/Plugin/PluginManager.h
+++ b/Plugin/PluginManager.h
@@ -7,7 +7,9 @@
 #define _PLUGIN_MANAGER_H_
 
 #include <map>
-#include "Plugin.h"
+
+class GMSH_Plugin;
+class GMSH_Solve_Plugin;
 
 struct ltstrpg
 {
diff --git a/Post/Makefile b/Post/Makefile
index 3b5bf1c50c6639bcd60e0abe572c987aca8b80e8..721fe95c04aeae44d33f25797c5f2374474649e7 100644
--- a/Post/Makefile
+++ b/Post/Makefile
@@ -51,9 +51,16 @@ depend:
 # DO NOT DELETE THIS LINE
 PView.o: PView.cpp PView.h ../Geo/SPoint3.h PViewOptions.h ColorTable.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h PViewData.h PViewDataList.h \
-  ../Common/ListUtils.h ../Common/VertexArray.h ../Geo/SVector3.h \
-  ../Geo/SPoint3.h ../Common/SmoothData.h adaptiveData.h \
-  ../Common/GmshMatrix.h ../Common/Message.h
+  ../Common/ListUtils.h PViewDataGModel.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/GPoint.h ../Geo/SPoint2.h ../Geo/GEdge.h \
+  ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h ../Geo/SPoint3.h \
+  ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/GFace.h ../Geo/GEntity.h \
+  ../Geo/GPoint.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Common/VertexArray.h \
+  ../Common/SmoothData.h adaptiveData.h ../Common/GmshMatrix.h \
+  ../Common/Message.h
 PViewIO.o: PViewIO.cpp PView.h ../Geo/SPoint3.h PViewDataList.h \
   PViewData.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
   ../Common/ListUtils.h PViewDataGModel.h ../Geo/GModel.h \
@@ -93,8 +100,9 @@ PViewDataGModel.o: PViewDataGModel.cpp PViewDataGModel.h PViewData.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
-  ../Numeric/NumericEmbedded.h ../Common/Message.h
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Message.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h ../Numeric/Numeric.h \
+  ../Numeric/NumericEmbedded.h
 PViewDataGModelIO.o: PViewDataGModelIO.cpp ../Common/Message.h \
   PViewDataGModel.h PViewData.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
   ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
@@ -107,7 +115,8 @@ PViewDataGModelIO.o: PViewDataGModelIO.cpp ../Common/Message.h \
   ../Geo/SBoundingBox3d.h ../Geo/MVertex.h ../Geo/SPoint3.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/FunctionSpace.h \
+  ../Common/GmshMatrix.h ../Numeric/Numeric.h \
   ../Numeric/NumericEmbedded.h ../Common/StringUtils.h
 PViewOptions.o: PViewOptions.cpp PViewOptions.h ColorTable.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/Message.h
@@ -130,7 +139,8 @@ OctreePost.o: OctreePost.cpp ../Common/Octree.h \
   ../Numeric/NumericEmbedded.h ../Common/Message.h shapeFunctions.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Numeric/FunctionSpace.h ../Common/GmshMatrix.h
 ColorTable.o: ColorTable.cpp ../Common/Message.h ColorTable.h \
   ../Common/Context.h ../Geo/CGNSOptions.h ../Mesh/PartitionOptions.h \
   ../Numeric/Numeric.h ../Numeric/NumericEmbedded.h
diff --git a/Post/PView.cpp b/Post/PView.cpp
index e8d7181d625c76f8946627cbd4efbb4899f96fc2..973807209886f34c78b8810b9217ec0e1db1d4af 100644
--- a/Post/PView.cpp
+++ b/Post/PView.cpp
@@ -6,9 +6,9 @@
 #include <string.h>
 #include <algorithm>
 #include "PView.h"
-#include "PViewOptions.h"
-#include "PViewData.h"
 #include "PViewDataList.h"
+#include "PViewDataGModel.h"
+#include "PViewOptions.h"
 #include "VertexArray.h"
 #include "SmoothData.h"
 #include "adaptiveData.h"
@@ -59,7 +59,6 @@ PView::PView(std::string xname, std::string yname,
 {
   _init();
   PViewDataList *data = new PViewDataList(true);
-  _data = data;
   for(unsigned int i = 0; i < y.size(); i++){
     double d;
     if(x.size() == y.size()){
@@ -78,13 +77,35 @@ PView::PView(std::string xname, std::string yname,
   data->setName(yname);
   data->setFileName(yname + ".pos");
   data->finalize();
-
+  _data = data;
   _options = new PViewOptions(PViewOptions::reference);
   _options->Type = PViewOptions::Plot2DSpace;
   _options->Axes = 2;
   strcpy(_options->AxesLabel[0], xname.c_str());
 }
 
+PView::PView(std::string name, std::string type, 
+             GModel *model, std::map<int, std::vector<double> > &data,
+             double time)
+{
+  _init();
+  PViewDataGModel *d = new PViewDataGModel
+    ((type == "NodeData") ? PViewDataGModel::NodeData : PViewDataGModel::ElementData);
+  d->addData(model, data, 0, time, 1);
+  d->setName(name);
+  d->setFileName(name + ".msh");
+  _data = d;
+  _options = new PViewOptions(PViewOptions::reference);
+}
+
+void PView::addStep(GModel *model, std::map<int, std::vector<double> > &data, 
+                    double time)
+{
+  PViewDataGModel *d = dynamic_cast<PViewDataGModel*>(_data);
+  if(d) d->addData(model, data, d->getNumTimeSteps(), time, 1);
+  else Msg::Error("Cannot only  step data to model-based datasets");
+}
+
 PView::~PView()
 {
   deleteVertexArrays();
diff --git a/Post/PView.h b/Post/PView.h
index dafd43387c2a071727328a2eff85c12e4911dc59..04f340d4ebc7b450e0824b12eca19272cd801627 100644
--- a/Post/PView.h
+++ b/Post/PView.h
@@ -7,6 +7,7 @@
 #define _PVIEW_H_
 
 #include <vector>
+#include <map>
 #include <string>
 #include "SPoint3.h"
 
@@ -14,6 +15,7 @@ class PViewData;
 class PViewOptions;
 class VertexArray;
 class smooth_normals;
+class GModel;
 class GMSH_Post_Plugin;
 
 // A post-processing view.
@@ -47,6 +49,13 @@ class PView{
   // construct a new list-based view from a simple 2D dataset
   PView(std::string xname, std::string yname,
         std::vector<double> &x, std::vector<double> &y);
+  // construct a new model-based view from a bunch of data
+  PView(std::string name, std::string type, GModel *model,
+        std::map<int, std::vector<double> > &data, double time=0.);
+  // add a new time step to a given model-based view
+  void addStep(GModel *model, std::map<int, std::vector<double> > &data, 
+               double time=0.);
+
   // default destructor
   ~PView();
 
diff --git a/Post/PViewDataGModel.cpp b/Post/PViewDataGModel.cpp
index 9a602f727ade657e04d572ed1c532fa58dc05c3f..e57e1e5bc2d4a3cc50a19379c0e9e25f03bd3d52 100644
--- a/Post/PViewDataGModel.cpp
+++ b/Post/PViewDataGModel.cpp
@@ -259,9 +259,9 @@ int PViewDataGModel::getNode(int step, int ent, int ele, int nod,
 	vy[i] = e->getVertex(i)->y();
 	vz[i] = e->getVertex(i)->z();
       }
-      x = e->interpolate(vx, p[3 * nod], p[3 * nod + 1], p[3 * nod + 2]);
-      y = e->interpolate(vy, p[3 * nod], p[3 * nod + 1], p[3 * nod + 2]);
-      z = e->interpolate(vz, p[3 * nod], p[3 * nod + 1], p[3 * nod + 2]);
+      x = e->interpolate(vx, p[3 * nod], p[3 * nod + 1], p[3 * nod + 2], 1, 1);
+      y = e->interpolate(vy, p[3 * nod], p[3 * nod + 1], p[3 * nod + 2], 1, 1);
+      z = e->interpolate(vz, p[3 * nod], p[3 * nod + 1], p[3 * nod + 2], 1, 1);
     }
     return 0;
   }
diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h
index b9df6148bdbfdfbb0c292ceaa5a09457351d0e3e..3e5216ca183ec614cc9d9c706da289b6e66f55be 100644
--- a/Post/PViewDataGModel.h
+++ b/Post/PViewDataGModel.h
@@ -175,12 +175,11 @@ class PViewDataGModel : public PViewData {
   // get underlying model
   GModel* getModel(int step){ return _steps[step]->getModel(); }
 
-  // Add some data "on the fly" (data is stored by vertex: if a field
-  // has e.g. 3 components, nodalData contains 3 * N entries with N
-  // being the number of mesh vertices in the model ; nodalData [ iVer
-  // * N + jComp] is the jComp-th component at vertex iVer)
-  bool addNodalData(int step, double time, int partition, 
-		    int numComp, const std::vector<double> &nodalData);
+  // Add some data "on the fly" (data is stored in a map, indexed by
+  // node or element number depending on the type of dataset; all the
+  // vectors are supposed to have the same length)
+  bool addData(GModel *model, std::map<int, std::vector<double> > &data,
+               int step, double time, int partition);
 
   // I/O routines
   bool readMSH(std::string fileName, int fileIndex, FILE *fp, bool binary, 
diff --git a/Post/PViewDataGModelIO.cpp b/Post/PViewDataGModelIO.cpp
index cfebecdc7fbe6633a7100c0fbe0c78eee49e4460..4be0c13da70be37aaee6b49aaf380a91375d6533 100644
--- a/Post/PViewDataGModelIO.cpp
+++ b/Post/PViewDataGModelIO.cpp
@@ -10,27 +10,26 @@
 #include "Numeric.h"
 #include "StringUtils.h"
 
-bool PViewDataGModel::addNodalData(int step, double time, int partition, 
-                                   int numComp, const std::vector<double> &nodalData)
+bool PViewDataGModel::addData(GModel *model, std::map<int, std::vector<double> > &data,
+                              int step, double time, int partition)
 {
-  // add empty steps up to the actual step 
-  while(step >= (int)_steps.size())
-    _steps.push_back(new stepData<double>(GModel::current(), numComp));
+  if(data.empty()) return false;
   
-  int numEnt = _steps[step]->getModel()->getNumMeshVertices();
-  if((int)nodalData.size() != numEnt * numComp){
-    Msg::Error("adding nodal data with wrong number of entries (%d != %d)", 
-        nodalData.size(), numEnt);
-    return false;
-  }
+  int numComp = data.begin()->second.size();
+  while(step >= (int)_steps.size())
+    _steps.push_back(new stepData<double>(model, numComp));
   
   _steps[step]->setTime(time);
+  
+  int numEnt = (_type == NodeData) ? model->getNumMeshVertices() : 
+    model->getNumMeshElements();
   _steps[step]->resizeData(numEnt);
   
-  for(int i = 0; i < numEnt; i++){
-    double *d  = _steps[step]->getData(i, true);
+  for(std::map<int, std::vector<double> >::iterator it = data.begin(); 
+      it != data.end(); it++){
+    double *d  = _steps[step]->getData(it->first, true);
     for(int j = 0; j < numComp; j++)
-      d[j] = nodalData[i * numComp + j];
+      d[j] = it->second[j];
   }
   _partitions.insert(partition);
   finalize();
diff --git a/contrib/ANN/src/Makefile b/contrib/ANN/src/Makefile
index f4c3704b2fc6ecd2eb0b229c9226cc45cec47dfe..6e861fd79e255833951fafa48f843bca1bb36a91 100644
--- a/contrib/ANN/src/Makefile
+++ b/contrib/ANN/src/Makefile
@@ -52,3 +52,36 @@ depend:
 	rm -f Makefile.new
 
 # DO NOT DELETE THIS LINE
+ANN.o: ANN.cpp ../include/ANN/ANNx.h ../include/ANN/ANN.h \
+  ../include/ANN/ANNperf.h
+bd_fix_rad_search.o: bd_fix_rad_search.cpp bd_tree.h \
+  ../include/ANN/ANNx.h ../include/ANN/ANN.h kd_tree.h \
+  kd_fix_rad_search.h kd_util.h pr_queue_k.h ../include/ANN/ANNperf.h
+bd_pr_search.o: bd_pr_search.cpp bd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h kd_tree.h kd_pr_search.h kd_util.h pr_queue.h \
+  ../include/ANN/ANNperf.h pr_queue_k.h
+bd_search.o: bd_search.cpp bd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h kd_tree.h kd_search.h kd_util.h pr_queue_k.h \
+  ../include/ANN/ANNperf.h
+bd_tree.o: bd_tree.cpp bd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h kd_tree.h kd_util.h kd_split.h \
+  ../include/ANN/ANNperf.h
+brute.o: brute.cpp ../include/ANN/ANNx.h ../include/ANN/ANN.h \
+  pr_queue_k.h ../include/ANN/ANNperf.h
+kd_dump.o: kd_dump.cpp kd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h bd_tree.h
+kd_fix_rad_search.o: kd_fix_rad_search.cpp kd_fix_rad_search.h kd_tree.h \
+  ../include/ANN/ANNx.h ../include/ANN/ANN.h kd_util.h pr_queue_k.h \
+  ../include/ANN/ANNperf.h
+kd_pr_search.o: kd_pr_search.cpp kd_pr_search.h kd_tree.h \
+  ../include/ANN/ANNx.h ../include/ANN/ANN.h kd_util.h pr_queue.h \
+  ../include/ANN/ANNperf.h pr_queue_k.h
+kd_search.o: kd_search.cpp kd_search.h kd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h kd_util.h pr_queue_k.h ../include/ANN/ANNperf.h
+kd_split.o: kd_split.cpp kd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h kd_util.h kd_split.h
+kd_tree.o: kd_tree.cpp kd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h kd_split.h kd_util.h ../include/ANN/ANNperf.h
+kd_util.o: kd_util.cpp kd_util.h kd_tree.h ../include/ANN/ANNx.h \
+  ../include/ANN/ANN.h ../include/ANN/ANNperf.h
+perf.o: perf.cpp ../include/ANN/ANN.h ../include/ANN/ANNperf.h
diff --git a/doc/TODO.txt b/doc/TODO.txt
index 61da5b491dcdeedb87ffe6b6215c17dcd6d57e06..68fe2c0a6c5a4ce1e7cf2fe8fc9c1b22e665b8a2 100644
--- a/doc/TODO.txt
+++ b/doc/TODO.txt
@@ -1,4 +1,10 @@
-$Id: TODO.txt,v 1.7 2008-10-05 12:06:58 geuzaine Exp $
+$Id: TODO.txt,v 1.8 2008-10-12 14:57:58 geuzaine Exp $
+
+********************************************************************
+
+Read all the components from postpro datasets, even if > 9. Provide a
+"interpretation" option allowing to select which components to draw
+and to force their interpretation as scalar, vector or tensor
 
 ********************************************************************
 
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index d510d6f163b4d4878db383594dcbc4b6d1c33f2e..c2917192ad4d3c50e6520225f254add789ccb8fd 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -2114,6 +2114,9 @@ the volume that define the corners of the transfinite interpolation.
 Here is a list of all other mesh commands currently available:
 
 @ftable @code
+@item Coherence Mesh;
+Removes all duplicate mesh vertices.
+
 @item Color @var{color-expression} @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
 Sets the mesh color of the entities in @var{expression-list} to @var{color-expression}.