diff --git a/Common/Makefile b/Common/Makefile
index 4fae7e3e30b964ba60b9426308b6fbb53da4ab32..0047c00d092f3298471428470ffbbef3c932d8e4 100644
--- a/Common/Makefile
+++ b/Common/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.123 2007-02-02 23:50:33 geuzaine Exp $
+# $Id: Makefile,v 1.124 2007-02-26 08:25:36 geuzaine Exp $
 #
 # Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 #
@@ -38,7 +38,7 @@ SRC = Context.cpp\
       Visibility.cpp\
       Trackball.cpp\
       VertexArray.cpp\
-      SmoothNormals.cpp\
+      SmoothData.cpp\
       License.cpp
 
 OBJ = ${SRC:.cpp=.o}
@@ -68,33 +68,33 @@ Context.o: Context.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Numeric/Numeric.h Context.h \
   DefaultOptions.h GmshDefines.h Options.h Views.h ColorTable.h \
-  VertexArray.h SmoothNormals.h AdaptiveViews.h GmshMatrix.h Trackball.h
+  VertexArray.h SmoothData.h AdaptiveViews.h GmshMatrix.h Trackball.h
 AdaptiveViews.o: AdaptiveViews.cpp AdaptiveViews.h ../DataStr/List.h \
   GmshMatrix.h ../Plugin/Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h OS.h
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h OS.h
 Views.o: Views.cpp Gmsh.h Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../Numeric/Numeric.h Views.h ColorTable.h \
-  VertexArray.h SmoothNormals.h AdaptiveViews.h GmshMatrix.h Context.h \
+  VertexArray.h SmoothData.h AdaptiveViews.h GmshMatrix.h Context.h \
   Options.h
 ViewsIO.o: ViewsIO.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Numeric/Numeric.h Views.h \
-  ColorTable.h VertexArray.h SmoothNormals.h AdaptiveViews.h GmshMatrix.h \
+  ColorTable.h VertexArray.h SmoothData.h AdaptiveViews.h GmshMatrix.h \
   Context.h
 Octree.o: Octree.cpp Octree.h OctreeInternals.h
 OctreeInternals.o: OctreeInternals.cpp Message.h OctreeInternals.h
 OctreePost.o: OctreePost.cpp Octree.h OctreeInternals.h OctreePost.h \
-  ../DataStr/List.h Views.h ColorTable.h VertexArray.h SmoothNormals.h \
+  ../DataStr/List.h Views.h ColorTable.h VertexArray.h SmoothData.h \
   ../Numeric/Numeric.h AdaptiveViews.h GmshMatrix.h Message.h \
   ShapeFunctions.h
 Options.o: Options.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h GmshUI.h GmshDefines.h \
   ../Graphics/Draw.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Mesh/Generator.h \
   Context.h Options.h ../Mesh/BackgroundMesh.h ../Plugin/PluginManager.h \
   ../Plugin/Plugin.h ../Common/Options.h ../Common/Message.h \
@@ -108,8 +108,8 @@ CommandLine.o: CommandLine.cpp Gmsh.h Message.h ../DataStr/Malloc.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 \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h Views.h ColorTable.h \
-  VertexArray.h SmoothNormals.h AdaptiveViews.h GmshMatrix.h \
+  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h Views.h \
+  ColorTable.h VertexArray.h SmoothData.h AdaptiveViews.h GmshMatrix.h \
   ../Parser/OpenFile.h ../Parser/CreateFile.h ../Parser/Parser.h \
   ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/MVertex.h \
@@ -122,7 +122,7 @@ CommandLine.o: CommandLine.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
   ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
   ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/SBoundingBox3d.h ../Common/SmoothNormals.h OS.h
+  ../Geo/SBoundingBox3d.h OS.h
 OS.o: OS.cpp Message.h
 ColorTable.o: ColorTable.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
@@ -137,20 +137,20 @@ Visibility.o: Visibility.cpp Visibility.h GmshDefines.h ../Geo/GVertex.h \
   ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEdge.h ../Geo/GFace.h \
-  ../Geo/GRegion.h ../Geo/SBoundingBox3d.h ../Common/SmoothNormals.h \
-  ../Parser/Parser.h ../DataStr/Tree.h ../DataStr/avl.h
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Geo/GFace.h \
+  ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
+  ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h \
+  ../Geo/SBoundingBox3d.h ../Parser/Parser.h ../DataStr/Tree.h \
+  ../DataStr/avl.h
 Trackball.o: Trackball.cpp Trackball.h
 VertexArray.o: VertexArray.cpp VertexArray.h Context.h ../DataStr/List.h \
   ../Numeric/Numeric.h
-SmoothNormals.o: SmoothNormals.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
+SmoothData.o: SmoothData.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
-  ../DataStr/List.h ../DataStr/Tree.h ../Numeric/Numeric.h \
-  SmoothNormals.h
+  ../DataStr/List.h ../DataStr/Tree.h ../Numeric/Numeric.h SmoothData.h
 License.o: License.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h
diff --git a/Common/SmoothNormals.cpp b/Common/SmoothData.cpp
similarity index 60%
rename from Common/SmoothNormals.cpp
rename to Common/SmoothData.cpp
index 987c8f472e09a67252af26fb45a464b4b7f8febd..3d9111532cd0eb9c9703f24ec87c5b438a22371e 100644
--- a/Common/SmoothNormals.cpp
+++ b/Common/SmoothData.cpp
@@ -1,4 +1,4 @@
-// $Id: SmoothNormals.cpp,v 1.8 2006-11-27 22:22:08 geuzaine Exp $
+// $Id: SmoothData.cpp,v 1.1 2007-02-26 08:25:36 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -21,7 +21,89 @@
 
 #include "Gmsh.h"
 #include "Numeric.h"
-#include "SmoothNormals.h"
+#include "SmoothData.h"
+
+// Basic coordinate-based floting point value averager
+
+double xyzv::eps = 1.e-12;
+
+xyzv::xyzv(const xyzv &other)
+{ 
+  x = other.x;
+  y = other.y;
+  z = other.z;
+  nbvals = other.nbvals;
+  nboccurences = other.nboccurences;
+  if(other.vals && other.nbvals) {
+    vals = new double[other.nbvals];
+    for(int i = 0; i < nbvals; i++)
+      vals[i] = other.vals[i];
+  }
+}
+
+xyzv &xyzv::operator = (const xyzv &other)
+{
+  if(this != &other) {
+    x = other.x;
+    y = other.y;
+    z = other.z;
+    nbvals = other.nbvals;
+    nboccurences = other.nboccurences;
+    if(other.vals && other.nbvals) {
+      vals = new double[other.nbvals];
+      for(int i = 0; i < nbvals; i++)
+	vals[i] = other.vals[i];
+    }
+  }
+  return *this;
+}
+
+void xyzv::update(int n, double *v) 
+{
+  if(!vals) {
+    vals = new double[n];
+    for(int i = 0; i < n; i++)
+      vals[i] = 0.0;
+    nbvals = n;
+    nboccurences = 0;
+  }
+  else if(nbvals != n) {
+    throw n;
+  }
+  double x1 = (double)(nboccurences) / (double)(nboccurences + 1);
+  double x2 = 1. / (double)(nboccurences + 1);
+  for(int i = 0; i < nbvals; i++)
+    vals[i] = (x1 * vals[i] + x2 * v[i]);
+  nboccurences++;
+}
+
+void smooth_data::add(double x, double y, double z, int n, double *vals)
+{
+  xyzv xyz(x, y, z);
+  std::set<xyzv, lessthanxyzv>::const_iterator it = c.find(xyz);
+  if(it == c.end()) {
+    xyz.update(n, vals);
+    c.insert(xyz);
+  }
+  else {
+    // we can do this because we know that it will not destroy the set
+    // ordering
+    xyzv *p = (xyzv *) & (*it);
+    p->update(n, vals);
+  }
+}
+
+bool smooth_data::get(double x, double y, double z, int n, double *vals)
+{
+  std::set<xyzv, lessthanxyzv>::const_iterator it = c.find(xyzv(x, y, z));
+  if(it == c.end())
+    return false;
+  for(int k = 0; k < n; k++)
+    vals[k] = (*it).vals[k];
+  return true;
+}
+
+// Normal smoother
 
 float xyzn::eps = 1.e-6;
 
@@ -81,19 +163,16 @@ void smooth_normals::add(double x, double y, double z,
 			 double nx, double ny, double nz)
 {
   xyzn xyz(x, y, z);
-
   std::set<xyzn, lessthanxyzn>::const_iterator it = c.find(xyz);
   if(it == c.end()) {
-    xyz.update(float2char(nx), 
-	       float2char(ny), 
-	       float2char(nz), tol);
+    xyz.update(float2char(nx), float2char(ny), float2char(nz), tol);
     c.insert(xyz);
   }
   else {
+    // we can do this because we know that it will not destroy the set
+    // ordering
     xyzn *p = (xyzn *) & (*it);
-    p->update(float2char(nx), 
-	      float2char(ny), 
-	      float2char(nz), tol);
+    p->update(float2char(nx), float2char(ny), float2char(nz), tol);
   }    
 }
 
diff --git a/Common/SmoothNormals.h b/Common/SmoothData.h
similarity index 58%
rename from Common/SmoothNormals.h
rename to Common/SmoothData.h
index 671c0148e04022ba41e701013e395f4bf3315ec2..446eff2c794694367f698b2f947bb78536f10f93 100644
--- a/Common/SmoothNormals.h
+++ b/Common/SmoothData.h
@@ -1,5 +1,5 @@
-#ifndef _SMOOTH_NORMALS_H_
-#define _SMOOTH_NORMALS_H_
+#ifndef _SMOOTH_DATA_H_
+#define _SMOOTH_DATA_H_
 
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -24,6 +24,52 @@
 #include <vector>
 #include "Numeric.h"
 
+// Basic coordinate-based floating point data averager
+
+struct xyzv {
+  double x, y, z, *vals;
+  int nbvals;
+  int nboccurences;
+  static double eps;
+  xyzv(double xx, double yy, double zz)
+    : x(xx), y(yy), z(zz), vals(0), nbvals(0), nboccurences(0) {}
+  ~xyzv(){ if(vals) delete [] vals; }
+  // these are needed for set<> operations since the default copy
+  // constructor won't allocate *vals
+  xyzv(const xyzv & other);
+  xyzv & operator = (const xyzv &other);
+  void update(int n, double *v);
+};
+
+struct lessthanxyzv {
+  bool operator () (const xyzv &p2, const xyzv &p1) const
+  {
+    if(p1.x - p2.x > xyzv::eps)
+      return true;
+    if(p1.x - p2.x < -xyzv::eps)
+      return false;
+    if(p1.y - p2.y > xyzv::eps)
+      return true;
+    if(p1.y - p2.y < -xyzv::eps)
+      return false;
+    if(p1.z - p2.z > xyzv::eps)
+      return true;
+    return false;
+  }
+};
+
+class smooth_data{
+ private:
+  std::set<xyzv, lessthanxyzv> c;  
+ public:
+  smooth_data() {}
+  void add(double x, double y, double z, int n, double *vals);
+  bool get(double x, double y, double z, int n, double *vals);
+};
+
+// Normal smoother with threshold (saves memory by storing normals as
+// chars and coordinates as floats)
+
 struct nnb
 {
   char nx, ny, nz;
@@ -43,7 +89,7 @@ struct xyzn
 
 struct lessthanxyzn
 {
-  bool operator () (const xyzn & p2, const xyzn & p1)const
+  bool operator () (const xyzn &p2, const xyzn &p1) const
   {
     if(p1.x - p2.x > xyzn::eps)
       return true;
diff --git a/Common/Views.cpp b/Common/Views.cpp
index 2aae9d5448c8b1f4a70c8824d1e9a414eed7e17e..9eb9ec1b3b7434005574bc1071f13c49527e47fe 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.193 2007-01-28 13:56:19 geuzaine Exp $
+// $Id: Views.cpp,v 1.194 2007-02-26 08:25:36 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -29,7 +29,7 @@
 #include "Context.h"
 #include "Options.h"
 #include "ColorTable.h"
-#include "SmoothNormals.h"
+#include "SmoothData.h"
 
 #if defined(HAVE_MATH_EVAL)
 #include "matheval.h"
@@ -926,126 +926,35 @@ void Post_View::splitCurvedElements()
 
 // Smoothing
 
-struct xyzv {
-  double x, y, z, *vals;
-  int nbvals;
-  int nboccurences;
-  static double eps;
-  xyzv(double xx, double yy, double zz)
-    : x(xx), y(yy), z(zz), vals(0), nbvals(0), nboccurences(0) {}
-  ~xyzv(){ if(vals) delete [] vals; }
-  // the following two are needed for set<> operations, since the
-  // default copy ctor won't allocate *vals
-  xyzv(const xyzv & other)
-  { 
-    x = other.x;
-    y = other.y;
-    z = other.z;
-    nbvals = other.nbvals;
-    nboccurences = other.nboccurences;
-    if(other.vals && other.nbvals) {
-      vals = new double[other.nbvals];
-      for(int i = 0; i < nbvals; i++)
-	vals[i] = other.vals[i];
-    }
-  }
-  xyzv & operator =(const xyzv &other)
-  {
-    if(this != &other) {
-      x = other.x;
-      y = other.y;
-      z = other.z;
-      nbvals = other.nbvals;
-      nboccurences = other.nboccurences;
-      if(other.vals && other.nbvals) {
-	vals = new double[other.nbvals];
-	for(int i = 0; i < nbvals; i++)
-	  vals[i] = other.vals[i];
-      }
-    }
-    return *this;
-  }
-  void update(int n, double *v) 
-  {
-    if(!vals) {
-      vals = new double[n];
-      for(int i = 0; i < n; i++)
-	vals[i] = 0.0;
-      nbvals = n;
-      nboccurences = 0;
-    }
-    else if(nbvals != n) {
-      throw n;
-    }
-    double x1 = (double)(nboccurences) / (double)(nboccurences + 1);
-    double x2 = 1. / (double)(nboccurences + 1);
-    for(int i = 0; i < nbvals; i++)
-      vals[i] = (x1 * vals[i] + x2 * v[i]);
-    nboccurences++;
-  }
-};
-
-struct lessthanxyzv {
-  bool operator () (const xyzv & p2, const xyzv & p1)const
-  {
-    if(p1.x - p2.x > xyzv::eps)
-      return true;
-    if(p1.x - p2.x < -xyzv::eps)
-      return false;
-    if(p1.y - p2.y > xyzv::eps)
-      return true;
-    if(p1.y - p2.y < -xyzv::eps)
-      return false;
-    if(p1.z - p2.z > xyzv::eps)
-      return true;
-    return false;
-  }
-};
-
-double xyzv::eps = 1.e-12;
-typedef std::set < xyzv, lessthanxyzv > xyzv_cont;
-typedef xyzv_cont::const_iterator xyzv_iter;
-
-void generate_connectivities(List_T * list, int nbList, int nbTimeStep, int nbVert,
-                             xyzv_cont & connectivities)
+void generate_connectivities(List_T *list, int nbList, 
+			     int nbTimeStep, int nbVert, smooth_data &data)
 {
   if(!nbList) return;
 
   double *vals = new double[nbTimeStep];
-  int nb = List_Nbr(list)/nbList;
+  int nb = List_Nbr(list) / nbList;
   for(int i = 0; i < List_Nbr(list); i += nb) {
     double *x = (double *)List_Pointer_Fast(list, i);
     double *y = (double *)List_Pointer_Fast(list, i + nbVert);
     double *z = (double *)List_Pointer_Fast(list, i + 2 * nbVert);
     double *v = (double *)List_Pointer_Fast(list, i + 3 * nbVert);
-
     for(int j = 0; j < nbVert; j++) {
       for(int k = 0; k < nbTimeStep; k++)
         vals[k] = v[j + k * nbVert];
-      xyzv xyz(x[j], y[j], z[j]);
-      xyzv_iter it = connectivities.find(xyz);
-      if(it == connectivities.end()) {
-        xyz.update(nbTimeStep, vals);
-        connectivities.insert(xyz);
-      }
-      else {
-        // a little weird ... because we know that this will not
-        // destroy the set ordering
-        xyzv *xx = (xyzv *) & (*it);
-        xx->update(nbTimeStep, vals);
-      }
+      data.add(x[j], y[j], z[j], nbTimeStep, vals);
     }
   }
-  delete[]vals;
+  delete [] vals;
 }
 
-void smooth_list(List_T * list, int nbList,
+void smooth_list(List_T *list, int nbList,
 		 double *min, double *max, double *tsmin, double *tsmax, 
-                 int nbTimeStep, int nbVert, xyzv_cont & connectivities)
+                 int nbTimeStep, int nbVert, smooth_data &data)
 {
   if(!nbList)
     return;
 
+  double *vals = new double[nbTimeStep];
   int nb = List_Nbr(list)/nbList;
   for(int i = 0; i < List_Nbr(list); i += nb) {
     double *x = (double *)List_Pointer_Fast(list, i);
@@ -1053,33 +962,27 @@ void smooth_list(List_T * list, int nbList,
     double *z = (double *)List_Pointer_Fast(list, i + 2 * nbVert);
     double *v = (double *)List_Pointer_Fast(list, i + 3 * nbVert);
     for(int j = 0; j < nbVert; j++) {
-      xyzv xyz(x[j], y[j], z[j]);
-      xyzv_iter it = connectivities.find(xyz);
-      if(it != connectivities.end()) {
-        for(int k = 0; k < nbTimeStep; k++) {
-	  double dd = (*it).vals[k];
+      if(data.get(x[j], y[j], z[j], nbTimeStep, vals)){
+	for(int k = 0; k < nbTimeStep; k++) {
+	  double dd = vals[k];
           v[j + k * nbVert] = dd;
-          if(dd < *min)
-            *min = dd;
-          if(dd > *max)
-            *max = dd;
-	  if(dd < tsmin[k])
-	    tsmin[k] = dd;
-	  if(dd > tsmax[k])
-	    tsmax[k] = dd;
+          if(dd < *min) *min = dd;
+          if(dd > *max) *max = dd;
+	  if(dd < tsmin[k]) tsmin[k] = dd;
+	  if(dd > tsmax[k]) tsmax[k] = dd;
         }
       }
     }
   }
+  delete [] vals;
 }
 
 void Post_View::smooth()
 {
   double old_eps = xyzv::eps;
   xyzv::eps = CTX.lc * 1.e-8;
-
+  
   if(NbSL || NbST || NbSQ || NbSS || NbSH || NbSI || NbSY) {
-    xyzv_cont con;
     Msg(INFO, "Smoothing scalar primitives in View[%d]", Index);
     Min = VAL_INF;
     Max = -VAL_INF;
@@ -1087,20 +990,21 @@ void Post_View::smooth()
       TimeStepMin[k] = VAL_INF;
       TimeStepMax[k] = -VAL_INF;
     }
-    generate_connectivities(SL, NbSL, NbTimeStep, 2, con);
-    generate_connectivities(ST, NbST, NbTimeStep, 3, con);
-    generate_connectivities(SQ, NbSQ, NbTimeStep, 4, con);
-    generate_connectivities(SS, NbSS, NbTimeStep, 4, con);
-    generate_connectivities(SH, NbSH, NbTimeStep, 8, con);
-    generate_connectivities(SI, NbSI, NbTimeStep, 6, con);
-    generate_connectivities(SY, NbSY, NbTimeStep, 5, con);
-    smooth_list(SL, NbSL, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 2, con);
-    smooth_list(ST, NbST, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 3, con);
-    smooth_list(SQ, NbSQ, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 4, con);
-    smooth_list(SS, NbSS, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 4, con);
-    smooth_list(SH, NbSH, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 8, con);
-    smooth_list(SI, NbSI, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 6, con);
-    smooth_list(SY, NbSY, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 5, con);
+    smooth_data data;
+    generate_connectivities(SL, NbSL, NbTimeStep, 2, data);
+    generate_connectivities(ST, NbST, NbTimeStep, 3, data);
+    generate_connectivities(SQ, NbSQ, NbTimeStep, 4, data);
+    generate_connectivities(SS, NbSS, NbTimeStep, 4, data);
+    generate_connectivities(SH, NbSH, NbTimeStep, 8, data);
+    generate_connectivities(SI, NbSI, NbTimeStep, 6, data);
+    generate_connectivities(SY, NbSY, NbTimeStep, 5, data);
+    smooth_list(SL, NbSL, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 2, data);
+    smooth_list(ST, NbST, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 3, data);
+    smooth_list(SQ, NbSQ, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 4, data);
+    smooth_list(SS, NbSS, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 4, data);
+    smooth_list(SH, NbSH, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 8, data);
+    smooth_list(SI, NbSI, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 6, data);
+    smooth_list(SY, NbSY, &Min, &Max, TimeStepMin, TimeStepMax, NbTimeStep, 5, data);
     Changed = 1;
   }
 
diff --git a/Common/Views.h b/Common/Views.h
index 9d6a063e4fbcfd8da5b91bad150e9641bf37da1a..ab8fe517b9cbdc8990d664e74c36edaac844ba1e 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -24,7 +24,7 @@
 #include "ColorTable.h"
 #include "List.h"
 #include "VertexArray.h"
-#include "SmoothNormals.h"
+#include "SmoothData.h"
 #include "AdaptiveViews.h"
 
 #define VIEW_NB_ELEMENT_TYPES  (8*3)
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 97cdf592c0eb27d3f61981bc47b859504dad7ad4..8da066dec001a501de7957075559639d22ca59bc 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.514 2007-02-15 08:26:45 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.515 2007-02-26 08:25:37 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -3864,9 +3864,9 @@ void mesh_inspect_cb(CALLBACK_ARGS)
 void mesh_degree_cb(CALLBACK_ARGS)
 {
   if((long)data == 2)
-    Degre2(CTX.mesh.second_order_linear, CTX.mesh.second_order_incomplete);
+    Degre2(GMODEL, CTX.mesh.second_order_linear, CTX.mesh.second_order_incomplete);
   else
-    Degre1();
+    Degre1(GMODEL);
   CTX.mesh.changed = ENT_LINE | ENT_SURFACE | ENT_VOLUME;
   Draw();
   Msg(STATUS2N, " ");
diff --git a/Fltk/Makefile b/Fltk/Makefile
index c9f6b0604ae97e16b3b9e6ce530a86f33ac3d7a1..6eca5a2b38f001d96a72618f51645d3e18250fcc 100644
--- a/Fltk/Makefile
+++ b/Fltk/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.122 2007-02-15 08:26:45 geuzaine Exp $
+# $Id: Makefile,v 1.123 2007-02-26 08:25:37 geuzaine Exp $
 #
 # Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 #
@@ -71,10 +71,10 @@ Main.o: Main.cpp GUI.h Opengl_Window.h Colorbar_Window.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 \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Mesh/Generator.h \
-  ../Parser/CreateFile.h ../Graphics/Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Mesh/Generator.h ../Parser/CreateFile.h \
+  ../Graphics/Draw.h ../Common/Views.h ../Common/ColorTable.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
   ../Common/Options.h ../Parser/Parser.h ../Parser/OpenFile.h \
   ../Common/CommandLine.h Solvers.h ../Plugin/PluginManager.h \
@@ -101,11 +101,10 @@ GUI.o: GUI.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Common/GmshUI.h \
   ../Common/GmshDefines.h ../Numeric/Numeric.h ../Common/Context.h \
   ../Common/Options.h ../Graphics/Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h GUI.h Opengl_Window.h Colorbar_Window.h \
-  Popup_Button.h SpherePosition_Widget.h Callbacks.h Bitmaps.h \
-  Win32Icon.h ../Parser/OpenFile.h ../Common/CommandLine.h \
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h GUI.h Opengl_Window.h \
+  Colorbar_Window.h Popup_Button.h SpherePosition_Widget.h Callbacks.h \
+  Bitmaps.h Win32Icon.h ../Parser/OpenFile.h ../Common/CommandLine.h \
   ../Mesh/Generator.h Solvers.h ../Plugin/PluginManager.h \
   ../Plugin/Plugin.h Shortcut_Window.h
 GUI_Extras.o: GUI_Extras.cpp ../Common/Gmsh.h ../Common/Message.h \
@@ -114,9 +113,8 @@ GUI_Extras.o: GUI_Extras.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Common/GmshUI.h ../Common/GmshDefines.h File_Picker.h \
   Shortcut_Window.h ../Parser/CreateFile.h ../Common/Options.h \
   ../Common/Context.h ../Graphics/Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 GUI_Projection.o: GUI_Projection.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
@@ -128,16 +126,15 @@ GUI_Projection.o: GUI_Projection.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h \
   ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
   ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
-  ../Common/Context.h ../Geo/ExtrudeParams.h ../Geo/GFace.h \
-  ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
-  ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
-  ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Common/Context.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
+  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
+  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
+  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
   ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h ../Geo/projectionFace.h ../Geo/GFace.h \
-  ../Graphics/Draw.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Options.h \
-  Shortcut_Window.h
+  ../Geo/projectionFace.h ../Geo/GFace.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
+  ../Common/SmoothData.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  ../Common/Options.h Shortcut_Window.h
 Callbacks.o: Callbacks.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
@@ -145,35 +142,35 @@ Callbacks.o: Callbacks.cpp ../Common/Gmsh.h ../Common/Message.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 ../Geo/SPoint2.h \
-  ../Geo/ExtrudeParams.h ../Geo/GeoStringInterface.h ../Geo/Geo.h \
-  ../Geo/findLinks.h ../Mesh/Generator.h ../Mesh/SecondOrder.h \
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Numeric/Numeric.h \
+  ../Geo/GeoStringInterface.h ../Geo/Geo.h ../Geo/findLinks.h \
+  ../Mesh/Generator.h ../Mesh/SecondOrder.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/MVertex.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/SPoint2.h \
+  ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
+  ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
+  ../Geo/SVector3.h ../Common/Context.h ../Geo/ExtrudeParams.h \
+  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
+  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
+  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
   ../Graphics/Draw.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
-  ../Graphics/SelectBuffer.h ../Geo/GVertex.h ../Geo/GEntity.h \
-  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
-  ../Geo/MVertex.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/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h \
-  ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
-  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Context.h \
-  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Parser/CreateFile.h ../Parser/OpenFile.h ../Common/CommandLine.h \
-  ../Common/Options.h GUI.h Opengl_Window.h Colorbar_Window.h \
-  Popup_Button.h SpherePosition_Widget.h GUI_Extras.h Callbacks.h \
-  ../Plugin/Plugin.h ../Plugin/PluginManager.h ../Plugin/Plugin.h \
-  ../Common/Visibility.h ../Common/GmshDefines.h Solvers.h ../Common/OS.h \
-  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEdge.h ../Geo/GFace.h \
-  ../Geo/GRegion.h ../Geo/SBoundingBox3d.h
+  ../Graphics/SelectBuffer.h ../Parser/CreateFile.h ../Parser/OpenFile.h \
+  ../Common/CommandLine.h ../Common/Options.h GUI.h Opengl_Window.h \
+  Colorbar_Window.h Popup_Button.h SpherePosition_Widget.h GUI_Extras.h \
+  Callbacks.h ../Plugin/Plugin.h ../Plugin/PluginManager.h \
+  ../Plugin/Plugin.h ../Common/Visibility.h ../Common/GmshDefines.h \
+  Solvers.h ../Common/OS.h
 Opengl.o: Opengl.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/GmshUI.h ../Numeric/Numeric.h ../Common/Context.h \
   ../Graphics/Draw.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ../Graphics/SelectBuffer.h ../Geo/GVertex.h ../Geo/GEntity.h \
   ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
@@ -196,22 +193,23 @@ Opengl_Window.o: Opengl_Window.cpp ../Common/Gmsh.h ../Common/Message.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 \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Graphics/Draw.h \
-  ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h ../Graphics/SelectBuffer.h ../Geo/GVertex.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/MVertex.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/SPoint2.h \
-  ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h \
-  ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h \
-  ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
-  ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/MElement.h \
-  ../Geo/ExtrudeParams.h GUI.h Opengl_Window.h Colorbar_Window.h \
-  Popup_Button.h SpherePosition_Widget.h
+  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
+  ../Graphics/Draw.h ../Common/Views.h ../Common/ColorTable.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  ../Graphics/SelectBuffer.h ../Geo/GVertex.h ../Geo/GEntity.h \
+  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
+  ../Geo/MVertex.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/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h \
+  ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
+  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
+  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h GUI.h \
+  Opengl_Window.h Colorbar_Window.h Popup_Button.h \
+  SpherePosition_Widget.h
 Colorbar_Window.o: Colorbar_Window.cpp ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
@@ -224,6 +222,6 @@ Solvers.o: Solvers.cpp ../Common/Gmsh.h ../Common/Message.h \
   Solvers.h GmshServer.h ../Parser/OpenFile.h ../Common/GmshUI.h GUI.h \
   Opengl_Window.h Colorbar_Window.h ../Common/ColorTable.h Popup_Button.h \
   SpherePosition_Widget.h ../Graphics/Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  ../Common/Context.h
diff --git a/Geo/ExtrudeParams.cpp b/Geo/ExtrudeParams.cpp
index 543bd2916158301c1026d5ec868deeb7279b71b7..50c407b0f8ba680ef6f84814ef767f9755b36c73 100644
--- a/Geo/ExtrudeParams.cpp
+++ b/Geo/ExtrudeParams.cpp
@@ -1,4 +1,4 @@
-// $Id: ExtrudeParams.cpp,v 1.22 2006-11-27 22:22:11 geuzaine Exp $
+// $Id: ExtrudeParams.cpp,v 1.23 2007-02-26 08:25:38 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -23,6 +23,8 @@
 #include "Geo.h"
 #include "ExtrudeParams.h"
 
+smooth_data* ExtrudeParams::normals = 0;
+
 void Projette(double p[3], double mat[3][3])
 {
   double X, Y, Z;
@@ -79,6 +81,7 @@ void ExtrudeParams::Rotate(double matr[3][3])
 void ExtrudeParams::Extrude(double t, double &x, double &y, double &z)
 {
   double dx, dy, dz, angle;
+  double n[3] = {0., 0., 0.};
 
   switch (geo.Type) {
   case TRANSLATE:
@@ -107,6 +110,12 @@ void ExtrudeParams::Extrude(double t, double &x, double &y, double &z)
     y += dy;
     z += dz;
     break;
+  case BOUNDARY_LAYER:
+    if(normals) normals->get(x, y, z, 3, n);
+    x += n[0] * t;
+    y += n[1] * t;
+    z += n[2] * t;
+    break;
   default:
     Msg(GERROR, "Unknown extrusion type");
     break;
diff --git a/Geo/ExtrudeParams.h b/Geo/ExtrudeParams.h
index 89c2d28de452808c2574cf7811f0826c22f9dcc0..4d21190d5b261b13a90681c0596b91b6ae02f235 100644
--- a/Geo/ExtrudeParams.h
+++ b/Geo/ExtrudeParams.h
@@ -21,6 +21,7 @@
 // Please report all bugs and problems to <gmsh@geuz.org>.
 
 #include <vector>
+#include "SmoothData.h"
 
 // geo.Mode
 #define EXTRUDED_ENTITY 1
@@ -30,9 +31,11 @@
 #define TRANSLATE 1
 #define ROTATE 2
 #define TRANSLATE_ROTATE 3
+#define BOUNDARY_LAYER 4
 
 class ExtrudeParams{
 public :
+  static smooth_data *normals;
   ExtrudeParams(int Mode = EXTRUDED_ENTITY);
   void fill(int type,
 	    double T0, double T1, double T2,
diff --git a/Geo/GEntity.h b/Geo/GEntity.h
index 25e692e1edd5e972b17ddfc2e21c062ef49c0975..9dbf88b098414bc5c049b5f5592732aa4ab9a011 100644
--- a/Geo/GEntity.h
+++ b/Geo/GEntity.h
@@ -65,12 +65,14 @@ class GEntity {
   enum GeomType {
     Unknown,
     Point,
+    BoundaryLayerPoint,
     Line,
     Circle,
     Ellipse,
     BSpline,
     Bezier,
     ParametricCurve,
+    BoundaryLayerCurve,
     DiscreteCurve,
     Plane,
     Nurb,
@@ -82,6 +84,7 @@ class GEntity {
     ParametricSurface,
     ProjectionSurface,
     BSplineSurface,
+    BoundaryLayerSurface,
     DiscreteSurface,
     Volume,
     DiscreteVolume
@@ -93,12 +96,14 @@ class GEntity {
     char *name[] = {
       "Unknown",
       "Point",
+      "Boundary layer point",
       "Line",
       "Circle",
       "Ellipse",
       "BSpline",
       "Bezier",
       "Parametric curve",
+      "Boundary layer curve",
       "Discrete curve",
       "Plane",
       "Nurb",
@@ -110,6 +115,7 @@ class GEntity {
       "Parametric surface",
       "Projection surface",
       "BSpline surface",
+      "Boundary layer surface",
       "Discrete surface",
       "Volume",
       "Discrete volume"
@@ -172,6 +178,7 @@ class GEntity {
 
   // The tag of the entity
   int tag() const { return _tag; }
+  void setTag(int tag) { _tag = tag; }
 
   // The bounding box
   virtual SBoundingBox3d bounds() const { throw; }
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index cf916fe593df80c5e3408979576b93f1a4766c1e..c86cc02beaad857fd77a7b7d3877918ed5b38f63 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -1,4 +1,4 @@
-// $Id: GModel.cpp,v 1.33 2007-02-04 15:59:18 geuzaine Exp $
+// $Id: GModel.cpp,v 1.34 2007-02-26 08:25:38 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -286,15 +286,18 @@ SBoundingBox3d GModel::bounds()
   return bb;
 }
 
-int GModel::getMeshStatus()
+int GModel::getMeshStatus(bool countDiscrete)
 {
   for(riter it = firstRegion(); it != lastRegion(); ++it)
-    if((*it)->tetrahedra.size() ||(*it)->hexahedra.size() || 
-       (*it)->prisms.size() || (*it)->pyramids.size()) return 3;
+    if((countDiscrete || (*it)->geomType() != GEntity::DiscreteVolume) && 
+       ((*it)->tetrahedra.size() ||(*it)->hexahedra.size() || 
+	(*it)->prisms.size() || (*it)->pyramids.size())) return 3;
   for(fiter it = firstFace(); it != lastFace(); ++it)
-    if((*it)->triangles.size() || (*it)->quadrangles.size()) return 2;
+    if((countDiscrete || (*it)->geomType() != GEntity::DiscreteSurface) && 
+       ((*it)->triangles.size() || (*it)->quadrangles.size())) return 2;
   for(eiter it = firstEdge(); it != lastEdge(); ++it)
-    if((*it)->lines.size()) return 1;
+    if((countDiscrete || (*it)->geomType() != GEntity::DiscreteCurve) && 
+       (*it)->lines.size()) return 1;
   for(viter it = firstVertex(); it != lastVertex(); ++it)
     if((*it)->mesh_vertices.size()) return 0;
   return -1;
diff --git a/Geo/GModel.h b/Geo/GModel.h
index ac632e83ddfd672ed7b021a86fd6d93e2abb06bc..3cd1759f8ae8bbbd86195d6cffd811f3fe5c67e4 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -28,7 +28,7 @@
 #include "GFace.h"
 #include "GRegion.h"
 #include "SBoundingBox3d.h"
-#include "SmoothNormals.h"
+#include "SmoothData.h"
 
 // OCC Internals have to be stored in the model
 class OCC_Internals;
@@ -133,8 +133,8 @@ class GModel
   // The bounding box
   virtual SBoundingBox3d bounds();
 
-  // Returns the mesh status for the entire model.
-  virtual int getMeshStatus();
+  // Returns the mesh status for the entire model
+  virtual int getMeshStatus(bool countDiscrete=true);
 
   // Returns the total number of vertices in the mesh
   virtual int numVertices();
diff --git a/Geo/GModelIO_Fourier.cpp b/Geo/GModelIO_Fourier.cpp
index 26f720134a744533a8dccbb790431825ef7cd215..09922a9d2214f122d4993dd4b6ac9fa07be127e6 100644
--- a/Geo/GModelIO_Fourier.cpp
+++ b/Geo/GModelIO_Fourier.cpp
@@ -1,5 +1,6 @@
 #include "GModel.h"
 #include "fourierFace.h"
+#include "gmshFace.h"
 #include "Message.h"
 #include "Context.h"
 #include "Views.h"
@@ -115,12 +116,33 @@ public:
     }
     for(int i = 0; i < M - 1; i++){
       for(int j = 0; j < N - 1; j++){
+#if 0
 	MQuadrangle *q = new MQuadrangle(gf->mesh_vertices[i * N + j],
 					 gf->mesh_vertices[(i + 1) * N + j],
 					 gf->mesh_vertices[(i + 1) * N + (j + 1)],
 					 gf->mesh_vertices[i * N + (j + 1)]);
 	//if(FM->GetOrientation(gf->tag()) < 0) q->revert();
 	gf->quadrangles.push_back(q);
+#else
+	MVertex *v1 = gf->mesh_vertices[i * N + j];
+	MVertex *v2 = gf->mesh_vertices[(i + 1) * N + j];
+	MVertex *v3 = gf->mesh_vertices[(i + 1) * N + (j + 1)];
+	MVertex *v4 = gf->mesh_vertices[i * N + (j + 1)];
+
+	const double tol = 1.e-6;
+	//if(v1->distance(v2) > tol && v1->distance(v3) > tol && v2->distance(v3) > tol)
+	{
+	  MTriangle *t = new MTriangle(v1, v2, v3);
+	  t->revert();
+	  gf->triangles.push_back(t);
+	}
+	//if(v1->distance(v3) > tol && v1->distance(v4) > tol && v3->distance(v4) > tol)
+	{
+	  MTriangle *t = new MTriangle(v1, v3, v4);
+	  t->revert();
+	  gf->triangles.push_back(t);
+	}
+#endif
       }
     }
   }
@@ -815,6 +837,39 @@ SPoint2 fourierFace::parFromPoint(const SPoint3 &p) const
   return SPoint2(u, v);
 }
 
+void cleanUpAndMergeAllFaces(GModel *m)
+{
+  GFace *newgf = new gmshFace(m, 1);
+  std::set<MVertex*, MVertexLessThanLexicographic> pos;
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){
+    GFace *gf = *it;
+    pos.insert(gf->mesh_vertices.begin(), gf->mesh_vertices.end());
+    gf->mesh_vertices.clear();
+  }
+  std::set<MVertex*, MVertexLessThanLexicographic>::iterator itp;
+  for(itp = pos.begin(); itp != pos.end(); itp++)
+    newgf->mesh_vertices.push_back(*itp);
+
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){
+    GFace *gf = *it;
+    for(unsigned int i = 0; i < gf->triangles.size(); i++){
+      std::vector<MVertex*> v(3);
+      for(int j = 0; j < 3; j++){
+	itp = pos.find(gf->triangles[i]->getVertex(j));
+	if(itp == pos.end())
+	  Msg(GERROR, "Could not find vertex");
+	else
+	  v[j] = *itp;
+      }
+      delete gf->triangles[i];
+      if(v[0] != v[1] && v[0] != v[2] && v[1] != v[2])
+	newgf->triangles.push_back(new MTriangle(v));
+    }
+    m->remove(gf);
+  }
+  m->add(newgf);
+}
+
 int GModel::readFourier(const std::string &name)
 {
   FM = new model(name);
@@ -829,6 +884,8 @@ int GModel::readFourier(const std::string &name)
 
   // mesh each face with quads
   std::for_each(firstFace(), lastFace(), meshCartesian());
+  cleanUpAndMergeAllFaces(this);
+
   return 1;
 
   // mesh each face using the standard gmsh algorithms
diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
index f5e1fa08e7e550121c290ff988ff8c29750326d5..5815c9103b5898f78ce3781761472ab131d8f181 100644
--- a/Geo/Geo.cpp
+++ b/Geo/Geo.cpp
@@ -1,4 +1,4 @@
-// $Id: Geo.cpp,v 1.82 2007-02-21 08:17:16 geuzaine Exp $
+// $Id: Geo.cpp,v 1.83 2007-02-26 08:25:38 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -71,24 +71,18 @@ int compareVertex(const void *a, const void *b)
 
 int comparePosition(const void *a, const void *b)
 {
+  Vertex *q = *(Vertex **)a;
+  Vertex *w = *(Vertex **)b;
+
   // Warning: tolerance! (before 1.61, it was set to 1.e-10 * CTX.lc)
   double eps = CTX.geom.tolerance * CTX.lc; 
 
-  Vertex **q = (Vertex **) a;
-  Vertex **w = (Vertex **) b;
-
-  if((*q)->Pos.X - (*w)->Pos.X > eps)
-    return 1;
-  if((*q)->Pos.X - (*w)->Pos.X < -eps)
-    return -1;
-  if((*q)->Pos.Y - (*w)->Pos.Y > eps)
-    return 1;
-  if((*q)->Pos.Y - (*w)->Pos.Y < -eps)
-    return -1;
-  if((*q)->Pos.Z - (*w)->Pos.Z > eps)
-    return 1;
-  if((*q)->Pos.Z - (*w)->Pos.Z < -eps)
-    return -1;
+  if(q->Pos.X - w->Pos.X > eps) return 1;
+  if(q->Pos.X - w->Pos.X < -eps) return -1;
+  if(q->Pos.Y - w->Pos.Y > eps) return 1;
+  if(q->Pos.Y - w->Pos.Y < -eps) return -1;
+  if(q->Pos.Z - w->Pos.Z > eps) return 1;
+  if(q->Pos.Z - w->Pos.Z < -eps) return -1;
   return 0;
 }
 
@@ -465,7 +459,7 @@ void End_Surface(Surface * s)
 {
   // if all generatrices of a surface are on the same geometry, then
   // the surface is also on the geometry
-  if(s->Generatrices){
+  if(List_Nbr(s->Generatrices)){
     Curve *c;
     int NN = List_Nbr(s->Generatrices);
     List_Read (s->Generatrices, 0, &c);
@@ -1797,7 +1791,7 @@ void SymmetryShapes(double A, double B, double C, double D, List_T * ListShapes)
 
 // Extrusion routines
 
-void ProtudeXYZ(double &x, double &y, double &z, ExtrudeParams * e)
+void ProtudeXYZ(double &x, double &y, double &z, ExtrudeParams *e)
 {
   double matrix[4][4];
   double T[3];
@@ -1832,8 +1826,8 @@ int Extrude_ProtudePoint(int type, int ip,
 			 double T0, double T1, double T2,
 			 double A0, double A1, double A2,
 			 double X0, double X1, double X2, double alpha,
-			 Curve ** pc, Curve ** prc, int final, 
-			 ExtrudeParams * e)
+			 Curve **pc, Curve **prc, int final, 
+			 ExtrudeParams *e)
 {
   double matrix[4][4], T[3], Ax[3], d;
   Vertex V, *pv, *newp, *chapeau;
@@ -1851,7 +1845,6 @@ int Extrude_ProtudePoint(int type, int ip,
   chapeau = DuplicateVertex(pv);
 
   switch (type) {
-
   case TRANSLATE:
     T[0] = T0;
     T[1] = T1;
@@ -1859,7 +1852,6 @@ int Extrude_ProtudePoint(int type, int ip,
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToPoint(matrix, chapeau);
-
     if(!comparePosition(&pv, &chapeau))
       return pv->Num;
     c = Create_Curve(NEWLINE(), MSH_SEGM_LINE, 1, NULL, NULL, -1, -1, 0., 1.);
@@ -1868,13 +1860,24 @@ int Extrude_ProtudePoint(int type, int ip,
     c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha);
     if(e)
       c->Extrude->mesh = e->mesh;
-
     List_Add(c->Control_Points, &pv);
     List_Add(c->Control_Points, &chapeau);
     c->beg = pv;
     c->end = chapeau;
     break;
-
+  case BOUNDARY_LAYER:
+    chapeau->Typ = MSH_POINT_BND_LAYER;
+    c = Create_Curve(NEWLINE(), MSH_SEGM_BND_LAYER, 1, NULL, NULL, -1, -1, 0., 1.);
+    c->Control_Points = List_Create(2, 1, sizeof(Vertex *));
+    c->Extrude = new ExtrudeParams;
+    c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha);
+    if(e)
+      c->Extrude->mesh = e->mesh;
+    List_Add(c->Control_Points, &pv);
+    List_Add(c->Control_Points, &chapeau);
+    c->beg = pv;
+    c->end = chapeau;
+    break;
   case ROTATE:
     T[0] = -X0;
     T[1] = -X1;
@@ -1882,21 +1885,18 @@ int Extrude_ProtudePoint(int type, int ip,
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToPoint(matrix, chapeau);
-
     Ax[0] = A0;
     Ax[1] = A1;
     Ax[2] = A2;
     SetRotationMatrix(matrix, Ax, alpha);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToPoint(matrix, chapeau);
-
     T[0] = X0;
     T[1] = X1;
     T[2] = X2;
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToPoint(matrix, chapeau);
-
     if(!comparePosition(&pv, &chapeau))
       return pv->Num;
     c = Create_Curve(NEWLINE(), MSH_SEGM_CIRC, 1, NULL, NULL, -1, -1, 0., 1.);
@@ -1924,7 +1924,6 @@ int Extrude_ProtudePoint(int type, int ip,
     c->beg = pv;
     c->end = chapeau;
     break;
-
   case TRANSLATE_ROTATE:
     d = CTX.geom.extrude_spline_points;
     d = d ? d : 1;
@@ -1940,40 +1939,34 @@ int Extrude_ProtudePoint(int type, int ip,
     for(i = 0; i < CTX.geom.extrude_spline_points; i++) {
       if(i)
         chapeau = DuplicateVertex(chapeau);
-
       T[0] = -X0;
       T[1] = -X1;
       T[2] = -X2;
       SetTranslationMatrix(matrix, T);
       List_Reset(ListOfTransformedPoints);
       ApplyTransformationToPoint(matrix, chapeau);
-
       Ax[0] = A0;
       Ax[1] = A1;
       Ax[2] = A2;
       SetRotationMatrix(matrix, Ax, alpha / d);
       List_Reset(ListOfTransformedPoints);
       ApplyTransformationToPoint(matrix, chapeau);
-
       T[0] = X0;
       T[1] = X1;
       T[2] = X2;
       SetTranslationMatrix(matrix, T);
       List_Reset(ListOfTransformedPoints);
       ApplyTransformationToPoint(matrix, chapeau);
-
       T[0] = T0 / d;
       T[1] = T1 / d;
       T[2] = T2 / d;
       SetTranslationMatrix(matrix, T);
       List_Reset(ListOfTransformedPoints);
       ApplyTransformationToPoint(matrix, chapeau);
-
       List_Add(c->Control_Points, &chapeau);
     }
     c->end = chapeau;
     break;
-
   default:
     Msg(GERROR, "Unknown extrusion type");
     return pv->Num;
@@ -2038,6 +2031,13 @@ int Extrude_ProtudeCurve(int type, int ic,
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToCurve(matrix, chapeau);
     break;
+  case BOUNDARY_LAYER:
+    chapeau->Typ = MSH_SEGM_BND_LAYER;
+    if(chapeau->beg) chapeau->beg->Typ = MSH_POINT_BND_LAYER;
+    if(chapeau->end) chapeau->end->Typ = MSH_POINT_BND_LAYER;
+    revpc = FindCurve(-chapeau->Num);
+    if(revpc) revpc->Typ = MSH_SEGM_BND_LAYER;
+    break;
   case ROTATE:
     T[0] = -X0;
     T[1] = -X1;
@@ -2045,14 +2045,12 @@ int Extrude_ProtudeCurve(int type, int ic,
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToCurve(matrix, chapeau);
-
     Ax[0] = A0;
     Ax[1] = A1;
     Ax[2] = A2;
     SetRotationMatrix(matrix, Ax, alpha);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToCurve(matrix, chapeau);
-
     T[0] = X0;
     T[1] = X1;
     T[2] = X2;
@@ -2067,21 +2065,18 @@ int Extrude_ProtudeCurve(int type, int ic,
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToCurve(matrix, chapeau);
-
     Ax[0] = A0;
     Ax[1] = A1;
     Ax[2] = A2;
     SetRotationMatrix(matrix, Ax, alpha);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToCurve(matrix, chapeau);
-
     T[0] = X0;
     T[1] = X1;
     T[2] = X2;
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToCurve(matrix, chapeau);
-
     T[0] = T0;
     T[1] = T1;
     T[2] = T2;
@@ -2105,7 +2100,9 @@ int Extrude_ProtudeCurve(int type, int ic,
     return pc->Num;
   }
 
-  if(!CurveBeg || !CurveEnd)
+  if(type == BOUNDARY_LAYER)
+    s = Create_Surface(NEWSURFACE(), MSH_SURF_BND_LAYER);
+  else if(!CurveBeg || !CurveEnd)
     s = Create_Surface(NEWSURFACE(), MSH_SURF_TRIC);
   else
     s = Create_Surface(NEWSURFACE(), MSH_SURF_REGL);
@@ -2240,6 +2237,17 @@ int Extrude_ProtudeSurface(int type, int is,
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToSurface(matrix, chapeau);
     break;
+  case BOUNDARY_LAYER:
+    chapeau->Typ = MSH_SURF_BND_LAYER;
+    for(int i = 0; i < List_Nbr(chapeau->Generatrices); i++) {
+      List_Read(chapeau->Generatrices, i, &c);
+      c->Typ = MSH_SEGM_BND_LAYER;
+      c = FindCurve(-c->Num);
+      c->Typ = MSH_SEGM_BND_LAYER;
+      if(c->beg) c->beg->Typ = MSH_POINT_BND_LAYER;
+      if(c->end) c->end->Typ = MSH_POINT_BND_LAYER;
+    }
+    break;
   case ROTATE:
     T[0] = -X0;
     T[1] = -X1;
@@ -2247,14 +2255,12 @@ int Extrude_ProtudeSurface(int type, int is,
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToSurface(matrix, chapeau);
-
     Ax[0] = A0;
     Ax[1] = A1;
     Ax[2] = A2;
     SetRotationMatrix(matrix, Ax, alpha);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToSurface(matrix, chapeau);
-
     T[0] = X0;
     T[1] = X1;
     T[2] = X2;
@@ -2269,21 +2275,18 @@ int Extrude_ProtudeSurface(int type, int is,
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToSurface(matrix, chapeau);
-
     Ax[0] = A0;
     Ax[1] = A1;
     Ax[2] = A2;
     SetRotationMatrix(matrix, Ax, alpha);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToSurface(matrix, chapeau);
-
     T[0] = X0;
     T[1] = X1;
     T[2] = X2;
     SetTranslationMatrix(matrix, T);
     List_Reset(ListOfTransformedPoints);
     ApplyTransformationToSurface(matrix, chapeau);
-
     T[0] = T0;
     T[1] = T1;
     T[2] = T2;
@@ -2296,7 +2299,8 @@ int Extrude_ProtudeSurface(int type, int is,
     return ps->Num;
   }
 
-  // FIXME: why do we do this? only for backward compatibility?
+  // this is done only for backward compatibility with the old
+  // numbering scheme
   Tree_Suppress(THEM->Surfaces, &chapeau);
   chapeau->Num = NEWSURFACE();
   THEM->MaxSurfaceNum = chapeau->Num;
@@ -2393,6 +2397,7 @@ void ExtrudeShapes(int type, List_T *in,
     case MSH_SURF_REGL:
     case MSH_SURF_TRIC:
     case MSH_SURF_PLAN:
+    case MSH_SURF_DISCRETE:
       TheShape.Num = Extrude_ProtudeSurface(type, O.Num, T0, T1, T2,
 					    A0, A1, A2, X0, X1, X2, alpha,
 					    &pv, e);
@@ -2421,10 +2426,20 @@ void ExtrudeShapes(int type, List_T *in,
 
 // Duplicate removal
 
+int compareTwoPoints(const void *a, const void *b)
+{
+  Vertex *q = *(Vertex **)a;
+  Vertex *w = *(Vertex **)b;
+
+  if(q->Typ != w->Typ) return q->Typ - w->Typ;
+
+  return comparePosition(a, b);
+}
+
 int compareTwoCurves(const void *a, const void *b)
 {
-  Curve *c1 = *(Curve **) a;
-  Curve *c2 = *(Curve **) b;
+  Curve *c1 = *(Curve **)a;
+  Curve *c2 = *(Curve **)b;
   int comp;
 
   if(c1->Typ != c2->Typ){
@@ -2471,6 +2486,19 @@ int compareTwoSurfaces(const void *a, const void *b)
 {
   Surface *s1 = *(Surface **) a;
   Surface *s2 = *(Surface **) b;
+
+  // checking types is the "right thing" to do (see e.g. compareTwoCurves)
+  // but it would break backward compatibility (see e.g. tutorial/t2.geo),
+  // so let's just do it for boundary layer surfaces for now:
+  if(s1->Typ == MSH_SURF_BND_LAYER || s2->Typ == MSH_SURF_BND_LAYER){
+    if(s1->Typ != s2->Typ) return s1->Typ - s2->Typ;
+  }
+  
+  // if both surfaces have no generatrices, stay on the safe side and
+  // assume they are different
+  if(!List_Nbr(s1->Generatrices) && !List_Nbr(s2->Generatrices))
+    return 1;
+
   return compare2Lists(s1->Generatrices, s2->Generatrices, compareAbsCurve);
 }
 
@@ -2509,7 +2537,7 @@ void ReplaceDuplicatePoints()
   start = Tree_Nbr(THEM->Points);
 
   All = Tree2List(THEM->Points);
-  allNonDuplicatedPoints = Tree_Create(sizeof(Vertex *), comparePosition);
+  allNonDuplicatedPoints = Tree_Create(sizeof(Vertex *), compareTwoPoints);
   for(i = 0; i < List_Nbr(All); i++) {
     List_Read(All, i, &v);
     if(!Tree_Search(allNonDuplicatedPoints, &v)) {
diff --git a/Geo/Geo.h b/Geo/Geo.h
index 9ebe4417e24d6872609e6e41ad44f8ec85d036ee..75776b757dc1356eb9996ffbf077988080ee54c1 100644
--- a/Geo/Geo.h
+++ b/Geo/Geo.h
@@ -30,6 +30,7 @@
 #include "ExtrudeParams.h"
 
 #define MSH_POINT            1
+#define MSH_POINT_BND_LAYER  20
 #define MSH_POINT_DISCRETE   100
 
 #define MSH_SEGM_LINE        2
@@ -40,6 +41,7 @@
 #define MSH_SEGM_ELLI_INV    7
 #define MSH_SEGM_LOOP        8
 #define MSH_SEGM_BSPLN       15
+#define MSH_SEGM_BND_LAYER   16
 #define MSH_SEGM_NURBS       17
 #define MSH_SEGM_BEZIER      18
 #define MSH_SEGM_PARAMETRIC  19
@@ -48,6 +50,7 @@
 #define MSH_SURF_PLAN        9
 #define MSH_SURF_REGL        10
 #define MSH_SURF_TRIC        11
+#define MSH_SURF_BND_LAYER   12
 #define MSH_SURF_LOOP        13
 #define MSH_SURF_DISCRETE    102
 
@@ -68,19 +71,21 @@ struct Coord{
 
 class Vertex {
  public :
-  // a model vertex is usually defined in the euclidian coordinates.
-  // Yet, it can be defined in the parametric coordinates of a surface
-  // this data structure stores local coodinates of the vertex in the
-  // gmshSurface it belongs to.
-  gmshSurface *geometry;
-  SPoint2  pntOnGeometry;
   int Num;
+  int Typ;
   char Visible;
   double lc, u, w;
   Coord Pos;
+  // a model vertex is usually defined in the euclidian coordinates
+  // (Pos). Yet, it can also be defined in the parametric coordinates
+  // of a surface: pntOnGeometry stores the local coodinates of the
+  // vertex in the gmshSurface it belongs to.
+  gmshSurface *geometry;
+  SPoint2  pntOnGeometry;
   Vertex(double X=0., double Y=0., double Z=0., double l=1., double W=1.)
-    : geometry(0), Num(0), Visible(1), lc(l), u(0.), w(W)
+    : Num(0), Visible(1), lc(l), u(0.), w(W), geometry(0)
   {
+    Typ = MSH_POINT;
     Pos.X = X;
     Pos.Y = Y;
     Pos.Z = Z;
diff --git a/Geo/Makefile b/Geo/Makefile
index eda6a6bcb32148b057ae97fcfe619cbe4fcaebba..86fa7e75a98be45d46680db178721a2c0c2cc72f 100644
--- a/Geo/Makefile
+++ b/Geo/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.135 2007-02-15 08:26:45 geuzaine Exp $
+# $Id: Makefile,v 1.136 2007-02-26 08:25:38 geuzaine Exp $
 #
 # Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 #
@@ -74,191 +74,194 @@ GEntity.o: GEntity.cpp GEntity.h Range.h SPoint3.h SBoundingBox3d.h \
   ../Common/GmshDefines.h MRep.h GEdge.h GVertex.h MVertex.h GPoint.h \
   SPoint2.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/VertexArray.h ../Common/Message.h ../Common/OS.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h ../Common/VertexArray.h ../Common/Message.h ../Common/OS.h
 GVertex.o: GVertex.cpp GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GFace.h GEdgeLoop.h GEdge.h SVector3.h MElement.h MEdge.h \
   ../Common/Hash.h MFace.h ../Numeric/Numeric.h ../Common/Context.h \
-  ../DataStr/List.h ExtrudeParams.h Pair.h
+  ../DataStr/List.h ExtrudeParams.h ../Common/SmoothData.h Pair.h
 GEdge.o: GEdge.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h
 GEdgeLoop.o: GEdgeLoop.cpp GEdgeLoop.h GEdge.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h GVertex.h MVertex.h \
   GPoint.h SPoint2.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h ../Common/Message.h
 GFace.o: GFace.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h ../Common/Message.h
 GRegion.o: GRegion.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h
 gmshVertex.o: gmshVertex.cpp GFace.h GPoint.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h GEdgeLoop.h GEdge.h GVertex.h \
   MVertex.h SPoint2.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h Pair.h gmshVertex.h Geo.h gmshSurface.h \
-  ../DataStr/Tree.h ../DataStr/avl.h GeoInterpolation.h \
+  ExtrudeParams.h ../Common/SmoothData.h Pair.h gmshVertex.h Geo.h \
+  gmshSurface.h ../DataStr/Tree.h ../DataStr/avl.h GeoInterpolation.h \
   ../Common/Message.h
 gmshEdge.o: gmshEdge.cpp GFace.h GPoint.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h GEdgeLoop.h GEdge.h GVertex.h \
   MVertex.h SPoint2.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h Pair.h gmshEdge.h Geo.h gmshSurface.h ../DataStr/Tree.h \
-  ../DataStr/avl.h gmshVertex.h GeoInterpolation.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h Pair.h gmshEdge.h Geo.h \
+  gmshSurface.h ../DataStr/Tree.h ../DataStr/avl.h gmshVertex.h \
+  GeoInterpolation.h ../Common/Message.h
 gmshFace.o: gmshFace.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h gmshVertex.h Geo.h gmshSurface.h \
-  ../DataStr/Tree.h ../DataStr/avl.h gmshEdge.h gmshFace.h \
-  GeoInterpolation.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h gmshVertex.h Geo.h gmshSurface.h ../DataStr/Tree.h \
+  ../DataStr/avl.h gmshEdge.h gmshFace.h GeoInterpolation.h \
+  ../Common/Message.h
 gmshRegion.o: gmshRegion.cpp GModel.h GVertex.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h \
   SPoint2.h GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h gmshFace.h Geo.h gmshSurface.h \
-  ../DataStr/Tree.h ../DataStr/avl.h gmshVertex.h gmshRegion.h \
-  ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h gmshFace.h Geo.h gmshSurface.h ../DataStr/Tree.h \
+  ../DataStr/avl.h gmshVertex.h gmshRegion.h ../Common/Message.h
 gmshSurface.o: gmshSurface.cpp gmshSurface.h Pair.h Range.h SPoint2.h \
   SPoint3.h SVector3.h SBoundingBox3d.h ../Common/Message.h
 OCCVertex.o: OCCVertex.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h OCCVertex.h OCCIncludes.h OCCEdge.h OCCFace.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.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 ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h ../Common/Message.h OCCEdge.h OCCVertex.h \
-  OCCIncludes.h OCCFace.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h ../Common/Message.h OCCEdge.h OCCVertex.h OCCIncludes.h \
+  OCCFace.h
 OCCFace.o: OCCFace.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h OCCVertex.h OCCIncludes.h OCCEdge.h OCCFace.h \
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h OCCVertex.h OCCIncludes.h OCCEdge.h OCCFace.h \
   ../Common/Message.h
 OCCRegion.o: OCCRegion.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h OCCVertex.h OCCIncludes.h OCCEdge.h OCCFace.h \
-  OCCRegion.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h OCCVertex.h OCCIncludes.h OCCEdge.h OCCFace.h OCCRegion.h \
+  ../Common/Message.h
 projectionFace.o: projectionFace.cpp projectionFace.h GFace.h GPoint.h \
   GEntity.h Range.h SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h \
   GEdgeLoop.h GEdge.h GVertex.h MVertex.h SPoint2.h SVector3.h MElement.h \
   MEdge.h ../Common/Hash.h MFace.h ../Numeric/Numeric.h \
-  ../Common/Context.h ../DataStr/List.h ExtrudeParams.h Pair.h
+  ../Common/Context.h ../DataStr/List.h ExtrudeParams.h \
+  ../Common/SmoothData.h Pair.h
 GModel.o: GModel.cpp GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h \
   GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h MFace.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h gmshSurface.h ../Mesh/Attractors.h \
-  ../Geo/SPoint3.h ../Geo/Geo.h ../Geo/gmshSurface.h ../DataStr/Tree.h \
-  ../DataStr/avl.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h \
-  ../Common/Message.h ../Geo/GEdge.h MRep.h ../Common/VertexArray.h \
-  ../Common/OS.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h gmshSurface.h ../Mesh/Attractors.h ../Geo/SPoint3.h \
+  ../Geo/Geo.h ../Geo/gmshSurface.h ../DataStr/Tree.h ../DataStr/avl.h \
+  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/Message.h \
+  ../Geo/GEdge.h MRep.h ../Common/VertexArray.h ../Common/OS.h
 GModelIO_Geo.o: GModelIO_Geo.cpp GModel.h GVertex.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h \
   SPoint2.h GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h Geo.h gmshSurface.h ../DataStr/Tree.h \
-  ../DataStr/avl.h ../Parser/OpenFile.h ../DataStr/Tools.h \
-  ../DataStr/List.h ../DataStr/Tree.h ../Common/Message.h gmshVertex.h \
-  gmshFace.h gmshEdge.h gmshRegion.h ../Parser/Parser.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h Geo.h gmshSurface.h ../DataStr/Tree.h ../DataStr/avl.h \
+  ../Parser/OpenFile.h ../DataStr/Tools.h ../DataStr/List.h \
+  ../DataStr/Tree.h ../Common/Message.h gmshVertex.h gmshFace.h \
+  gmshEdge.h gmshRegion.h ../Parser/Parser.h
 GModelIO_Mesh.o: GModelIO_Mesh.cpp ../Common/Message.h \
   ../Common/GmshDefines.h GModel.h GVertex.h GEntity.h Range.h SPoint3.h \
   SBoundingBox3d.h MVertex.h GPoint.h SPoint2.h GEdge.h SVector3.h \
   MElement.h MEdge.h ../Common/Hash.h MFace.h ../Numeric/Numeric.h \
-  ../Common/Context.h ../DataStr/List.h ExtrudeParams.h GFace.h \
-  GEdgeLoop.h Pair.h GRegion.h ../Common/SmoothNormals.h gmshRegion.h \
-  Geo.h gmshSurface.h ../DataStr/Tree.h ../DataStr/avl.h gmshFace.h \
-  gmshVertex.h gmshEdge.h
+  ../Common/Context.h ../DataStr/List.h ExtrudeParams.h \
+  ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
+  gmshRegion.h Geo.h gmshSurface.h ../DataStr/Tree.h ../DataStr/avl.h \
+  gmshFace.h gmshVertex.h gmshEdge.h
 GModelIO_Fourier.o: GModelIO_Fourier.cpp GModel.h GVertex.h GEntity.h \
   Range.h SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h \
   GPoint.h SPoint2.h GEdge.h SVector3.h MElement.h MEdge.h \
   ../Common/Hash.h MFace.h ../Numeric/Numeric.h ../Common/Context.h \
-  ../DataStr/List.h ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h fourierFace.h ../Common/Message.h \
-  ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h
+  ../DataStr/List.h ExtrudeParams.h ../Common/SmoothData.h GFace.h \
+  GEdgeLoop.h Pair.h GRegion.h fourierFace.h gmshFace.h Geo.h \
+  gmshSurface.h ../DataStr/Tree.h ../DataStr/avl.h gmshVertex.h \
+  ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 GModelIO_OCC.o: GModelIO_OCC.cpp GModel.h GVertex.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h \
   SPoint2.h GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h ../Common/Message.h OCCIncludes.h OCCVertex.h \
-  OCCEdge.h OCCFace.h OCCRegion.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h ../Common/Message.h OCCIncludes.h OCCVertex.h OCCEdge.h \
+  OCCFace.h OCCRegion.h
 GModelIO_CGNS.o: GModelIO_CGNS.cpp GModel.h GVertex.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h \
   SPoint2.h GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h ../Common/Message.h MNeighbour.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h ../Common/Message.h MNeighbour.h
 GModelIO_MED.o: GModelIO_MED.cpp GModel.h GVertex.h GEntity.h Range.h \
   SPoint3.h SBoundingBox3d.h ../Common/GmshDefines.h MVertex.h GPoint.h \
   SPoint2.h GEdge.h SVector3.h MElement.h MEdge.h ../Common/Hash.h \
   MFace.h ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h GRegion.h \
-  ../Common/SmoothNormals.h GModelIO_MED.h ../Common/Message.h
+  ExtrudeParams.h ../Common/SmoothData.h GFace.h GEdgeLoop.h Pair.h \
+  GRegion.h GModelIO_MED.h ../Common/Message.h
 ExtrudeParams.o: ExtrudeParams.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   Geo.h ../Common/GmshDefines.h gmshSurface.h Pair.h Range.h SPoint2.h \
-  SPoint3.h SVector3.h SBoundingBox3d.h ExtrudeParams.h
+  SPoint3.h SVector3.h SBoundingBox3d.h ExtrudeParams.h \
+  ../Common/SmoothData.h ../Numeric/Numeric.h
 Geo.o: Geo.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Numeric/Numeric.h Geo.h \
   ../Common/GmshDefines.h gmshSurface.h Pair.h Range.h SPoint2.h \
-  SPoint3.h SVector3.h SBoundingBox3d.h ExtrudeParams.h GModel.h \
-  GVertex.h GEntity.h MVertex.h GPoint.h GEdge.h MElement.h MEdge.h \
-  ../Common/Hash.h MFace.h ../Common/Context.h GFace.h GEdgeLoop.h \
-  GRegion.h ../Common/SmoothNormals.h GeoInterpolation.h
+  SPoint3.h SVector3.h SBoundingBox3d.h ExtrudeParams.h \
+  ../Common/SmoothData.h GModel.h GVertex.h GEntity.h MVertex.h GPoint.h \
+  GEdge.h MElement.h MEdge.h ../Common/Hash.h MFace.h ../Common/Context.h \
+  GFace.h GEdgeLoop.h GRegion.h GeoInterpolation.h
 GeoStringInterface.o: GeoStringInterface.cpp ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../Numeric/Numeric.h Geo.h ../Common/GmshDefines.h \
   gmshSurface.h Pair.h Range.h SPoint2.h SPoint3.h SVector3.h \
-  SBoundingBox3d.h ExtrudeParams.h GeoStringInterface.h \
-  ../Parser/Parser.h ../Parser/OpenFile.h ../Common/Context.h GModel.h \
-  GVertex.h GEntity.h MVertex.h GPoint.h GEdge.h MElement.h MEdge.h \
-  ../Common/Hash.h MFace.h GFace.h GEdgeLoop.h GRegion.h \
-  ../Common/SmoothNormals.h
+  SBoundingBox3d.h ExtrudeParams.h ../Common/SmoothData.h \
+  GeoStringInterface.h ../Parser/Parser.h ../Parser/OpenFile.h \
+  ../Common/Context.h GModel.h GVertex.h GEntity.h MVertex.h GPoint.h \
+  GEdge.h MElement.h MEdge.h ../Common/Hash.h MFace.h GFace.h GEdgeLoop.h \
+  GRegion.h
 GeoInterpolation.o: GeoInterpolation.cpp ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h Geo.h ../Common/GmshDefines.h gmshSurface.h Pair.h \
   Range.h SPoint2.h SPoint3.h SVector3.h SBoundingBox3d.h ExtrudeParams.h \
-  GeoInterpolation.h GeoStringInterface.h ../Numeric/Numeric.h
+  ../Common/SmoothData.h ../Numeric/Numeric.h GeoInterpolation.h \
+  GeoStringInterface.h
 findLinks.o: findLinks.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   GModel.h GVertex.h GEntity.h Range.h SPoint3.h SBoundingBox3d.h \
   ../Common/GmshDefines.h MVertex.h GPoint.h SPoint2.h GEdge.h SVector3.h \
   MElement.h MEdge.h ../Common/Hash.h MFace.h ../Numeric/Numeric.h \
-  ../Common/Context.h ExtrudeParams.h GFace.h GEdgeLoop.h Pair.h \
-  GRegion.h ../Common/SmoothNormals.h
+  ../Common/Context.h ExtrudeParams.h ../Common/SmoothData.h GFace.h \
+  GEdgeLoop.h Pair.h GRegion.h
 MVertex.o: MVertex.cpp MVertex.h SPoint3.h
 MElement.o: MElement.cpp MElement.h ../Common/GmshDefines.h MVertex.h \
   SPoint3.h MEdge.h SVector3.h ../Common/Hash.h MFace.h \
diff --git a/Geo/gmshEdge.cpp b/Geo/gmshEdge.cpp
index a495b7566efa2941f2516af59470eb2ac059748f..b3475419dc21514f3fddc3562b26a7fe8844d3bd 100644
--- a/Geo/gmshEdge.cpp
+++ b/Geo/gmshEdge.cpp
@@ -1,4 +1,4 @@
-// $Id: gmshEdge.cpp,v 1.28 2007-02-03 00:02:16 geuzaine Exp $
+// $Id: gmshEdge.cpp,v 1.29 2007-02-26 08:25:38 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -112,6 +112,7 @@ GEntity::GeomType gmshEdge::geomType() const
   case MSH_SEGM_BEZIER: 
   case MSH_SEGM_NURBS:
   case MSH_SEGM_SPLN: return Nurb; 
+  case MSH_SEGM_BND_LAYER: return BoundaryLayerCurve; 
   case MSH_SEGM_DISCRETE: return DiscreteCurve; 
   default : return Unknown;
   }
diff --git a/Geo/gmshFace.cpp b/Geo/gmshFace.cpp
index d0b1fb074db9cd2b725cb938eab71b5b7049a8b6..b03c7b8132604b6a576ffaefeba12c611e70b382 100644
--- a/Geo/gmshFace.cpp
+++ b/Geo/gmshFace.cpp
@@ -1,4 +1,4 @@
-// $Id: gmshFace.cpp,v 1.38 2007-02-21 08:17:16 geuzaine Exp $
+// $Id: gmshFace.cpp,v 1.39 2007-02-26 08:25:38 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -230,6 +230,7 @@ GEntity::GeomType gmshFace::geomType() const
   case MSH_SURF_REGL:
   case MSH_SURF_TRIC: return RuledSurface;
   case MSH_SURF_DISCRETE: return DiscreteSurface;
+  case MSH_SURF_BND_LAYER: return BoundaryLayerSurface;
   default: return Unknown;
   }
 }
diff --git a/Geo/gmshVertex.cpp b/Geo/gmshVertex.cpp
index 76b39d67f84023e7937ee72e93e8c0119ae0cecc..5f137208bb9edee2eb40ecb09aa6a4dc88e4c42d 100644
--- a/Geo/gmshVertex.cpp
+++ b/Geo/gmshVertex.cpp
@@ -55,3 +55,11 @@ SPoint2 gmshVertex::reparamOnFace(GFace *face, int dir) const
     return GVertex::reparamOnFace(face,dir);
   }
 }
+
+GEntity::GeomType gmshVertex::geomType() const
+{
+  if(v && v->Typ == MSH_POINT_BND_LAYER)
+    return BoundaryLayerPoint;
+  else
+    return Point;
+}
diff --git a/Geo/gmshVertex.h b/Geo/gmshVertex.h
index 45e833e1faef1a3e11592807d16911ecc7deb62f..42ecd6d71538b84739b7ece615b0439dc526cc28 100644
--- a/Geo/gmshVertex.h
+++ b/Geo/gmshVertex.h
@@ -59,6 +59,7 @@ class gmshVertex : public GVertex {
   {
     return v ? v->Pos.Z : mesh_vertices.size() ? mesh_vertices[0]->z() : 0.;
   }
+  virtual GeomType geomType() const;
   ModelType getNativeType() const { return GmshModel; }
   void * getNativePtr() const { return v; }
   virtual void setPrescribedMeshSizeAtVertex(double l) 
diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp
index f61fe210018a86a2c46e19bda3c0d593581d7279..9af8287a10317241a9aee58a0d02960db980bdfd 100644
--- a/Graphics/Geom.cpp
+++ b/Graphics/Geom.cpp
@@ -1,4 +1,4 @@
-// $Id: Geom.cpp,v 1.129 2007-01-23 08:01:08 geuzaine Exp $
+// $Id: Geom.cpp,v 1.130 2007-02-26 08:25:38 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -35,6 +35,7 @@ class drawGVertex {
   void operator () (GVertex *v)
   {
     if(!v->getVisibility()) return;
+    if(v->geomType() == GEntity::BoundaryLayerPoint) return;
 
     if(CTX.render_mode == GMSH_SELECT) {
       glPushName(0);
@@ -98,8 +99,9 @@ class drawGEdge {
  public :
   void operator () (GEdge *e)
   {
-    if(!e->getVisibility() || e->geomType() == GEntity::DiscreteCurve)
-      return;
+    if(!e->getVisibility()) return;
+    if(e->geomType() == GEntity::DiscreteCurve) return;
+    if(e->geomType() == GEntity::BoundaryLayerCurve) return;
     
     if(CTX.render_mode == GMSH_SELECT) {
       glPushName(1);
@@ -383,8 +385,9 @@ class drawGFace {
 public :
   void operator () (GFace *f)
   {
-    if(!f->getVisibility() || f->geomType() == GEntity::DiscreteSurface)
-      return;
+    if(!f->getVisibility()) return;
+    if(f->geomType() == GEntity::DiscreteSurface) return;
+    if(f->geomType() == GEntity::BoundaryLayerSurface) return;
     
     if(CTX.render_mode == GMSH_SELECT) {
       glPushName(2);
@@ -422,8 +425,8 @@ class drawGRegion {
  public :
   void operator () (GRegion *r)
   {
-    if(!r->getVisibility() || r->geomType() == GEntity::DiscreteVolume)
-      return;
+    if(!r->getVisibility()) return;
+    if(r->geomType() == GEntity::DiscreteVolume) return;
     
     if(CTX.render_mode == GMSH_SELECT) {
       glPushName(3);
diff --git a/Graphics/Makefile b/Graphics/Makefile
index b9eb25515dd8cab06fa8bbdcb051ca17b9a308f0..dabd58a1f6166647a7989fd0a8db9f85dcc1e9a1 100644
--- a/Graphics/Makefile
+++ b/Graphics/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.110 2007-01-22 16:31:43 geuzaine Exp $
+# $Id: Makefile,v 1.111 2007-02-26 08:25:38 geuzaine Exp $
 #
 # Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 #
@@ -73,7 +73,7 @@ Draw.o: Draw.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Common/GmshUI.h \
   ../Common/GmshDefines.h Draw.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
   ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
@@ -98,30 +98,28 @@ Mesh.o: Mesh.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Numeric/Numeric.h ../Common/Context.h ../Geo/ExtrudeParams.h \
-  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
-  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
-  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h ../Geo/MRep.h ../Geo/GEdge.h ../Geo/GFace.h \
-  ../Geo/GRegion.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MElement.h \
-  ../Common/OS.h gl2ps.h
+  ../Common/SmoothData.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
+  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
+  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
+  ../Geo/SBoundingBox3d.h Draw.h ../Common/Views.h ../Common/ColorTable.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Geo/MRep.h \
+  ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h ../Geo/MVertex.h \
+  ../Geo/MEdge.h ../Geo/MElement.h ../Common/OS.h gl2ps.h
 Geom.o: Geom.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Common/GmshUI.h Draw.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
-  gl2ps.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h \
-  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
-  ../Geo/SPoint3.h ../Common/GmshDefines.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h \
-  ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
-  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h ../Common/Context.h gl2ps.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
+  ../Geo/MVertex.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/MElement.h \
+  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
   ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
   ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
@@ -131,105 +129,99 @@ Post.o: Post.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Common/GmshUI.h \
   ../Numeric/Numeric.h Draw.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
   gl2ps.h
 PostElement.o: PostElement.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/GmshUI.h Draw.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Iso.h \
   ../Common/Context.h
 SelectBuffer.o: SelectBuffer.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/GmshUI.h ../Common/GmshDefines.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
-  SelectBuffer.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Geo/MVertex.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/MElement.h \
-  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEdge.h ../Geo/GFace.h \
-  ../Geo/GRegion.h ../Geo/SBoundingBox3d.h ../Geo/MRep.h ../Geo/GEdge.h \
-  ../Geo/GFace.h ../Geo/GRegion.h ../Geo/MVertex.h ../Geo/MEdge.h \
-  ../Geo/MElement.h ../Common/OS.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  ../Common/Context.h SelectBuffer.h ../Geo/GVertex.h ../Geo/GEntity.h \
+  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
+  ../Geo/SPoint3.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
+  ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
+  ../Geo/SVector3.h ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h \
+  ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h \
+  ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
+  ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/MElement.h \
+  ../Geo/ExtrudeParams.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEdge.h \
+  ../Geo/GFace.h ../Geo/GRegion.h ../Geo/SBoundingBox3d.h ../Geo/MRep.h \
+  ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h ../Geo/MVertex.h \
+  ../Geo/MEdge.h ../Geo/MElement.h ../Common/OS.h
 Iso.o: Iso.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
   ../DataStr/List.h ../DataStr/Tree.h ../Common/GmshUI.h Draw.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h ../Common/Context.h
 Entity.o: Entity.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/GmshUI.h ../Numeric/Numeric.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h ../Common/Context.h gl2ps.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
+  gl2ps.h
 ReadImg.o: ReadImg.cpp ReadImg.h ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/GmshUI.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 Scale.o: Scale.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/GmshUI.h ../Numeric/Numeric.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h ../Common/Context.h gl2ps.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
+  gl2ps.h
 Graph2D.o: Graph2D.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/GmshUI.h ../Common/Context.h ../Numeric/Numeric.h Draw.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h gl2ps.h
+  ../Common/SmoothData.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  gl2ps.h
 gl2ps.o: gl2ps.cpp gl2ps.h
 gl2gif.o: gl2gif.cpp gl2gif.h PixelBuffer.h ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../Common/GmshUI.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 gl2jpeg.o: gl2jpeg.cpp gl2jpeg.h PixelBuffer.h ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../Common/GmshUI.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 gl2png.o: gl2png.cpp gl2png.h PixelBuffer.h ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../Common/GmshUI.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 gl2ppm.o: gl2ppm.cpp gl2ppm.h PixelBuffer.h ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../Common/GmshUI.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 gl2yuv.o: gl2yuv.cpp gl2yuv.h PixelBuffer.h ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../Common/GmshUI.h Draw.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 tc.o: tc.cpp tc.h
diff --git a/Mesh/BoundaryLayer.cpp b/Mesh/BoundaryLayer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9a0c2df98cb04c093bb5acc6c6163c69c7e3f8eb
--- /dev/null
+++ b/Mesh/BoundaryLayer.cpp
@@ -0,0 +1,128 @@
+// $Id: BoundaryLayer.cpp,v 1.1 2007-02-26 08:25:39 geuzaine Exp $
+//
+// Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+// 
+// Please report all bugs and problems to <gmsh@geuz.org>.
+
+#include "BoundaryLayer.h"
+#include "ExtrudeParams.h"
+#include "meshGEdge.h"
+#include "meshGFace.h"
+#include "Message.h"
+
+template<class T>
+static void addExtrudeNormals(std::vector<T*> &elements)
+{
+  for(unsigned int i = 0; i < elements.size(); i++){
+    MElement *ele = elements[i];
+    for(int j = 0; j < ele->getNumFaces(); j++){
+      MFace fac = ele->getFace(j);
+      SVector3 n = fac.normal();
+      if(n[0] || n[1] || n[2]){
+	double nn[3] = {n[0], n[1], n[2]};
+	for(int k = 0; k < fac.getNumVertices(); k++){
+	  MVertex *v = fac.getVertex(k);
+	  SPoint3 p(v->x(), v->y(), v->z());
+	  ExtrudeParams::normals->add(p[0], p[1], p[2], 3, nn);
+	}
+      }
+    }
+  }
+}
+  
+int MeshBoundaryLayerFaces(GModel *m)
+{
+  bool haveBoundaryLayers = false;
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){
+    GFace *gf = *it;
+    if(gf->geomType() == GEntity::BoundaryLayerSurface){
+      haveBoundaryLayers = true;
+      break;
+    }
+  }
+  if(!haveBoundaryLayers) return 0;
+
+  // make sure the surface mesh is oriented correctly (normally we do
+  // this only after the 3D mesh is done; but here it's critical since
+  // we use the normals for the extrusion)
+  std::for_each(m->firstFace(), m->lastFace(), orientMeshGFace());
+
+  // compute a smooth normal field on all the surfaces giving rise to
+  // boundary layers
+  if(ExtrudeParams::normals) delete ExtrudeParams::normals;
+  ExtrudeParams::normals = new smooth_data();
+  ExtrudeParams *myep = 0;
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){
+    GFace *gf = *it;
+    if(gf->geomType() == GEntity::BoundaryLayerSurface){
+      ExtrudeParams *ep = myep = gf->meshAttributes.extrude;
+      if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == COPIED_ENTITY){
+	GFace *from = gf->model()->faceByTag(std::abs(ep->geo.Source));
+	if(!from){
+	  Msg(GERROR, "Unknown source face %d for boundary layer", ep->geo.Source);
+	  continue;
+	}
+	addExtrudeNormals(from->triangles);
+	addExtrudeNormals(from->quadrangles);
+      }
+    }
+  }
+  if(!myep) return 0;
+
+  // set the position of bounding points (FIXME: should check
+  // coherence of all extrude parameters)
+  for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++){
+    GVertex *gv = *it;
+    if(gv->geomType() == GEntity::BoundaryLayerPoint){
+      double x = gv->x();
+      double y = gv->y();
+      double z = gv->z();
+      myep->Extrude(myep->mesh.NbLayer - 1, myep->mesh.NbElmLayer[myep->mesh.NbLayer - 1],
+		    x, y, z);
+      gv->mesh_vertices[0]->x() = x;
+      gv->mesh_vertices[0]->y() = y;
+      gv->mesh_vertices[0]->z() = z;
+    }
+  }
+  
+  // mesh the curves bounding the boundary layers by extrusion using
+  // the smooth normal field
+  for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++){
+    GEdge *ge = *it;
+    if(ge->geomType() == GEntity::BoundaryLayerCurve){
+      Msg(INFO, "Meshing curve %d", ge->tag());
+      deMeshGEdge dem;
+      dem(ge);
+      MeshExtrudedCurve(ge);
+    }
+  }
+
+  // mesh the surfaces bounding the boundary layers by extrusion using
+  // the smooth normal field
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){
+    GFace *gf = *it;
+    if(gf->geomType() == GEntity::BoundaryLayerSurface){
+      Msg(STATUS2, "Meshing surface %d (%s)", gf->tag(), gf->getTypeString().c_str());
+      deMeshGFace dem;
+      dem(gf);
+      MeshExtrudedSurface(gf);
+    }
+  }
+
+  return 1;
+}
diff --git a/Mesh/BoundaryLayer.h b/Mesh/BoundaryLayer.h
new file mode 100644
index 0000000000000000000000000000000000000000..e7cce6b78b3563c0b37fbce9b83e9c1b288a9cf6
--- /dev/null
+++ b/Mesh/BoundaryLayer.h
@@ -0,0 +1,27 @@
+#ifndef _BOUNDARY_LAYER_H_
+#define _BOUNDARY_LAYER_H_
+
+// Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+// 
+// Please report all bugs and problems to <gmsh@geuz.org>.
+
+#include "GModel.h"
+
+int MeshBoundaryLayerFaces(GModel *m);
+
+#endif
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index bab07cc3d1cae83f6e084886861c60f208867f19..a9b31287a7406b8f629492538c3c91b86021b2e8 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -1,4 +1,4 @@
-// $Id: Generator.cpp,v 1.114 2007-02-04 15:59:18 geuzaine Exp $
+// $Id: Generator.cpp,v 1.115 2007-02-26 08:25:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -29,6 +29,7 @@
 #include "meshGFace.h"
 #include "meshGRegion.h"
 #include "BackgroundMesh.h"
+#include "BoundaryLayer.h"
 #include "SecondOrder.h"
 
 extern Context_T CTX;
@@ -217,7 +218,12 @@ void Mesh2D()
   Msg(STATUS1, "Meshing 2D...");
   double t1 = Cpu();
 
-  std::for_each(GMODEL->firstFace(), GMODEL->lastFace(), meshGFace());
+  std::for_each(GMODEL->firstFace(), GMODEL->lastFace(), meshGFace());  
+
+  // boundary layers are special: their definition (including vertices
+  // and curve meshes) relies on the surface mesh--and it is global
+  // since we use a smooth normal field
+  MeshBoundaryLayerFaces(GMODEL);
 
   double t2 = Cpu();
   CTX.mesh_timer[1] = t2 - t1;
@@ -233,12 +239,15 @@ void Mesh3D()
 
   // mesh the extruded volumes first
   std::for_each(GMODEL->firstRegion(), GMODEL->lastRegion(), meshGRegionExtruded());
+
   // then subdivide if necessary (unfortunately the subdivision is a
   // global operation, which can require changing the surface mesh!)
   SubdivideExtrudedMesh(GMODEL);
+
   // then mesh all the non-delaunay regions
   std::vector<GRegion*> delaunay;
   std::for_each(GMODEL->firstRegion(), GMODEL->lastRegion(), meshGRegion(delaunay));
+
   // and finally mesh the delaunay regions (again, this is global)
   MeshDelaunayVolume(delaunay);
 
@@ -268,10 +277,10 @@ void GenerateMesh(int ask)
   }
   CTX.threads_lock = 1;
 
-  int old = GMODEL->getMeshStatus();
+  int old = GMODEL->getMeshStatus(false);
 
   // Change any high order elements back into first order ones
-  Degre1();
+  Degre1(GMODEL);
 
   // 1D mesh
   if(ask == 1 || (ask > 1 && old < 1)) {
@@ -294,14 +303,14 @@ void GenerateMesh(int ask)
   // Orient the surface mesh so that it matches the geometry
   if(GMODEL->getMeshStatus() >= 2)
     std::for_each(GMODEL->firstFace(), GMODEL->lastFace(), orientMeshGFace());
-
+  
   // Optimize quality
   if(GMODEL->getMeshStatus() == 3 && CTX.mesh.optimize)
     OptimizeMesh();
   
   // Create second order elements
   if(GMODEL->getMeshStatus() && CTX.mesh.order == 2) 
-    Degre2(CTX.mesh.second_order_linear, CTX.mesh.second_order_incomplete);
+    Degre2(GMODEL, CTX.mesh.second_order_linear, CTX.mesh.second_order_incomplete);
 
   Msg(INFO, "%d vertices %d elements", GMODEL->numVertices(), GMODEL->numElements());
 
diff --git a/Mesh/Makefile b/Mesh/Makefile
index 4a9d22c903cbfdd83d391cc471094a82eb1e9e2d..ca0239cdeb44da5ca90de717279f3e15d083b172 100644
--- a/Mesh/Makefile
+++ b/Mesh/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.163 2007-02-02 23:50:34 geuzaine Exp $
+# $Id: Makefile,v 1.164 2007-02-26 08:25:39 geuzaine Exp $
 #
 # Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 #
@@ -44,6 +44,7 @@ SRC = Generator.cpp \
         meshGRegionExtruded.cpp \
         DivideAndConquer.cpp \
         BackgroundMesh.cpp \
+        BoundaryLayer.cpp \
         BDS.cpp \
         SecondOrder.cpp
 
@@ -74,35 +75,35 @@ Generator.o: Generator.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Numeric/Numeric.h ../Common/Context.h ../Common/Views.h \
-  ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h ../Common/OS.h ../Geo/GModel.h ../Geo/GVertex.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
-  ../Geo/MVertex.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/MElement.h \
-  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/SBoundingBox3d.h meshGEdge.h meshGFace.h meshGRegion.h \
-  BackgroundMesh.h SecondOrder.h
+  ../Common/ColorTable.h ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/OS.h \
+  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
+  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
+  ../Common/GmshDefines.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \
+  ../Geo/MVertex.h ../Geo/SVector3.h ../Geo/ExtrudeParams.h \
+  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
+  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
+  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
+  meshGEdge.h meshGFace.h meshGRegion.h BackgroundMesh.h BoundaryLayer.h \
+  SecondOrder.h
 Attractors.o: Attractors.cpp Attractors.h ../Geo/SPoint3.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 \
   ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../Geo/SPoint2.h \
-  ../Geo/ExtrudeParams.h ../Common/Message.h ../Geo/GEdge.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/GVertex.h ../Geo/GEntity.h \
-  ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/GPoint.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint2.h ../Geo/MElement.h \
-  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Numeric/Numeric.h ../Common/Context.h ../Geo/ExtrudeParams.h \
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Numeric/Numeric.h \
+  ../Common/Message.h ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/Range.h \
+  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/GVertex.h \
+  ../Geo/GEntity.h ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/GPoint.h \
+  ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/SPoint3.h ../Geo/SPoint2.h \
+  ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
+  ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
+  ../Geo/SVector3.h ../Common/Context.h ../Geo/ExtrudeParams.h \
   ../Geo/GeoInterpolation.h ../Geo/Geo.h
 meshGEdge.o: meshGEdge.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
@@ -115,28 +116,29 @@ meshGEdge.o: meshGEdge.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
   ../Geo/SVector3.h ../Numeric/Numeric.h ../Common/Context.h \
-  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/MRep.h \
-  ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h ../Geo/GEntity.h \
-  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/MVertex.h \
-  ../Geo/MEdge.h ../Geo/MElement.h ../Common/VertexArray.h ../Common/OS.h \
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Geo/GFace.h \
+  ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
+  ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/ExtrudeParams.h ../Geo/MRep.h ../Geo/GEdge.h ../Geo/GFace.h \
+  ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/MElement.h \
+  ../Geo/ExtrudeParams.h ../Geo/MVertex.h ../Geo/MEdge.h \
+  ../Geo/MElement.h ../Common/VertexArray.h ../Common/OS.h \
   BackgroundMesh.h
 meshGEdgeExtruded.o: meshGEdgeExtruded.cpp ../Geo/ExtrudeParams.h \
-  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Common/GmshDefines.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
+  ../Geo/MVertex.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/MElement.h \
+  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Context.h ../DataStr/List.h ../Geo/ExtrudeParams.h \
   ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
   ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
   ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
   ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h ../Common/Message.h
+  ../Common/Message.h
 meshGFace.o: meshGFace.cpp meshGFace.h meshGFaceDelaunayInsertion.h \
   ../Geo/MElement.h ../Common/GmshDefines.h ../Geo/MVertex.h \
   ../Geo/SPoint3.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
@@ -147,19 +149,20 @@ meshGFace.o: meshGFace.cpp meshGFace.h meshGFaceDelaunayInsertion.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Geo/MVertex.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/MElement.h ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h \
-  ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h \
-  ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
-  ../Geo/MRep.h ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MElement.h \
-  ../Common/VertexArray.h ../Common/Message.h ../Common/OS.h BDS.h \
-  ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h Attractors.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 ../DataStr/Tree.h \
-  ../DataStr/avl.h ../Geo/SPoint2.h ../Geo/ExtrudeParams.h
+  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
+  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
+  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
+  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/MRep.h ../Geo/GEdge.h \
+  ../Geo/GFace.h ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/MElement.h \
+  ../Geo/ExtrudeParams.h ../Geo/MVertex.h ../Geo/MEdge.h \
+  ../Geo/MElement.h ../Common/VertexArray.h ../Common/Message.h \
+  ../Common/OS.h BDS.h ../Common/Views.h ../Common/ColorTable.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
+  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Attractors.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 ../DataStr/Tree.h ../DataStr/avl.h \
+  ../Geo/SPoint2.h ../Geo/ExtrudeParams.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 ../Common/GmshDefines.h \
@@ -169,25 +172,25 @@ meshGFaceTransfinite.o: meshGFaceTransfinite.cpp meshGFace.h \
   ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
-  ../Common/Message.h
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Geo/GFace.h \
+  ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
+  ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/ExtrudeParams.h ../Common/Message.h
 meshGFaceExtruded.o: meshGFaceExtruded.cpp ../Geo/ExtrudeParams.h \
-  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Common/GmshDefines.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
+  ../Geo/MVertex.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/MElement.h \
+  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Context.h ../DataStr/List.h ../Geo/ExtrudeParams.h \
   ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
   ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
   ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
   ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h ../Common/Message.h
+  ../Common/Message.h
 meshGFaceDelaunayInsertion.o: meshGFaceDelaunayInsertion.cpp BDS.h \
   ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/Range.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
@@ -198,12 +201,11 @@ meshGFaceDelaunayInsertion.o: meshGFaceDelaunayInsertion.cpp BDS.h \
   ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ../Geo/ExtrudeParams.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Geo/MElement.h \
+  ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h BackgroundMesh.h meshGFaceDelaunayInsertion.h \
-  ../Common/Message.h
+  ../Common/SmoothData.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  BackgroundMesh.h meshGFaceDelaunayInsertion.h ../Common/Message.h
 meshGRegion.o: meshGRegion.cpp meshGRegion.h \
   meshGRegionDelaunayInsertion.h ../Geo/MElement.h \
   ../Common/GmshDefines.h ../Geo/MVertex.h ../Geo/SPoint3.h \
@@ -215,11 +217,11 @@ meshGRegion.o: meshGRegion.cpp meshGRegion.h \
   ../Geo/MVertex.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/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
-  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
-  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h ../Geo/gmshRegion.h ../Geo/Geo.h \
+  ../Common/SmoothData.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
+  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
+  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
+  ../Geo/SBoundingBox3d.h ../Geo/gmshRegion.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 \
   ../DataStr/Tree.h ../DataStr/avl.h ../Geo/SPoint2.h \
@@ -227,7 +229,7 @@ meshGRegion.o: meshGRegion.cpp meshGRegion.h \
   ../Geo/GFace.h ../Geo/GRegion.h ../Geo/MVertex.h ../Geo/MEdge.h \
   ../Geo/MElement.h ../Common/VertexArray.h ../Common/Message.h \
   ../Common/OS.h BDS.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h
 meshGRegionDelaunayInsertion.o: meshGRegionDelaunayInsertion.cpp \
   BackgroundMesh.h meshGRegionDelaunayInsertion.h ../Geo/MElement.h \
@@ -240,11 +242,11 @@ meshGRegionDelaunayInsertion.o: meshGRegionDelaunayInsertion.cpp \
   ../Geo/MVertex.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/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
-  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
-  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h ../Common/Message.h
+  ../Common/SmoothData.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
+  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
+  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
+  ../Geo/SBoundingBox3d.h ../Common/Message.h
 meshGRegionTransfinite.o: meshGRegionTransfinite.cpp meshGFace.h \
   ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/Range.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
@@ -255,25 +257,25 @@ meshGRegionTransfinite.o: meshGRegionTransfinite.cpp meshGFace.h \
   ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ../Geo/ExtrudeParams.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Common/Message.h
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Geo/MElement.h \
+  ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
+  ../Geo/GRegion.h ../Geo/GEntity.h ../Geo/MElement.h \
+  ../Geo/ExtrudeParams.h ../Common/Message.h
 meshGRegionExtruded.o: meshGRegionExtruded.cpp ../Geo/ExtrudeParams.h \
-  ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h \
-  ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
-  ../Common/GmshDefines.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h \
-  ../Geo/MVertex.h ../Geo/SVector3.h ../Numeric/Numeric.h \
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
+  ../Geo/MVertex.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/MElement.h \
+  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Context.h ../DataStr/List.h ../Geo/ExtrudeParams.h \
   ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
   ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
   ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
   ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h meshGFace.h meshGRegion.h ../Common/Message.h
+  meshGFace.h meshGRegion.h ../Common/Message.h
 DivideAndConquer.o: DivideAndConquer.cpp ../Common/Gmsh.h \
   ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
@@ -282,17 +284,16 @@ BackgroundMesh.o: BackgroundMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h BackgroundMesh.h \
-  ../Common/Context.h ../Common/OctreePost.h ../Common/Octree.h \
-  ../Common/OctreeInternals.h ../Geo/GVertex.h ../Geo/GEntity.h \
-  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
-  ../Geo/SPoint3.h ../Common/GmshDefines.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h \
-  ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
-  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h BackgroundMesh.h ../Common/Context.h \
+  ../Common/OctreePost.h ../Common/Octree.h ../Common/OctreeInternals.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
+  ../Geo/MVertex.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/MElement.h \
+  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
   ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
   ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GModel.h \
@@ -302,6 +303,21 @@ BackgroundMesh.o: BackgroundMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Geo/Pair.h ../Geo/Range.h ../Geo/SPoint2.h ../Geo/SPoint3.h \
   ../Geo/SVector3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint2.h \
   ../Geo/ExtrudeParams.h
+BoundaryLayer.o: BoundaryLayer.cpp BoundaryLayer.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
+  ../Geo/MVertex.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/MElement.h \
+  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Geo/GFace.h \
+  ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
+  ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
+  meshGEdge.h meshGFace.h ../Common/Message.h
 BDS.o: BDS.cpp ../Numeric/Numeric.h ../Common/GmshMatrix.h BDS.h \
   ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/Range.h \
   ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h \
@@ -312,12 +328,13 @@ BDS.o: BDS.cpp ../Numeric/Numeric.h ../Common/GmshMatrix.h BDS.h \
   ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Context.h ../DataStr/List.h ../Geo/ExtrudeParams.h \
-  ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
-  ../Geo/ExtrudeParams.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Message.h
-SecondOrder.o: SecondOrder.cpp ../Geo/GModel.h ../Geo/GVertex.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
+  ../Common/SmoothData.h ../Geo/MElement.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h \
+  ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
+  ../Common/SmoothData.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  ../Common/Message.h
+SecondOrder.o: SecondOrder.cpp SecondOrder.h ../Geo/GModel.h \
+  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
   ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
   ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/GPoint.h ../Geo/SPoint2.h \
   ../Geo/GEdge.h ../Geo/GEntity.h ../Geo/GVertex.h ../Geo/SVector3.h \
@@ -325,11 +342,11 @@ SecondOrder.o: SecondOrder.cpp ../Geo/GModel.h ../Geo/GVertex.h \
   ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Numeric/Numeric.h ../Common/Context.h ../DataStr/List.h \
-  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
-  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
-  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
-  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/SBoundingBox3d.h ../Common/SmoothNormals.h ../Geo/MRep.h \
-  ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h ../Geo/MVertex.h \
-  ../Geo/MEdge.h ../Geo/MElement.h ../Common/VertexArray.h \
-  ../Common/Message.h ../Common/OS.h
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h ../Geo/GFace.h \
+  ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h ../Geo/GEdge.h \
+  ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h ../Geo/Pair.h \
+  ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
+  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
+  ../Geo/MRep.h ../Geo/GEdge.h ../Geo/GFace.h ../Geo/GRegion.h \
+  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MElement.h \
+  ../Common/VertexArray.h ../Common/Message.h ../Common/OS.h
diff --git a/Mesh/SecondOrder.cpp b/Mesh/SecondOrder.cpp
index d9900ce7cecfbd4a7ef7bbcca98009e3efa78a01..7d9c3c3cf360fcbaea8fdb3036f65adf52d462b1 100644
--- a/Mesh/SecondOrder.cpp
+++ b/Mesh/SecondOrder.cpp
@@ -1,4 +1,4 @@
-// $Id: SecondOrder.cpp,v 1.52 2007-01-30 08:56:36 geuzaine Exp $
+// $Id: SecondOrder.cpp,v 1.53 2007-02-26 08:25:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -19,16 +19,12 @@
 // 
 // Please report all bugs and problems to <gmsh@geuz.org>.
 
-#include "GModel.h"
-#include "GFace.h"
-#include "GEdge.h"
+#include "SecondOrder.h"
 #include "MElement.h"
 #include "MRep.h"
 #include "Message.h"
 #include "OS.h"
 
-extern GModel *GMODEL;
-
 bool reparamOnFace(MVertex *v, GFace *gf, SPoint2 &param)
 {
   if(v->onWhat()->dim() == 0){
@@ -413,18 +409,18 @@ void removeSecondOrderVertices(GEntity *e)
   e->mesh_vertices = v1;
 }
 
-void Degre1()
+void Degre1(GModel *m)
 {
   // replace all elements with first order elements and mark all
   // unused vertices with a -1 visibility flag
-  for(GModel::eiter it = GMODEL->firstEdge(); it != GMODEL->lastEdge(); ++it){
+  for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); ++it){
     setFirstOrder(*it, (*it)->lines);
   }
-  for(GModel::fiter it = GMODEL->firstFace(); it != GMODEL->lastFace(); ++it){
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it){
     setFirstOrder(*it, (*it)->triangles);
     setFirstOrder(*it, (*it)->quadrangles);
   }
-  for(GModel::riter it = GMODEL->firstRegion(); it != GMODEL->lastRegion(); ++it){
+  for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); ++it){
     setFirstOrder(*it, (*it)->tetrahedra);
     setFirstOrder(*it, (*it)->hexahedra);
     setFirstOrder(*it, (*it)->prisms);
@@ -432,15 +428,15 @@ void Degre1()
   }
 
   // remove all vertices with a -1 visibility flag
-  for(GModel::eiter it = GMODEL->firstEdge(); it != GMODEL->lastEdge(); ++it)
+  for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); ++it)
     removeSecondOrderVertices(*it);
-  for(GModel::fiter it = GMODEL->firstFace(); it != GMODEL->lastFace(); ++it)
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it)
     removeSecondOrderVertices(*it);
-  for(GModel::riter it = GMODEL->firstRegion(); it != GMODEL->lastRegion(); ++it)
+  for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); ++it)
     removeSecondOrderVertices(*it);
 }
 
-void Degre2(bool linear, bool incomplete)
+void Degre2(GModel *m, bool linear, bool incomplete)
 {
   // replace all the elements in the mesh with second order elements
   // by creating unique vertices on the edges/faces of the mesh:
@@ -461,16 +457,16 @@ void Degre2(bool linear, bool incomplete)
   double t1 = Cpu();
 
   // first, make sure to remove any existsing second order vertices/elements
-  Degre1();
+  Degre1(m);
 
   // then create new second order vertices/elements
   std::map<std::pair<MVertex*,MVertex*>, MVertex* > edgeVertices;
   std::map<std::vector<MVertex*>, MVertex* > faceVertices;
-  for(GModel::eiter it = GMODEL->firstEdge(); it != GMODEL->lastEdge(); ++it)
+  for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); ++it)
     setSecondOrder(*it, edgeVertices, linear);
-  for(GModel::fiter it = GMODEL->firstFace(); it != GMODEL->lastFace(); ++it)
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it)
     setSecondOrder(*it, edgeVertices, faceVertices, linear, incomplete);
-  for(GModel::riter it = GMODEL->firstRegion(); it != GMODEL->lastRegion(); ++it)
+  for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); ++it)
     setSecondOrder(*it, edgeVertices, faceVertices, linear, incomplete);
 
   double t2 = Cpu();
diff --git a/Mesh/SecondOrder.h b/Mesh/SecondOrder.h
index 13451ed7cacf6d75a8775ac4efa60f67ea88ff45..57c02268567ccd3f573afb384f5aa3f94138075d 100644
--- a/Mesh/SecondOrder.h
+++ b/Mesh/SecondOrder.h
@@ -20,7 +20,9 @@
 // 
 // Please report all bugs and problems to <gmsh@geuz.org>.
 
-void Degre1();
-void Degre2(bool linear=true, bool incomplete=false);
+#include "GModel.h"
+
+void Degre1(GModel *m);
+void Degre2(GModel *m, bool linear=true, bool incomplete=false);
 
 #endif
diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp
index cb6de829832f5db00bba54aa1004bd4a7205d163..60f2940fb9a21746e868b33e2d40aa4823ea65c4 100644
--- a/Mesh/meshGEdge.cpp
+++ b/Mesh/meshGEdge.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGEdge.cpp,v 1.28 2007-02-02 17:16:47 remacle Exp $
+// $Id: meshGEdge.cpp,v 1.29 2007-02-26 08:25:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -178,6 +178,8 @@ double Integration(GEdge *ge, double t1, double t2,
 
 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();
@@ -190,6 +192,7 @@ void deMeshGEdge::operator() (GEdge *ge)
 void meshGEdge::operator() (GEdge *ge) 
 {  
   if(ge->geomType() == GEntity::DiscreteCurve) return;
+  if(ge->geomType() == GEntity::BoundaryLayerCurve) return;
 
   // Send a messsage to the GMSH environment
   Msg(INFO, "Meshing curve %d", ge->tag());
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index d2b58d61a690fe98f82f42229bdd4e8f020dfd9b..1065e4d63e6b02bff36e5564066cb541008a5e3b 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFace.cpp,v 1.59 2007-02-02 23:53:04 geuzaine Exp $
+// $Id: meshGFace.cpp,v 1.60 2007-02-26 08:25:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -1401,10 +1401,10 @@ bool gmsh2DMeshGeneratorPeriodic ( GFace *gf )
   return true;
 }
 
-
-
-void deMeshGFace :: operator() (GFace *gf) 
+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();
   for (unsigned int i=0;i<gf->triangles.size();i++) delete gf->triangles[i];
@@ -1414,12 +1414,13 @@ void deMeshGFace :: operator() (GFace *gf)
   if(gf->meshRep) gf->meshRep->destroy();
 }
 
-void meshGFace :: operator() (GFace *gf) 
+void meshGFace::operator() (GFace *gf) 
 {  
   if(gf->geomType() == GEntity::DiscreteSurface) return;
+  if(gf->geomType() == GEntity::BoundaryLayerSurface) return;
   if(gf->geomType() == GEntity::ProjectionSurface) return;
 
-  Msg(STATUS2, "Meshing surface %d (%s)", gf->tag(),gf->getTypeString().c_str());
+  Msg(STATUS2, "Meshing surface %d (%s)", gf->tag(), gf->getTypeString().c_str());
 
   // destroy the mesh if it exists
   deMeshGFace dem;
@@ -1428,29 +1429,25 @@ void meshGFace :: operator() (GFace *gf)
   if(MeshTransfiniteSurface(gf)) return;
   if(MeshExtrudedSurface(gf)) return;
 
-  std::vector<MVertex*> points;
-  std::vector<int> indices;
   // compute loops on the fly (indices indicate start and end points
   // of a loop; loops are not yet oriented)
   Msg(DEBUG1, "Computing edge loops");
+  std::vector<MVertex*> points;
+  std::vector<int> indices;
   computeEdgeLoops(gf, points, indices);
 
+  // temp fix until we create MEdgeLoops in gmshFace
   Msg(DEBUG1, "Generating the mesh");
-  // temp fix until we create MEdgeLoops in gmshFace:
-  if(gf->getNativeType() == GEntity::GmshModel || 
-     gf->edgeLoops.empty() )
-    {
-      gmsh2DMeshGenerator ( gf );
-    }
-  else
-    {
-      if (!gmsh2DMeshGeneratorPeriodic ( gf ))
-	Msg(GERROR, "Impossible to mesh face %d",gf->tag());
-    }
-
+  if(gf->getNativeType() == GEntity::GmshModel || gf->edgeLoops.empty()){
+    gmsh2DMeshGenerator(gf);
+  }
+  else{
+    if(!gmsh2DMeshGeneratorPeriodic(gf))
+      Msg(GERROR, "Impossible to mesh face %d", gf->tag());
+  }
+  
   Msg(DEBUG1, "type %d %d triangles generated, %d internal vertices",
-      gf->geomType(),gf->triangles.size(),gf->mesh_vertices.size());
-
+      gf->geomType(), gf->triangles.size(), gf->mesh_vertices.size());
 }  
 
 template<class T>
diff --git a/Mesh/meshGFace.h b/Mesh/meshGFace.h
index 3cb51edea00160107370a98a93c10dd9cf366170..7f3b16b0c838559b26644845b020ba17a51b6aa5 100644
--- a/Mesh/meshGFace.h
+++ b/Mesh/meshGFace.h
@@ -46,7 +46,7 @@ class deMeshGFace {
 //    orientation
 class orientMeshGFace {
   public :
-  void operator () ( GFace * );
+  void operator () (GFace *);
 };
 
 // Compute edge loops of the face, all_mvertices are the vertices of
diff --git a/Mesh/meshGFaceExtruded.cpp b/Mesh/meshGFaceExtruded.cpp
index b04c979ad76c056c0bf6fde40514e86851a49bb3..b7d32decd22bfe4d87dd990c982e2b1292a57674 100644
--- a/Mesh/meshGFaceExtruded.cpp
+++ b/Mesh/meshGFaceExtruded.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFaceExtruded.cpp,v 1.16 2007-01-22 16:31:44 geuzaine Exp $
+// $Id: meshGFaceExtruded.cpp,v 1.17 2007-02-26 08:25:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -219,3 +219,4 @@ int MeshExtrudedSurface(GFace *gf,
 
   return 1;
 }
+
diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp
index ac05211b002264a0785ff770c2828729c853d274..15fd98ea14f74b0502b141623d9c4842fd1aee54 100644
--- a/Mesh/meshGRegion.cpp
+++ b/Mesh/meshGRegion.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGRegion.cpp,v 1.27 2007-01-30 08:56:36 geuzaine Exp $
+// $Id: meshGRegion.cpp,v 1.28 2007-02-26 08:25:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -340,6 +340,8 @@ void TransferVolumeMesh(GRegion *gr, Ng_Mesh *ngmesh,
 
 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();
@@ -540,6 +542,10 @@ void optimizeMeshGRegion::operator() (GRegion *gr)
 {  
   if(gr->geomType() == GEntity::DiscreteVolume) return;
   
+  // don't optimize extruded meshes
+  ExtrudeParams *ep = gr->meshAttributes.extrude;
+  if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == EXTRUDED_ENTITY) return;
+  
 #if !defined(HAVE_NETGEN)
   Msg(GERROR, "Netgen is not compiled in this version of Gmsh");
 #else
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index d95e07afbef9b68a25c5ab32ecbb6a9966331eb9..faeff30f0ad571a014a40956df01884af9250720 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -121,7 +121,7 @@
 
 #line 1 "Gmsh.y"
 
-// $Id: Gmsh.tab.cpp,v 1.306 2007-02-16 08:54:04 geuzaine Exp $
+// $Id: Gmsh.tab.cpp,v 1.307 2007-02-26 08:25:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -215,11 +215,11 @@ typedef union {
 
 
 
-#define	YYFINAL		1179
+#define	YYFINAL		1183
 #define	YYFLAG		-32768
 #define	YYNTBASE	137
 
-#define YYTRANSLATE(x) ((unsigned)(x) <= 370 ? yytranslate[x] : 203)
+#define YYTRANSLATE(x) ((unsigned)(x) <= 370 ? yytranslate[x] : 204)
 
 static const short yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -279,224 +279,225 @@ static const short yyprhs[] = {     0,
    743,   747,   752,   757,   761,   769,   777,   781,   789,   793,
    796,   799,   815,   818,   825,   834,   843,   854,   856,   859,
    861,   865,   870,   872,   878,   890,   904,   905,   913,   914,
-   928,   929,   945,   954,   963,   972,   985,   998,  1011,  1026,
-  1041,  1056,  1057,  1070,  1071,  1084,  1085,  1098,  1099,  1116,
-  1117,  1134,  1135,  1152,  1153,  1172,  1173,  1192,  1193,  1212,
-  1214,  1217,  1223,  1231,  1241,  1244,  1251,  1261,  1271,  1280,
-  1290,  1299,  1308,  1315,  1320,  1331,  1342,  1353,  1364,  1367,
-  1369,  1373,  1376,  1379,  1382,  1386,  1390,  1394,  1398,  1402,
-  1406,  1410,  1414,  1418,  1422,  1426,  1430,  1434,  1438,  1444,
-  1449,  1454,  1459,  1464,  1469,  1474,  1479,  1484,  1489,  1494,
-  1501,  1506,  1511,  1516,  1521,  1526,  1531,  1538,  1545,  1552,
-  1557,  1562,  1567,  1572,  1577,  1582,  1587,  1592,  1597,  1602,
-  1607,  1614,  1619,  1624,  1629,  1634,  1639,  1644,  1651,  1658,
-  1665,  1670,  1672,  1674,  1676,  1678,  1680,  1682,  1684,  1686,
-  1692,  1697,  1702,  1705,  1711,  1715,  1722,  1727,  1735,  1742,
-  1744,  1747,  1750,  1754,  1758,  1770,  1780,  1788,  1796,  1798,
-  1802,  1804,  1806,  1809,  1813,  1818,  1822,  1828,  1833,  1835,
-  1837,  1839,  1843,  1848,  1855,  1863,  1865,  1867,  1871,  1875,
-  1885,  1893,  1895,  1901,  1905,  1912,  1914,  1918,  1920,  1922,
-  1929,  1934,  1939,  1944,  1951,  1958
+   928,   929,   945,   946,   953,   962,   971,   980,   993,  1006,
+  1019,  1034,  1049,  1064,  1065,  1078,  1079,  1092,  1093,  1106,
+  1107,  1124,  1125,  1142,  1143,  1160,  1161,  1180,  1181,  1200,
+  1201,  1220,  1222,  1225,  1231,  1239,  1249,  1252,  1259,  1269,
+  1279,  1288,  1298,  1307,  1316,  1323,  1328,  1339,  1350,  1361,
+  1372,  1375,  1377,  1381,  1384,  1387,  1390,  1394,  1398,  1402,
+  1406,  1410,  1414,  1418,  1422,  1426,  1430,  1434,  1438,  1442,
+  1446,  1452,  1457,  1462,  1467,  1472,  1477,  1482,  1487,  1492,
+  1497,  1502,  1509,  1514,  1519,  1524,  1529,  1534,  1539,  1546,
+  1553,  1560,  1565,  1570,  1575,  1580,  1585,  1590,  1595,  1600,
+  1605,  1610,  1615,  1622,  1627,  1632,  1637,  1642,  1647,  1652,
+  1659,  1666,  1673,  1678,  1680,  1682,  1684,  1686,  1688,  1690,
+  1692,  1694,  1700,  1705,  1710,  1713,  1719,  1723,  1730,  1735,
+  1743,  1750,  1752,  1755,  1758,  1762,  1766,  1778,  1788,  1796,
+  1804,  1806,  1810,  1812,  1814,  1817,  1821,  1826,  1830,  1836,
+  1841,  1843,  1845,  1847,  1851,  1856,  1863,  1871,  1873,  1875,
+  1879,  1883,  1893,  1901,  1903,  1909,  1913,  1920,  1922,  1926,
+  1928,  1930,  1937,  1942,  1947,  1952,  1959,  1966
 };
 
 static const short yyrhs[] = {   138,
      0,     1,     6,     0,     0,   138,   139,     0,   142,     0,
    141,     0,   161,     0,   163,     0,   164,     0,   167,     0,
-   168,     0,   169,     0,   170,     0,   173,     0,   188,     0,
-   189,     0,   190,     0,   172,     0,   171,     0,   115,     0,
+   168,     0,   169,     0,   170,     0,   173,     0,   189,     0,
+   190,     0,   191,     0,   172,     0,   171,     0,   115,     0,
    115,   115,     0,    33,   127,     5,   128,     6,     0,    33,
-   127,     5,   128,   140,   202,     6,     0,    33,   127,     5,
-   133,   198,   128,     6,     0,    33,   127,     5,   133,   198,
-   128,   140,   202,     6,     0,     4,     5,   134,   143,   135,
-     6,     0,     4,     5,     4,   193,   134,   143,   135,     6,
+   127,     5,   128,   140,   203,     6,     0,    33,   127,     5,
+   133,   199,   128,     6,     0,    33,   127,     5,   133,   199,
+   128,   140,   203,     6,     0,     4,     5,   134,   143,   135,
+     6,     0,     4,     5,     4,   194,   134,   143,   135,     6,
      0,     0,   143,   146,     0,   143,   150,     0,   143,   153,
      0,   143,   155,     0,   143,   156,     0,   143,   158,     0,
-   191,     0,   144,   133,   191,     0,   191,     0,   145,   133,
-   191,     0,     0,     0,     4,   147,   127,   144,   128,   148,
-   134,   145,   135,     6,     0,   202,     0,   149,   133,   202,
-     0,     0,    76,   127,   191,   133,   191,   133,   191,   128,
-   151,   134,   149,   135,     6,     0,   202,     0,   152,   133,
-   202,     0,     0,    77,   127,   191,   133,   191,   133,   191,
-   133,   191,   128,   154,   134,   152,   135,     6,     0,    78,
-   134,   195,   135,   134,   195,   135,     6,     0,     0,    79,
-   157,   134,   145,   135,     6,     0,    80,   127,   191,   128,
-   196,     6,     0,     7,     0,   104,     0,   105,     0,   106,
-     0,   107,     0,   123,     0,   124,     0,     4,   159,   191,
-     6,     0,     4,   129,   191,   130,   159,   191,     6,     0,
-     4,   129,   134,   198,   135,   130,   159,   196,     6,     0,
-     4,   129,   130,     7,   196,     6,     0,     4,   129,   130,
-   104,   196,     6,     0,     4,   160,     6,     0,     4,   129,
-   191,   130,   160,     6,     0,     4,   131,     4,     7,   202,
-     6,     0,     4,   129,   191,   130,   131,     4,     7,   202,
-     6,     0,     4,   131,     4,   159,   191,     6,     0,     4,
-   129,   191,   130,   131,     4,   159,   191,     6,     0,     4,
-   131,     4,   160,     6,     0,     4,   129,   191,   130,   131,
+   192,     0,   144,   133,   192,     0,   192,     0,   145,   133,
+   192,     0,     0,     0,     4,   147,   127,   144,   128,   148,
+   134,   145,   135,     6,     0,   203,     0,   149,   133,   203,
+     0,     0,    76,   127,   192,   133,   192,   133,   192,   128,
+   151,   134,   149,   135,     6,     0,   203,     0,   152,   133,
+   203,     0,     0,    77,   127,   192,   133,   192,   133,   192,
+   133,   192,   128,   154,   134,   152,   135,     6,     0,    78,
+   134,   196,   135,   134,   196,   135,     6,     0,     0,    79,
+   157,   134,   145,   135,     6,     0,    80,   127,   192,   128,
+   197,     6,     0,     7,     0,   104,     0,   105,     0,   106,
+     0,   107,     0,   123,     0,   124,     0,     4,   159,   192,
+     6,     0,     4,   129,   192,   130,   159,   192,     6,     0,
+     4,   129,   134,   199,   135,   130,   159,   197,     6,     0,
+     4,   129,   130,     7,   197,     6,     0,     4,   129,   130,
+   104,   197,     6,     0,     4,   160,     6,     0,     4,   129,
+   192,   130,   160,     6,     0,     4,   131,     4,     7,   203,
+     6,     0,     4,   129,   192,   130,   131,     4,     7,   203,
+     6,     0,     4,   131,     4,   159,   192,     6,     0,     4,
+   129,   192,   130,   131,     4,   159,   192,     6,     0,     4,
+   131,     4,   160,     6,     0,     4,   129,   192,   130,   131,
      4,   160,     6,     0,     4,   131,    87,   131,     4,     7,
-   199,     6,     0,     4,   129,   191,   130,   131,    87,   131,
-     4,     7,   199,     6,     0,     4,   131,    88,     7,   200,
-     6,     0,     4,   129,   191,   130,   131,    88,     7,   200,
-     6,     0,    61,   127,     4,   128,   131,     4,     7,   191,
-     6,     0,    61,   127,     4,   128,   131,     4,     7,   202,
-     6,     0,   191,     0,   202,     0,    41,   127,   191,   128,
-     7,   193,     6,     0,    41,   127,   191,   128,    90,    46,
-   134,   191,   135,     7,   193,     6,     0,    57,    41,   127,
-   162,   128,     7,   196,     6,     0,    72,    41,   196,     7,
-   196,     6,     0,    72,    44,   196,     7,   196,     6,     0,
-    49,    50,   196,     7,   191,     6,     0,    44,   127,   191,
-   128,     7,   196,     6,     0,    47,   127,   191,   128,     7,
-   196,     6,     0,    42,   127,   191,   128,     7,   196,     6,
-     0,    42,   127,   191,   128,     7,   196,    53,   193,     6,
-     0,    43,   127,   191,   128,     7,   196,     6,     0,    43,
-   127,   191,   128,     7,   196,    53,   193,     6,     0,    51,
-   127,   191,   128,     7,   134,   191,   133,   191,   133,     5,
-   133,     5,   133,     5,   135,     6,     0,    82,   127,   191,
-   128,     7,   196,     6,     0,    83,   127,   191,   128,     7,
-   196,     6,     0,    84,   127,   191,   128,     7,   196,    86,
-   196,    85,   191,     6,     0,    44,    68,   127,   191,   128,
-     7,   196,     6,     0,    57,    44,   127,   162,   128,     7,
-   196,     6,     0,    53,    46,   127,   191,   128,     7,   196,
-     6,     0,    54,    46,   127,   191,   128,     7,   196,     6,
-     0,    45,   127,   191,   128,     7,   196,     6,     0,    46,
-    68,   127,   191,   128,     7,   196,     6,     0,    57,    46,
-   127,   162,   128,     7,   196,     6,     0,    56,    48,   127,
-   191,   128,     7,   196,     6,     0,    48,   127,   191,   128,
-     7,   196,     6,     0,    57,    48,   127,   162,   128,     7,
-   196,     6,     0,    63,   193,   134,   165,   135,     0,    62,
-   134,   193,   133,   193,   133,   191,   135,   134,   165,   135,
-     0,    64,   193,   134,   165,   135,     0,    65,   134,   193,
-   133,   191,   135,   134,   165,   135,     0,   167,     0,   166,
+   200,     6,     0,     4,   129,   192,   130,   131,    87,   131,
+     4,     7,   200,     6,     0,     4,   131,    88,     7,   201,
+     6,     0,     4,   129,   192,   130,   131,    88,     7,   201,
+     6,     0,    61,   127,     4,   128,   131,     4,     7,   192,
+     6,     0,    61,   127,     4,   128,   131,     4,     7,   203,
+     6,     0,   192,     0,   203,     0,    41,   127,   192,   128,
+     7,   194,     6,     0,    41,   127,   192,   128,    90,    46,
+   134,   192,   135,     7,   194,     6,     0,    57,    41,   127,
+   162,   128,     7,   197,     6,     0,    72,    41,   197,     7,
+   197,     6,     0,    72,    44,   197,     7,   197,     6,     0,
+    49,    50,   197,     7,   192,     6,     0,    44,   127,   192,
+   128,     7,   197,     6,     0,    47,   127,   192,   128,     7,
+   197,     6,     0,    42,   127,   192,   128,     7,   197,     6,
+     0,    42,   127,   192,   128,     7,   197,    53,   194,     6,
+     0,    43,   127,   192,   128,     7,   197,     6,     0,    43,
+   127,   192,   128,     7,   197,    53,   194,     6,     0,    51,
+   127,   192,   128,     7,   134,   192,   133,   192,   133,     5,
+   133,     5,   133,     5,   135,     6,     0,    82,   127,   192,
+   128,     7,   197,     6,     0,    83,   127,   192,   128,     7,
+   197,     6,     0,    84,   127,   192,   128,     7,   197,    86,
+   197,    85,   192,     6,     0,    44,    68,   127,   192,   128,
+     7,   197,     6,     0,    57,    44,   127,   162,   128,     7,
+   197,     6,     0,    53,    46,   127,   192,   128,     7,   197,
+     6,     0,    54,    46,   127,   192,   128,     7,   197,     6,
+     0,    45,   127,   192,   128,     7,   197,     6,     0,    46,
+    68,   127,   192,   128,     7,   197,     6,     0,    57,    46,
+   127,   162,   128,     7,   197,     6,     0,    56,    48,   127,
+   192,   128,     7,   197,     6,     0,    48,   127,   192,   128,
+     7,   197,     6,     0,    57,    48,   127,   162,   128,     7,
+   197,     6,     0,    63,   194,   134,   165,   135,     0,    62,
+   134,   194,   133,   194,   133,   192,   135,   134,   165,   135,
+     0,    64,   194,   134,   165,   135,     0,    65,   134,   194,
+   133,   192,   135,   134,   165,   135,     0,   167,     0,   166,
      0,   164,     0,     0,   166,   163,     0,   166,    41,   134,
-   198,   135,     6,     0,   166,    44,   134,   198,   135,     6,
-     0,   166,    46,   134,   198,   135,     6,     0,   166,    48,
-   134,   198,   135,     6,     0,    67,   134,   166,   135,     0,
-    67,     4,   129,   191,   130,     6,     0,    74,     4,   129,
-   191,   130,     6,     0,    75,     4,   129,   191,   130,     6,
-     0,    70,   134,   166,   135,     0,    70,     4,   129,   191,
+   199,   135,     6,     0,   166,    44,   134,   199,   135,     6,
+     0,   166,    46,   134,   199,   135,     6,     0,   166,    48,
+   134,   199,   135,     6,     0,    67,   134,   166,   135,     0,
+    67,     4,   129,   192,   130,     6,     0,    74,     4,   129,
+   192,   130,     6,     0,    75,     4,   129,   192,   130,     6,
+     0,    70,   134,   166,   135,     0,    70,     4,   129,   192,
    130,     6,     0,    70,     4,     6,     0,    70,     4,     4,
-     6,     0,    87,   199,   134,   166,   135,     0,    98,   202,
-     6,     0,    99,   202,     6,     0,    98,   134,   166,   135,
-     0,    99,   134,   166,   135,     0,     4,   202,     6,     0,
-     4,     4,   129,   191,   130,   202,     6,     0,     4,     4,
-     4,   129,   191,   130,     6,     0,     4,   191,     6,     0,
+     6,     0,    87,   200,   134,   166,   135,     0,    98,   203,
+     6,     0,    99,   203,     6,     0,    98,   134,   166,   135,
+     0,    99,   134,   166,   135,     0,     4,   203,     6,     0,
+     4,     4,   129,   192,   130,   203,     6,     0,     4,     4,
+     4,   129,   192,   130,     6,     0,     4,   192,     6,     0,
     61,   127,     4,   128,   131,     4,     6,     0,    81,     4,
      6,     0,    94,     6,     0,    38,     6,     0,    38,   134,
-   191,   133,   191,   133,   191,   133,   191,   133,   191,   133,
-   191,   135,     6,     0,    39,     6,     0,    89,   127,   191,
-     8,   191,   128,     0,    89,   127,   191,     8,   191,     8,
-   191,   128,     0,    89,     4,    90,   134,   191,     8,   191,
-   135,     0,    89,     4,    90,   134,   191,     8,   191,     8,
-   191,   135,     0,    91,     0,    97,     4,     0,    95,     0,
-    96,     4,     6,     0,    92,   127,   191,   128,     0,    93,
-     0,    66,   193,   134,   166,   135,     0,    66,   134,   193,
-   133,   193,   133,   191,   135,   134,   166,   135,     0,    66,
-   134,   193,   133,   193,   133,   193,   133,   191,   135,   134,
-   166,   135,     0,     0,    66,   193,   134,   166,   174,   186,
-   135,     0,     0,    66,   134,   193,   133,   193,   133,   191,
-   135,   134,   166,   175,   186,   135,     0,     0,    66,   134,
-   193,   133,   193,   133,   193,   133,   191,   135,   134,   166,
-   176,   186,   135,     0,    66,    41,   134,   191,   133,   193,
-   135,     6,     0,    66,    44,   134,   191,   133,   193,   135,
-     6,     0,    66,    46,   134,   191,   133,   193,   135,     6,
-     0,    66,    41,   134,   191,   133,   193,   133,   193,   133,
-   191,   135,     6,     0,    66,    44,   134,   191,   133,   193,
-   133,   193,   133,   191,   135,     6,     0,    66,    46,   134,
-   191,   133,   193,   133,   193,   133,   191,   135,     6,     0,
-    66,    41,   134,   191,   133,   193,   133,   193,   133,   193,
-   133,   191,   135,     6,     0,    66,    44,   134,   191,   133,
-   193,   133,   193,   133,   193,   133,   191,   135,     6,     0,
-    66,    46,   134,   191,   133,   193,   133,   193,   133,   193,
-   133,   191,   135,     6,     0,     0,    66,    41,   134,   191,
-   133,   193,   135,   177,   134,   186,   135,     6,     0,     0,
-    66,    44,   134,   191,   133,   193,   135,   178,   134,   186,
-   135,     6,     0,     0,    66,    46,   134,   191,   133,   193,
-   135,   179,   134,   186,   135,     6,     0,     0,    66,    41,
-   134,   191,   133,   193,   133,   193,   133,   191,   135,   180,
-   134,   186,   135,     6,     0,     0,    66,    44,   134,   191,
-   133,   193,   133,   193,   133,   191,   135,   181,   134,   186,
-   135,     6,     0,     0,    66,    46,   134,   191,   133,   193,
-   133,   193,   133,   191,   135,   182,   134,   186,   135,     6,
-     0,     0,    66,    41,   134,   191,   133,   193,   133,   193,
-   133,   193,   133,   191,   135,   183,   134,   186,   135,     6,
-     0,     0,    66,    44,   134,   191,   133,   193,   133,   193,
-   133,   193,   133,   191,   135,   184,   134,   186,   135,     6,
-     0,     0,    66,    46,   134,   191,   133,   193,   133,   193,
-   133,   193,   133,   191,   135,   185,   134,   186,   135,     6,
-     0,   187,     0,   186,   187,     0,    73,   134,   191,   135,
-     6,     0,    73,   134,   196,   133,   196,   135,     6,     0,
-    73,   134,   196,   133,   196,   133,   196,   135,     6,     0,
-    69,     6,     0,    55,    44,   196,     7,   191,     6,     0,
-    55,    44,   196,     7,   191,    58,    60,   191,     6,     0,
-    55,    44,   196,     7,   191,    58,    59,   191,     6,     0,
-    55,    46,   134,   191,   135,     7,   196,     6,     0,    55,
-    46,   134,   191,   135,     7,   196,     4,     6,     0,    52,
-    46,   134,   191,   135,     7,   196,     6,     0,    55,    48,
-   134,   191,   135,     7,   196,     6,     0,    69,    46,   196,
-     7,   191,     6,     0,    69,    46,   196,     6,     0,    41,
-   134,   198,   135,    90,    46,   134,   191,   135,     6,     0,
-    44,   134,   198,   135,    90,    46,   134,   191,   135,     6,
-     0,    44,   134,   198,   135,    90,    48,   134,   191,   135,
-     6,     0,    46,   134,   198,   135,    90,    48,   134,   191,
-   135,     6,     0,    71,     6,     0,   192,     0,   127,   191,
-   128,     0,   118,   191,     0,   117,   191,     0,   122,   191,
-     0,   191,   118,   191,     0,   191,   117,   191,     0,   191,
-   119,   191,     0,   191,   120,   191,     0,   191,   121,   191,
-     0,   191,   126,   191,     0,   191,   113,   191,     0,   191,
-   115,   191,     0,   191,   114,   191,     0,   191,   116,   191,
-     0,   191,   111,   191,     0,   191,   112,   191,     0,   191,
-   110,   191,     0,   191,   109,   191,     0,   191,   108,   191,
-     8,   191,     0,    12,   127,   191,   128,     0,    13,   127,
-   191,   128,     0,    14,   127,   191,   128,     0,    15,   127,
-   191,   128,     0,    16,   127,   191,   128,     0,    17,   127,
-   191,   128,     0,    18,   127,   191,   128,     0,    19,   127,
-   191,   128,     0,    20,   127,   191,   128,     0,    22,   127,
-   191,   128,     0,    23,   127,   191,   133,   191,   128,     0,
-    24,   127,   191,   128,     0,    25,   127,   191,   128,     0,
-    26,   127,   191,   128,     0,    27,   127,   191,   128,     0,
-    28,   127,   191,   128,     0,    29,   127,   191,   128,     0,
-    30,   127,   191,   133,   191,   128,     0,    31,   127,   191,
-   133,   191,   128,     0,    32,   127,   191,   133,   191,   128,
-     0,    21,   127,   191,   128,     0,    12,   129,   191,   130,
-     0,    13,   129,   191,   130,     0,    14,   129,   191,   130,
-     0,    15,   129,   191,   130,     0,    16,   129,   191,   130,
-     0,    17,   129,   191,   130,     0,    18,   129,   191,   130,
-     0,    19,   129,   191,   130,     0,    20,   129,   191,   130,
-     0,    22,   129,   191,   130,     0,    23,   129,   191,   133,
-   191,   130,     0,    24,   129,   191,   130,     0,    25,   129,
-   191,   130,     0,    26,   129,   191,   130,     0,    27,   129,
-   191,   130,     0,    28,   129,   191,   130,     0,    29,   129,
-   191,   130,     0,    30,   129,   191,   133,   191,   130,     0,
-    31,   129,   191,   133,   191,   130,     0,    32,   129,   191,
-   133,   191,   130,     0,    21,   129,   191,   130,     0,     3,
-     0,     9,     0,    10,     0,    11,     0,   101,     0,   102,
-     0,   103,     0,     4,     0,     4,   136,   134,   191,   135,
-     0,     4,   129,   191,   130,     0,   132,     4,   129,   130,
-     0,     4,   160,     0,     4,   129,   191,   130,   160,     0,
-     4,   131,     4,     0,     4,   129,   191,   130,   131,     4,
-     0,     4,   131,     4,   160,     0,     4,   129,   191,   130,
-   131,     4,   160,     0,   100,   127,     5,   133,   191,   128,
-     0,   194,     0,   118,   193,     0,   117,   193,     0,   193,
-   118,   193,     0,   193,   117,   193,     0,   134,   191,   133,
-   191,   133,   191,   133,   191,   133,   191,   135,     0,   134,
-   191,   133,   191,   133,   191,   133,   191,   135,     0,   134,
-   191,   133,   191,   133,   191,   135,     0,   127,   191,   133,
-   191,   133,   191,   128,     0,   196,     0,   195,   133,   196,
-     0,   191,     0,   197,     0,   134,   135,     0,   134,   198,
-   135,     0,   118,   134,   198,   135,     0,   191,     8,   191,
-     0,   191,     8,   191,     8,   191,     0,    41,   134,   191,
-   135,     0,   164,     0,   167,     0,   173,     0,     4,   129,
-   130,     0,   118,     4,   129,   130,     0,     4,   129,   134,
-   198,   135,   130,     0,   118,     4,   129,   134,   198,   135,
-   130,     0,   191,     0,   197,     0,   198,   133,   191,     0,
-   198,   133,   197,     0,   134,   191,   133,   191,   133,   191,
-   133,   191,   135,     0,   134,   191,   133,   191,   133,   191,
-   135,     0,     4,     0,     4,   131,    87,   131,     4,     0,
-   134,   201,   135,     0,     4,   129,   191,   130,   131,    88,
-     0,   199,     0,   201,   133,   199,     0,     5,     0,    40,
-     0,    35,   127,   202,   133,   202,   128,     0,    36,   127,
-   202,   128,     0,    37,   127,   202,   128,     0,    34,   127,
-   202,   128,     0,    34,   127,   202,   133,   198,   128,     0,
-    34,   127,     4,   131,     4,   128,     0,    34,   127,     4,
-   129,   191,   130,   131,     4,   128,     0
+   192,   133,   192,   133,   192,   133,   192,   133,   192,   133,
+   192,   135,     6,     0,    39,     6,     0,    89,   127,   192,
+     8,   192,   128,     0,    89,   127,   192,     8,   192,     8,
+   192,   128,     0,    89,     4,    90,   134,   192,     8,   192,
+   135,     0,    89,     4,    90,   134,   192,     8,   192,     8,
+   192,   135,     0,    91,     0,    97,     4,     0,    95,     0,
+    96,     4,     6,     0,    92,   127,   192,   128,     0,    93,
+     0,    66,   194,   134,   166,   135,     0,    66,   134,   194,
+   133,   194,   133,   192,   135,   134,   166,   135,     0,    66,
+   134,   194,   133,   194,   133,   194,   133,   192,   135,   134,
+   166,   135,     0,     0,    66,   194,   134,   166,   174,   187,
+   135,     0,     0,    66,   134,   194,   133,   194,   133,   192,
+   135,   134,   166,   175,   187,   135,     0,     0,    66,   134,
+   194,   133,   194,   133,   194,   133,   192,   135,   134,   166,
+   176,   187,   135,     0,     0,    66,   134,   166,   177,   187,
+   135,     0,    66,    41,   134,   192,   133,   194,   135,     6,
+     0,    66,    44,   134,   192,   133,   194,   135,     6,     0,
+    66,    46,   134,   192,   133,   194,   135,     6,     0,    66,
+    41,   134,   192,   133,   194,   133,   194,   133,   192,   135,
+     6,     0,    66,    44,   134,   192,   133,   194,   133,   194,
+   133,   192,   135,     6,     0,    66,    46,   134,   192,   133,
+   194,   133,   194,   133,   192,   135,     6,     0,    66,    41,
+   134,   192,   133,   194,   133,   194,   133,   194,   133,   192,
+   135,     6,     0,    66,    44,   134,   192,   133,   194,   133,
+   194,   133,   194,   133,   192,   135,     6,     0,    66,    46,
+   134,   192,   133,   194,   133,   194,   133,   194,   133,   192,
+   135,     6,     0,     0,    66,    41,   134,   192,   133,   194,
+   135,   178,   134,   187,   135,     6,     0,     0,    66,    44,
+   134,   192,   133,   194,   135,   179,   134,   187,   135,     6,
+     0,     0,    66,    46,   134,   192,   133,   194,   135,   180,
+   134,   187,   135,     6,     0,     0,    66,    41,   134,   192,
+   133,   194,   133,   194,   133,   192,   135,   181,   134,   187,
+   135,     6,     0,     0,    66,    44,   134,   192,   133,   194,
+   133,   194,   133,   192,   135,   182,   134,   187,   135,     6,
+     0,     0,    66,    46,   134,   192,   133,   194,   133,   194,
+   133,   192,   135,   183,   134,   187,   135,     6,     0,     0,
+    66,    41,   134,   192,   133,   194,   133,   194,   133,   194,
+   133,   192,   135,   184,   134,   187,   135,     6,     0,     0,
+    66,    44,   134,   192,   133,   194,   133,   194,   133,   194,
+   133,   192,   135,   185,   134,   187,   135,     6,     0,     0,
+    66,    46,   134,   192,   133,   194,   133,   194,   133,   194,
+   133,   192,   135,   186,   134,   187,   135,     6,     0,   188,
+     0,   187,   188,     0,    73,   134,   192,   135,     6,     0,
+    73,   134,   197,   133,   197,   135,     6,     0,    73,   134,
+   197,   133,   197,   133,   197,   135,     6,     0,    69,     6,
+     0,    55,    44,   197,     7,   192,     6,     0,    55,    44,
+   197,     7,   192,    58,    60,   192,     6,     0,    55,    44,
+   197,     7,   192,    58,    59,   192,     6,     0,    55,    46,
+   134,   192,   135,     7,   197,     6,     0,    55,    46,   134,
+   192,   135,     7,   197,     4,     6,     0,    52,    46,   134,
+   192,   135,     7,   197,     6,     0,    55,    48,   134,   192,
+   135,     7,   197,     6,     0,    69,    46,   197,     7,   192,
+     6,     0,    69,    46,   197,     6,     0,    41,   134,   199,
+   135,    90,    46,   134,   192,   135,     6,     0,    44,   134,
+   199,   135,    90,    46,   134,   192,   135,     6,     0,    44,
+   134,   199,   135,    90,    48,   134,   192,   135,     6,     0,
+    46,   134,   199,   135,    90,    48,   134,   192,   135,     6,
+     0,    71,     6,     0,   193,     0,   127,   192,   128,     0,
+   118,   192,     0,   117,   192,     0,   122,   192,     0,   192,
+   118,   192,     0,   192,   117,   192,     0,   192,   119,   192,
+     0,   192,   120,   192,     0,   192,   121,   192,     0,   192,
+   126,   192,     0,   192,   113,   192,     0,   192,   115,   192,
+     0,   192,   114,   192,     0,   192,   116,   192,     0,   192,
+   111,   192,     0,   192,   112,   192,     0,   192,   110,   192,
+     0,   192,   109,   192,     0,   192,   108,   192,     8,   192,
+     0,    12,   127,   192,   128,     0,    13,   127,   192,   128,
+     0,    14,   127,   192,   128,     0,    15,   127,   192,   128,
+     0,    16,   127,   192,   128,     0,    17,   127,   192,   128,
+     0,    18,   127,   192,   128,     0,    19,   127,   192,   128,
+     0,    20,   127,   192,   128,     0,    22,   127,   192,   128,
+     0,    23,   127,   192,   133,   192,   128,     0,    24,   127,
+   192,   128,     0,    25,   127,   192,   128,     0,    26,   127,
+   192,   128,     0,    27,   127,   192,   128,     0,    28,   127,
+   192,   128,     0,    29,   127,   192,   128,     0,    30,   127,
+   192,   133,   192,   128,     0,    31,   127,   192,   133,   192,
+   128,     0,    32,   127,   192,   133,   192,   128,     0,    21,
+   127,   192,   128,     0,    12,   129,   192,   130,     0,    13,
+   129,   192,   130,     0,    14,   129,   192,   130,     0,    15,
+   129,   192,   130,     0,    16,   129,   192,   130,     0,    17,
+   129,   192,   130,     0,    18,   129,   192,   130,     0,    19,
+   129,   192,   130,     0,    20,   129,   192,   130,     0,    22,
+   129,   192,   130,     0,    23,   129,   192,   133,   192,   130,
+     0,    24,   129,   192,   130,     0,    25,   129,   192,   130,
+     0,    26,   129,   192,   130,     0,    27,   129,   192,   130,
+     0,    28,   129,   192,   130,     0,    29,   129,   192,   130,
+     0,    30,   129,   192,   133,   192,   130,     0,    31,   129,
+   192,   133,   192,   130,     0,    32,   129,   192,   133,   192,
+   130,     0,    21,   129,   192,   130,     0,     3,     0,     9,
+     0,    10,     0,    11,     0,   101,     0,   102,     0,   103,
+     0,     4,     0,     4,   136,   134,   192,   135,     0,     4,
+   129,   192,   130,     0,   132,     4,   129,   130,     0,     4,
+   160,     0,     4,   129,   192,   130,   160,     0,     4,   131,
+     4,     0,     4,   129,   192,   130,   131,     4,     0,     4,
+   131,     4,   160,     0,     4,   129,   192,   130,   131,     4,
+   160,     0,   100,   127,     5,   133,   192,   128,     0,   195,
+     0,   118,   194,     0,   117,   194,     0,   194,   118,   194,
+     0,   194,   117,   194,     0,   134,   192,   133,   192,   133,
+   192,   133,   192,   133,   192,   135,     0,   134,   192,   133,
+   192,   133,   192,   133,   192,   135,     0,   134,   192,   133,
+   192,   133,   192,   135,     0,   127,   192,   133,   192,   133,
+   192,   128,     0,   197,     0,   196,   133,   197,     0,   192,
+     0,   198,     0,   134,   135,     0,   134,   199,   135,     0,
+   118,   134,   199,   135,     0,   192,     8,   192,     0,   192,
+     8,   192,     8,   192,     0,    41,   134,   192,   135,     0,
+   164,     0,   167,     0,   173,     0,     4,   129,   130,     0,
+   118,     4,   129,   130,     0,     4,   129,   134,   199,   135,
+   130,     0,   118,     4,   129,   134,   199,   135,   130,     0,
+   192,     0,   198,     0,   199,   133,   192,     0,   199,   133,
+   198,     0,   134,   192,   133,   192,   133,   192,   133,   192,
+   135,     0,   134,   192,   133,   192,   133,   192,   135,     0,
+     4,     0,     4,   131,    87,   131,     4,     0,   134,   202,
+   135,     0,     4,   129,   192,   130,   131,    88,     0,   200,
+     0,   202,   133,   200,     0,     5,     0,    40,     0,    35,
+   127,   203,   133,   203,   128,     0,    36,   127,   203,   128,
+     0,    37,   127,   203,   128,     0,    34,   127,   203,   128,
+     0,    34,   127,   203,   133,   199,   128,     0,    34,   127,
+     4,   131,     4,   128,     0,    34,   127,     4,   129,   192,
+   130,   131,     4,   128,     0
 };
 
 #endif
@@ -519,24 +520,24 @@ static const short yyrline[] = { 0,
   1803,  1809,  1818,  1831,  1882,  1897,  1908,  1928,  1938,  1960,
   1964,  1969,  1974,  1984,  2001,  2017,  2043,  2070,  2102,  2109,
   2114,  2120,  2124,  2132,  2141,  2149,  2157,  2162,  2170,  2175,
-  2183,  2188,  2198,  2205,  2212,  2219,  2226,  2233,  2240,  2247,
-  2254,  2261,  2266,  2273,  2278,  2285,  2290,  2297,  2302,  2309,
-  2314,  2321,  2326,  2333,  2338,  2345,  2350,  2357,  2362,  2372,
-  2376,  2381,  2391,  2413,  2437,  2445,  2464,  2482,  2500,  2529,
-  2564,  2569,  2596,  2610,  2628,  2635,  2641,  2644,  2652,  2662,
-  2664,  2665,  2666,  2667,  2668,  2669,  2670,  2671,  2678,  2679,
-  2680,  2681,  2682,  2683,  2684,  2685,  2686,  2687,  2688,  2689,
+  2183,  2188,  2196,  2201,  2210,  2217,  2224,  2231,  2238,  2245,
+  2252,  2259,  2266,  2273,  2278,  2285,  2290,  2297,  2302,  2309,
+  2314,  2321,  2326,  2333,  2338,  2345,  2350,  2357,  2362,  2369,
+  2374,  2384,  2388,  2393,  2403,  2425,  2449,  2457,  2476,  2494,
+  2512,  2541,  2576,  2581,  2608,  2622,  2640,  2647,  2653,  2656,
+  2664,  2674,  2676,  2677,  2678,  2679,  2680,  2681,  2682,  2683,
   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,  2736,  2741,  2742,  2743,  2744,  2745,  2746,  2750,  2766,
-  2781,  2801,  2815,  2828,  2851,  2869,  2887,  2905,  2923,  2930,
-  2935,  2939,  2943,  2947,  2953,  2958,  2962,  2966,  2972,  2978,
-  2985,  2991,  2995,  3000,  3004,  3015,  3022,  3033,  3053,  3063,
-  3073,  3083,  3100,  3119,  3143,  3171,  3177,  3181,  3185,  3197,
-  3202,  3214,  3221,  3242,  3247,  3261,  3267,  3273,  3278,  3286,
-  3294,  3308,  3322,  3326,  3345,  3367
+  2710,  2711,  2712,  2713,  2714,  2715,  2716,  2717,  2718,  2719,
+  2720,  2721,  2723,  2724,  2725,  2726,  2727,  2728,  2729,  2730,
+  2731,  2732,  2733,  2734,  2735,  2736,  2737,  2738,  2739,  2740,
+  2741,  2742,  2743,  2748,  2753,  2754,  2755,  2756,  2757,  2758,
+  2762,  2778,  2793,  2813,  2827,  2840,  2863,  2881,  2899,  2917,
+  2935,  2942,  2947,  2951,  2955,  2959,  2965,  2970,  2974,  2978,
+  2984,  2990,  2997,  3003,  3007,  3012,  3016,  3027,  3034,  3045,
+  3065,  3075,  3085,  3095,  3112,  3131,  3155,  3183,  3189,  3193,
+  3197,  3209,  3214,  3226,  3233,  3254,  3259,  3273,  3279,  3285,
+  3290,  3298,  3306,  3320,  3334,  3338,  3357,  3379
 };
 #endif
 
@@ -566,7 +567,7 @@ static const char * const yytname[] = {   "$","error","$undefined.","tDOUBLE",
 "Time","@5","Grain","NumericAffectation","NumericIncrement","Affectation","PhysicalId",
 "Shape","Transform","MultipleShape","ListOfShapes","Duplicata","Delete","Colorify",
 "Visibility","Command","Loop","Extrude","@6","@7","@8","@9","@10","@11","@12",
-"@13","@14","@15","@16","@17","ExtrudeParameters","ExtrudeParameter","Transfinite",
+"@13","@14","@15","@16","@17","@18","ExtrudeParameters","ExtrudeParameter","Transfinite",
 "Embedding","Coherence","FExpr","FExpr_Single","VExpr","VExpr_Single","RecursiveListOfListOfDouble",
 "ListOfDouble","FExpr_Multi","RecursiveListOfDouble","ColorExpr","ListOfColor",
 "RecursiveListOfColor","StringExpr", NULL
@@ -590,24 +591,24 @@ static const short yyr1[] = {     0,
    170,   170,   170,   171,   171,   171,   171,   171,   171,   171,
    171,   171,   171,   172,   172,   172,   172,   172,   172,   172,
    172,   172,   172,   173,   173,   173,   174,   173,   175,   173,
-   176,   173,   173,   173,   173,   173,   173,   173,   173,   173,
-   173,   177,   173,   178,   173,   179,   173,   180,   173,   181,
+   176,   173,   177,   173,   173,   173,   173,   173,   173,   173,
+   173,   173,   173,   178,   173,   179,   173,   180,   173,   181,
    173,   182,   173,   183,   173,   184,   173,   185,   173,   186,
-   186,   187,   187,   187,   187,   188,   188,   188,   188,   188,
-   188,   188,   188,   188,   189,   189,   189,   189,   190,   191,
-   191,   191,   191,   191,   191,   191,   191,   191,   191,   191,
-   191,   191,   191,   191,   191,   191,   191,   191,   191,   191,
-   191,   191,   191,   191,   191,   191,   191,   191,   191,   191,
-   191,   191,   191,   191,   191,   191,   191,   191,   191,   191,
-   191,   191,   191,   191,   191,   191,   191,   191,   191,   191,
-   191,   191,   191,   191,   191,   191,   191,   191,   191,   191,
+   173,   187,   187,   188,   188,   188,   188,   189,   189,   189,
+   189,   189,   189,   189,   189,   189,   190,   190,   190,   190,
    191,   192,   192,   192,   192,   192,   192,   192,   192,   192,
-   192,   192,   192,   192,   192,   192,   192,   192,   192,   193,
-   193,   193,   193,   193,   194,   194,   194,   194,   195,   195,
-   196,   196,   196,   196,   196,   197,   197,   197,   197,   197,
-   197,   197,   197,   197,   197,   198,   198,   198,   198,   199,
-   199,   199,   199,   200,   200,   201,   201,   202,   202,   202,
-   202,   202,   202,   202,   202,   202
+   192,   192,   192,   192,   192,   192,   192,   192,   192,   192,
+   192,   192,   192,   192,   192,   192,   192,   192,   192,   192,
+   192,   192,   192,   192,   192,   192,   192,   192,   192,   192,
+   192,   192,   192,   192,   192,   192,   192,   192,   192,   192,
+   192,   192,   192,   192,   192,   192,   192,   192,   192,   192,
+   192,   192,   192,   193,   193,   193,   193,   193,   193,   193,
+   193,   193,   193,   193,   193,   193,   193,   193,   193,   193,
+   193,   194,   194,   194,   194,   194,   195,   195,   195,   195,
+   196,   196,   197,   197,   197,   197,   197,   198,   198,   198,
+   198,   198,   198,   198,   198,   198,   198,   199,   199,   199,
+   199,   200,   200,   200,   200,   201,   201,   202,   202,   203,
+   203,   203,   203,   203,   203,   203,   203,   203
 };
 
 static const short yyr2[] = {     0,
@@ -627,24 +628,24 @@ static const short yyr2[] = {     0,
      3,     4,     4,     3,     7,     7,     3,     7,     3,     2,
      2,    15,     2,     6,     8,     8,    10,     1,     2,     1,
      3,     4,     1,     5,    11,    13,     0,     7,     0,    13,
-     0,    15,     8,     8,     8,    12,    12,    12,    14,    14,
-    14,     0,    12,     0,    12,     0,    12,     0,    16,     0,
-    16,     0,    16,     0,    18,     0,    18,     0,    18,     1,
-     2,     5,     7,     9,     2,     6,     9,     9,     8,     9,
-     8,     8,     6,     4,    10,    10,    10,    10,     2,     1,
-     3,     2,     2,     2,     3,     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,     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,     3,     5,     4,     1,     1,
-     1,     3,     4,     6,     7,     1,     1,     3,     3,     9,
-     7,     1,     5,     3,     6,     1,     3,     1,     1,     6,
-     4,     4,     4,     6,     6,     9
+     0,    15,     0,     6,     8,     8,     8,    12,    12,    12,
+    14,    14,    14,     0,    12,     0,    12,     0,    12,     0,
+    16,     0,    16,     0,    16,     0,    18,     0,    18,     0,
+    18,     1,     2,     5,     7,     9,     2,     6,     9,     9,
+     8,     9,     8,     8,     6,     4,    10,    10,    10,    10,
+     2,     1,     3,     2,     2,     2,     3,     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,     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,     3,     5,     4,
+     1,     1,     1,     3,     4,     6,     7,     1,     1,     3,
+     3,     9,     7,     1,     5,     3,     6,     1,     3,     1,
+     1,     6,     4,     4,     4,     6,     6,     9
 };
 
 static const short yydefact[] = {     0,
@@ -654,1296 +655,1296 @@ static const short yydefact[] = {     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,   148,     0,   153,     0,   150,     0,     0,     0,
      0,     4,     6,     5,     7,     8,     9,    10,    11,    12,
-    13,    19,    18,    14,    15,    16,    17,   272,   279,   328,
-    54,   273,   274,   275,     0,     0,     0,     0,     0,     0,
+    13,    19,    18,    14,    15,    16,    17,   274,   281,   330,
+    54,   275,   276,   277,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,   329,
-     0,   276,   277,   278,    55,    56,    57,    58,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   331,
+     0,   278,   279,   280,    55,    56,    57,    58,     0,     0,
      0,    59,    60,     0,     0,     0,     0,     0,     0,     0,
-   210,     0,     0,   141,     0,   143,     0,     0,     0,     0,
+   212,     0,     0,   141,     0,   143,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   290,     0,
-     0,     0,     0,     0,     0,     0,     0,   115,     0,     0,
-   115,   209,     0,     0,     0,     0,     0,     0,     0,     0,
-   322,     0,     0,     0,     0,     0,   140,     0,   149,   328,
-   115,     0,   115,     0,     0,     0,     0,     0,   283,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   292,     0,
+     0,     0,     0,     0,   115,     0,     0,   115,     0,     0,
+   115,   211,     0,     0,     0,     0,     0,     0,     0,     0,
+   324,     0,     0,     0,     0,     0,   140,     0,   149,   330,
+   115,     0,   115,     0,     0,     0,     0,     0,   285,     0,
     28,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   279,   213,
-   212,   214,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   281,   215,
+   214,   216,     0,     0,     0,     0,     0,     0,     0,     0,
      0,    66,   137,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,   134,     0,
-     0,     0,   279,     0,     0,   309,   310,   311,   316,   317,
+     0,     0,   281,     0,     0,   311,   312,   313,   318,   319,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,   301,     0,   302,     0,     0,     0,     0,
+     0,     0,     0,   303,     0,   304,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-   292,   291,     0,     0,     0,     0,   115,   115,     0,     0,
-     0,     0,     0,     0,     0,     0,   115,     0,     0,     0,
-     0,   127,     0,     0,     0,     0,     0,     0,   139,     0,
-     0,     0,     0,     0,   115,     0,     0,     0,   151,     0,
-   130,     0,   131,     0,     0,   285,     0,     0,     0,     0,
+   294,   293,     0,     0,     0,     0,   115,   115,     0,     0,
+     0,     0,     0,     0,     0,   163,     0,   115,     0,     0,
+     0,     0,   127,     0,     0,     0,     0,     0,     0,   139,
+     0,     0,     0,     0,     0,   115,     0,     0,     0,   151,
+     0,   130,     0,   131,     0,     0,   287,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   211,     0,
-     0,     0,     0,    54,     0,     0,     0,     0,     0,    61,
-     0,   228,   227,   225,   226,   221,   223,   222,   224,   216,
-   215,   217,   218,   219,   220,     0,     0,     0,     0,     0,
-     0,   279,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,   303,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,    80,    81,
-     0,     0,     0,     0,     0,     0,     0,   294,   293,   114,
-     0,   113,   112,     0,     0,     0,     0,     0,     0,     0,
-   157,     0,     0,     0,     0,     0,   121,   116,   204,     0,
-   128,     0,   125,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,   152,   132,   133,     0,   281,
-   287,     0,    28,    39,     0,     0,     0,    51,     0,     0,
-    29,    30,    31,    32,    33,    34,   230,   251,   231,   252,
-   232,   253,   233,   254,   234,   255,   235,   256,   236,   257,
-   237,   258,   238,   259,   250,   271,   239,   260,     0,     0,
-   241,   262,   242,   263,   243,   264,   244,   265,   245,   266,
-   246,   267,     0,     0,     0,     0,     0,     0,     0,     0,
-   333,     0,     0,   331,   332,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,    72,     0,     0,     0,     0,
-   282,     0,    22,    20,     0,     0,     0,     0,     0,   312,
-     0,     0,     0,   306,   318,   319,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   304,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   213,
+     0,     0,     0,     0,    54,     0,     0,     0,     0,     0,
+    61,     0,   230,   229,   227,   228,   223,   225,   224,   226,
+   218,   217,   219,   220,   221,   222,     0,     0,     0,     0,
+     0,     0,   281,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   305,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    80,
+    81,     0,     0,     0,     0,     0,     0,     0,   296,   295,
+   114,     0,   113,   112,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,   116,     0,     0,   157,     0,   121,
+   206,     0,   128,     0,   125,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   152,   132,   133,
+     0,   283,   289,     0,    28,    39,     0,     0,     0,    51,
+     0,     0,    29,    30,    31,    32,    33,    34,   232,   253,
+   233,   254,   234,   255,   235,   256,   236,   257,   237,   258,
+   238,   259,   239,   260,   240,   261,   252,   273,   241,   262,
+     0,     0,   243,   264,   244,   265,   245,   266,   246,   267,
+   247,   268,   248,   269,     0,     0,     0,     0,     0,     0,
+     0,     0,   335,     0,     0,   333,   334,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,    72,     0,     0,
+     0,     0,   284,     0,    22,    20,     0,     0,     0,     0,
+     0,   314,     0,     0,     0,   308,   320,   321,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,   108,   110,     0,     0,
-     0,     0,     0,   154,     0,     0,     0,     0,     0,     0,
+   306,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   108,   110,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,   129,     0,     0,     0,     0,   284,     0,   280,     0,
-     0,     0,     0,     0,     0,     0,    26,     0,     0,     0,
+     0,   192,     0,   154,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   129,     0,     0,
+     0,     0,   286,     0,   282,     0,     0,     0,     0,     0,
+     0,     0,    26,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,   283,    64,    65,     0,
+     0,     0,     0,     0,    67,    68,    70,     0,     0,   328,
+     0,    76,   231,    21,     0,     0,     0,     0,     0,     0,
+   310,   315,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,   307,    87,     0,     0,
+     0,     0,   198,     0,     0,     0,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-   281,    64,    65,     0,     0,     0,     0,     0,    67,    68,
-    70,     0,     0,   326,     0,    76,   229,    21,     0,     0,
-     0,     0,     0,     0,   308,   313,     0,     0,     0,     0,
+     0,     0,     0,   197,     0,   164,   193,     0,     0,   122,
+   205,   126,    85,    86,   123,   124,     0,     0,     0,   325,
+     0,     0,     0,   144,   136,   288,   135,     0,     0,     0,
+     0,     0,   301,     0,     0,   242,   263,   249,   270,   250,
+   271,   251,   272,     0,   337,   336,   332,   291,     0,    54,
+     0,     0,     0,     0,    62,     0,     0,     0,   326,    23,
+    24,     0,     0,    82,     0,     0,     0,   309,     0,    90,
+     0,    92,     0,     0,    88,     0,     0,   102,     0,     0,
+    89,   106,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,   138,     0,     0,     0,     0,
+   115,     0,   174,     0,   176,     0,   178,     0,     0,     0,
+     0,   303,     0,     0,     0,   158,    95,    96,     0,     0,
+     0,     0,   290,    27,     0,    35,     0,     0,     0,     0,
+     0,    37,     0,     0,     0,     0,     0,    73,     0,     0,
+    74,     0,   329,     0,     0,     0,   316,     0,     0,     0,
+     0,    98,     0,     0,   103,     0,     0,   203,   100,   101,
+     0,     0,     0,   201,   204,   105,    84,    99,   104,   107,
+     0,     0,     0,   300,     0,   299,     0,     0,   165,     0,
+     0,   166,     0,     0,   167,     0,   117,   118,   119,   120,
+     0,     0,     0,     0,     0,     0,   323,     0,   146,   145,
+    40,     0,     0,     0,   302,     0,     0,     0,     0,     0,
+    63,    69,    71,     0,    77,     0,    25,     0,     0,   317,
+     0,    91,    93,     0,     0,     0,     0,   200,   199,   202,
+    78,    79,   115,     0,   111,     0,     0,     0,     0,     0,
+     0,   194,     0,   115,     0,     0,     0,     0,     0,    36,
+     0,     0,     0,    38,    52,    53,   338,     0,   327,     0,
+     0,   207,   208,   209,   210,     0,     0,     0,   298,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-   305,    87,     0,     0,     0,     0,   196,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,   190,   122,     0,
-     0,     0,     0,   203,   126,    85,    86,   123,   124,     0,
-     0,     0,   323,     0,     0,     0,   144,   136,   286,   135,
-     0,     0,     0,     0,     0,   299,     0,     0,   240,   261,
-   247,   268,   248,   269,   249,   270,     0,   335,   334,   330,
-   289,     0,    54,     0,     0,     0,     0,    62,     0,     0,
-     0,   324,    23,    24,     0,     0,    82,     0,     0,     0,
-   307,     0,    90,     0,    92,     0,     0,    88,     0,     0,
-   102,     0,     0,    89,   106,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   138,     0,
-     0,     0,     0,   115,     0,   172,     0,   174,     0,   176,
-     0,     0,   195,     0,   158,   191,     0,     0,     0,     0,
-    95,    96,     0,     0,     0,     0,   288,    27,     0,    35,
-     0,     0,     0,     0,     0,    37,     0,     0,     0,     0,
-     0,    73,     0,     0,    74,     0,   327,     0,     0,     0,
-   314,     0,     0,     0,     0,    98,     0,     0,   103,     0,
-     0,   201,   100,   101,     0,     0,     0,   199,   202,   105,
-    84,    99,   104,   107,     0,     0,     0,   298,     0,   297,
-     0,     0,   163,     0,     0,   164,     0,     0,   165,     0,
-     0,     0,   301,     0,   117,   118,   119,   120,     0,     0,
-   321,     0,   146,   145,    40,     0,     0,     0,   300,     0,
-     0,     0,     0,     0,    63,    69,    71,     0,    77,     0,
-    25,     0,     0,   315,     0,    91,    93,     0,     0,     0,
-     0,   198,   197,   200,    78,    79,   115,     0,   111,     0,
-     0,     0,     0,     0,     0,   115,     0,     0,     0,     0,
-     0,     0,     0,    36,     0,     0,     0,    38,    52,    53,
-   336,     0,   325,     0,     0,   205,   206,   207,   208,     0,
-     0,     0,   296,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,   159,     0,   192,     0,     0,   320,   147,     0,
-     0,     0,     0,    75,     0,     0,     0,   109,     0,   178,
-     0,     0,   180,     0,     0,   182,     0,     0,   155,     0,
-   115,     0,     0,    97,     0,    44,     0,    50,     0,    83,
-     0,   295,   166,     0,     0,   173,   167,     0,     0,   175,
-   168,     0,     0,   177,     0,   161,     0,   193,     0,     0,
-     0,     0,     0,     0,   184,     0,   186,     0,   188,   160,
-   156,     0,     0,    41,     0,    48,     0,     0,     0,   169,
-     0,     0,   170,     0,     0,   171,     0,     0,   194,     0,
-    42,     0,   142,     0,     0,     0,     0,     0,     0,     0,
-   162,     0,     0,     0,     0,   179,     0,   181,     0,   183,
-     0,    43,    45,     0,    46,    94,     0,     0,     0,     0,
-     0,   185,   187,   189,    47,    49,     0,     0,     0
+   159,     0,     0,   322,   147,     0,     0,     0,     0,    75,
+     0,     0,     0,   109,     0,   180,     0,     0,   182,     0,
+     0,   184,     0,     0,     0,   195,   155,     0,   115,    97,
+     0,    44,     0,    50,     0,    83,     0,   297,   168,     0,
+     0,   175,   169,     0,     0,   177,   170,     0,     0,   179,
+     0,     0,   161,     0,     0,     0,     0,     0,     0,   186,
+     0,   188,     0,   190,   196,   160,   156,     0,    41,     0,
+    48,     0,     0,     0,   171,     0,     0,   172,     0,     0,
+   173,     0,     0,     0,    42,     0,   142,     0,     0,     0,
+     0,     0,     0,     0,   162,     0,     0,     0,     0,   181,
+     0,   183,     0,   185,     0,    43,    45,     0,    46,    94,
+     0,     0,     0,     0,     0,   187,   189,   191,    47,    49,
+     0,     0,     0
 };
 
-static const short yydefgoto[] = {  1177,
-     2,    52,   615,    53,    54,   369,   899,   905,   541,   691,
-  1023,  1140,   542,  1110,  1164,   543,  1142,   544,   545,   695,
-   546,   118,   199,    55,   478,   508,   286,   491,   492,   287,
-    59,    60,    61,    62,    63,   288,   665,  1080,  1122,   954,
-   957,   960,  1094,  1098,  1102,  1131,  1134,  1137,   777,   778,
-    65,    66,    67,   304,   121,   321,   159,   805,   806,   306,
-   291,   183,   610,   725,   480
+static const short yydefgoto[] = {  1181,
+     2,    52,   617,    53,    54,   370,   905,   911,   543,   697,
+  1029,  1144,   544,  1115,  1168,   545,  1146,   546,   547,   701,
+   548,   118,   199,    55,   479,   505,   286,   492,   493,   287,
+    59,    60,    61,    62,    63,   288,   675,  1088,  1128,   506,
+   960,   963,   966,  1100,  1104,  1108,  1136,  1139,  1142,   671,
+   672,    65,    66,    67,   304,   121,   321,   159,   812,   813,
+   306,   291,   183,   612,   731,   481
 };
 
-static const short yypact[] = {  2404,
-    42,  2473,-32768,  1769,   -76,    -1,    51,   -90,   -39,   -29,
-   -28,   -26,   -62,   -13,    13,    76,    18,    86,   122,   143,
-   396,    81,   558,    87,   256,    98,    98,   268,   299,     5,
-   171,    21,   422,     1,   430,   437,   450,   338,   345,   370,
-    26,     7,-32768,   378,-32768,   503,-32768,   508,   523,    19,
-    31,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    12,    27,
--32768,-32768,-32768,-32768,   119,   120,   169,   220,   240,   326,
-   389,   394,   461,   464,   476,   483,   496,   500,   501,   512,
-   516,   519,   541,   545,   546,   414,   418,   432,   440,-32768,
-   444,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1966,  1966,
-  1966,-32768,-32768,  1966,  1382,    25,   590,  1966,   594,  1123,
--32768,   603,   617,-32768,  1966,-32768,  1966,  1899,  1966,  1966,
-   488,  1966,  1899,  1966,   511,  1899,  1966,  1966,  1315,  1966,
-   513,   515,   535,  1315,   547,   561,   578,   581,   638,   650,
-   657,   735,    98,    98,    98,  1966,  1966,   221,-32768,   287,
-    98,   661,   662,   665,  1608,   346,   671,-32768,  1315,    22,
--32768,-32768,  1315,  1315,   685,   696,   814,  1966,  1966,  1966,
-   701,  1966,   706,   751,  1966,  1966,-32768,   839,-32768,-32768,
--32768,   840,-32768,   841,   719,  1966,   845,   717,-32768,    98,
--32768,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,
-  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,
-  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,
-  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,
-  1966,  1966,  1966,   441,   502,   502,   502,   847,    -6,   727,
-   727,   727,  4897,    15,  1899,  4184,   325,   723,   849,   728,
-  1156,-32768,-32768,  1966,  1966,  1966,  1966,  1966,  1966,  1966,
-  1966,  1966,  1966,  1966,  1966,  1966,  1966,  1966,-32768,    65,
-  3430,  4918,   490,   725,  2091,-32768,-32768,-32768,  2208,-32768,
-   276,  4939,  4960,  1966,  4981,   543,  5002,  1966,   544,  5023,
-  5044,  1734,  1188,  2208,   853,-32768,  5065,  1966,  1966,  1966,
-   854,  1966,  1966,  1966,  2024,  2024,  2024,  2024,   734,   -55,
--32768,-32768,  3456,  3482,    98,    98,   635,   635,   177,  1966,
-  1966,  1966,  1608,  1608,  1966,   281,-32768,  1966,   610,   196,
-   857,-32768,  1966,  2532,   858,   860,  1966,  1966,-32768,  5086,
-  5107,  5128,   777,  3508,-32768,   736,  2236,  5149,-32768,  2549,
--32768,  2593,-32768,  1966,  4207,   181,  1966,   376,     3,  5170,
-  4230,  5191,  4253,  5212,  4276,  5233,  4299,  5254,  4322,  5275,
-  4345,  5296,  4368,  5317,  4391,  5338,  4414,  5359,  4437,  5380,
-  4460,  3534,  3560,  5401,  4483,  5422,  4506,  5443,  4529,  5464,
-  4552,  5485,  4575,  5506,  4598,  3586,  3612,  3638,  3664,  3690,
-  3716,   582,   259,   738,   740,   741,   744,  1966,-32768,  1315,
-  1315,   601,   114,   502,  1966,   867,   871,    30,   748,-32768,
-  2255,   692,  1309,   570,   570,   443,   443,   443,   443,   103,
-   103,   727,   727,   727,   727,    32,  1899,  1966,    20,  1441,
-  1966,   583,  1966,  1899,   789,   874,   875,  5527,   876,   794,
-   878,  5548,   797,   881,   882,  1899,-32768,   602,  1966,   884,
-  2670,  5569,  5590,  1966,  2760,  2788,  5611,   764,  5842,-32768,
-   765,   766,   767,   768,    98,  1966,  1966,-32768,-32768,-32768,
-   761,  1098,-32768,   769,  1966,  3742,  3768,  3794,  3404,    98,
-  2615,  4621,    10,   -27,   -25,    60,-32768,-32768,-32768,  1966,
--32768,  4644,-32768,  1315,  1315,  4667,  4690,   895,   896,   898,
-   775,  1966,  2659,  1966,  1966,-32768,-32768,-32768,  4713,    68,
--32768,  2816,-32768,-32768,   780,   783,   779,-32768,   788,   911,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+static const short yypact[] = {  2365,
+    59,  2434,-32768,  1756,   -45,     1,    73,   -63,   -41,   -27,
+   -60,   -16,   -18,    -2,    29,    91,    87,   104,   124,   179,
+    -8,   188,   328,   207,   210,   301,   301,   221,   407,     6,
+   313,    10,   371,    85,   390,   413,   439,   334,   337,   341,
+    11,    24,-32768,   374,-32768,   444,-32768,   483,   489,     8,
+    21,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,     7,    12,
+-32768,-32768,-32768,-32768,   182,   211,   225,   296,   309,   315,
+   365,   377,   383,   392,   393,   402,   420,   432,   455,   481,
+   482,   495,   498,   502,   514,   387,   403,   424,   425,-32768,
+   428,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1953,  1953,
+  1953,-32768,-32768,  1953,  1369,    18,   494,  1953,   563,   849,
+-32768,   572,   561,-32768,  1953,-32768,  1953,  1886,  1953,  1953,
+   452,  1953,  1886,  1953,   456,  1886,  1953,  1953,  1302,  1953,
+   496,   460,   466,  1302,   506,   510,   470,   499,   527,   537,
+   538,   586,   301,   301,   301,  1953,  1953,   -93,-32768,   105,
+   301,   535,   536,   544,  1595,   214,   565,-32768,  1302,    23,
+-32768,-32768,  1302,  1302,   573,   578,   705,  1953,  1953,  1953,
+   601,  1953,   583,   658,  1953,  1953,-32768,   735,-32768,-32768,
+-32768,   736,-32768,   747,   625,  1953,   754,   640,-32768,   301,
+-32768,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,
+  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,
+  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,
+  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,
+  1953,  1953,  1953,   503,   528,   528,   528,   770,   492,   653,
+   653,   653,  4874,    30,  1886,  4161,   303,   678,   776,   660,
+   878,-32768,-32768,  1953,  1953,  1953,  1953,  1953,  1953,  1953,
+  1953,  1953,  1953,  1953,  1953,  1953,  1953,  1953,-32768,   -13,
+  3407,  4895,   543,   714,  2078,-32768,-32768,-32768,  2152,-32768,
+   342,  4916,  4937,  1953,  4958,   512,  4979,  1953,   515,  5000,
+  5021,  1721,  1164,  2152,   809,-32768,  5042,  1953,  1953,  1953,
+   812,  1953,  1953,  1953,  2011,  2011,  2011,  2011,   703,    50,
+-32768,-32768,  3433,  3459,   301,   301,   634,   634,   287,  1953,
+  1953,  1953,  1595,  1595,  1953,  2703,   323,-32768,  1953,   999,
+   196,   833,-32768,  1953,  2493,   846,   847,  1953,  1953,-32768,
+  5063,  5084,  5105,   769,  3485,-32768,   724,  2174,  5126,-32768,
+  2510,-32768,  2554,-32768,  1953,  4184,   261,  1953,   345,    14,
+  5147,  4207,  5168,  4230,  5189,  4253,  5210,  4276,  5231,  4299,
+  5252,  4322,  5273,  4345,  5294,  4368,  5315,  4391,  5336,  4414,
+  5357,  4437,  3511,  3537,  5378,  4460,  5399,  4483,  5420,  4506,
+  5441,  4529,  5462,  4552,  5483,  4575,  3563,  3589,  3615,  3641,
+  3667,  3693,   520,    20,   727,   731,   733,   730,  1953,-32768,
+  1302,  1302,   554,   114,   528,  1953,   858,   862,    13,   737,
+-32768,  2193,  1158,  1045,   992,   992,   726,   726,   726,   726,
+   486,   486,   653,   653,   653,   653,    54,  1886,  1953,    28,
+  1428,  1953,   689,  1953,  1886,   778,   863,   864,  5504,   865,
+   779,   867,  5525,   785,   869,   870,  1886,-32768,   557,  1953,
+   871,  1236,  5546,  5567,  1953,  2737,  2765,  5588,   752,  5819,
+-32768,   757,   758,   760,   751,   301,  1953,  1953,-32768,-32768,
+-32768,   755,  2703,-32768,   756,  1953,  3719,  3745,  3771,  3381,
+   -59,   -17,    55,   -51,-32768,    39,   301,  2576,  4598,-32768,
+-32768,  1953,-32768,  4621,-32768,  1302,  1302,  4644,  4667,   885,
+   887,   888,   765,  1953,  2620,  1953,  1953,-32768,-32768,-32768,
+  4690,    67,-32768,  2793,-32768,-32768,   771,   772,   766,-32768,
+   774,   896,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
 -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1966,  1966,
 -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,  1966,  1966,  1966,  1966,  1966,  1966,  1966,   917,
--32768,  1899,   502,-32768,-32768,  1966,  4736,   916,   918,   795,
-    28,  1966,   920,   921,  1413,-32768,   922,   799,    26,   924,
--32768,  1966,-32768,   816,   502,   285,  3820,    98,   887,-32768,
-  1899,  2844,  1573,  2281,  2208,-32768,   888,  1315,  1315,   928,
-  1315,   720,  1315,   929,   889,  1315,  1315,   637,-32768,  1534,
-   804,   932,   933,   934,   643,   938,   939,   940,   941,   944,
-   945,   946,   950,   367,  3846,  3872,-32768,-32768,  2872,    98,
-    98,    98,   373,-32768,   101,   949,  1899,  1899,  1899,  1899,
-  1706,   951,   952,   953,   957,   958,  1315,  1315,  1315,   961,
-  3898,-32768,  2303,   872,   960,   964,-32768,   963,-32768,    14,
-   829,  1966,  1966,  1315,   836,  1966,-32768,  5632,  4759,  5653,
-  4782,  5674,  4805,  5695,  4828,  4851,   843,   291,   844,  5716,
-   176,-32768,-32768,   104,   364,   842,   967,  1833,-32768,-32768,
--32768,    26,  1966,-32768,   640,-32768,  5842,-32768,   969,    52,
-  1966,    54,   861,   641,-32768,-32768,  1899,  1966,   862,    43,
-    44,  1315,   970,   865,   868,   971,  1315,   869,   972,   988,
--32768,-32768,  1966,  1315,  1315,  1315,-32768,   683,  1315,  1315,
-  1315,  1315,  1315,  1315,  1315,   742,  1966,  1966,  1966,   870,
-   -48,   219,   290,  1608,   995,   877,   -61,-32768,-32768,   645,
-   648,   654,   655,-32768,-32768,-32768,-32768,-32768,-32768,   999,
-  1000,   926,-32768,  1966,  1966,  1966,-32768,-32768,   181,-32768,
-  1002,  1966,  3924,  3950,   658,-32768,  1966,  5737,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,   883,-32768,-32768,-32768,
--32768,  1315,   502,  1966,  1007,  1011,    30,-32768,  1010,  4874,
-    26,-32768,-32768,-32768,   502,  3976,-32768,  1966,   891,   659,
-  5842,  1966,-32768,    98,-32768,    98,  1013,-32768,  1966,  1966,
--32768,  1016,  1966,-32768,-32768,  4002,  1017,  1020,  1021,  1966,
-  1966,   817,  1022,  1025,  1026,  1027,  1028,  1029,-32768,  2024,
-  2900,  5758,   983,   635,    98,  1030,    98,  1034,    98,  1035,
-  2928,   386,-32768,  1315,-32768,-32768,  1043,  1044,  1045,  1046,
--32768,-32768,  1315,  2704,   466,  5779,-32768,-32768,   334,  5842,
-  1966,  1966,  1315,   919,   691,  5842,  1315,  1050,  1049,  1051,
-  2051,-32768,  1052,  1055,-32768,   886,-32768,  1057,  1966,  2956,
--32768,   935,  2984,    78,    83,-32768,  3012,  3040,-32768,  3068,
-  1966,-32768,-32768,-32768,  2122,  2141,  1058,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,  2167,  1060,   936,-32768,  1966,-32768,
-   937,   407,-32768,   942,   411,-32768,   943,   413,-32768,   947,
-   954,  1966,   612,   956,-32768,-32768,-32768,-32768,   982,  1966,
--32768,  1966,-32768,-32768,-32768,  1966,  4028,  4054,-32768,  1315,
-  1966,  1063,  1065,   955,-32768,-32768,-32768,    26,-32768,   987,
--32768,  4080,  1071,-32768,  1073,-32768,-32768,  1074,  1078,  1079,
-  4106,-32768,-32768,-32768,-32768,-32768,   635,  2732,-32768,  1608,
-   101,  1608,   101,  1608,   101,-32768,  3096,  1080,  1315,  1966,
-  3124,  3152,   973,  5842,  1966,  1966,   694,  5842,-32768,-32768,
--32768,  1081,-32768,  1966,    98,-32768,-32768,-32768,-32768,  1101,
-   975,  1966,-32768,  3180,   415,    77,  3208,   433,   166,  3236,
-   435,   224,  2676,   977,-32768,   695,  2189,-32768,-32768,  1966,
-  5800,  4132,  1106,-32768,  4158,    89,   980,-32768,  3264,  1108,
-  1966,  1109,  1111,  1966,  1114,  1117,  1966,  1118,-32768,   101,
--32768,  1315,  1121,-32768,   700,-32768,  1966,-32768,  1966,-32768,
-  1125,-32768,-32768,   997,  3292,-32768,-32768,   998,  3320,-32768,
--32768,  1004,  3348,-32768,   233,  2720,  1001,-32768,  1127,  1019,
-  5821,  3376,  1023,   101,  1128,   101,  1152,   101,  1154,-32768,
--32768,   101,  1157,-32768,   502,-32768,  1158,  1160,   262,-32768,
-  1037,   275,-32768,  1038,   301,-32768,  1039,   303,-32768,   703,
--32768,  1040,-32768,  1033,  1163,   101,  1169,   101,  1171,   101,
--32768,   502,  1172,   502,  1173,-32768,   304,-32768,   315,-32768,
-   316,-32768,-32768,   704,-32768,-32768,  1177,  1178,  1179,   502,
-  1181,-32768,-32768,-32768,-32768,-32768,  1189,  1193,-32768
+  1953,  1953,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,  1953,  1953,  1953,  1953,  1953,  1953,
+  1953,   899,-32768,  1886,   528,-32768,-32768,  1953,  4713,   900,
+   901,   780,    26,  1953,   903,   905,  1098,-32768,   906,   783,
+    11,   908,-32768,  1953,-32768,   802,   528,    68,  3797,   301,
+   872,-32768,  1886,  2821,  1560,  2223,  2152,-32768,   873,  1302,
+  1302,   913,  1302,   607,  1302,   914,   874,  1302,  1302,   560,
+-32768,  1132,   789,   917,   919,   920,   685,   921,   922,   941,
+   942,   943,   944,   946,   967,   348,  3823,  3849,-32768,-32768,
+  2849,   301,   301,   301,  1886,  1886,  1886,  1886,   966,   842,
+    -7,-32768,   399,-32768,    39,   971,  1400,   972,   973,   974,
+   975,   976,  1302,  1302,  1302,   979,  3875,-32768,  2242,   826,
+   978,   996,-32768,   995,-32768,    19,   875,  1953,  1953,  1302,
+   876,  1953,-32768,  5609,  4736,  5630,  4759,  5651,  4782,  5672,
+  4805,  4828,   877,    83,   879,  5693,   176,-32768,-32768,   102,
+   366,   880,  1001,  1521,-32768,-32768,-32768,    11,  1953,-32768,
+   577,-32768,  5819,-32768,  1000,    57,  1953,    15,   882,   600,
+-32768,-32768,  1886,  1953,   883,    25,    27,  1302,  1003,   884,
+   886,  1006,  1302,   889,  1008,  1013,-32768,-32768,  1953,  1302,
+  1302,  1302,-32768,   339,  1302,  1302,  1302,  1302,  1302,  1302,
+  1302,   405,  1953,  1953,  1953,   891,   -48,    77,    82,   604,
+   605,   616,   624,-32768,  1302,-32768,-32768,  1595,     4,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,  1015,  1021,   945,-32768,
+  1953,  1953,  1953,-32768,-32768,   261,-32768,  1022,  1953,  3901,
+  3927,   647,-32768,  1953,  5714,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,   898,-32768,-32768,-32768,-32768,  1302,   528,
+  1953,  1026,  1029,    13,-32768,  1028,  4851,    11,-32768,-32768,
+-32768,   528,  3953,-32768,  1953,   907,   651,  5819,  1953,-32768,
+   301,-32768,   301,  1030,-32768,  1953,  1953,-32768,  1032,  1953,
+-32768,-32768,  3979,  1033,  1043,  1048,  1953,  1953,   784,  1052,
+  1053,  1054,  1055,  1056,  1057,-32768,  2011,  2877,  5735,  2262,
+   634,   301,  1059,   301,  1061,   301,  1063,  1064,  1066,  1067,
+  1069,   610,   918,  2905,   409,-32768,-32768,-32768,  1302,  2680,
+   652,  5756,-32768,-32768,    96,  5819,  1953,  1953,  1302,   950,
+   675,  5819,  1302,  1072,  1071,  1079,  1693,-32768,  1080,  1083,
+-32768,   947,-32768,  1084,  1953,  2933,-32768,   956,  2961,    43,
+    47,-32768,  2989,  3017,-32768,  3045,  1953,-32768,-32768,-32768,
+  1820,  2038,  1085,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+  2109,  1086,   959,-32768,  1953,-32768,   960,   440,-32768,   963,
+   453,-32768,   964,   459,-32768,   965,-32768,-32768,-32768,-32768,
+  1088,  1302,   968,  1953,  1016,  1953,-32768,  1953,-32768,-32768,
+-32768,  1953,  4005,  4031,-32768,  1302,  1953,  1094,  1097,   987,
+-32768,-32768,-32768,    11,-32768,  1031,-32768,  4057,  1109,-32768,
+  1111,-32768,-32768,  1115,  1117,  1118,  4083,-32768,-32768,-32768,
+-32768,-32768,   634,  2709,-32768,  1595,    39,  1595,    39,  1595,
+    39,-32768,   682,-32768,  3073,  1953,  3101,  3129,   993,  5819,
+  1953,  1953,   694,  5819,-32768,-32768,-32768,  1123,-32768,  1953,
+   301,-32768,-32768,-32768,-32768,  1125,   997,  1953,-32768,  3157,
+   463,   162,  3185,   471,   232,  3213,   484,   233,  1302,  1127,
+  2637,  1002,  2128,-32768,-32768,  1953,  5777,  4109,  1129,-32768,
+  4135,    75,  1004,-32768,  3241,  1133,  1953,  1134,  1136,  1953,
+  1138,  1139,  1953,  1140,  1012,-32768,-32768,    39,-32768,-32768,
+   697,-32768,  1953,-32768,  1953,-32768,  1143,-32768,-32768,  1035,
+  3269,-32768,-32768,  1038,  3297,-32768,-32768,  1065,  3325,-32768,
+  1144,   235,  2681,  1191,  1068,  5798,  3353,  1070,    39,  1192,
+    39,  1194,    39,  1195,-32768,-32768,-32768,    39,-32768,   528,
+-32768,  1198,  1215,   266,-32768,  1087,   280,-32768,  1089,   302,
+-32768,  1091,   317,   702,-32768,  1099,-32768,  1014,  1216,    39,
+  1226,    39,  1228,    39,-32768,   528,  1229,   528,  1230,-32768,
+   320,-32768,   322,-32768,   360,-32768,-32768,   707,-32768,-32768,
+  1231,  1248,  1249,   528,  1250,-32768,-32768,-32768,-32768,-32768,
+  1257,  1259,-32768
 };
 
 static const short yypgoto[] = {-32768,
--32768,-32768,   458,-32768,-32768,   663,-32768,   134,-32768,-32768,
+-32768,-32768,   524,-32768,-32768,   728,-32768,   195,-32768,-32768,
 -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,  -254,    35,-32768,  -241,  1219,     0,  -327,  -158,     2,
--32768,-32768,-32768,-32768,-32768,  1220,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  -994,  -646,
--32768,-32768,-32768,    48,-32768,   282,-32768,   215,   283,  -113,
-   -72,  -595,   397,-32768,    -4
+-32768,  -237,    35,-32768,   -69,  1260,     0,  -325,  -159,     2,
+-32768,-32768,-32768,-32768,-32768,  1278,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  -674,
+  -652,-32768,-32768,-32768,    48,-32768,   269,-32768,   297,   -85,
+    -9,    38,  -606,   454,-32768,    -4
 };
 
 
-#define	YYLAST		5968
+#define	YYLAST		5945
 
 
 static const short yytable[] = {   122,
-   494,    57,   425,    58,   124,   135,   534,   775,   167,   339,
-   184,   776,   344,   724,   290,   195,  1046,   534,  1049,   290,
-  1052,   420,   290,   190,   170,   341,   618,   342,   257,   181,
-   200,   715,   360,   608,   362,   190,   127,   613,   119,   131,
-   131,   173,   135,   128,   174,   192,   194,     3,   843,   845,
-   123,   120,    96,    97,    98,    99,   126,   834,   100,   837,
-   296,   325,   326,   299,    96,    97,    98,    99,   325,   326,
-   100,   136,   190,   885,   481,   482,   483,   485,   535,   536,
-   537,   538,   539,   996,   875,  1105,   876,   129,   997,   535,
-   536,   537,   538,   539,  1090,   844,   846,   130,   132,   132,
-   134,    96,    97,    98,    99,   133,   668,   100,   669,   619,
-    71,   258,   259,   137,   716,   717,   112,   113,   421,  1129,
-    71,  1132,   418,  1135,   197,   139,   829,  1138,   147,   198,
-   886,   141,   125,   185,   112,   113,   127,   540,   168,   138,
-   196,   290,   197,   667,   140,   775,   614,   198,   801,   776,
-   343,  1157,   191,  1159,   171,  1161,   250,   251,   252,   182,
-   201,   253,   256,   609,   193,   261,   614,   142,   602,   775,
-   325,   326,   281,   776,   282,   289,   292,   293,   501,   295,
-   289,   297,   422,   289,   300,   301,   138,   307,   143,   290,
-   112,   113,   446,   670,   325,   326,   523,   447,   686,   325,
-   326,   509,   510,   323,   324,   325,   326,   105,   106,   107,
-   108,  1072,   324,   152,   154,   155,   169,   105,   106,   107,
-   108,   275,   276,   277,   156,   350,   351,   352,   278,   354,
-   468,   157,   357,   358,   775,   917,   112,   113,   776,   413,
-   414,   415,   416,   365,   601,   202,   204,   203,   205,   370,
-   371,   372,   373,   374,   375,   376,   377,   378,   379,   380,
-   381,   382,   383,   384,   385,   386,   387,   388,   389,   390,
-   391,   392,   393,   394,   395,   396,   397,   398,   399,   400,
-   401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
-   411,   426,   775,   325,   326,   206,   776,   207,   112,   113,
-  1075,   775,   289,   112,   113,   776,   686,   158,   160,   495,
-   166,   431,   432,   433,   434,   435,   436,   437,   438,   439,
-   440,   441,   442,   443,   444,   445,   490,   490,   493,   493,
-   775,   424,   251,   290,   776,   325,   326,   325,   326,   162,
-   626,   458,   163,   775,   164,   462,   208,   776,   209,   251,
-   289,   877,   290,   878,   327,   471,   472,   473,  1078,   475,
-   476,   477,   479,   479,   479,   479,   210,  1120,   211,   775,
-   823,   775,   775,   776,   616,   776,   776,   496,   497,   498,
-   250,   251,   499,   775,   775,   502,   591,   776,   776,   153,
-   512,   592,  1032,   638,   516,   517,  1145,   325,   326,   886,
-   531,   161,   886,   325,   326,   886,   325,   326,   454,  1147,
-   455,   529,   730,   500,   532,   154,   155,   454,   819,   604,
-   328,   305,   879,   454,   880,   156,   311,   172,   105,   106,
-   107,   108,   165,   175,   320,  1149,   322,  1151,  1167,   144,
-   176,   145,   329,   146,   412,   190,   336,   112,   113,  1168,
-  1169,   340,   212,   177,   213,   345,   346,   603,   886,   822,
-   824,   975,   325,   326,   178,   597,   976,   105,   106,   107,
-   108,   179,   605,   972,    96,    97,    98,    99,   290,   337,
-   100,   368,   886,   325,   326,   886,   112,   113,   886,   325,
-   326,   886,   325,   326,   289,   617,   180,   597,   622,   767,
-   624,   625,   325,   326,   186,   774,   190,   290,   187,   533,
-   886,   188,   886,   289,   886,   214,   640,   215,   962,   708,
-   216,   645,   217,   325,   326,   688,   189,   325,   326,   325,
-   326,   325,   326,   655,   656,    96,    97,    98,    99,  1010,
-   244,   100,   659,  1012,   245,  1014,   951,  1071,   734,   325,
-   326,   325,   326,   290,   290,   290,   290,   671,   246,   273,
-   274,   275,   276,   277,   687,  1074,   247,  1077,   278,   681,
-   248,   683,   684,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,   218,   709,   219,
-   220,   278,   221,   260,   780,   781,   782,   783,   148,   262,
-   973,   149,   222,   150,   223,   151,   488,   489,   279,   224,
-   729,   225,   112,   113,   294,   322,   698,   699,   450,   453,
-   197,   280,   226,   290,   227,   198,   228,   230,   229,   231,
-   700,   701,   702,   703,   704,   705,   706,   298,   232,   289,
-   233,   309,   234,   710,   235,   236,   308,   237,   757,   718,
-   503,     9,    10,   504,    12,   505,    14,   506,    16,   727,
-    17,   310,    19,    20,   840,    22,    23,   238,   289,   239,
-   597,   240,   242,   241,   243,   454,   454,   460,   463,  1041,
-   312,    34,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,    38,    39,    40,   313,   278,    25,    26,    27,    28,
-   758,    30,   598,   599,   314,   112,   113,   315,    35,    36,
-   589,   623,   590,   197,   289,   289,   289,   289,   198,   264,
+   789,    57,   495,    58,   730,   336,   124,   131,   340,   167,
+   195,   345,   190,   170,   181,   200,   610,   536,   787,   426,
+   844,   257,   536,   325,   326,   190,   342,   184,   343,   721,
+   850,   361,   852,   363,   620,   144,   421,   145,   119,   146,
+   327,    96,    97,    98,    99,   192,   194,   100,  1002,   135,
+   131,   120,  1003,   305,    96,    97,    98,    99,   311,   615,
+   100,   669,   841,   127,     3,   670,   132,   127,   325,   326,
+   128,   190,   669,   133,   665,   138,   670,   851,   126,   853,
+  1096,   123,   668,   341,   882,   129,   883,   346,   347,   537,
+   538,   539,   540,   541,   537,   538,   539,   540,   541,   130,
+    96,    97,    98,    99,   258,   259,   100,   669,    71,   132,
+   134,   670,   722,   723,   447,   136,   666,   621,   290,   448,
+    71,   836,   135,   290,   137,   173,   290,   786,   174,   112,
+   113,   325,   326,   422,   125,   196,   787,   197,   896,   168,
+   139,   191,   198,   171,   182,   201,   611,   593,   542,   141,
+   185,   344,   594,   808,   193,   138,   250,   251,   252,   325,
+   326,   253,   256,   325,   326,   261,   325,   326,   616,   142,
+   296,   616,   281,   299,   282,   289,   292,   293,   508,   295,
+   289,   297,   486,   289,   300,   301,   604,   307,   667,   112,
+   113,   325,   326,   325,   326,   736,   525,   692,   325,   326,
+   455,   511,   512,   323,   324,   105,   106,   107,   108,   884,
+   826,   885,   324,   140,   886,   455,   887,   105,   106,   107,
+   108,   325,   326,   981,   143,   351,   352,   353,   982,   355,
+   669,   923,   358,   359,   670,   147,   112,   113,   328,   414,
+   415,   416,   417,   366,   603,   290,   482,   483,   484,   371,
+   372,   373,   374,   375,   376,   377,   378,   379,   380,   381,
+   382,   383,   384,   385,   386,   387,   388,   389,   390,   391,
+   392,   393,   394,   395,   396,   397,   398,   399,   400,   401,
+   402,   403,   404,   405,   406,   407,   408,   409,   410,   411,
+   412,   427,   423,   290,   158,   160,  1078,   166,   112,   113,
+   669,   669,   289,   669,   670,   670,   692,   670,   202,   425,
+   203,   432,   433,   434,   435,   436,   437,   438,   439,   440,
+   441,   442,   443,   444,   445,   446,   491,   491,   494,   494,
+   325,   326,   251,   152,   669,   600,   601,   204,   670,   205,
+   469,   459,  1052,   153,  1055,   463,  1058,   338,   669,   251,
+   289,   206,   670,   207,   161,   472,   473,   474,   169,   476,
+   477,   478,   480,   480,   480,   480,  1081,  1084,   148,  1126,
+   669,   149,   830,   150,   670,   151,   172,   497,   498,   499,
+   250,   251,   500,   112,   113,   669,   509,  1038,   669,   670,
+   669,   514,   670,   175,   670,   518,   519,   867,   868,   787,
+  1149,   533,   787,   325,   326,   787,   105,   106,   107,   108,
+   876,   877,   531,  1112,  1151,   534,   176,   154,   155,   496,
+   606,   320,   208,   322,   209,   112,   113,   156,   669,   329,
+   679,   680,   670,   337,   157,   210,  1153,   211,   290,   325,
+   326,   212,   177,   213,  1134,   628,  1137,   162,  1140,   187,
+   163,  1155,   164,  1143,  1171,   507,  1172,   290,   605,   787,
+   178,   325,   326,   179,   325,   326,   599,   180,   369,   105,
+   106,   107,   108,   607,   455,  1161,   456,  1163,   535,  1165,
+   773,   787,   829,   831,   787,   618,   188,   787,   112,   113,
+   787,   214,   189,   215,  1173,   289,   619,   260,   599,   624,
+   186,   626,   627,   216,   640,   217,   413,   190,   787,   218,
+   787,   219,   787,   244,   289,   325,   326,   642,   220,   222,
+   221,   223,   647,   154,   155,   325,   326,   694,   224,   245,
+   225,   788,   190,   156,   657,   658,    96,    97,    98,    99,
+   165,   974,   100,   661,   746,   747,   226,   749,   227,   752,
+   246,   247,   755,   756,   248,   957,   325,   326,   228,   677,
+   229,    96,    97,    98,    99,   280,   693,   100,   262,   325,
+   326,   687,  1016,   689,   690,   325,   326,   279,   294,   325,
+   326,   230,   298,   231,   290,  1018,   309,   325,   326,   319,
+   715,  1020,   310,   489,   490,  1077,   314,   797,   798,   799,
+   325,   326,   322,  1080,   275,   276,   277,   232,   234,   233,
+   235,   278,   735,   290,   112,   113,  1083,   454,   704,   705,
+   419,   236,   197,   237,   238,   315,   239,   198,   240,   308,
+   241,   714,   706,   707,   708,   709,   710,   711,   712,   312,
+   242,   289,   243,   313,   455,   716,   461,   455,   591,   464,
+   592,   724,   750,   316,   751,   290,   290,   290,   290,   978,
+   740,   733,   854,   317,   318,   112,   113,   859,   330,   331,
+   289,   451,   599,   197,   864,   865,   866,   332,   198,   869,
+   870,   871,   872,   873,   874,   875,   455,  1047,   602,   455,
+   763,   641,   455,   339,   757,    25,    26,    27,    28,   893,
+    30,   348,   780,   781,   782,   783,   349,    35,    36,   838,
+   350,   839,   289,   289,   289,   289,   356,   264,   265,   266,
+   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+   277,   354,   455,   290,   846,   278,   455,   455,   888,   889,
+   360,   362,   764,   915,   971,   810,   811,   357,   455,   815,
+   890,   693,   364,   365,   656,   832,   455,   367,   891,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,   454,   454,   600,   639,   278,   319,   803,
-   804,   860,   861,   808,   507,   687,  1018,   869,   870,   825,
-   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-   274,   275,   276,   277,   316,   744,   654,   745,   278,   454,
-   830,   751,   831,   454,   832,   839,   317,   454,   836,   887,
-   454,   663,   888,   318,   289,   841,   454,   454,   889,   890,
-   903,   454,   904,   922,   330,   331,   673,   674,   332,   338,
-   856,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,   347,   871,   872,   873,   278,   910,   349,
-   937,   881,   938,   981,   348,   982,   903,  1082,  1063,  1083,
-   918,   353,   981,   897,  1109,  1152,  1170,  1153,  1171,   355,
-   356,   894,   895,   896,   359,   361,   363,   364,   366,   900,
-   367,   417,   278,   427,   906,   428,   429,  1053,   451,   469,
-   474,   484,   511,   521,   514,   946,   515,   594,   595,   524,
-   593,   911,   606,   490,   607,   493,   596,   611,   627,   796,
-   628,   629,   631,   632,   633,   920,   635,   636,   637,   923,
-   641,   649,   650,   651,   652,   657,   927,   928,   653,   732,
-   930,   677,   678,   658,   679,   680,   692,   935,   936,   693,
-   740,   741,   694,   743,   696,   746,   697,   945,   749,   750,
-   707,   712,  1106,   713,   714,   719,   720,   723,   722,   726,
-   728,   963,   733,   739,   742,   747,   748,   753,   754,   755,
-   756,   771,   772,   773,   759,   760,   761,   762,   977,   978,
-   763,   764,   765,   766,   779,   802,   785,   786,   787,   790,
-   791,   792,   788,   789,   793,   798,   992,   799,   800,   807,
-   818,   820,   826,   827,   833,   848,   851,   854,  1001,   264,
+   275,   276,   277,   368,   418,   673,   837,   278,   278,   909,
+   847,   910,   429,   455,   843,   928,   979,   943,   430,   944,
+   289,   848,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,   863,   987,   428,   988,
+   278,   112,   113,   975,  1059,   470,  1060,   625,   475,   197,
+   878,   879,   880,   985,   198,   916,   909,   989,  1069,   987,
+   485,  1114,   892,   803,  1156,   894,  1157,   924,   513,  1174,
+   903,  1175,   273,   274,   275,   276,   277,   452,   900,   901,
+   902,   278,   516,   517,   263,   523,   906,   526,   596,   595,
+   597,   912,   598,   608,  1061,   609,   613,   629,   634,   630,
+   631,   633,   952,   635,   637,   638,   639,   643,   917,   651,
+   491,   655,   494,   431,   652,   653,  1023,   654,   738,   659,
+   660,   683,   926,   684,   685,   686,   929,   698,   699,   700,
+   702,   703,   713,   933,   934,   718,   719,   936,   725,   720,
+   726,   729,   728,   732,   941,   942,   734,   739,   745,   748,
+   753,   754,   759,   760,   951,   761,   762,   765,   766,  1113,
+   777,   778,   779,   264,   265,   266,   267,   268,   269,   270,
+   271,   272,   273,   274,   275,   276,   277,   767,   768,   769,
+   770,   278,   771,   804,   983,   984,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+   772,   784,   998,  1085,   278,   785,   790,   792,   793,   794,
+   795,   796,   800,   805,  1007,   264,   265,   266,   267,   268,
+   269,   270,   271,   272,   273,   274,   275,   276,   277,   806,
+   807,   809,  1014,   278,   825,   840,   827,   834,   855,   814,
+   833,   858,   491,   861,   494,   845,   849,   856,   862,   857,
+   897,  1025,   860,  1027,   881,  1028,   898,   904,   914,  1030,
+   899,   918,   919,   921,  1034,   932,   927,   935,   938,   501,
+     9,    10,   502,    12,   503,    14,   504,    16,   939,    17,
+   972,    19,    20,   940,    22,    23,   895,   945,   946,   947,
+   948,   949,   950,  1050,   959,  1053,   962,  1056,   965,   967,
+    34,   968,   969,  1063,   970,   990,   991,   996,  1067,  1068,
+    38,    39,    40,   986,   992,  1000,   994,  1071,   995,   997,
+  1010,  1012,  1013,  1022,  1015,  1075,  1017,  1019,  1021,  1035,
+  1026,  1024,  1036,   727,   269,   270,   271,   272,   273,   274,
+   275,   276,   277,   912,  1037,  1041,  1042,   278,  1039,   930,
+  1043,   931,  1044,  1045,  1101,  1145,  1066,  1105,  1070,  1073,
+  1109,  1074,  1086,   510,  1094,  1089,  1097,   758,  1099,  1102,
+  1116,  1103,  1117,  1106,  1107,  1110,  1111,  1118,  1159,  1125,
+   958,  1166,   961,  1169,   964,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,    68,   283,  1119,  1179,
+   278,  1121,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,  1129,  1135,  1123,  1138,
+  1141,  1130,  1133,  1147,   284,   264,   265,   266,   267,   268,
+   269,   270,   271,   272,   273,   274,   275,   276,   277,  1148,
+  1150,  1160,  1152,   278,  1154,    25,    26,    27,    28,    29,
+    30,  1162,  1158,  1164,  1167,  1170,  1176,    35,    36,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,   855,   838,   842,  1008,   278,   849,   797,
-   883,   850,   853,   874,   891,   892,   490,   898,   493,  1017,
-   884,   893,   912,   908,   913,   915,   990,  1021,   926,  1022,
-   921,   929,   932,  1024,   847,   933,   934,   939,  1028,   852,
-   940,   941,   942,   943,   944,   953,   857,   858,   859,   956,
-   959,   862,   863,   864,   865,   866,   867,   868,   965,   966,
-   967,   968,   980,   984,   985,   882,   986,  1044,   988,  1047,
-   989,  1050,   991,  1004,   994,  1006,  1020,  1057,  1029,  1007,
-  1030,  1009,  1061,  1062,  1033,  1011,  1013,  1035,  1036,  1037,
-  1015,  1065,  1031,  1038,  1039,  1055,  1064,  1016,  1019,  1069,
-   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-   274,   275,   276,   277,   909,  1067,  1060,   906,   278,  1068,
-  1081,  1088,  1091,  1093,  1096,   949,  1097,   950,  1095,  1100,
-  1141,  1099,  1101,  1104,  1103,   924,  1108,   925,   263,  1113,
-  1114,  1116,  1124,  1130,  1111,  1123,  1112,  1118,   503,     9,
-    10,   504,    12,   505,    14,   506,    16,  1162,    17,  1165,
-    19,    20,  1125,    22,    23,  1128,   952,  1133,   955,  1136,
-   958,   430,  1139,  1143,  1144,  1175,   964,  1155,  1156,    34,
-  1146,  1148,  1150,  1154,  1158,   969,  1160,  1163,  1166,    38,
-    39,    40,  1172,  1173,  1174,   979,  1176,   835,  1178,   983,
-    68,   283,  1179,  1085,  1027,   690,    72,    73,    74,    75,
+   275,   276,   277,  1177,  1178,  1180,  1182,   278,  1183,   842,
+  1091,    56,   696,   101,   102,   103,   104,   266,   267,   268,
+   269,   270,   271,   272,   273,   274,   275,   276,   277,    64,
+   109,   285,  1033,   278,  1051,   111,  1054,   920,  1057,     0,
+   114,     0,     0,     0,     0,   117,     0,     0,   468,     0,
+     0,     0,     0,     0,    68,   283,     0,     0,     0,  1072,
+    72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+    82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
+    92,    93,    94,    95,     0,     0,     0,     0,     0,     0,
+     0,     0,   284,   264,   265,   266,   267,   268,   269,   270,
+   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
+     0,   278,     0,    25,    26,    27,    28,    29,    30,     0,
+   644,    68,   249,     0,     0,    35,    36,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,   101,   102,   103,   104,   791,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   109,   302,
+     0,     0,     0,   111,     0,     0,     0,     0,   114,     0,
+    68,   249,     0,   117,     0,   303,    72,    73,    74,    75,
     76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
     86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-    56,    64,     0,   914,     0,     0,     0,     0,   284,     0,
-   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-   274,   275,   276,   277,     0,     0,     0,     0,   278,    25,
-    26,    27,    28,    29,    30,     0,     0,     0,     0,     0,
-     0,    35,    36,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,   101,   102,   103,
-   104,  1045,     0,  1048,     0,  1051,     0,     0,     0,     0,
-     0,  1056,     0,     0,   109,   285,     0,     0,     0,   111,
-     0,     0,     0,     0,   114,     0,  1066,    68,   283,   117,
-     0,     0,   467,    72,    73,    74,    75,    76,    77,    78,
+     0,     0,     0,     0,     0,     0,     0,     0,   101,   102,
+   103,   104,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,   109,   110,     0,     0,     0,
+   111,     0,     0,     0,     0,   114,     0,     0,   254,     0,
+   117,     0,   255,     0,     0,     0,     0,   264,   265,   266,
+   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+   277,     0,     0,     0,     0,   278,   835,   101,   102,   103,
+   104,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,   109,   110,     0,     0,     0,   111,
+     0,     0,     0,     0,   114,     0,     0,   622,     0,   117,
+     0,   623,    68,   249,     0,     0,     0,     0,    72,    73,
+    74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+    84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+    94,    95,     0,     0,     0,     0,     0,    68,   249,     0,
+     0,     0,     0,    72,    73,    74,    75,    76,    77,    78,
     79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-    89,    90,    91,    92,    93,    94,    95,     0,     0,     0,
-     0,     0,     0,     0,     0,   284,     0,     0,     0,     0,
-     0,     0,     0,     0,  1107,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,    25,    26,    27,    28,
-    29,    30,     0,     0,    68,   249,     0,     0,    35,    36,
-    72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-    82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-    92,    93,    94,    95,   101,   102,   103,   104,   721,   267,
-   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,   109,   302,     0,   278,     0,   111,     0,     0,     0,
-     0,   114,     0,    68,   249,     0,   117,     0,   303,    72,
+    89,    90,    91,    92,    93,    94,    95,     0,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   101,
+   102,   103,   104,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,   109,   110,     0,     0,
+     0,   111,     0,     0,     0,     0,   114,     0,     0,   742,
+     0,   117,     0,   743,   101,   102,   103,   104,   993,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,   333,   334,     0,     0,     0,   111,     0,     0,     0,
+     0,   335,     0,    68,   453,     0,   117,     0,   157,    72,
     73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
     83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-    93,    94,    95,     0,     0,     0,     0,     0,     0,     0,
-     0,   101,   102,   103,   104,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,   109,   110,
-     0,     0,     0,   111,     0,     0,     0,     0,   114,     0,
-     0,   254,     0,   117,     0,   255,     0,     0,     0,     0,
+    93,    94,    95,     0,     0,     0,     0,     0,    68,    69,
+    70,     0,    71,     0,    72,    73,    74,    75,    76,    77,
+    78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+    88,    89,    90,    91,    92,    93,    94,    95,     0,    96,
+    97,    98,    99,     0,     0,   100,     0,     0,     0,     0,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-   274,   275,   276,   277,     0,     0,     0,     0,   278,   752,
-   101,   102,   103,   104,     0,     0,     0,     0,     0,     0,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+   101,   102,   103,   104,     0,  1008,     0,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,   109,   110,     0,
      0,     0,   111,     0,     0,     0,     0,   114,     0,     0,
-   620,     0,   117,     0,   621,    68,   249,     0,     0,     0,
-     0,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+     0,     0,   117,     0,   467,   101,   102,   103,   104,   105,
+   106,   107,   108,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   109,   110,     0,     0,     0,   111,   112,   113,
+     0,     0,   114,     0,   115,     0,   116,   117,    68,   283,
+     0,     0,     0,     0,    72,    73,    74,    75,    76,    77,
+    78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+    88,    89,    90,    91,    92,    93,    94,    95,     0,     0,
+     0,     0,     0,     0,     0,     0,   284,   264,   265,   266,
+   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+   277,     0,     0,     0,     0,   278,     0,    25,    26,    27,
+    28,    29,    30,     0,     0,    68,   249,     0,     0,    35,
+    36,    72,    73,    74,    75,    76,    77,    78,    79,    80,
     81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-    91,    92,    93,    94,    95,     0,     0,     0,     0,     0,
-    68,   249,     0,     0,     0,     0,    72,    73,    74,    75,
+    91,    92,    93,    94,    95,   101,   102,   103,   104,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   109,   285,     0,     0,     0,   111,     0,     0,
+     0,     0,   114,    68,   249,   190,     0,   117,     0,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,  1009,    96,    97,    98,    99,     0,     0,
+   100,     0,   101,   102,   103,   104,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   109,
+   110,     0,     0,     0,   111,     0,     0,     0,     0,   114,
+    68,   453,     0,     0,   117,     0,    72,    73,    74,    75,
     76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
     86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+   101,   102,   103,   104,  1011,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   109,   110,     0,
+     0,     0,   111,  1090,     0,     0,     0,   114,     0,     0,
+     0,     0,   117,     0,     0,   264,   265,   266,   267,   268,
+   269,   270,   271,   272,   273,   274,   275,   276,   277,   454,
+     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   101,   102,   103,
+   104,   527,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,   109,   110,     0,     0,     0,   111,
+   614,     0,     0,     0,   114,     0,     0,     0,     0,   117,
+     0,     0,     0,     0,     0,     0,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+   744,     0,     0,     0,   278,   264,   265,   266,   267,   268,
+   269,   270,   271,   272,   273,   274,   275,   276,   277,   802,
+     0,     0,     0,   278,     0,     0,     0,     0,     0,   264,
+   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
      0,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,   101,   102,   103,   104,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,   109,
-   110,     0,     0,     0,   111,     0,     0,     0,     0,   114,
-     0,     0,   736,     0,   117,     0,   737,   101,   102,   103,
-   104,   784,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,   333,   334,     0,     0,     0,   111,
-     0,     0,     0,     0,   335,     0,    68,   452,     0,   117,
-     0,   157,    72,    73,    74,    75,    76,    77,    78,    79,
-    80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-    90,    91,    92,    93,    94,    95,     0,     0,     0,     0,
-     0,    68,    69,    70,     0,    71,     0,    72,    73,    74,
-    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-    85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-    95,     0,    96,    97,    98,    99,     0,     0,   100,     0,
-     0,     0,     0,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,   101,   102,   103,   104,     0,   828,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-   109,   110,     0,     0,     0,   111,     0,     0,     0,     0,
-   114,     0,     0,     0,     0,   117,     0,   466,   101,   102,
-   103,   104,   105,   106,   107,   108,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,   109,   110,     0,     0,     0,
-   111,   112,   113,     0,     0,   114,     0,   115,     0,   116,
-   117,    68,   283,     0,     0,     0,     0,    72,    73,    74,
-    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-    85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-    95,     0,     0,     0,     0,     0,     0,     0,     0,   284,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-    25,    26,    27,    28,    29,    30,     0,     0,    68,   249,
-     0,     0,    35,    36,    72,    73,    74,    75,    76,    77,
-    78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-    88,    89,    90,    91,    92,    93,    94,    95,   101,   102,
-   103,   104,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,   109,   285,     0,     0,     0,
-   111,     0,     0,     0,     0,   114,    68,   249,   190,     0,
-   117,     0,    72,    73,    74,    75,    76,    77,    78,    79,
-    80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-    90,    91,    92,    93,    94,    95,   987,    96,    97,    98,
-    99,     0,     0,   100,     0,   101,   102,   103,   104,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     0,     0,   109,   110,     0,     0,     0,   111,     0,     0,
-     0,     0,   114,    68,   452,     0,     0,   117,     0,    72,
-    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-    83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-    93,    94,    95,   101,   102,   103,   104,  1002,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-   109,   110,     0,     0,     0,   111,  1003,     0,     0,     0,
-   114,     0,     0,     0,     0,   117,     0,     0,   264,   265,
-   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,  1005,     0,     0,     0,   278,     0,     0,     0,
      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-   101,   102,   103,   104,  1084,     0,     0,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,     0,   109,   110,     0,
-     0,     0,   111,     0,     0,   453,     0,   114,     0,     0,
-     0,     0,   117,     0,     0,     0,     0,     0,     0,   264,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,   525,     0,     0,     0,   278,   264,   265,
+   275,   276,   277,     0,    -3,     1,     0,   278,    -3,   264,
+   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
+     0,     0,     0,     0,   955,     0,   956,    -3,     0,     0,
+     0,     0,    -3,    -3,     0,    -3,    -3,    -3,    -3,    -3,
+    -3,    -3,    -3,    -3,     0,    -3,    -3,    -3,    -3,    -3,
+    -3,    -3,     0,     0,     0,    -3,    -3,    -3,    -3,    -3,
+    -3,    -3,     0,    -3,    -3,    -3,    -3,     4,    -3,    -3,
+     0,     0,     0,     0,     0,    -3,    -3,    -3,    -3,     0,
+     0,    -3,     0,    -3,     0,    -3,    -3,    -3,    -3,    -3,
+    -3,    -3,    -3,    -3,     0,     0,     5,     0,     0,     0,
+     0,     6,     7,     0,     8,     9,    10,    11,    12,    13,
+    14,    15,    16,     0,    17,    18,    19,    20,    21,    22,
+    23,     0,     0,     0,    24,    25,    26,    27,    28,    29,
+    30,     0,    31,    32,    33,    34,     0,    35,    36,     0,
+     0,     0,     0,     0,    37,    38,    39,    40,     0,     0,
+    41,     0,    42,     0,    43,    44,    45,    46,    47,    48,
+    49,    50,    51,   501,     9,    10,   502,    12,   503,    14,
+   504,    16,     0,    17,     0,    19,    20,     0,    22,    23,
+   501,     9,    10,   502,    12,   503,    14,   504,    16,     0,
+    17,     0,    19,    20,    34,    22,    23,     0,     0,     0,
+     0,     0,     0,     0,    38,    39,    40,     0,     0,     0,
+     0,    34,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,    38,    39,    40,   501,     9,    10,   502,    12,   503,
+    14,   504,    16,     0,    17,     0,    19,    20,     0,    22,
+    23,     0,     0,     0,     0,     0,   501,     9,    10,   502,
+    12,   503,    14,   504,    16,    34,    17,   515,    19,    20,
+     0,    22,    23,     0,     0,    38,    39,    40,     0,     0,
+     0,     0,     0,     0,   529,     0,     0,    34,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,    38,    39,    40,
+   501,     9,    10,   502,    12,   503,    14,   504,    16,     0,
+    17,     0,    19,    20,     0,    22,    23,   501,     9,    10,
+   502,    12,   503,    14,   504,    16,     0,    17,   530,    19,
+    20,    34,    22,    23,     0,     0,     0,     0,     0,     0,
+     0,    38,    39,    40,     0,     0,     0,     0,    34,     0,
+   674,     0,     0,     0,     0,     0,     0,     0,    38,    39,
+    40,   501,     9,    10,   502,    12,   503,    14,   504,    16,
+     0,    17,     0,    19,    20,     0,    22,    23,     0,     0,
+     0,     0,     0,   501,     9,    10,   502,    12,   503,    14,
+   504,    16,    34,    17,   688,    19,    20,     0,    22,    23,
+     0,     0,    38,    39,    40,     0,     0,     0,     0,     0,
+     0,  1087,     0,     0,    34,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    38,    39,    40,   264,   265,   266,
+   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
+     0,     0,   976,     0,   977,  1127,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,  1048,     0,  1049,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,     0,
+     0,   648,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,     0,     0,   649,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,     0,     0,   695,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,   612,     0,     0,     0,   278,     0,     0,     0,
-     0,     0,     0,     0,   264,   265,   266,   267,   268,   269,
-   270,   271,   272,   273,   274,   275,   276,   277,   738,     0,
-     0,     0,   278,     0,     0,     0,   264,   265,   266,   267,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,     0,     0,   741,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-   795,     0,     0,     0,   278,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-     0,     0,     0,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,     0,     0,   776,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,     0,
+     0,   953,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,     0,     0,     0,     0,     0,     0,   264,   265,
+   278,     0,     0,     0,     0,     0,     0,     0,     0,   973,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,     0,     0,   999,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,     0,    -3,     1,     0,   278,    -3,     0,     0,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,     0,     0,  1001,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,     0,     0,  1004,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,     0,
+     0,  1005,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,     0,     0,  1006,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-     0,     0,     0,     0,     0,     0,    -3,     0,     0,     0,
-     0,    -3,    -3,     0,    -3,    -3,    -3,    -3,    -3,    -3,
-    -3,    -3,    -3,     0,    -3,    -3,    -3,    -3,    -3,    -3,
-    -3,     0,     0,     0,    -3,    -3,    -3,    -3,    -3,    -3,
-    -3,     0,    -3,    -3,    -3,    -3,     4,    -3,    -3,     0,
-     0,     0,     0,     0,    -3,    -3,    -3,    -3,     0,     0,
-    -3,     0,    -3,     0,    -3,    -3,    -3,    -3,    -3,    -3,
-    -3,    -3,    -3,     0,     0,     5,     0,     0,     0,     0,
-     6,     7,     0,     8,     9,    10,    11,    12,    13,    14,
-    15,    16,     0,    17,    18,    19,    20,    21,    22,    23,
-     0,     0,     0,    24,    25,    26,    27,    28,    29,    30,
-     0,    31,    32,    33,    34,     0,    35,    36,     0,     0,
-     0,     0,     0,    37,    38,    39,    40,     0,     0,    41,
-     0,    42,     0,    43,    44,    45,    46,    47,    48,    49,
-    50,    51,   503,     9,    10,   504,    12,   505,    14,   506,
-    16,     0,    17,     0,    19,    20,     0,    22,    23,   503,
-     9,    10,   504,    12,   505,    14,   506,    16,     0,    17,
-     0,    19,    20,    34,    22,    23,     0,     0,     0,     0,
-     0,     0,     0,    38,    39,    40,     0,     0,     0,     0,
-    34,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    38,    39,    40,   503,     9,    10,   504,    12,   505,    14,
-   506,    16,     0,    17,     0,    19,    20,     0,    22,    23,
-     0,     0,     0,     0,     0,   503,     9,    10,   504,    12,
-   505,    14,   506,    16,    34,    17,   513,    19,    20,     0,
-    22,    23,     0,     0,    38,    39,    40,     0,     0,     0,
-     0,     0,     0,   527,     0,     0,    34,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,    38,    39,    40,   503,
-     9,    10,   504,    12,   505,    14,   506,    16,     0,    17,
-     0,    19,    20,     0,    22,    23,   503,     9,    10,   504,
-    12,   505,    14,   506,    16,     0,    17,   528,    19,    20,
-    34,    22,    23,     0,     0,     0,     0,     0,     0,     0,
-    38,    39,    40,     0,     0,     0,     0,    34,     0,   664,
-     0,     0,     0,     0,     0,     0,     0,    38,    39,    40,
-   503,     9,    10,   504,    12,   505,    14,   506,    16,     0,
-    17,     0,    19,    20,     0,    22,    23,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,    34,     0,   682,     0,   278,     0,     0,     0,     0,
-     0,    38,    39,    40,   642,     0,     0,     0,     0,     0,
-  1079,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,   970,     0,   971,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,  1121,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,  1042,     0,  1043,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,     0,     0,   646,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-     0,     0,   647,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,     0,     0,
-   689,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,     0,     0,   735,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,     0,     0,   770,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,     0,     0,   947,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-     0,     0,   961,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,     0,     0,
-   993,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,     0,     0,   995,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,     0,     0,   998,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,     0,     0,   999,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-     0,     0,  1000,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,     0,     0,
-  1054,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,     0,     0,  1058,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,     0,     0,  1059,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,     0,     0,  1070,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-     0,     0,  1073,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,     0,     0,
-  1076,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,     0,     0,  1092,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,     0,     0,  1115,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,     0,     0,  1117,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-     0,     0,  1119,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,     0,     0,
-  1127,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,   419,     0,     0,     0,     0,   486,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,   448,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,   486,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,   487,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-   522,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,   569,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,   570,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,   583,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,   584,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-   585,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,   586,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,   587,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,   588,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,   660,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-   661,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,   662,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,   731,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,   768,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,   769,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-   794,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,   901,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,   902,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,   919,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,   931,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-  1025,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-   273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,     0,     0,     0,  1026,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,     0,
-     0,     0,  1034,   264,   265,   266,   267,   268,   269,   270,
-   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,     0,     0,     0,  1040,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,     0,     0,     0,  1087,   264,   265,   266,   267,   268,
-   269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,     0,     0,     0,
-  1089,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     0,     0,     0,     0,     0,     0,     0,  1062,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,     0,     0,  1064,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,     0,     0,  1065,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,     0,
+     0,  1076,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,     0,     0,  1079,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,     0,     0,  1082,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,     0,     0,  1098,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,     0,     0,  1120,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,     0,
+     0,  1122,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,     0,     0,  1124,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,     0,     0,  1132,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,   420,     0,
+     0,     0,     0,   487,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,   449,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,   487,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,   488,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,   524,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,   571,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,   572,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,   585,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,   586,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,   587,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,   588,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,   589,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,   590,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,   662,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,   663,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,   664,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,   737,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,   774,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,   775,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,   801,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,   907,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,   908,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,   925,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,   937,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,  1031,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+     0,     0,     0,  1032,   264,   265,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
+     0,     0,   278,     0,     0,     0,     0,     0,     0,  1040,
+   264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+   274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
+     0,     0,     0,     0,     0,  1046,   264,   265,   266,   267,
+   268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     0,     0,     0,     0,   278,     0,     0,     0,     0,     0,
+     0,  1093,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,     0,     0,     0,     0,     0,  1095,   264,   265,
+   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+   276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
+   424,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,   423,   264,   265,   266,   267,   268,   269,
+     0,     0,     0,   532,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,     0,     0,   530,   264,   265,   266,
+     0,     0,   278,     0,     0,     0,   550,   264,   265,   266,
    267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,   548,
+   277,     0,     0,     0,     0,   278,     0,     0,     0,   552,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-     0,     0,   550,   264,   265,   266,   267,   268,   269,   270,
+     0,     0,   554,   264,   265,   266,   267,   268,   269,   270,
    271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,   552,   264,   265,   266,   267,
+     0,   278,     0,     0,     0,   556,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,     0,     0,   554,   264,
+     0,     0,     0,     0,   278,     0,     0,     0,   558,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
    275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,   556,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,   560,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,     0,     0,   558,   264,   265,   266,   267,   268,
+   278,     0,     0,     0,   562,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,   560,   264,   265,
+     0,     0,     0,   278,     0,     0,     0,   564,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
    276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
-   562,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   566,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,   564,   264,   265,   266,   267,   268,   269,
+     0,     0,     0,   568,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,     0,     0,   566,   264,   265,   266,
+     0,     0,   278,     0,     0,     0,   570,   264,   265,   266,
    267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,   568,
+   277,     0,     0,     0,     0,   278,     0,     0,     0,   574,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-     0,     0,   572,   264,   265,   266,   267,   268,   269,   270,
+     0,     0,   576,   264,   265,   266,   267,   268,   269,   270,
    271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,   574,   264,   265,   266,   267,
+     0,   278,     0,     0,     0,   578,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,     0,     0,   576,   264,
+     0,     0,     0,     0,   278,     0,     0,     0,   580,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
    275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,   578,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,   582,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,     0,     0,   580,   264,   265,   266,   267,   268,
+   278,     0,     0,     0,   584,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,   582,   264,   265,
+     0,     0,     0,   278,     0,     0,     0,   676,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
    276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
-   666,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   678,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,   672,   264,   265,   266,   267,   268,   269,
+     0,     0,     0,   681,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,     0,     0,   675,   264,   265,   266,
+     0,     0,   278,     0,     0,     0,   682,   264,   265,   266,
    267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,     0,     0,   676,
+   277,     0,     0,     0,     0,   278,     0,     0,     0,   691,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-     0,     0,   685,   264,   265,   266,   267,   268,   269,   270,
+     0,     0,   717,   264,   265,   266,   267,   268,   269,   270,
    271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,     0,     0,   711,   264,   265,   266,   267,
+     0,   278,     0,     0,     0,   817,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,     0,     0,   810,   264,
+     0,     0,     0,     0,   278,     0,     0,     0,   819,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
    275,   276,   277,     0,     0,     0,     0,   278,     0,     0,
-     0,   812,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,   821,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,     0,     0,   814,   264,   265,   266,   267,   268,
+   278,     0,     0,     0,   823,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,     0,     0,   816,   264,   265,
+     0,     0,     0,   278,     0,     0,     0,   824,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
    276,   277,     0,     0,     0,     0,   278,     0,     0,     0,
-   817,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   922,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,     0,     0,   916,   264,   265,   266,   267,   268,   269,
+     0,   420,   264,   265,   266,   267,   268,   269,   270,   271,
+   272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+   278,     0,   450,   264,   265,   266,   267,   268,   269,   270,
+   271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
+     0,   278,     0,   457,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,   419,   264,   265,   266,   267,   268,
+     0,     0,   278,     0,   458,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,   449,   264,   265,   266,   267,
+     0,     0,     0,   278,     0,   460,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,   456,   264,   265,   266,
+     0,     0,     0,     0,   278,     0,   462,   264,   265,   266,
    267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,   457,   264,   265,
+   277,     0,     0,     0,     0,   278,     0,   465,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,     0,     0,     0,     0,   278,     0,   459,   264,
+   276,   277,     0,     0,     0,     0,   278,     0,   466,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,   461,
+   275,   276,   277,     0,     0,     0,     0,   278,     0,   471,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-   464,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   520,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,   465,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,   521,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,   470,   264,   265,   266,   267,   268,   269,   270,
+   278,     0,   522,   264,   265,   266,   267,   268,   269,   270,
    271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,   518,   264,   265,   266,   267,   268,   269,
+     0,   278,     0,   528,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,   519,   264,   265,   266,   267,   268,
+     0,     0,   278,     0,   549,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,   520,   264,   265,   266,   267,
+     0,     0,     0,   278,     0,   551,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,   526,   264,   265,   266,
+     0,     0,     0,     0,   278,     0,   553,   264,   265,   266,
    267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,   547,   264,   265,
+   277,     0,     0,     0,     0,   278,     0,   555,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,     0,     0,     0,     0,   278,     0,   549,   264,
+   276,   277,     0,     0,     0,     0,   278,     0,   557,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,   551,
+   275,   276,   277,     0,     0,     0,     0,   278,     0,   559,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-   553,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   561,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,   555,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,   563,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,   557,   264,   265,   266,   267,   268,   269,   270,
+   278,     0,   565,   264,   265,   266,   267,   268,   269,   270,
    271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,   559,   264,   265,   266,   267,   268,   269,
+     0,   278,     0,   567,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,   561,   264,   265,   266,   267,   268,
+     0,     0,   278,     0,   569,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,   563,   264,   265,   266,   267,
+     0,     0,     0,   278,     0,   573,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,   565,   264,   265,   266,
+     0,     0,     0,     0,   278,     0,   575,   264,   265,   266,
    267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,   567,   264,   265,
+   277,     0,     0,     0,     0,   278,     0,   577,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,     0,     0,     0,     0,   278,     0,   571,   264,
+   276,   277,     0,     0,     0,     0,   278,     0,   579,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,   573,
+   275,   276,   277,     0,     0,     0,     0,   278,     0,   581,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-   575,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   583,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,   577,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,   632,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,   579,   264,   265,   266,   267,   268,   269,   270,
+   278,     0,   636,   264,   265,   266,   267,   268,   269,   270,
    271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,   581,   264,   265,   266,   267,   268,   269,
+     0,   278,     0,   645,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,   630,   264,   265,   266,   267,   268,
+     0,     0,   278,     0,   646,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,   634,   264,   265,   266,   267,
+     0,     0,     0,   278,     0,   650,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,   643,   264,   265,   266,
+     0,     0,     0,     0,   278,     0,   816,   264,   265,   266,
    267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,   644,   264,   265,
+   277,     0,     0,     0,     0,   278,     0,   818,   264,   265,
    266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,     0,     0,     0,     0,   278,     0,   648,   264,
+   276,   277,     0,     0,     0,     0,   278,     0,   820,   264,
    265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278,     0,   809,
+   275,   276,   277,     0,     0,     0,     0,   278,     0,   822,
    264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
    274,   275,   276,   277,     0,     0,     0,     0,   278,     0,
-   811,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   828,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,     0,     0,     0,     0,   278,
-     0,   813,   264,   265,   266,   267,   268,   269,   270,   271,
+     0,   913,   264,   265,   266,   267,   268,   269,   270,   271,
    272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
-   278,     0,   815,   264,   265,   266,   267,   268,   269,   270,
+   278,     0,   954,   264,   265,   266,   267,   268,   269,   270,
    271,   272,   273,   274,   275,   276,   277,     0,     0,     0,
-     0,   278,     0,   821,   264,   265,   266,   267,   268,   269,
+     0,   278,     0,   980,   264,   265,   266,   267,   268,   269,
    270,   271,   272,   273,   274,   275,   276,   277,     0,     0,
-     0,     0,   278,     0,   907,   264,   265,   266,   267,   268,
+     0,     0,   278,     0,  1092,   264,   265,   266,   267,   268,
    269,   270,   271,   272,   273,   274,   275,   276,   277,     0,
-     0,     0,     0,   278,     0,   948,   264,   265,   266,   267,
+     0,     0,     0,   278,     0,  1131,   264,   265,   266,   267,
    268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     0,     0,     0,     0,   278,     0,   974,   264,   265,   266,
-   267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-   277,     0,     0,     0,     0,   278,     0,  1086,   264,   265,
-   266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-   276,   277,     0,     0,     0,     0,   278,     0,  1126,   264,
-   265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-   275,   276,   277,     0,     0,     0,     0,   278
+     0,     0,     0,     0,   278
 };
 
 static const short yycheck[] = {     4,
-   328,     2,   257,     2,     6,    68,     4,    69,     4,   168,
-     4,    73,   171,   609,   128,     4,  1011,     4,  1013,   133,
-  1015,     7,   136,     5,     4,     4,     7,     6,     4,     4,
-     4,     4,   191,     4,   193,     5,   127,     6,     4,    68,
-    68,    41,    68,   134,    44,    50,    51,     6,     6,     6,
-   127,     4,    34,    35,    36,    37,     6,     6,    40,     6,
-   133,   117,   118,   136,    34,    35,    36,    37,   117,   118,
-    40,   134,     5,   135,   316,   317,   318,   133,    76,    77,
-    78,    79,    80,     6,   133,  1080,   135,   127,     6,    76,
-    77,    78,    79,    80,     6,    53,    53,   127,   127,   127,
-   127,    34,    35,    36,    37,   134,   134,    40,   134,    90,
-     7,    87,    88,   127,    87,    88,   123,   124,   104,  1114,
-     7,  1116,   129,  1118,   131,    50,   722,  1122,    48,   136,
-   777,    46,   134,   127,   123,   124,   127,   135,   134,   127,
-   129,   255,   131,   134,   127,    69,   115,   136,   135,    73,
-   129,  1146,   134,  1148,   134,  1150,   109,   110,   111,   134,
-   134,   114,   115,   134,   134,   118,   115,    46,   423,    69,
-   117,   118,   125,    73,   127,   128,   129,   130,   337,   132,
-   133,   134,   255,   136,   137,   138,   127,   140,    46,   303,
-   123,   124,   128,   134,   117,   118,   355,   133,   131,   117,
-   118,     6,     7,   156,   157,   117,   118,   104,   105,   106,
-   107,   135,   165,   127,   117,   118,    46,   104,   105,   106,
-   107,   119,   120,   121,   127,   178,   179,   180,   126,   182,
-   303,   134,   185,   186,    69,   831,   123,   124,    73,   244,
-   245,   246,   247,   196,   131,   127,   127,   129,   129,   202,
+   675,     2,   328,     2,   611,   165,     6,    68,   168,     4,
+     4,   171,     5,     4,     4,     4,     4,     4,   671,   257,
+     6,     4,     4,   117,   118,     5,     4,     4,     6,     4,
+     6,   191,     6,   193,     7,    44,     7,    46,     4,    48,
+   134,    34,    35,    36,    37,    50,    51,    40,     6,    68,
+    68,     4,     6,   139,    34,    35,    36,    37,   144,     6,
+    40,    69,     6,   127,     6,    73,   127,   127,   117,   118,
+   134,     5,    69,   134,   134,   127,    73,    53,     6,    53,
+     6,   127,   134,   169,   133,   127,   135,   173,   174,    76,
+    77,    78,    79,    80,    76,    77,    78,    79,    80,   127,
+    34,    35,    36,    37,    87,    88,    40,    69,     7,   127,
+   127,    73,    87,    88,   128,   134,   134,    90,   128,   133,
+     7,   728,    68,   133,   127,    41,   136,   135,    44,   123,
+   124,   117,   118,   104,   134,   129,   789,   131,   135,   134,
+    50,   134,   136,   134,   134,   134,   134,   128,   135,    46,
+   127,   129,   133,   135,   134,   127,   109,   110,   111,   117,
+   118,   114,   115,   117,   118,   118,   117,   118,   115,    46,
+   133,   115,   125,   136,   127,   128,   129,   130,   338,   132,
+   133,   134,   133,   136,   137,   138,   424,   140,   134,   123,
+   124,   117,   118,   117,   118,   128,   356,   131,   117,   118,
+   133,     6,     7,   156,   157,   104,   105,   106,   107,   133,
+   128,   135,   165,   127,   133,   133,   135,   104,   105,   106,
+   107,   117,   118,   128,    46,   178,   179,   180,   133,   182,
+    69,   838,   185,   186,    73,    48,   123,   124,   134,   244,
+   245,   246,   247,   196,   131,   255,   316,   317,   318,   202,
    203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
    213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
    223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
    233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
-   243,   257,    69,   117,   118,   127,    73,   129,   123,   124,
-   135,    69,   255,   123,   124,    73,   131,    26,    27,   133,
-    29,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+   243,   257,   255,   303,    26,    27,   135,    29,   123,   124,
+    69,    69,   255,    69,    73,    73,   131,    73,   127,     7,
+   129,   264,   265,   266,   267,   268,   269,   270,   271,   272,
    273,   274,   275,   276,   277,   278,   327,   328,   327,   328,
-    69,     7,   285,   447,    73,   117,   118,   117,   118,    41,
-   454,   294,    44,    69,    46,   298,   127,    73,   129,   302,
-   303,   133,   466,   135,   134,   308,   309,   310,   135,   312,
-   313,   314,   315,   316,   317,   318,   127,   135,   129,    69,
-     7,    69,    69,    73,   447,    73,    73,   330,   331,   332,
-   333,   334,   335,    69,    69,   338,   128,    73,    73,   134,
-   343,   133,   988,   466,   347,   348,   135,   117,   118,  1046,
-   366,   134,  1049,   117,   118,  1052,   117,   118,   133,   135,
-   135,   364,   128,   133,   367,   117,   118,   133,   128,   424,
-   134,   139,   133,   133,   135,   127,   144,     6,   104,   105,
-   106,   107,   134,     4,   153,   135,   155,   135,   135,    44,
-     4,    46,   161,    48,     4,     5,   165,   123,   124,   135,
-   135,   169,   127,     4,   129,   173,   174,   423,  1105,   714,
-   715,   128,   117,   118,   127,   418,   133,   104,   105,   106,
-   107,   127,   425,     8,    34,    35,    36,    37,   592,   134,
-    40,   200,  1129,   117,   118,  1132,   123,   124,  1135,   117,
-   118,  1138,   117,   118,   447,   448,   127,   450,   451,   133,
-   453,   454,   117,   118,   127,   133,     5,   621,     6,   134,
-  1157,     4,  1159,   466,  1161,   127,   469,   129,   133,   592,
-   127,   474,   129,   117,   118,   530,     4,   117,   118,   117,
-   118,   117,   118,   486,   487,    34,    35,    36,    37,   133,
-   127,    40,   495,   133,   127,   133,   874,   133,   621,   117,
-   118,   117,   118,   667,   668,   669,   670,   510,   127,   117,
-   118,   119,   120,   121,   530,   133,   127,   133,   126,   522,
-   127,   524,   525,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,   127,   593,   129,
-   127,   126,   129,     4,   667,   668,   669,   670,    41,     6,
-   135,    44,   127,    46,   129,    48,   325,   326,     6,   127,
-   615,   129,   123,   124,   127,   334,   569,   570,   129,     8,
-   131,     5,   127,   737,   129,   136,   127,   127,   129,   129,
-   583,   584,   585,   586,   587,   588,   589,   127,   127,   592,
-   129,   127,   127,   596,   129,   127,   134,   129,     6,   602,
-    41,    42,    43,    44,    45,    46,    47,    48,    49,   612,
-    51,   127,    53,    54,   737,    56,    57,   127,   621,   129,
-   623,   127,   127,   129,   129,   133,   133,   135,   135,  1007,
-   134,    72,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    82,    83,    84,   134,   126,    62,    63,    64,    65,
-    58,    67,   420,   421,   127,   123,   124,   127,    74,    75,
-   129,   129,   131,   131,   667,   668,   669,   670,   136,   108,
+   117,   118,   285,   127,    69,   421,   422,   127,    73,   129,
+   303,   294,  1017,   134,  1019,   298,  1021,   134,    69,   302,
+   303,   127,    73,   129,   134,   308,   309,   310,    46,   312,
+   313,   314,   315,   316,   317,   318,   135,   135,    41,   135,
+    69,    44,     7,    46,    73,    48,     6,   330,   331,   332,
+   333,   334,   335,   123,   124,    69,   339,   994,    69,    73,
+    69,   344,    73,     4,    73,   348,   349,    59,    60,  1052,
+   135,   367,  1055,   117,   118,  1058,   104,   105,   106,   107,
+     6,     7,   365,  1088,   135,   368,     4,   117,   118,   133,
+   425,   153,   127,   155,   129,   123,   124,   127,    69,   161,
+   516,   517,    73,   165,   134,   127,   135,   129,   448,   117,
+   118,   127,     4,   129,  1119,   455,  1121,    41,  1123,     6,
+    44,   135,    46,  1128,   135,   133,   135,   467,   424,  1112,
+   127,   117,   118,   127,   117,   118,   419,   127,   200,   104,
+   105,   106,   107,   426,   133,  1150,   135,  1152,   134,  1154,
+   133,  1134,   720,   721,  1137,   448,     4,  1140,   123,   124,
+  1143,   127,     4,   129,   135,   448,   449,     4,   451,   452,
+   127,   454,   455,   127,   467,   129,     4,     5,  1161,   127,
+  1163,   129,  1165,   127,   467,   117,   118,   470,   127,   127,
+   129,   129,   475,   117,   118,   117,   118,   532,   127,   127,
+   129,   133,     5,   127,   487,   488,    34,    35,    36,    37,
+   134,   133,    40,   496,   630,   631,   127,   633,   129,   635,
+   127,   127,   638,   639,   127,   881,   117,   118,   127,   512,
+   129,    34,    35,    36,    37,     5,   532,    40,     6,   117,
+   118,   524,   133,   526,   527,   117,   118,     6,   127,   117,
+   118,   127,   127,   129,   594,   133,   127,   117,   118,     4,
+   595,   133,   127,   325,   326,   133,   127,   683,   684,   685,
+   117,   118,   334,   133,   119,   120,   121,   127,   127,   129,
+   129,   126,   617,   623,   123,   124,   133,     8,   571,   572,
+   129,   127,   131,   129,   127,   127,   129,   136,   127,   134,
+   129,   594,   585,   586,   587,   588,   589,   590,   591,   134,
+   127,   594,   129,   134,   133,   598,   135,   133,   129,   135,
+   131,   604,    46,   127,    48,   665,   666,   667,   668,     8,
+   623,   614,   748,   127,   127,   123,   124,   753,   134,   134,
+   623,   129,   625,   131,   760,   761,   762,   134,   136,   765,
+   766,   767,   768,   769,   770,   771,   133,  1013,   135,   133,
+     6,   135,   133,   129,   135,    62,    63,    64,    65,   785,
+    67,   129,   665,   666,   667,   668,   129,    74,    75,   133,
+     6,   135,   665,   666,   667,   668,   134,   108,   109,   110,
+   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+   121,   131,   133,   743,   135,   126,   133,   133,   135,   135,
+     6,     6,    58,   829,   135,   698,   699,    90,   133,   702,
+   135,   717,     6,   129,   486,   721,   133,     4,   135,   108,
    109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,   133,   133,   135,   135,   126,     4,   692,
-   693,    59,    60,   696,   135,   711,   135,     6,     7,   715,
-   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-   118,   119,   120,   121,   127,    46,   485,    48,   126,   133,
-   723,   135,   133,   133,   135,   135,   127,   133,   731,   135,
-   133,   500,   135,   127,   737,   738,   133,   133,   135,   135,
-   133,   133,   135,   135,   134,   134,   514,   515,   134,   129,
-   753,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,   129,   767,   768,   769,   126,   823,     6,
-     4,   774,     6,   133,   129,   135,   133,   133,   135,   135,
-   835,   131,   133,   799,   135,   133,   133,   135,   135,   134,
-    90,   794,   795,   796,     6,     6,     6,   129,     4,   802,
-   134,     5,   126,   131,   807,     7,   129,  1016,   134,     7,
-     7,   128,     6,    87,     7,   870,     7,   128,   128,   134,
-   133,   824,     6,   874,     4,   874,   133,   130,    90,     8,
-     7,     7,     7,    90,     7,   838,    90,     7,     7,   842,
-     7,   128,   128,   128,   128,   135,   849,   850,   131,   618,
-   853,     7,     7,   135,     7,   131,   127,   860,   861,   127,
-   628,   629,   134,   631,   127,   633,     6,   870,   636,   637,
-     4,     6,  1081,     6,   130,     6,     6,   129,     7,     6,
-   115,   884,    46,    46,     7,     7,    48,   134,     7,     7,
-     7,   660,   661,   662,     7,     7,     7,     7,   901,   902,
-     7,     7,     7,     4,     6,   127,     6,     6,     6,   677,
-   678,   679,     6,     6,     4,     6,   919,     4,     6,   134,
-   128,   128,   131,     7,     6,     6,     6,     6,   931,   108,
+   119,   120,   121,   134,     5,   507,   729,   126,   126,   133,
+   743,   135,     7,   133,   737,   135,   135,     4,   129,     6,
+   743,   744,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,   759,   133,   131,   135,
+   126,   123,   124,   899,   133,     7,   135,   129,     7,   131,
+   773,   774,   775,   909,   136,   830,   133,   913,   135,   133,
+   128,   135,   785,     8,   133,   788,   135,   842,     6,   133,
+   806,   135,   117,   118,   119,   120,   121,   134,   801,   802,
+   803,   126,     7,     7,     6,    87,   809,   134,   128,   133,
+   128,   814,   133,     6,  1024,     4,   130,    90,    90,     7,
+     7,     7,   877,     7,    90,     7,     7,     7,   831,   128,
+   881,   131,   881,     6,   128,   128,   972,   128,   620,   135,
+   135,     7,   845,     7,     7,   131,   849,   127,   127,   134,
+   127,     6,     4,   856,   857,     6,     6,   860,     6,   130,
+     6,   129,     7,     6,   867,   868,   115,    46,    46,     7,
+     7,    48,   134,     7,   877,     7,     7,     7,     7,  1089,
+   662,   663,   664,   108,   109,   110,   111,   112,   113,   114,
+   115,   116,   117,   118,   119,   120,   121,     7,     7,     7,
+     7,   126,     7,   128,   907,   908,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+     4,     6,   925,  1059,   126,   134,     6,     6,     6,     6,
+     6,     6,     4,     6,   937,   108,   109,   110,   111,   112,
+   113,   114,   115,   116,   117,   118,   119,   120,   121,     4,
+     6,   127,   955,   126,   128,     6,   128,     7,     6,   134,
+   131,     6,  1013,     6,  1013,   134,   134,   134,     6,   134,
+     6,   974,   134,   976,   134,   978,     6,     6,   131,   982,
+    86,     6,     4,     6,   987,     6,   130,     6,     6,    41,
+    42,    43,    44,    45,    46,    47,    48,    49,     6,    51,
+   133,    53,    54,     6,    56,    57,   788,     6,     6,     6,
+     6,     6,     6,  1016,     6,  1018,     6,  1020,     6,     6,
+    72,     6,     6,  1026,     6,     4,     6,   131,  1031,  1032,
+    82,    83,    84,   134,     6,   130,     7,  1040,     6,     6,
+     6,     6,   134,     6,   135,  1048,   134,   134,   134,     6,
+    85,   134,     6,     6,   113,   114,   115,   116,   117,   118,
+   119,   120,   121,  1066,   128,     7,     6,   126,    88,   851,
+     6,   853,     6,     6,  1077,  1130,   134,  1080,     6,     5,
+  1083,   135,     6,   135,     6,   134,   133,     6,     6,     6,
+  1093,     6,  1095,     6,     6,     6,   135,     5,   135,     6,
+   882,  1156,   884,  1158,   886,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,     3,     4,   134,  1174,
+   126,   134,     9,    10,    11,    12,    13,    14,    15,    16,
+    17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+    27,    28,    29,    30,    31,    32,     6,     6,   134,     6,
+     6,   134,   133,     6,    41,   108,   109,   110,   111,   112,
+   113,   114,   115,   116,   117,   118,   119,   120,   121,     5,
+   134,     6,   134,   126,   134,    62,    63,    64,    65,    66,
+    67,     6,   134,     6,     6,     6,     6,    74,    75,   108,
    109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,     6,   134,   134,   949,   126,   134,   128,
-     6,   134,   134,   134,     6,     6,  1007,     6,  1007,   962,
-   134,    86,     6,   131,     4,     6,   131,   970,     6,   972,
-   130,     6,     6,   976,   742,     6,     6,     6,   981,   747,
-     6,     6,     6,     6,     6,     6,   754,   755,   756,     6,
-     6,   759,   760,   761,   762,   763,   764,   765,     6,     6,
-     6,     6,   134,     4,     6,   774,     6,  1010,     7,  1012,
-     6,  1014,     6,     6,   130,     6,    85,  1020,     6,   134,
-     6,   135,  1025,  1026,    88,   134,   134,     7,     6,     6,
-   134,  1034,   128,     6,     6,     6,     6,   134,   133,  1042,
-   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-   118,   119,   120,   121,   822,     5,   134,  1060,   126,   135,
-   134,     6,   133,     6,     6,   133,     6,   135,  1071,     6,
-  1125,  1074,     6,     6,  1077,   844,     6,   846,     6,     5,
-   134,   134,     6,     6,  1087,   135,  1089,   134,    41,    42,
-    43,    44,    45,    46,    47,    48,    49,  1152,    51,  1154,
-    53,    54,   134,    56,    57,   133,   875,     6,   877,     6,
-   879,     6,     6,     6,     5,  1170,   884,   135,     6,    72,
-   134,   134,   134,   134,     6,   893,     6,     6,     6,    82,
-    83,    84,     6,     6,     6,   903,     6,   730,     0,   907,
-     3,     4,     0,  1060,   980,   533,     9,    10,    11,    12,
-    13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-    23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-     2,     2,    -1,   827,    -1,    -1,    -1,    -1,    41,    -1,
-   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    62,
-    63,    64,    65,    66,    67,    -1,    -1,    -1,    -1,    -1,
-    -1,    74,    75,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,   100,   101,   102,
-   103,  1010,    -1,  1012,    -1,  1014,    -1,    -1,    -1,    -1,
-    -1,  1019,    -1,    -1,   117,   118,    -1,    -1,    -1,   122,
-    -1,    -1,    -1,    -1,   127,    -1,  1035,     3,     4,   132,
-    -1,    -1,   135,     9,    10,    11,    12,    13,    14,    15,
-    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-    26,    27,    28,    29,    30,    31,    32,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    41,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,  1082,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    62,    63,    64,    65,
-    66,    67,    -1,    -1,     3,     4,    -1,    -1,    74,    75,
+   119,   120,   121,     6,     6,     6,     0,   126,     0,   736,
+  1066,     2,   535,   100,   101,   102,   103,   110,   111,   112,
+   113,   114,   115,   116,   117,   118,   119,   120,   121,     2,
+   117,   118,   986,   126,  1016,   122,  1018,   834,  1020,    -1,
+   127,    -1,    -1,    -1,    -1,   132,    -1,    -1,   135,    -1,
+    -1,    -1,    -1,    -1,     3,     4,    -1,    -1,    -1,  1041,
      9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
     19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-    29,    30,    31,    32,   100,   101,   102,   103,     6,   111,
-   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-    -1,   117,   118,    -1,   126,    -1,   122,    -1,    -1,    -1,
-    -1,   127,    -1,     3,     4,    -1,   132,    -1,   134,     9,
-    10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-    20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,   100,   101,   102,   103,    -1,    -1,    -1,    -1,    -1,
+    29,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    41,   108,   109,   110,   111,   112,   113,   114,
+   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
+    -1,   126,    -1,    62,    63,    64,    65,    66,    67,    -1,
+   135,     3,     4,    -1,    -1,    74,    75,     9,    10,    11,
+    12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+    22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+    32,   100,   101,   102,   103,     6,    -1,    -1,    -1,    -1,
     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,
     -1,    -1,    -1,   122,    -1,    -1,    -1,    -1,   127,    -1,
-    -1,   130,    -1,   132,    -1,   134,    -1,    -1,    -1,    -1,
-   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,     6,
-   100,   101,   102,   103,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,
-    -1,    -1,   122,    -1,    -1,    -1,    -1,   127,    -1,    -1,
-   130,    -1,   132,    -1,   134,     3,     4,    -1,    -1,    -1,
-    -1,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-    18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-    28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
-     3,     4,    -1,    -1,    -1,    -1,     9,    10,    11,    12,
+     3,     4,    -1,   132,    -1,   134,     9,    10,    11,    12,
     13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
     23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-    -1,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,   100,   101,   102,   103,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,
-   118,    -1,    -1,    -1,   122,    -1,    -1,    -1,    -1,   127,
-    -1,    -1,   130,    -1,   132,    -1,   134,   100,   101,   102,
-   103,     6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,   101,
+   102,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,
+   122,    -1,    -1,    -1,    -1,   127,    -1,    -1,   130,    -1,
+   132,    -1,   134,    -1,    -1,    -1,    -1,   108,   109,   110,
+   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+   121,    -1,    -1,    -1,    -1,   126,     6,   100,   101,   102,
+   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,   122,
-    -1,    -1,    -1,    -1,   127,    -1,     3,     4,    -1,   132,
-    -1,   134,     9,    10,    11,    12,    13,    14,    15,    16,
-    17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-    27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,
-    -1,     3,     4,     5,    -1,     7,    -1,     9,    10,    11,
-    12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-    22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-    32,    -1,    34,    35,    36,    37,    -1,    -1,    40,    -1,
-    -1,    -1,    -1,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,   100,   101,   102,   103,    -1,     6,    -1,
+    -1,    -1,    -1,    -1,   127,    -1,    -1,   130,    -1,   132,
+    -1,   134,     3,     4,    -1,    -1,    -1,    -1,     9,    10,
+    11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+    21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+    31,    32,    -1,    -1,    -1,    -1,    -1,     3,     4,    -1,
+    -1,    -1,    -1,     9,    10,    11,    12,    13,    14,    15,
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    26,    27,    28,    29,    30,    31,    32,    -1,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,
+   101,   102,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,    -1,
+    -1,   122,    -1,    -1,    -1,    -1,   127,    -1,    -1,   130,
+    -1,   132,    -1,   134,   100,   101,   102,   103,     6,    -1,
     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-   117,   118,    -1,    -1,    -1,   122,    -1,    -1,    -1,    -1,
-   127,    -1,    -1,    -1,    -1,   132,    -1,   134,   100,   101,
-   102,   103,   104,   105,   106,   107,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,
-   122,   123,   124,    -1,    -1,   127,    -1,   129,    -1,   131,
-   132,     3,     4,    -1,    -1,    -1,    -1,     9,    10,    11,
-    12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-    22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-    32,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    41,
+    -1,   117,   118,    -1,    -1,    -1,   122,    -1,    -1,    -1,
+    -1,   127,    -1,     3,     4,    -1,   132,    -1,   134,     9,
+    10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+    20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+    30,    31,    32,    -1,    -1,    -1,    -1,    -1,     3,     4,
+     5,    -1,     7,    -1,     9,    10,    11,    12,    13,    14,
+    15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+    25,    26,    27,    28,    29,    30,    31,    32,    -1,    34,
+    35,    36,    37,    -1,    -1,    40,    -1,    -1,    -1,    -1,
    108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
    118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
-    62,    63,    64,    65,    66,    67,    -1,    -1,     3,     4,
-    -1,    -1,    74,    75,     9,    10,    11,    12,    13,    14,
+   100,   101,   102,   103,    -1,     6,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,
+    -1,    -1,   122,    -1,    -1,    -1,    -1,   127,    -1,    -1,
+    -1,    -1,   132,    -1,   134,   100,   101,   102,   103,   104,
+   105,   106,   107,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,   117,   118,    -1,    -1,    -1,   122,   123,   124,
+    -1,    -1,   127,    -1,   129,    -1,   131,   132,     3,     4,
+    -1,    -1,    -1,    -1,     9,    10,    11,    12,    13,    14,
     15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-    25,    26,    27,    28,    29,    30,    31,    32,   100,   101,
-   102,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,
-   122,    -1,    -1,    -1,    -1,   127,     3,     4,     5,    -1,
-   132,    -1,     9,    10,    11,    12,    13,    14,    15,    16,
-    17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-    27,    28,    29,    30,    31,    32,     6,    34,    35,    36,
-    37,    -1,    -1,    40,    -1,   100,   101,   102,   103,    -1,
+    25,    26,    27,    28,    29,    30,    31,    32,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    41,   108,   109,   110,
+   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+   121,    -1,    -1,    -1,    -1,   126,    -1,    62,    63,    64,
+    65,    66,    67,    -1,    -1,     3,     4,    -1,    -1,    74,
+    75,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+    18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+    28,    29,    30,    31,    32,   100,   101,   102,   103,    -1,
     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     -1,    -1,   117,   118,    -1,    -1,    -1,   122,    -1,    -1,
-    -1,    -1,   127,     3,     4,    -1,    -1,   132,    -1,     9,
+    -1,    -1,   127,     3,     4,     5,    -1,   132,    -1,     9,
     10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
     20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-    30,    31,    32,   100,   101,   102,   103,     6,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-   117,   118,    -1,    -1,    -1,   122,     6,    -1,    -1,    -1,
-   127,    -1,    -1,    -1,    -1,   132,    -1,    -1,   108,   109,
-   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-   120,   121,     6,    -1,    -1,    -1,   126,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    30,    31,    32,     6,    34,    35,    36,    37,    -1,    -1,
+    40,    -1,   100,   101,   102,   103,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,
+   118,    -1,    -1,    -1,   122,    -1,    -1,    -1,    -1,   127,
+     3,     4,    -1,    -1,   132,    -1,     9,    10,    11,    12,
+    13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+    23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
    100,   101,   102,   103,     6,    -1,    -1,    -1,    -1,    -1,
     -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,    -1,
-    -1,    -1,   122,    -1,    -1,     8,    -1,   127,    -1,    -1,
-    -1,    -1,   132,    -1,    -1,    -1,    -1,    -1,    -1,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,     8,    -1,    -1,    -1,   126,   108,   109,
-   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-   120,   121,     8,    -1,    -1,    -1,   126,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,   108,   109,   110,   111,   112,   113,
-   114,   115,   116,   117,   118,   119,   120,   121,     8,    -1,
-    -1,    -1,   126,    -1,    -1,    -1,   108,   109,   110,   111,
+    -1,    -1,   122,     6,    -1,    -1,    -1,   127,    -1,    -1,
+    -1,    -1,   132,    -1,    -1,   108,   109,   110,   111,   112,
+   113,   114,   115,   116,   117,   118,   119,   120,   121,     8,
+    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,   100,   101,   102,
+   103,     8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,   122,
+     8,    -1,    -1,    -1,   127,    -1,    -1,    -1,    -1,   132,
+    -1,    -1,    -1,    -1,    -1,    -1,   108,   109,   110,   111,
    112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
      8,    -1,    -1,    -1,   126,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,   108,   109,   110,   111,   112,   113,   114,   115,
-   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
-   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   108,   109,
-   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-   120,   121,    -1,     0,     1,    -1,   126,     4,    -1,    -1,
+   113,   114,   115,   116,   117,   118,   119,   120,   121,     8,
+    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,   108,
+   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
+    -1,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
    108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
    118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    33,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,   108,
+   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+   119,   120,   121,    -1,     0,     1,    -1,   126,     4,   108,
+   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
+    -1,    -1,    -1,    -1,   133,    -1,   135,    33,    -1,    -1,
+    -1,    -1,    38,    39,    -1,    41,    42,    43,    44,    45,
+    46,    47,    48,    49,    -1,    51,    52,    53,    54,    55,
+    56,    57,    -1,    -1,    -1,    61,    62,    63,    64,    65,
+    66,    67,    -1,    69,    70,    71,    72,     4,    74,    75,
+    -1,    -1,    -1,    -1,    -1,    81,    82,    83,    84,    -1,
+    -1,    87,    -1,    89,    -1,    91,    92,    93,    94,    95,
+    96,    97,    98,    99,    -1,    -1,    33,    -1,    -1,    -1,
     -1,    38,    39,    -1,    41,    42,    43,    44,    45,    46,
     47,    48,    49,    -1,    51,    52,    53,    54,    55,    56,
     57,    -1,    -1,    -1,    61,    62,    63,    64,    65,    66,
-    67,    -1,    69,    70,    71,    72,     4,    74,    75,    -1,
+    67,    -1,    69,    70,    71,    72,    -1,    74,    75,    -1,
     -1,    -1,    -1,    -1,    81,    82,    83,    84,    -1,    -1,
     87,    -1,    89,    -1,    91,    92,    93,    94,    95,    96,
-    97,    98,    99,    -1,    -1,    33,    -1,    -1,    -1,    -1,
-    38,    39,    -1,    41,    42,    43,    44,    45,    46,    47,
-    48,    49,    -1,    51,    52,    53,    54,    55,    56,    57,
-    -1,    -1,    -1,    61,    62,    63,    64,    65,    66,    67,
-    -1,    69,    70,    71,    72,    -1,    74,    75,    -1,    -1,
-    -1,    -1,    -1,    81,    82,    83,    84,    -1,    -1,    87,
-    -1,    89,    -1,    91,    92,    93,    94,    95,    96,    97,
-    98,    99,    41,    42,    43,    44,    45,    46,    47,    48,
-    49,    -1,    51,    -1,    53,    54,    -1,    56,    57,    41,
-    42,    43,    44,    45,    46,    47,    48,    49,    -1,    51,
-    -1,    53,    54,    72,    56,    57,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    82,    83,    84,    -1,    -1,    -1,    -1,
-    72,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    82,    83,    84,    41,    42,    43,    44,    45,    46,    47,
+    97,    98,    99,    41,    42,    43,    44,    45,    46,    47,
     48,    49,    -1,    51,    -1,    53,    54,    -1,    56,    57,
-    -1,    -1,    -1,    -1,    -1,    41,    42,    43,    44,    45,
-    46,    47,    48,    49,    72,    51,   135,    53,    54,    -1,
-    56,    57,    -1,    -1,    82,    83,    84,    -1,    -1,    -1,
-    -1,    -1,    -1,   135,    -1,    -1,    72,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    82,    83,    84,    41,
-    42,    43,    44,    45,    46,    47,    48,    49,    -1,    51,
-    -1,    53,    54,    -1,    56,    57,    41,    42,    43,    44,
-    45,    46,    47,    48,    49,    -1,    51,   135,    53,    54,
-    72,    56,    57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    82,    83,    84,    -1,    -1,    -1,    -1,    72,    -1,   135,
+    41,    42,    43,    44,    45,    46,    47,    48,    49,    -1,
+    51,    -1,    53,    54,    72,    56,    57,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    82,    83,    84,    -1,    -1,    -1,
+    -1,    72,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    82,    83,    84,    41,    42,    43,    44,    45,    46,
+    47,    48,    49,    -1,    51,    -1,    53,    54,    -1,    56,
+    57,    -1,    -1,    -1,    -1,    -1,    41,    42,    43,    44,
+    45,    46,    47,    48,    49,    72,    51,   135,    53,    54,
+    -1,    56,    57,    -1,    -1,    82,    83,    84,    -1,    -1,
+    -1,    -1,    -1,    -1,   135,    -1,    -1,    72,    -1,    -1,
     -1,    -1,    -1,    -1,    -1,    -1,    -1,    82,    83,    84,
     41,    42,    43,    44,    45,    46,    47,    48,    49,    -1,
-    51,    -1,    53,    54,    -1,    56,    57,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    72,    -1,   135,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    82,    83,    84,   135,    -1,    -1,    -1,    -1,    -1,
-   135,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,   133,    -1,   135,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,   135,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,   133,    -1,   135,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,   135,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-   135,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,
+    51,    -1,    53,    54,    -1,    56,    57,    41,    42,    43,
+    44,    45,    46,    47,    48,    49,    -1,    51,   135,    53,
+    54,    72,    56,    57,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    82,    83,    84,    -1,    -1,    -1,    -1,    72,    -1,
+   135,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    82,    83,
+    84,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+    -1,    51,    -1,    53,    54,    -1,    56,    57,    -1,    -1,
+    -1,    -1,    -1,    41,    42,    43,    44,    45,    46,    47,
+    48,    49,    72,    51,   135,    53,    54,    -1,    56,    57,
+    -1,    -1,    82,    83,    84,    -1,    -1,    -1,    -1,    -1,
+    -1,   135,    -1,    -1,    72,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    82,    83,    84,   108,   109,   110,
    111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
    121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,   135,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-   135,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,   135,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-   135,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,   135,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-   135,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-    -1,    -1,   135,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-   135,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,   128,    -1,    -1,    -1,    -1,   133,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,   133,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-   133,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,   133,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-   133,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,   133,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-   133,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,   133,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-   133,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,   133,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-   133,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,
-    -1,    -1,   133,   108,   109,   110,   111,   112,   113,   114,
-   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
-    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,
-    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,
-   113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
-    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,
-   133,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+    -1,    -1,   133,    -1,   135,   135,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,   133,    -1,   135,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,   135,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,   135,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,   135,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,   135,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,   135,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,   135,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,   135,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,   128,    -1,
+    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,   133,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,   133,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,   133,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,   133,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,   133,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+    -1,    -1,    -1,   133,   108,   109,   110,   111,   112,   113,
+   114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
+    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,
+   108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,    -1,
+    -1,    -1,    -1,    -1,    -1,   133,   108,   109,   110,   111,
+   112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+    -1,   133,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   108,   109,
+   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+   120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+   130,   108,   109,   110,   111,   112,   113,   114,   115,   116,
    117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
     -1,    -1,    -1,   130,   108,   109,   110,   111,   112,   113,
    114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
@@ -2014,7 +2015,11 @@ static const short yycheck[] = {     4,
    120,   121,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
    130,   108,   109,   110,   111,   112,   113,   114,   115,   116,
    117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,   126,
-    -1,    -1,    -1,   130,   108,   109,   110,   111,   112,   113,
+    -1,   128,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,    -1,
+   126,    -1,   128,   108,   109,   110,   111,   112,   113,   114,
+   115,   116,   117,   118,   119,   120,   121,    -1,    -1,    -1,
+    -1,   126,    -1,   128,   108,   109,   110,   111,   112,   113,
    114,   115,   116,   117,   118,   119,   120,   121,    -1,    -1,
     -1,    -1,   126,    -1,   128,   108,   109,   110,   111,   112,
    113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
@@ -2104,13 +2109,7 @@ static const short yycheck[] = {     4,
    113,   114,   115,   116,   117,   118,   119,   120,   121,    -1,
     -1,    -1,    -1,   126,    -1,   128,   108,   109,   110,   111,
    112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-    -1,    -1,    -1,    -1,   126,    -1,   128,   108,   109,   110,
-   111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-   121,    -1,    -1,    -1,    -1,   126,    -1,   128,   108,   109,
-   110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-   120,   121,    -1,    -1,    -1,    -1,   126,    -1,   128,   108,
-   109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-   119,   120,   121,    -1,    -1,    -1,    -1,   126
+    -1,    -1,    -1,    -1,   126
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/share/bison.simple"
@@ -4878,100 +4877,100 @@ case 162:
     ;
     break;}
 case 163:
-#line 2199 "Gmsh.y"
+#line 2197 "Gmsh.y"
 {
-      yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE, MSH_POINT, (int)yyvsp[-4].d, 
-		   yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2], 0., 0., 0., 0., 0., 0., 0.,
-		   NULL, yyval.l);
+      extr.mesh.ExtrudeMesh = false;
+      extr.mesh.Recombine = false;
     ;
     break;}
 case 164:
-#line 2206 "Gmsh.y"
+#line 2202 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)yyvsp[-4].d, 
-		   yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2], 0., 0., 0., 0., 0., 0., 0.,
-		   NULL, yyval.l);
+      ExtrudeShapes(BOUNDARY_LAYER, yyvsp[-3].l, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
+		    &extr, yyval.l);
+      List_Delete(yyvsp[-3].l);
     ;
     break;}
 case 165:
-#line 2213 "Gmsh.y"
+#line 2211 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)yyvsp[-4].d, 
+      ExtrudeShape(TRANSLATE, MSH_POINT, (int)yyvsp[-4].d, 
 		   yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2], 0., 0., 0., 0., 0., 0., 0.,
 		   NULL, yyval.l);
     ;
     break;}
 case 166:
-#line 2220 "Gmsh.y"
+#line 2218 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(ROTATE, MSH_POINT, (int)yyvsp[-8].d, 
-		   0., 0., 0., yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
+      ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)yyvsp[-4].d, 
+		   yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2], 0., 0., 0., 0., 0., 0., 0.,
 		   NULL, yyval.l);
     ;
     break;}
 case 167:
-#line 2227 "Gmsh.y"
+#line 2225 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)yyvsp[-8].d, 
-		   0., 0., 0., yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
+      ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)yyvsp[-4].d, 
+		   yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2], 0., 0., 0., 0., 0., 0., 0.,
 		   NULL, yyval.l);
     ;
     break;}
 case 168:
-#line 2234 "Gmsh.y"
+#line 2232 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)yyvsp[-8].d, 
+      ExtrudeShape(ROTATE, MSH_POINT, (int)yyvsp[-8].d, 
 		   0., 0., 0., yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
 		   NULL, yyval.l);
     ;
     break;}
 case 169:
-#line 2241 "Gmsh.y"
+#line 2239 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)yyvsp[-10].d, 
-		   yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
+      ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)yyvsp[-8].d, 
+		   0., 0., 0., yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
 		   NULL, yyval.l);
     ;
     break;}
 case 170:
-#line 2248 "Gmsh.y"
+#line 2246 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)yyvsp[-10].d, 
-		   yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
+      ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)yyvsp[-8].d, 
+		   0., 0., 0., yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
 		   NULL, yyval.l);
     ;
     break;}
 case 171:
-#line 2255 "Gmsh.y"
+#line 2253 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)yyvsp[-10].d, 
+      ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)yyvsp[-10].d, 
 		   yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
 		   NULL, yyval.l);
     ;
     break;}
 case 172:
-#line 2262 "Gmsh.y"
+#line 2260 "Gmsh.y"
 {
-      extr.mesh.ExtrudeMesh = false;
-      extr.mesh.Recombine = false;
+      yyval.l = List_Create(2, 1, sizeof(Shape));
+      ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)yyvsp[-10].d, 
+		   yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
+		   NULL, yyval.l);
     ;
     break;}
 case 173:
 #line 2267 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE, MSH_POINT, (int)yyvsp[-8].d, 
-		   yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], 0., 0., 0., 0., 0., 0., 0.,
-		   &extr, yyval.l);
+      ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)yyvsp[-10].d, 
+		   yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].v[0], yyvsp[-4].v[1], yyvsp[-4].v[2], yyvsp[-2].d,
+		   NULL, yyval.l);
     ;
     break;}
 case 174:
@@ -4985,7 +4984,7 @@ case 175:
 #line 2279 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)yyvsp[-8].d, 
+      ExtrudeShape(TRANSLATE, MSH_POINT, (int)yyvsp[-8].d, 
 		   yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], 0., 0., 0., 0., 0., 0., 0.,
 		   &extr, yyval.l);
     ;
@@ -5001,7 +5000,7 @@ case 177:
 #line 2291 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)yyvsp[-8].d, 
+      ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)yyvsp[-8].d, 
 		   yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], 0., 0., 0., 0., 0., 0., 0.,
 		   &extr, yyval.l);
     ;
@@ -5017,8 +5016,8 @@ case 179:
 #line 2303 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(ROTATE, MSH_POINT, (int)yyvsp[-12].d, 
-		   0., 0., 0., yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
+      ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)yyvsp[-8].d, 
+		   yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], 0., 0., 0., 0., 0., 0., 0.,
 		   &extr, yyval.l);
     ;
     break;}
@@ -5033,7 +5032,7 @@ case 181:
 #line 2315 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)yyvsp[-12].d, 
+      ExtrudeShape(ROTATE, MSH_POINT, (int)yyvsp[-12].d, 
 		   0., 0., 0., yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
 		   &extr, yyval.l);
     ;
@@ -5049,7 +5048,7 @@ case 183:
 #line 2327 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)yyvsp[-12].d, 
+      ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)yyvsp[-12].d, 
 		   0., 0., 0., yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
 		   &extr, yyval.l);
     ;
@@ -5065,8 +5064,8 @@ case 185:
 #line 2339 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)yyvsp[-14].d, 
-		   yyvsp[-12].v[0], yyvsp[-12].v[1], yyvsp[-12].v[2], yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
+      ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)yyvsp[-12].d, 
+		   0., 0., 0., yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
 		   &extr, yyval.l);
     ;
     break;}
@@ -5081,7 +5080,7 @@ case 187:
 #line 2351 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)yyvsp[-14].d, 
+      ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)yyvsp[-14].d, 
 		   yyvsp[-12].v[0], yyvsp[-12].v[1], yyvsp[-12].v[2], yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
 		   &extr, yyval.l);
     ;
@@ -5097,23 +5096,39 @@ case 189:
 #line 2363 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(Shape));
-      ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)yyvsp[-14].d, 
+      ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)yyvsp[-14].d, 
 		   yyvsp[-12].v[0], yyvsp[-12].v[1], yyvsp[-12].v[2], yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
 		   &extr, yyval.l);
     ;
     break;}
 case 190:
-#line 2374 "Gmsh.y"
+#line 2370 "Gmsh.y"
 {
+      extr.mesh.ExtrudeMesh = false;
+      extr.mesh.Recombine = false;
     ;
     break;}
 case 191:
-#line 2377 "Gmsh.y"
+#line 2375 "Gmsh.y"
 {
+      yyval.l = List_Create(2, 1, sizeof(Shape));
+      ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)yyvsp[-14].d, 
+		   yyvsp[-12].v[0], yyvsp[-12].v[1], yyvsp[-12].v[2], yyvsp[-10].v[0], yyvsp[-10].v[1], yyvsp[-10].v[2], yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2], yyvsp[-6].d,
+		   &extr, yyval.l);
     ;
     break;}
 case 192:
-#line 2383 "Gmsh.y"
+#line 2386 "Gmsh.y"
+{
+    ;
+    break;}
+case 193:
+#line 2389 "Gmsh.y"
+{
+    ;
+    break;}
+case 194:
+#line 2395 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = 1;
@@ -5123,8 +5138,8 @@ case 192:
       extr.mesh.hLayer.push_back(1.);
     ;
     break;}
-case 193:
-#line 2392 "Gmsh.y"
+case 195:
+#line 2404 "Gmsh.y"
 {
       double d;
       extr.mesh.ExtrudeMesh = true;
@@ -5147,8 +5162,8 @@ case 193:
       List_Delete(yyvsp[-2].l);
     ;
     break;}
-case 194:
-#line 2414 "Gmsh.y"
+case 196:
+#line 2426 "Gmsh.y"
 {
       yymsg(WARNING, "Explicit region numbers in layers are deprecated");
       double d;
@@ -5173,14 +5188,14 @@ case 194:
       List_Delete(yyvsp[-2].l);
     ;
     break;}
-case 195:
-#line 2438 "Gmsh.y"
+case 197:
+#line 2450 "Gmsh.y"
 {
       extr.mesh.Recombine = true;
     ;
     break;}
-case 196:
-#line 2447 "Gmsh.y"
+case 198:
+#line 2459 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[-3].l); i++){
 	double d;
@@ -5199,8 +5214,8 @@ case 196:
       List_Delete(yyvsp[-3].l);
     ;
     break;}
-case 197:
-#line 2465 "Gmsh.y"
+case 199:
+#line 2477 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[-6].l); i++){
 	double d;
@@ -5219,8 +5234,8 @@ case 197:
       List_Delete(yyvsp[-6].l);
     ;
     break;}
-case 198:
-#line 2483 "Gmsh.y"
+case 200:
+#line 2495 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[-6].l); i++){
 	double d;
@@ -5239,8 +5254,8 @@ case 198:
       List_Delete(yyvsp[-6].l);
     ;
     break;}
-case 199:
-#line 2501 "Gmsh.y"
+case 201:
+#line 2513 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d);
       if(!s)
@@ -5270,8 +5285,8 @@ case 199:
       List_Delete(yyvsp[-1].l);
     ;
     break;}
-case 200:
-#line 2530 "Gmsh.y"
+case 202:
+#line 2542 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-5].d);
       if(!s)
@@ -5307,15 +5322,15 @@ case 200:
       Free(yyvsp[-1].c);
     ;
     break;}
-case 201:
-#line 2565 "Gmsh.y"
+case 203:
+#line 2577 "Gmsh.y"
 {
       yymsg(WARNING, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)");
       List_Delete(yyvsp[-1].l);
     ;
     break;}
-case 202:
-#line 2570 "Gmsh.y"
+case 204:
+#line 2582 "Gmsh.y"
 {
       Volume *v = FindVolume((int)yyvsp[-4].d);
       if(!v)
@@ -5343,8 +5358,8 @@ case 202:
       List_Delete(yyvsp[-1].l);
     ;
     break;}
-case 203:
-#line 2597 "Gmsh.y"
+case 205:
+#line 2609 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[-3].l); i++){
 	double d;
@@ -5359,8 +5374,8 @@ case 203:
       List_Delete(yyvsp[-3].l);
     ;
     break;}
-case 204:
-#line 2611 "Gmsh.y"
+case 206:
+#line 2623 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[-1].l); i++){
 	double d;
@@ -5374,72 +5389,72 @@ case 204:
       List_Delete(yyvsp[-1].l);
     ;
     break;}
-case 205:
-#line 2630 "Gmsh.y"
+case 207:
+#line 2642 "Gmsh.y"
 { 
       Surface *s = FindSurface((int)yyvsp[-2].d);
       if(s)
 	setSurfaceEmbeddedPoints(s, yyvsp[-7].l);
     ;
     break;}
-case 206:
-#line 2636 "Gmsh.y"
+case 208:
+#line 2648 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-2].d);
       if(s)
 	setSurfaceEmbeddedCurves(s, yyvsp[-7].l);
     ;
     break;}
-case 207:
-#line 2642 "Gmsh.y"
+case 209:
+#line 2654 "Gmsh.y"
 {
     ;
     break;}
-case 208:
-#line 2645 "Gmsh.y"
+case 210:
+#line 2657 "Gmsh.y"
 {
     ;
     break;}
-case 209:
-#line 2654 "Gmsh.y"
+case 211:
+#line 2666 "Gmsh.y"
 { 
       ReplaceAllDuplicates();
     ;
     break;}
-case 210:
-#line 2663 "Gmsh.y"
+case 212:
+#line 2675 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
-case 211:
-#line 2664 "Gmsh.y"
+case 213:
+#line 2676 "Gmsh.y"
 { yyval.d = yyvsp[-1].d;           ;
     break;}
-case 212:
-#line 2665 "Gmsh.y"
+case 214:
+#line 2677 "Gmsh.y"
 { yyval.d = -yyvsp[0].d;          ;
     break;}
-case 213:
-#line 2666 "Gmsh.y"
+case 215:
+#line 2678 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
-case 214:
-#line 2667 "Gmsh.y"
+case 216:
+#line 2679 "Gmsh.y"
 { yyval.d = !yyvsp[0].d;          ;
     break;}
-case 215:
-#line 2668 "Gmsh.y"
+case 217:
+#line 2680 "Gmsh.y"
 { yyval.d = yyvsp[-2].d - yyvsp[0].d;      ;
     break;}
-case 216:
-#line 2669 "Gmsh.y"
+case 218:
+#line 2681 "Gmsh.y"
 { yyval.d = yyvsp[-2].d + yyvsp[0].d;      ;
     break;}
-case 217:
-#line 2670 "Gmsh.y"
+case 219:
+#line 2682 "Gmsh.y"
 { yyval.d = yyvsp[-2].d * yyvsp[0].d;      ;
     break;}
-case 218:
-#line 2672 "Gmsh.y"
+case 220:
+#line 2684 "Gmsh.y"
 { 
       if(!yyvsp[0].d)
 	yymsg(GERROR, "Division by zero in '%g / %g'", yyvsp[-2].d, yyvsp[0].d);
@@ -5447,248 +5462,248 @@ case 218:
 	yyval.d = yyvsp[-2].d / yyvsp[0].d;     
     ;
     break;}
-case 219:
-#line 2678 "Gmsh.y"
+case 221:
+#line 2690 "Gmsh.y"
 { yyval.d = (int)yyvsp[-2].d % (int)yyvsp[0].d;  ;
     break;}
-case 220:
-#line 2679 "Gmsh.y"
+case 222:
+#line 2691 "Gmsh.y"
 { yyval.d = pow(yyvsp[-2].d, yyvsp[0].d);  ;
     break;}
-case 221:
-#line 2680 "Gmsh.y"
+case 223:
+#line 2692 "Gmsh.y"
 { yyval.d = yyvsp[-2].d < yyvsp[0].d;      ;
     break;}
-case 222:
-#line 2681 "Gmsh.y"
+case 224:
+#line 2693 "Gmsh.y"
 { yyval.d = yyvsp[-2].d > yyvsp[0].d;      ;
     break;}
-case 223:
-#line 2682 "Gmsh.y"
+case 225:
+#line 2694 "Gmsh.y"
 { yyval.d = yyvsp[-2].d <= yyvsp[0].d;     ;
     break;}
-case 224:
-#line 2683 "Gmsh.y"
+case 226:
+#line 2695 "Gmsh.y"
 { yyval.d = yyvsp[-2].d >= yyvsp[0].d;     ;
     break;}
-case 225:
-#line 2684 "Gmsh.y"
+case 227:
+#line 2696 "Gmsh.y"
 { yyval.d = yyvsp[-2].d == yyvsp[0].d;     ;
     break;}
-case 226:
-#line 2685 "Gmsh.y"
+case 228:
+#line 2697 "Gmsh.y"
 { yyval.d = yyvsp[-2].d != yyvsp[0].d;     ;
     break;}
-case 227:
-#line 2686 "Gmsh.y"
+case 229:
+#line 2698 "Gmsh.y"
 { yyval.d = yyvsp[-2].d && yyvsp[0].d;     ;
     break;}
-case 228:
-#line 2687 "Gmsh.y"
+case 230:
+#line 2699 "Gmsh.y"
 { yyval.d = yyvsp[-2].d || yyvsp[0].d;     ;
     break;}
-case 229:
-#line 2688 "Gmsh.y"
+case 231:
+#line 2700 "Gmsh.y"
 { yyval.d = yyvsp[-4].d? yyvsp[-2].d : yyvsp[0].d;  ;
     break;}
-case 230:
-#line 2689 "Gmsh.y"
+case 232:
+#line 2701 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
-case 231:
-#line 2690 "Gmsh.y"
+case 233:
+#line 2702 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
-case 232:
-#line 2691 "Gmsh.y"
+case 234:
+#line 2703 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
-case 233:
-#line 2692 "Gmsh.y"
+case 235:
+#line 2704 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
-case 234:
-#line 2693 "Gmsh.y"
+case 236:
+#line 2705 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
-case 235:
-#line 2694 "Gmsh.y"
+case 237:
+#line 2706 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
-case 236:
-#line 2695 "Gmsh.y"
+case 238:
+#line 2707 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
-case 237:
-#line 2696 "Gmsh.y"
+case 239:
+#line 2708 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
-case 238:
-#line 2697 "Gmsh.y"
+case 240:
+#line 2709 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
-case 239:
-#line 2698 "Gmsh.y"
+case 241:
+#line 2710 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
-case 240:
-#line 2699 "Gmsh.y"
+case 242:
+#line 2711 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d, yyvsp[-1].d);;
     break;}
-case 241:
-#line 2700 "Gmsh.y"
+case 243:
+#line 2712 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
-case 242:
-#line 2701 "Gmsh.y"
+case 244:
+#line 2713 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
-    break;}
-case 243:
-#line 2702 "Gmsh.y"
+    break;}
+case 245:
+#line 2714 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
-case 244:
-#line 2703 "Gmsh.y"
+case 246:
+#line 2715 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
-case 245:
-#line 2704 "Gmsh.y"
+case 247:
+#line 2716 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
-case 246:
-#line 2705 "Gmsh.y"
+case 248:
+#line 2717 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
-case 247:
-#line 2706 "Gmsh.y"
+case 249:
+#line 2718 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
-case 248:
-#line 2707 "Gmsh.y"
+case 250:
+#line 2719 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
-case 249:
-#line 2708 "Gmsh.y"
+case 251:
+#line 2720 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
-case 250:
-#line 2709 "Gmsh.y"
+case 252:
+#line 2721 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
-case 251:
-#line 2711 "Gmsh.y"
+case 253:
+#line 2723 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
-case 252:
-#line 2712 "Gmsh.y"
+case 254:
+#line 2724 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
-case 253:
-#line 2713 "Gmsh.y"
+case 255:
+#line 2725 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
-case 254:
-#line 2714 "Gmsh.y"
+case 256:
+#line 2726 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
-case 255:
-#line 2715 "Gmsh.y"
+case 257:
+#line 2727 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
-case 256:
-#line 2716 "Gmsh.y"
+case 258:
+#line 2728 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
-case 257:
-#line 2717 "Gmsh.y"
+case 259:
+#line 2729 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
-case 258:
-#line 2718 "Gmsh.y"
+case 260:
+#line 2730 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
-case 259:
-#line 2719 "Gmsh.y"
+case 261:
+#line 2731 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
-case 260:
-#line 2720 "Gmsh.y"
+case 262:
+#line 2732 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
-case 261:
-#line 2721 "Gmsh.y"
+case 263:
+#line 2733 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d, yyvsp[-1].d);;
     break;}
-case 262:
-#line 2722 "Gmsh.y"
+case 264:
+#line 2734 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
-case 263:
-#line 2723 "Gmsh.y"
+case 265:
+#line 2735 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
-case 264:
-#line 2724 "Gmsh.y"
+case 266:
+#line 2736 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
-case 265:
-#line 2725 "Gmsh.y"
+case 267:
+#line 2737 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
-case 266:
-#line 2726 "Gmsh.y"
+case 268:
+#line 2738 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
-case 267:
-#line 2727 "Gmsh.y"
+case 269:
+#line 2739 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
-case 268:
-#line 2728 "Gmsh.y"
+case 270:
+#line 2740 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
-case 269:
-#line 2729 "Gmsh.y"
+case 271:
+#line 2741 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
-case 270:
-#line 2730 "Gmsh.y"
+case 272:
+#line 2742 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
-case 271:
-#line 2731 "Gmsh.y"
+case 273:
+#line 2743 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
-case 272:
-#line 2740 "Gmsh.y"
+case 274:
+#line 2752 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
-case 273:
-#line 2741 "Gmsh.y"
+case 275:
+#line 2753 "Gmsh.y"
 { yyval.d = 3.141592653589793; ;
     break;}
-case 274:
-#line 2742 "Gmsh.y"
+case 276:
+#line 2754 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->rank(); ;
     break;}
-case 275:
-#line 2743 "Gmsh.y"
+case 277:
+#line 2755 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->size(); ;
     break;}
-case 276:
-#line 2744 "Gmsh.y"
+case 278:
+#line 2756 "Gmsh.y"
 { yyval.d = Get_GmshMajorVersion(); ;
     break;}
-case 277:
-#line 2745 "Gmsh.y"
+case 279:
+#line 2757 "Gmsh.y"
 { yyval.d = Get_GmshMinorVersion(); ;
     break;}
-case 278:
-#line 2746 "Gmsh.y"
+case 280:
+#line 2758 "Gmsh.y"
 { yyval.d = Get_GmshPatchVersion(); ;
     break;}
-case 279:
-#line 2751 "Gmsh.y"
+case 281:
+#line 2763 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[0].c;
@@ -5702,8 +5717,8 @@ case 279:
       Free(yyvsp[0].c);
     ;
     break;}
-case 280:
-#line 2767 "Gmsh.y"
+case 282:
+#line 2779 "Gmsh.y"
 {
       char tmpstring[1024];
       sprintf(tmpstring, "%s_%d", yyvsp[-4].c, (int)yyvsp[-1].d) ;
@@ -5719,8 +5734,8 @@ case 280:
       Free(yyvsp[-4].c);
     ;
     break;}
-case 281:
-#line 2782 "Gmsh.y"
+case 283:
+#line 2794 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-3].c;
@@ -5741,8 +5756,8 @@ case 281:
       Free(yyvsp[-3].c);
     ;
     break;}
-case 282:
-#line 2802 "Gmsh.y"
+case 284:
+#line 2814 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-2].c;
@@ -5757,8 +5772,8 @@ case 282:
       Free(yyvsp[-2].c);
     ;
     break;}
-case 283:
-#line 2816 "Gmsh.y"
+case 285:
+#line 2828 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-1].c;
@@ -5772,8 +5787,8 @@ case 283:
       Free(yyvsp[-1].c);
     ;
     break;}
-case 284:
-#line 2829 "Gmsh.y"
+case 286:
+#line 2841 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-4].c;
@@ -5794,8 +5809,8 @@ case 284:
       Free(yyvsp[-4].c);
     ;
     break;}
-case 285:
-#line 2852 "Gmsh.y"
+case 287:
+#line 2864 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -5814,8 +5829,8 @@ case 285:
       Free(yyvsp[-2].c); Free(yyvsp[0].c);
     ;
     break;}
-case 286:
-#line 2870 "Gmsh.y"
+case 288:
+#line 2882 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -5834,8 +5849,8 @@ case 286:
       Free(yyvsp[-5].c); Free(yyvsp[0].c);
     ;
     break;}
-case 287:
-#line 2888 "Gmsh.y"
+case 289:
+#line 2900 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -5854,8 +5869,8 @@ case 287:
       Free(yyvsp[-3].c); Free(yyvsp[-1].c);
     ;
     break;}
-case 288:
-#line 2906 "Gmsh.y"
+case 290:
+#line 2918 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -5874,108 +5889,108 @@ case 288:
       Free(yyvsp[-6].c); Free(yyvsp[-1].c);
     ;
     break;}
-case 289:
-#line 2924 "Gmsh.y"
+case 291:
+#line 2936 "Gmsh.y"
 { 
       yyval.d = GetValue(yyvsp[-3].c, yyvsp[-1].d);
       Free(yyvsp[-3].c);
     ;
     break;}
-case 290:
-#line 2932 "Gmsh.y"
+case 292:
+#line 2944 "Gmsh.y"
 {
       memcpy(yyval.v, yyvsp[0].v, 5*sizeof(double));
     ;
     break;}
-case 291:
-#line 2936 "Gmsh.y"
+case 293:
+#line 2948 "Gmsh.y"
 {
       for(int i = 0; i < 5; i++) yyval.v[i] = -yyvsp[0].v[i];
     ;
     break;}
-case 292:
-#line 2940 "Gmsh.y"
+case 294:
+#line 2952 "Gmsh.y"
 { 
       for(int i = 0; i < 5; i++) yyval.v[i] = yyvsp[0].v[i];
     ;
     break;}
-case 293:
-#line 2944 "Gmsh.y"
+case 295:
+#line 2956 "Gmsh.y"
 { 
       for(int i = 0; i < 5; i++) yyval.v[i] = yyvsp[-2].v[i] - yyvsp[0].v[i];
     ;
     break;}
-case 294:
-#line 2948 "Gmsh.y"
+case 296:
+#line 2960 "Gmsh.y"
 {
       for(int i = 0; i < 5; i++) yyval.v[i] = yyvsp[-2].v[i] + yyvsp[0].v[i];
     ;
     break;}
-case 295:
-#line 2955 "Gmsh.y"
+case 297:
+#line 2967 "Gmsh.y"
 { 
       yyval.v[0] = yyvsp[-9].d;  yyval.v[1] = yyvsp[-7].d;  yyval.v[2] = yyvsp[-5].d;  yyval.v[3] = yyvsp[-3].d; yyval.v[4] = yyvsp[-1].d;
     ;
     break;}
-case 296:
-#line 2959 "Gmsh.y"
+case 298:
+#line 2971 "Gmsh.y"
 { 
       yyval.v[0] = yyvsp[-7].d;  yyval.v[1] = yyvsp[-5].d;  yyval.v[2] = yyvsp[-3].d;  yyval.v[3] = yyvsp[-1].d; yyval.v[4] = 1.0;
     ;
     break;}
-case 297:
-#line 2963 "Gmsh.y"
+case 299:
+#line 2975 "Gmsh.y"
 {
       yyval.v[0] = yyvsp[-5].d;  yyval.v[1] = yyvsp[-3].d;  yyval.v[2] = yyvsp[-1].d;  yyval.v[3] = 0.0; yyval.v[4] = 1.0;
     ;
     break;}
-case 298:
-#line 2967 "Gmsh.y"
+case 300:
+#line 2979 "Gmsh.y"
 {
       yyval.v[0] = yyvsp[-5].d;  yyval.v[1] = yyvsp[-3].d;  yyval.v[2] = yyvsp[-1].d;  yyval.v[3] = 0.0; yyval.v[4] = 1.0;
     ;
     break;}
-case 299:
-#line 2974 "Gmsh.y"
+case 301:
+#line 2986 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(List_T*));
       List_Add(yyval.l, &(yyvsp[0].l));
     ;
     break;}
-case 300:
-#line 2979 "Gmsh.y"
+case 302:
+#line 2991 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].l));
     ;
     break;}
-case 301:
-#line 2987 "Gmsh.y"
+case 303:
+#line 2999 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       List_Add(yyval.l, &(yyvsp[0].d));
     ;
     break;}
-case 302:
-#line 2992 "Gmsh.y"
+case 304:
+#line 3004 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l;
     ;
     break;}
-case 303:
-#line 2996 "Gmsh.y"
+case 305:
+#line 3008 "Gmsh.y"
 {
       // creates an empty list
       yyval.l = List_Create(2, 1, sizeof(double));
     ;
     break;}
-case 304:
-#line 3001 "Gmsh.y"
+case 306:
+#line 3013 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
-case 305:
-#line 3005 "Gmsh.y"
+case 307:
+#line 3017 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
       double *pd;
@@ -5985,16 +6000,16 @@ case 305:
       }
     ;
     break;}
-case 306:
-#line 3017 "Gmsh.y"
+case 308:
+#line 3029 "Gmsh.y"
 { 
       yyval.l = List_Create(2, 1, sizeof(double)); 
       for(double d = yyvsp[-2].d; (yyvsp[-2].d < yyvsp[0].d) ? (d <= yyvsp[0].d) : (d >= yyvsp[0].d); (yyvsp[-2].d < yyvsp[0].d) ? (d += 1.) : (d -= 1.)) 
 	List_Add(yyval.l, &d);
     ;
     break;}
-case 307:
-#line 3023 "Gmsh.y"
+case 309:
+#line 3035 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)); 
       if(!yyvsp[0].d || (yyvsp[-4].d < yyvsp[-2].d && yyvsp[0].d < 0) || (yyvsp[-4].d > yyvsp[-2].d && yyvsp[0].d > 0)){
@@ -6006,8 +6021,8 @@ case 307:
 	  List_Add(yyval.l, &d);
    ;
     break;}
-case 308:
-#line 3034 "Gmsh.y"
+case 310:
+#line 3046 "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
@@ -6028,8 +6043,8 @@ case 308:
       }
     ;
     break;}
-case 309:
-#line 3054 "Gmsh.y"
+case 311:
+#line 3066 "Gmsh.y"
 {
       yyval.l = List_Create(List_Nbr(yyvsp[0].l), 1, sizeof(double));
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
@@ -6040,8 +6055,8 @@ case 309:
       List_Delete(yyvsp[0].l);
     ;
     break;}
-case 310:
-#line 3064 "Gmsh.y"
+case 312:
+#line 3076 "Gmsh.y"
 {
       yyval.l = List_Create(List_Nbr(yyvsp[0].l), 1, sizeof(double));
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
@@ -6052,8 +6067,8 @@ case 310:
       List_Delete(yyvsp[0].l);
     ;
     break;}
-case 311:
-#line 3074 "Gmsh.y"
+case 313:
+#line 3086 "Gmsh.y"
 {
       yyval.l = List_Create(List_Nbr(yyvsp[0].l), 1, sizeof(double));
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
@@ -6064,8 +6079,8 @@ case 311:
       List_Delete(yyvsp[0].l);
     ;
     break;}
-case 312:
-#line 3084 "Gmsh.y"
+case 314:
+#line 3096 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -6083,8 +6098,8 @@ case 312:
       Free(yyvsp[-2].c);
     ;
     break;}
-case 313:
-#line 3101 "Gmsh.y"
+case 315:
+#line 3113 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -6104,8 +6119,8 @@ case 313:
       Free(yyvsp[-2].c);
     ;
     break;}
-case 314:
-#line 3120 "Gmsh.y"
+case 316:
+#line 3132 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -6130,8 +6145,8 @@ case 314:
       List_Delete(yyvsp[-2].l);
     ;
     break;}
-case 315:
-#line 3144 "Gmsh.y"
+case 317:
+#line 3156 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -6158,27 +6173,27 @@ case 315:
       List_Delete(yyvsp[-2].l);
     ;
     break;}
-case 316:
-#line 3173 "Gmsh.y"
+case 318:
+#line 3185 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       List_Add(yyval.l, &(yyvsp[0].d));
     ;
     break;}
-case 317:
-#line 3178 "Gmsh.y"
+case 319:
+#line 3190 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l;
     ;
     break;}
-case 318:
-#line 3182 "Gmsh.y"
+case 320:
+#line 3194 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].d));
     ;
     break;}
-case 319:
-#line 3186 "Gmsh.y"
+case 321:
+#line 3198 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
 	double d;
@@ -6188,20 +6203,20 @@ case 319:
       List_Delete(yyvsp[0].l);
     ;
     break;}
-case 320:
-#line 3199 "Gmsh.y"
+case 322:
+#line 3211 "Gmsh.y"
 {
       yyval.u = CTX.PACK_COLOR((int)yyvsp[-7].d, (int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d);
     ;
     break;}
-case 321:
-#line 3203 "Gmsh.y"
+case 323:
+#line 3215 "Gmsh.y"
 {
       yyval.u = CTX.PACK_COLOR((int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d, 255);
     ;
     break;}
-case 322:
-#line 3215 "Gmsh.y"
+case 324:
+#line 3227 "Gmsh.y"
 {
       int flag;
       yyval.u = Get_ColorForString(ColorString, -1, yyvsp[0].c, &flag);
@@ -6209,8 +6224,8 @@ case 322:
       Free(yyvsp[0].c);
     ;
     break;}
-case 323:
-#line 3222 "Gmsh.y"
+case 325:
+#line 3234 "Gmsh.y"
 {
       unsigned int (*pColOpt)(int num, int action, unsigned int value);
       StringXColor *pColCat;
@@ -6230,14 +6245,14 @@ case 323:
       Free(yyvsp[-4].c); Free(yyvsp[0].c);
     ;
     break;}
-case 324:
-#line 3244 "Gmsh.y"
+case 326:
+#line 3256 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
-case 325:
-#line 3248 "Gmsh.y"
+case 327:
+#line 3260 "Gmsh.y"
 {
       yyval.l = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = Get_ColorTable((int)yyvsp[-3].d);
@@ -6250,27 +6265,27 @@ case 325:
       Free(yyvsp[-5].c);
     ;
     break;}
-case 326:
-#line 3263 "Gmsh.y"
+case 328:
+#line 3275 "Gmsh.y"
 {
       yyval.l = List_Create(256, 10, sizeof(unsigned int));
       List_Add(yyval.l, &(yyvsp[0].u));
     ;
     break;}
-case 327:
-#line 3268 "Gmsh.y"
+case 329:
+#line 3280 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].u));
     ;
     break;}
-case 328:
-#line 3275 "Gmsh.y"
+case 330:
+#line 3287 "Gmsh.y"
 {
       yyval.c = yyvsp[0].c;
     ;
     break;}
-case 329:
-#line 3279 "Gmsh.y"
+case 331:
+#line 3291 "Gmsh.y"
 {
       yyval.c = (char *)Malloc(32*sizeof(char));
       time_t now;
@@ -6279,8 +6294,8 @@ case 329:
       yyval.c[strlen(yyval.c) - 1] = '\0';
     ;
     break;}
-case 330:
-#line 3287 "Gmsh.y"
+case 332:
+#line 3299 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-3].c)+strlen(yyvsp[-1].c)+1)*sizeof(char));
       strcpy(yyval.c, yyvsp[-3].c);
@@ -6289,8 +6304,8 @@ case 330:
       Free(yyvsp[-1].c);
     ;
     break;}
-case 331:
-#line 3295 "Gmsh.y"
+case 333:
+#line 3307 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-1].c)+1)*sizeof(char));
       int i;
@@ -6305,8 +6320,8 @@ case 331:
       Free(yyvsp[-1].c);
     ;
     break;}
-case 332:
-#line 3309 "Gmsh.y"
+case 334:
+#line 3321 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-1].c)+1)*sizeof(char));
       int i;
@@ -6321,14 +6336,14 @@ case 332:
       Free(yyvsp[-1].c);
     ;
     break;}
-case 333:
-#line 3323 "Gmsh.y"
+case 335:
+#line 3335 "Gmsh.y"
 {
       yyval.c = yyvsp[-1].c;
     ;
     break;}
-case 334:
-#line 3327 "Gmsh.y"
+case 336:
+#line 3339 "Gmsh.y"
 {
       char tmpstring[1024];
       int i = PrintListOfDouble(yyvsp[-3].c, yyvsp[-1].l, tmpstring);
@@ -6348,8 +6363,8 @@ case 334:
       List_Delete(yyvsp[-1].l);
     ;
     break;}
-case 335:
-#line 3346 "Gmsh.y"
+case 337:
+#line 3358 "Gmsh.y"
 { 
       char* (*pStrOpt)(int num, int action, char *value);
       StringXString *pStrCat;
@@ -6372,8 +6387,8 @@ case 335:
       }
     ;
     break;}
-case 336:
-#line 3368 "Gmsh.y"
+case 338:
+#line 3380 "Gmsh.y"
 { 
       char* (*pStrOpt)(int num, int action, char *value);
       StringXString *pStrCat;
@@ -6618,7 +6633,7 @@ yyerrhandle:
     }
   return 1;
 }
-#line 3391 "Gmsh.y"
+#line 3403 "Gmsh.y"
 
 
 void DeleteSymbol(void *a, void *b){
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 04a2d6220330bc5123b283b37e04aae171d57036..a53c91b4b505203a2ccbdf6cfa912f51110a1bdb 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,5 +1,5 @@
 %{
-// $Id: Gmsh.y,v 1.263 2007-02-16 08:54:06 geuzaine Exp $
+// $Id: Gmsh.y,v 1.264 2007-02-26 08:25:42 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -2193,6 +2193,18 @@ Extrude :
 		    &extr, $$);
       List_Delete($12);
     }
+  | tExtrude '{' ListOfShapes 
+    {
+      extr.mesh.ExtrudeMesh = false;
+      extr.mesh.Recombine = false;
+    }
+                       ExtrudeParameters '}'
+    {
+      $$ = List_Create(2, 1, sizeof(Shape));
+      ExtrudeShapes(BOUNDARY_LAYER, $3, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
+		    &extr, $$);
+      List_Delete($3);
+    }
 
   // Deprecated extrude commands (for backward compatibility)
   | tExtrude tPoint '{' FExpr ',' VExpr '}' tEND
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index 185a444d1cf76f81d9e97b72470400864d48294f..d2e998250a99f17bc53a9e97fb5885511b729d53 100644
--- a/Parser/Gmsh.yy.cpp
+++ b/Parser/Gmsh.yy.cpp
@@ -2,7 +2,7 @@
 /* A lexical scanner generated by flex */
 
 /* Scanner skeleton version:
- * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.305 2007-02-16 08:54:06 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.306 2007-02-26 08:25:43 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -720,7 +720,7 @@ char *yytext;
 #line 1 "Gmsh.l"
 #define INITIAL 0
 #line 2 "Gmsh.l"
-// $Id: Gmsh.yy.cpp,v 1.305 2007-02-16 08:54:06 geuzaine Exp $
+// $Id: Gmsh.yy.cpp,v 1.306 2007-02-26 08:25:43 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
diff --git a/Parser/Makefile b/Parser/Makefile
index 5240134c28212749fcac0ea09a20708e943614ee..73bd9a10b972b51835a8db788bf9a105bd2eee90 100644
--- a/Parser/Makefile
+++ b/Parser/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.115 2007-02-12 08:36:13 geuzaine Exp $
+# $Id: Makefile,v 1.116 2007-02-26 08:25:46 geuzaine Exp $
 #
 # Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 #
@@ -79,18 +79,18 @@ depend:
 Gmsh.tab.o: Gmsh.tab.cpp ../Plugin/PluginManager.h ../Plugin/Plugin.h \
   ../Common/Options.h ../Common/Message.h ../Common/Views.h \
   ../Common/ColorTable.h ../DataStr/List.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Parallel/ParUtil.h \
-  ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
-  ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h \
-  ../DataStr/Tree.h ../Common/Context.h ../Geo/GModel.h ../Geo/GVertex.h \
-  ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/SPoint3.h ../Common/GmshDefines.h \
-  ../Geo/MVertex.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/MElement.h \
-  ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h \
-  ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h ../Parallel/ParUtil.h ../Common/Gmsh.h \
+  ../Common/Message.h ../DataStr/Malloc.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../Common/Context.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h \
+  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
+  ../Geo/SPoint3.h ../Common/GmshDefines.h ../Geo/MVertex.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/MElement.h ../Geo/MVertex.h \
+  ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
   ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
   ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
   ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
@@ -109,33 +109,32 @@ Gmsh.yy.o: Gmsh.yy.cpp ../Common/Gmsh.h ../Common/Message.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 ../Geo/SPoint2.h \
-  ../Geo/ExtrudeParams.h Gmsh.tab.hpp
+  ../Geo/ExtrudeParams.h ../Common/SmoothData.h Gmsh.tab.hpp
 OpenFile.o: OpenFile.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.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 \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Geo/GModel.h \
-  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/MVertex.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/SPoint2.h \
-  ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Numeric/Numeric.h ../Common/Context.h \
+  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h \
+  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
+  ../Geo/MVertex.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/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h \
+  ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Context.h \
   ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
   ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
   ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
   ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
-  ../Geo/SBoundingBox3d.h ../Common/SmoothNormals.h Parser.h OpenFile.h \
-  ../Common/CommandLine.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Graphics/ReadImg.h \
-  ../Common/OS.h ../Common/GmshUI.h ../Graphics/Draw.h \
-  ../Graphics/SelectBuffer.h ../Fltk/GUI.h ../Fltk/Opengl_Window.h \
-  ../Fltk/Colorbar_Window.h ../Fltk/Popup_Button.h \
-  ../Fltk/SpherePosition_Widget.h
+  ../Geo/SBoundingBox3d.h Parser.h OpenFile.h ../Common/CommandLine.h \
+  ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
+  ../Common/SmoothData.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  ../Graphics/ReadImg.h ../Common/OS.h ../Common/GmshUI.h \
+  ../Graphics/Draw.h ../Graphics/SelectBuffer.h ../Fltk/GUI.h \
+  ../Fltk/Opengl_Window.h ../Fltk/Colorbar_Window.h \
+  ../Fltk/Popup_Button.h ../Fltk/SpherePosition_Widget.h
 CreateFile.o: CreateFile.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
@@ -143,24 +142,24 @@ CreateFile.o: CreateFile.cpp ../Common/Gmsh.h ../Common/Message.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 \
-  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Geo/GModel.h \
-  ../Geo/GVertex.h ../Geo/GEntity.h ../Geo/Range.h ../Geo/SPoint3.h \
-  ../Geo/SBoundingBox3d.h ../Geo/MVertex.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/SPoint2.h \
-  ../Geo/MElement.h ../Geo/MVertex.h ../Geo/MEdge.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Common/Hash.h ../Geo/MFace.h ../Geo/MVertex.h \
-  ../Geo/SVector3.h ../Numeric/Numeric.h ../Geo/ExtrudeParams.h \
-  ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h ../Geo/GEdgeLoop.h \
-  ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h ../Geo/SVector3.h \
-  ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h ../Geo/GEntity.h \
-  ../Geo/MElement.h ../Geo/ExtrudeParams.h ../Geo/SBoundingBox3d.h \
-  ../Common/SmoothNormals.h ../Common/GmshUI.h ../Graphics/gl2ps.h \
+  ../Geo/SPoint2.h ../Geo/ExtrudeParams.h ../Common/SmoothData.h \
+  ../Numeric/Numeric.h ../Geo/GModel.h ../Geo/GVertex.h ../Geo/GEntity.h \
+  ../Geo/Range.h ../Geo/SPoint3.h ../Geo/SBoundingBox3d.h \
+  ../Geo/MVertex.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/SPoint2.h ../Geo/MElement.h ../Geo/MVertex.h \
+  ../Geo/MEdge.h ../Geo/MVertex.h ../Geo/SVector3.h ../Common/Hash.h \
+  ../Geo/MFace.h ../Geo/MVertex.h ../Geo/SVector3.h \
+  ../Geo/ExtrudeParams.h ../Geo/GFace.h ../Geo/GPoint.h ../Geo/GEntity.h \
+  ../Geo/GEdgeLoop.h ../Geo/GEdge.h ../Geo/MElement.h ../Geo/SPoint2.h \
+  ../Geo/SVector3.h ../Geo/Pair.h ../Geo/ExtrudeParams.h ../Geo/GRegion.h \
+  ../Geo/GEntity.h ../Geo/MElement.h ../Geo/ExtrudeParams.h \
+  ../Geo/SBoundingBox3d.h ../Common/GmshUI.h ../Graphics/gl2ps.h \
   ../Graphics/gl2gif.h ../Graphics/PixelBuffer.h ../Graphics/Draw.h \
   ../Common/Views.h ../Common/ColorTable.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Common/AdaptiveViews.h \
-  ../Common/GmshMatrix.h ../Graphics/gl2jpeg.h ../Graphics/PixelBuffer.h \
-  ../Graphics/gl2png.h ../Graphics/PixelBuffer.h ../Graphics/gl2ppm.h \
+  ../Common/SmoothData.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
+  ../Graphics/gl2jpeg.h ../Graphics/PixelBuffer.h ../Graphics/gl2png.h \
+  ../Graphics/PixelBuffer.h ../Graphics/gl2ppm.h \
   ../Graphics/PixelBuffer.h ../Graphics/gl2yuv.h \
   ../Graphics/PixelBuffer.h
 FunctionManager.o: FunctionManager.cpp FunctionManager.h
diff --git a/Plugin/Makefile b/Plugin/Makefile
index fa8efcce75d158ecbe02583df9542e4e479f3840..57d010576e5c68d8cf8ef4c0e18892148c7be1e3 100644
--- a/Plugin/Makefile
+++ b/Plugin/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.118 2007-02-01 15:09:44 geuzaine Exp $
+# $Id: Makefile,v 1.119 2007-02-26 08:25:46 geuzaine Exp $
 #
 # Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 #
@@ -71,7 +71,7 @@ depend:
 # DO NOT DELETE THIS LINE
 Plugin.o: Plugin.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h PluginManager.h \
   CutMap.h Levelset.h CutGrid.h StreamLines.h CutPlane.h CutParametric.h \
   CutSphere.h Skin.h ../DataStr/Tree.h ../DataStr/avl.h Extract.h \
@@ -83,7 +83,7 @@ Plugin.o: Plugin.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   Probe.h ../Common/Context.h
 Levelset.o: Levelset.cpp Levelset.h Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   DecomposeInSimplex.h ../DataStr/Tools.h ../DataStr/List.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../Graphics/Iso.h \
@@ -91,70 +91,70 @@ Levelset.o: Levelset.cpp Levelset.h Plugin.h ../Common/Options.h \
 CutPlane.o: CutPlane.cpp CutPlane.h Levelset.h Plugin.h \
   ../Common/Options.h ../Common/Message.h ../Common/Views.h \
   ../Common/ColorTable.h ../DataStr/List.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
-  ../Common/GmshUI.h ../Graphics/Draw.h
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h ../Common/Context.h ../Common/GmshUI.h \
+  ../Graphics/Draw.h
 CutSphere.o: CutSphere.cpp CutSphere.h Levelset.h Plugin.h \
   ../Common/Options.h ../Common/Message.h ../Common/Views.h \
   ../Common/ColorTable.h ../DataStr/List.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
-  ../Common/GmshUI.h ../Graphics/Draw.h
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h ../Common/Context.h ../Common/GmshUI.h \
+  ../Graphics/Draw.h
 CutMap.o: CutMap.cpp CutMap.h Levelset.h Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ../Common/Context.h
 Smooth.o: Smooth.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Smooth.h \
   ../Common/Context.h
 CutParametric.o: CutParametric.cpp ../Common/OctreePost.h \
   ../Common/Octree.h ../Common/OctreeInternals.h CutParametric.h Plugin.h \
   ../Common/Options.h ../Common/Message.h ../Common/Views.h \
   ../Common/ColorTable.h ../DataStr/List.h ../Common/VertexArray.h \
-  ../Common/SmoothNormals.h ../Numeric/Numeric.h \
-  ../Common/AdaptiveViews.h ../Common/GmshMatrix.h ../Common/Context.h \
-  ../Common/GmshUI.h ../Graphics/Draw.h
+  ../Common/SmoothData.h ../Numeric/Numeric.h ../Common/AdaptiveViews.h \
+  ../Common/GmshMatrix.h ../Common/Context.h ../Common/GmshUI.h \
+  ../Graphics/Draw.h
 Lambda2.o: Lambda2.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Lambda2.h \
   ../Common/Context.h ../Common/ShapeFunctions.h
 Eigenvectors.o: Eigenvectors.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   Eigenvectors.h ../Common/Context.h ../DataStr/Malloc.h \
   ../Numeric/EigSolve.h
 Eigenvalues.o: Eigenvalues.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   Eigenvalues.h ../Common/Context.h ../DataStr/Malloc.h
 StreamLines.o: StreamLines.cpp ../Common/OctreePost.h ../Common/Octree.h \
   ../Common/OctreeInternals.h StreamLines.h Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ../Common/Context.h ../Common/GmshUI.h ../Graphics/Draw.h
 CutGrid.o: CutGrid.cpp ../Common/OctreePost.h ../Common/Octree.h \
   ../Common/OctreeInternals.h CutGrid.h Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ../Common/Context.h ../Common/GmshUI.h ../Graphics/Draw.h
 Transform.o: Transform.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   Transform.h ../Common/Context.h
 Triangulate.o: Triangulate.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
   ../DataStr/avl.h ../DataStr/Tools.h ../DataStr/List.h ../DataStr/Tree.h \
   Plugin.h ../Common/Options.h ../Common/Views.h ../Common/ColorTable.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Triangulate.h \
   ../Common/Context.h ../Geo/MVertex.h ../Geo/SPoint3.h ../Geo/gmshFace.h \
   ../Geo/Geo.h ../Common/GmshDefines.h ../Geo/gmshSurface.h ../Geo/Pair.h \
@@ -173,28 +173,28 @@ Triangulate.o: Triangulate.cpp ../Common/Gmsh.h ../Common/Message.h \
   ../Geo/GVertex.h ../Geo/Range.h
 Warp.o: Warp.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Warp.h \
   ../Common/Context.h
 Skin.o: Skin.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Skin.h \
   ../DataStr/Tree.h ../DataStr/avl.h ../Common/Context.h \
   ../DataStr/Malloc.h
 Extract.o: Extract.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Extract.h \
   ../Common/Context.h ../DataStr/Malloc.h
 ExtractElements.o: ExtractElements.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ExtractElements.h ../Common/Context.h ../DataStr/Malloc.h
 ExtractEdges.o: ExtractEdges.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ExtractEdges.h ../DataStr/Tree.h ../DataStr/avl.h ../Common/Context.h \
   ../DataStr/Malloc.h ../Mesh/BDS.h ../Geo/GFace.h ../Geo/GPoint.h \
@@ -210,39 +210,39 @@ ExtractEdges.o: ExtractEdges.cpp Plugin.h ../Common/Options.h \
   ../Geo/ExtrudeParams.h
 DecomposeInSimplex.o: DecomposeInSimplex.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   DecomposeInSimplex.h ../DataStr/Tree.h ../DataStr/avl.h \
   ../Common/Context.h ../DataStr/Malloc.h
 Evaluate.o: Evaluate.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Evaluate.h \
   ../Common/OctreePost.h ../Common/Octree.h ../Common/OctreeInternals.h \
   ../Common/Context.h
 Integrate.o: Integrate.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   Integrate.h ../Common/Context.h ../Common/ShapeFunctions.h
 Gradient.o: Gradient.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Gradient.h \
   ../Common/Context.h ../Common/ShapeFunctions.h
 Curl.o: Curl.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Curl.h \
   ../Common/Context.h ../Common/ShapeFunctions.h
 Divergence.o: Divergence.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   Divergence.h ../Common/Context.h ../Common/ShapeFunctions.h
 Annotate.o: Annotate.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Annotate.h \
   ../Common/Context.h ../Common/GmshUI.h ../Fltk/GUI.h \
   ../Fltk/Opengl_Window.h ../Fltk/Colorbar_Window.h \
@@ -250,22 +250,22 @@ Annotate.o: Annotate.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Graphics/Draw.h
 Remove.o: Remove.cpp Plugin.h ../Common/Options.h ../Common/Message.h \
   ../Common/Views.h ../Common/ColorTable.h ../DataStr/List.h \
-  ../Common/VertexArray.h ../Common/SmoothNormals.h ../Numeric/Numeric.h \
+  ../Common/VertexArray.h ../Common/SmoothData.h ../Numeric/Numeric.h \
   ../Common/AdaptiveViews.h ../Common/GmshMatrix.h Remove.h \
   ../Common/Context.h
 Probe.o: Probe.cpp Probe.h Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ../Common/Context.h ../Common/GmshUI.h ../Graphics/Draw.h \
   ../Common/OctreePost.h ../Common/Octree.h ../Common/OctreeInternals.h
 HarmonicToTime.o: HarmonicToTime.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   HarmonicToTime.h ../Common/Context.h
 ModulusPhase.o: ModulusPhase.cpp Plugin.h ../Common/Options.h \
   ../Common/Message.h ../Common/Views.h ../Common/ColorTable.h \
-  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothNormals.h \
+  ../DataStr/List.h ../Common/VertexArray.h ../Common/SmoothData.h \
   ../Numeric/Numeric.h ../Common/AdaptiveViews.h ../Common/GmshMatrix.h \
   ModulusPhase.h ../Common/Context.h
diff --git a/Plugin/Warp.cpp b/Plugin/Warp.cpp
index 2e579a8b2397f7d1db913eac6332f0f947037ca1..dfa361640e47465bc483a4f2b955068987984c50 100644
--- a/Plugin/Warp.cpp
+++ b/Plugin/Warp.cpp
@@ -1,4 +1,4 @@
-// $Id: Warp.cpp,v 1.5 2006-11-27 22:22:32 geuzaine Exp $
+// $Id: Warp.cpp,v 1.6 2007-02-26 08:25:46 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -25,7 +25,7 @@
 #include "Views.h"
 #include "Context.h"
 #include "Numeric.h"
-#include "SmoothNormals.h"
+#include "SmoothData.h"
 
 extern Context_T CTX;
 
diff --git a/benchmarks/2d/function.geo b/benchmarks/2d/function.geo
index 54ce6fe371ebc182eabebc44a88473947e50c5e3..0d1f9f4cbdd0122fac6dcf1f7d39435985db5f2a 100644
--- a/benchmarks/2d/function.geo
+++ b/benchmarks/2d/function.geo
@@ -52,8 +52,6 @@ loop5 = theloop;
 
 Plane Surface(newreg) = {loop5,loop4,loop3,loop2,loop1};
 Line(10000) = {6,11};
-Attractor Line {10000} = {1,.03,1};
-
-Mesh.Algorithm = 2 ; // This is the new 2D anisotropic algorithm
+Attractor Line {10000} = {0.5,0.05,5,5,100};
 
 
diff --git a/benchmarks/2d/fx79.geo b/benchmarks/2d/fx79.geo
new file mode 100644
index 0000000000000000000000000000000000000000..9a3963cf07e54f72b8f49cc748389d7a12dc4926
--- /dev/null
+++ b/benchmarks/2d/fx79.geo
@@ -0,0 +1,302 @@
+//Gmesh input File created by Gmeshgen.pl
+//Inputfile was: fx79.new
+
+lc_box = 0.;
+//FX 79-W-151 A
+
+Point(1) = {1.00617363919509, -0.050512514502615, 0, 0.00456204959960413};
+Point(2) = {1.00165723435172, -0.0511562410284263, 0, 0.00589667334996958};
+Point(3) = {0.994444903091042, -0.0517453063693019, 0, 0.00695270466127643};
+Point(4) = {0.987802724878602, -0.0523449275670149, 0, 0.00781006110462724};
+Point(5) = {0.978901753380908, -0.0532940848945938, 0, 0.01038725609613};
+Point(6) = {0.967152889489861, -0.0546175153528345, 0, 0.0130971474744754};
+Point(7) = {0.952846092714635, -0.0559854851094759, 0, 0.0151324908112227};
+Point(8) = {0.937003511472759, -0.0572602635036876, 0, 0.0166652491572883};
+Point(9) = {0.919622131099139, -0.058648282974513, 0, 0.018365619899588};
+Point(10) = {0.9003831929919, -0.060112675035187, 0, 0.0201345328810872};
+Point(11) = {0.879463184679618, -0.0616243004194157, 0, 0.0217698614519213};
+Point(12) = {0.856952646375697, -0.063194085614974, 0, 0.0233105073748239};
+Point(13) = {0.832949931018259, -0.0647923045420384, 0, 0.0247464848158542};
+Point(14) = {0.807566124142478, -0.0664383828690749, 0, 0.0260813026098437};
+Point(15) = {0.780893170548586, -0.0681136104159457, 0, 0.0273196336388469};
+Point(16) = {0.753032096552583, -0.0698279792267318, 0, 0.0284561096908369};
+Point(17) = {0.724085588967674, -0.0715631596438602, 0, 0.0294753743716627};
+Point(18) = {0.694183627667583, -0.0732990723239944, 0, 0.030372720135173};
+Point(19) = {0.663438362655617, -0.0750160503592312, 0, 0.0311360020340592};
+Point(20) = {0.632003617631884, -0.0766826861642702, 0, 0.0317410356210839};
+Point(21) = {0.600041696702843, -0.0783078758813485, 0, 0.0322178826763649};
+Point(22) = {0.567647871388409, -0.0798929481531925, 0, 0.0325674864793903};
+Point(23) = {0.534981015892058, -0.0814179425652384, 0, 0.032784892731434};
+Point(24) = {0.5021463377705, -0.0828839110998825, 0, 0.0328795803728962};
+Point(25) = {0.469282466748472, -0.0842406827974891, 0, 0.0328279129585575};
+Point(26) = {0.436542155432508, -0.0854875118031408, 0, 0.0326396687955573};
+Point(27) = {0.404045580730026, -0.0865945347365429, 0, 0.0323011753420278};
+Point(28) = {0.371972764524435, -0.0875508759654124, 0, 0.0318068895575232};
+Point(29) = {0.340456198307875, -0.0883561636609631, 0, 0.0311825288137988};
+Point(30) = {0.309625029437813, -0.0890206863143952, 0, 0.0304437205056048};
+Point(31) = {0.2795801664247, -0.0895348133341898, 0, 0.0296024016783327};
+Point(32) = {0.250426436189937, -0.0898781814886931, 0, 0.0286489999876588};
+Point(33) = {0.22228430578873, -0.090029944786437, 0, 0.0275928775151386};
+Point(34) = {0.195240755169614, -0.0899685617129009, 0, 0.0264437230765299};
+Point(35) = {0.169398287503204, -0.0896413183645262, 0, 0.0252006769254343};
+Point(36) = {0.144847876136587, -0.0890443253994118, 0, 0.0239049808202747};
+Point(37) = {0.121612248521966, -0.0881290648955573, 0, 0.0226250177778736};
+Point(38) = {0.0996517949675359, -0.0868352611728824, 0, 0.0214545259879573};
+Point(39) = {0.0788165845166658, -0.0850117128433833, 0, 0.0204420797299119};
+Point(40) = {0.0590069000314231, -0.0824185870431043, 0, 0.0194402875450237};
+Point(41) = {0.0404235154991374, -0.07887401207289, 0, 0.0182887135322985};
+Point(42) = {0.0233260188228607, -0.0743698053435937, 0, 0.0171337006713823};
+Point(43) = {0.00764674335584091, -0.0688771124208716, 0, 0.0164129222556413};
+Point(44) = {-0.0070924385384326, -0.0620307000422324, 0, 0.0163278037515129};
+Point(45) = {-0.0209748000307029, -0.0531546458343633, 0, 0.0172474872453871};
+Point(46) = {-0.034255730593759, -0.0407690249004144, 0, 0.0216934911607246};
+Point(47) = {-0.0469306104549718, -0.0183879068417406, 0, 0.021851747129617};
+Point(48) = {-0.05, 0.00000, 0, 0.0180688410124145};
+Point(49) = {-0.0471836952806479, 0.0177488889514486, 0, 0.0198804625921837};
+Point(50) = {-0.0374036583288223, 0.0377129069155351, 0, 0.0189685918923241};
+Point(51) = {-0.0273884132570324, 0.050112089088575, 0, 0.0156550224352199};
+Point(52) = {-0.0163386613759948, 0.0608772073186624, 0, 0.0158914743141713};
+Point(53) = {-0.00362253538650892, 0.0712151427196309, 0, 0.0169710501991986};
+Point(54) = {0.0108237924265827, 0.0812307643266579, 0, 0.0181740655037653};
+Point(55) = {0.0269220603558963, 0.0909182972557362, 0, 0.0194404178707935};
+Point(56) = {0.0447070863427307, 0.100300158164853, 0, 0.0207729685596819};
+Point(57) = {0.0641533073272547, 0.10935465101899, 0, 0.0221284527964365};
+Point(58) = {0.0852561082259123, 0.118032910826911, 0, 0.0234897863214629};
+Point(59) = {0.107986176315194, 0.126259083632896, 0, 0.0248047510762615};
+Point(60) = {0.132246158261103, 0.133940075926685, 0, 0.0260695266247325};
+Point(61) = {0.157993821830426, 0.141014295043562, 0, 0.027318844023494};
+Point(62) = {0.185209088723227, 0.14736411972817, 0, 0.0285471765408241};
+Point(63) = {0.21384878784108, 0.15284594436902, 0, 0.0297055217496057};
+Point(64) = {0.243793004161789, 0.157243236163996, 0, 0.0306769875792258};
+Point(65) = {0.27473353595332, 0.160419432010324, 0, 0.0314195933738048};
+Point(66) = {0.306420259672539, 0.162399810442738, 0, 0.0320414317396908};
+Point(67) = {0.338753091362607, 0.163267223595795, 0, 0.032614136750213};
+Point(68) = {0.371645101780606, 0.163068866362746, 0, 0.0331276823434321};
+Point(69) = {0.404993409397787, 0.16185526878505, 0, 0.0335598679185385};
+Point(70) = {0.438677438696783, 0.15964472466078, 0, 0.0338595551365455};
+Point(71) = {0.472501916638331, 0.156518664402816, 0, 0.0340233402697617};
+Point(72) = {0.506354772414623, 0.15256452457236, 0, 0.0340514534218912};
+Point(73) = {0.540052963746546, 0.147866384058501, 0, 0.0339184239670291};
+Point(74) = {0.573454876397506, 0.142593868469835, 0, 0.0336727786192166};
+Point(75) = {0.606488807717522, 0.136834488681042, 0, 0.0333169769680977};
+Point(76) = {0.639016639296883, 0.130688446902461, 0, 0.0328394206680481};
+Point(77) = {0.670945507569959, 0.124223222155235, 0, 0.0322071196284741};
+Point(78) = {0.702071472787017, 0.117524777483076, 0, 0.0313904325229361};
+Point(79) = {0.732265061194123, 0.110756620533397, 0, 0.0304385000832155};
+Point(80) = {0.761424215056791, 0.103987379863097, 0, 0.0293620357988487};
+Point(81) = {0.789437020766208, 0.0973445504582977, 0, 0.0281483256012299};
+Point(82) = {0.816173544580009, 0.0908792200620603, 0, 0.0267800238750393};
+Point(83) = {0.841486414670495, 0.0847136633482379, 0, 0.0252766251031232};
+Point(84) = {0.86529455020835, 0.0789310857944918, 0, 0.0236602264229706};
+Point(85) = {0.887482031723118, 0.0735948293494144, 0, 0.0219474012376518};
+Point(86) = {0.907997620604271, 0.0687722737031624, 0, 0.0201492501471799};
+Point(87) = {0.926732568608878, 0.0644644142354061, 0, 0.0182288848507191};
+Point(88) = {0.943558353346318, 0.0607346584814801, 0, 0.0162031331076611};
+Point(89) = {0.958404970323222, 0.057606932214755, 0, 0.0140856703524853};
+Point(90) = {0.971158958627949, 0.055092759403764, 0, 0.0118756487437321};
+Point(91) = {0.981742138254301, 0.0531909696589077, 0, 0.00943699954001213};
+Point(92) = {0.989763512620446, 0.0519149595338826, 0, 0.00709162511586322};
+Point(93) = {0.995783284796803, 0.0511882737489522, 0, 0.00457246821355165};
+Point(94) = {0.998846480732691, 0.0508521554467141, 0, 0.0025930747723635};
+Point(95) = {1.00095326359672, 0.0507790472729257, 0, 0.0132172862861438};
+Point(96) = {1.0251152939317, 0.0478964693681358, 0, 0.0186384868667792};
+Point(97) = {1.02570238569503, 0.0229033638535843, 0, 0.0387500000000005};
+Point(98) = {1.02623653276368, 0.000616300054223318, 0, 0.0552065398013811};
+Point(99) = {1.02693527839802, -0.0295821577269702, 0, 0.0387500000000005};
+Point(100) = {1.02752237016135, -0.0545752632415217, 0, 0.0151032703232118};
+Point(101) = {10, 10, 0, 2.5+lc_box};
+Point(102) = {10, -10, 0, 2.5+lc_box};
+Point(103) = {-10, -10, 0, 2.5+lc_box};
+Point(104) = {-10, 10, 0, 2.5+lc_box};
+//Additional stearing triangles
+pos_mv1 = 0.;
+y_pos_mov1 = 0;
+
+lc_tri1 = 0.13;
+Point(105) = {2.6+pos_mv1, 0.32+y_pos_mov1, 0, lc_tri1};
+Point(106) = {2.47+pos_mv1, 0.32+y_pos_mov1, 0, lc_tri1};
+Point(107) = {2.6+pos_mv1, 0.45+y_pos_mov1, 0, lc_tri1};
+pos_mv2 = 0.;
+y_pos_mov2 = 0;
+
+lc_tri2 = 0.13;
+Point(108) = {2.6+pos_mv2, -0.32+y_pos_mov2, 0, lc_tri2};
+Point(109) = {2.47+pos_mv2, -0.32+y_pos_mov2, 0, lc_tri2};
+Point(110) = {2.6+pos_mv2, -0.45+y_pos_mov2, 0, lc_tri2};
+pos_mv3 = 0.;
+y_pos_mov3 = 0;
+
+lc_tri3 = 0.13;
+Point(111) = {-2.6+pos_mv3, 0.32+y_pos_mov3, 0, lc_tri3};
+Point(112) = {-2.73+pos_mv3, 0.32+y_pos_mov3, 0, lc_tri3};
+Point(113) = {-2.6+pos_mv3, 0.45+y_pos_mov3, 0, lc_tri3};
+
+//wake quadrilaterals area
+wakeq = 0.;
+Point(114) = {4+wakeq, -5, 0, 0.6};
+Point(115) = {4.7612534562212+wakeq, -5, 0, 0.761253456221198};
+Point(116) = {6.00626728110599+wakeq, -5, 0, 1.24501382488479};
+Point(117) = {10, -5, 0, 1};
+Point(118) = {10, -4, 0, 1};
+Point(119) = {10, -3, 0, 1};
+Point(120) = {10, -2, 0, 1};
+Point(121) = {10, -1, 0, 1};
+Point(122) = {10, 0, 0, 1};
+Point(123) = {10, 1, 0, 1};
+Point(124) = {10, 2, 0, 1};
+Point(125) = {6.00626728110599+wakeq, 2, 0, 1.24501382488479};
+Point(126) = {4.7612534562212+wakeq, 2, 0, 0.761253456221198};
+Point(127) = {4+wakeq, 2, 0, 0.6};
+Point(128) = {4+wakeq, 1, 0, 1};
+Point(129) = {4+wakeq, 0, 0, 1};
+Point(130) = {4+wakeq, -1, 0, 1};
+Point(131) = {4+wakeq, -2, 0, 1};
+Point(132) = {4+wakeq, -3, 0, 1};
+Point(133) = {4+wakeq, -4, 0, 1};
+
+//now the list of lines
+Line(1) = {1,2};
+Line(2) = {2,3};
+Line(3) = {3,4};
+Line(4) = {4,5};
+Line(5) = {5,6};
+Line(6) = {6,7};
+Line(7) = {7,8};
+Line(8) = {8,9};
+Line(9) = {9,10};
+Line(10) = {10,11};
+Line(11) = {11,12};
+Line(12) = {12,13};
+Line(13) = {13,14};
+Line(14) = {14,15};
+Line(15) = {15,16};
+Line(16) = {16,17};
+Line(17) = {17,18};
+Line(18) = {18,19};
+Line(19) = {19,20};
+Line(20) = {20,21};
+Line(21) = {21,22};
+Line(22) = {22,23};
+Line(23) = {23,24};
+Line(24) = {24,25};
+Line(25) = {25,26};
+Line(26) = {26,27};
+Line(27) = {27,28};
+Line(28) = {28,29};
+Line(29) = {29,30};
+Line(30) = {30,31};
+Line(31) = {31,32};
+Line(32) = {32,33};
+Line(33) = {33,34};
+Line(34) = {34,35};
+Line(35) = {35,36};
+Line(36) = {36,37};
+Line(37) = {37,38};
+Line(38) = {38,39};
+Line(39) = {39,40};
+Line(40) = {40,41};
+Line(41) = {41,42};
+Line(42) = {42,43};
+Line(43) = {43,44};
+Line(44) = {44,45};
+Line(45) = {45,46};
+Line(46) = {46,47};
+Line(47) = {47,48};
+Line(48) = {48,49};
+Line(49) = {49,50};
+Line(50) = {50,51};
+Line(51) = {51,52};
+Line(52) = {52,53};
+Line(53) = {53,54};
+Line(54) = {54,55};
+Line(55) = {55,56};
+Line(56) = {56,57};
+Line(57) = {57,58};
+Line(58) = {58,59};
+Line(59) = {59,60};
+Line(60) = {60,61};
+Line(61) = {61,62};
+Line(62) = {62,63};
+Line(63) = {63,64};
+Line(64) = {64,65};
+Line(65) = {65,66};
+Line(66) = {66,67};
+Line(67) = {67,68};
+Line(68) = {68,69};
+Line(69) = {69,70};
+Line(70) = {70,71};
+Line(71) = {71,72};
+Line(72) = {72,73};
+Line(73) = {73,74};
+Line(74) = {74,75};
+Line(75) = {75,76};
+Line(76) = {76,77};
+Line(77) = {77,78};
+Line(78) = {78,79};
+Line(79) = {79,80};
+Line(80) = {80,81};
+Line(81) = {81,82};
+Line(82) = {82,83};
+Line(83) = {83,84};
+Line(84) = {84,85};
+Line(85) = {85,86};
+Line(86) = {86,87};
+Line(87) = {87,88};
+Line(88) = {88,89};
+Line(89) = {89,90};
+Line(90) = {90,91};
+Line(91) = {91,92};
+Line(92) = {92,93};
+Line(93) = {93,94};
+Line(94) = {94,95};
+Line(95) = {95,96};
+Line(96) = {96,97};
+Line(97) = {97,98};
+Line(98) = {98,99};
+Line(99) = {99,100};
+Line(100) = {100,1};
+//Line(101) = {101,102}; // overlaps!
+Line(102) = {102,103};
+Line(103) = {103,104};
+Line(104) = {104,101};
+Line(105) = {105,106};
+Line(106) = {106,107};
+Line(107) = {107,105};
+Line(108) = {108,109};
+Line(109) = {109,110};
+Line(110) = {110,108};
+Line(111) = {111,112};
+Line(112) = {112,113};
+Line(113) = {113,111};
+Line(114) = {114,115};
+Line(115) = {115,116};
+Line(116) = {116,117};
+Line(117) = {117,118};
+Line(118) = {118,119};
+Line(119) = {119,120};
+Line(120) = {120,121};
+Line(121) = {121,122};
+Line(122) = {122,123};
+Line(123) = {123,124};
+Line(124) = {124,125};
+Line(125) = {125,126};
+Line(126) = {126,127};
+Line(127) = {127,128};
+Line(128) = {128,129};
+Line(129) = {129,130};
+Line(130) = {130,131};
+Line(131) = {131,132};
+Line(132) = {132,133};
+Line(133) = {133,114};
+
+
+Line(134) = {101,124};
+Line(135) = {117,102};
+
+
+Line Loop(136) = {104,134,124,125,126,127,128,129,130,131,132,133,114,115,116,135,102,103};
+Line Loop(137) = {105,106,107};
+Line Loop(138) = {108,109,110};
+Line Loop(139) = {73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72};
+Line Loop(140) = {113,111,112};
+Plane Surface(141) = {136,137,138,139,140};
diff --git a/benchmarks/3d/plate_conductor.geo b/benchmarks/3d/plate_conductor.geo
deleted file mode 100644
index 512c8155b45793ebbcde5f8c510a6b76cc672e4c..0000000000000000000000000000000000000000
--- a/benchmarks/3d/plate_conductor.geo
+++ /dev/null
@@ -1,111 +0,0 @@
-cm = 1e-02;
-cl = 0.005;
-
-
-//box
-Point(1) = {0, 0, 0, cl};
-Point(2) = {0, 0, 10*cm, cl};
-Point(3) = {10*cm, 0, 10*cm, cl};
-Point(4) = {10*cm, 0, 0, cl};
-Point(5) = {0, 2*cm, 0, cl};
-Point(6) = {0, 2*cm, 10*cm, cl};
-Point(7) = {10*cm, 2*cm, 10*cm, cl};
-Point(8) = {10*cm, 2*cm, 0, cl};
-
-//outer conductor
-Point(14) = {6.25*cm, 0, 5*cm, cl};
-Point(15) = {6.25*cm, 0, 4.6*cm, cl};
-Point(16) = {5.85*cm, 0, 5*cm, cl};
-Point(17) = {6.25*cm, 0, 5.4*cm, cl};
-Point(18) = {6.65*cm, 0, 5*cm, cl};
-
-//inner conductor
-Point(19) = {6.25*cm, 1*cm, 5*cm, cl};
-Point(20) = {6.25*cm, 1*cm, 4.9*cm, cl};
-Point(21) = {6.15*cm, 1*cm, 5*cm, cl};
-Point(22) = {6.25*cm, 1*cm, 5.1*cm, cl};
-Point(23) = {6.35*cm, 1*cm, 5*cm, cl};
-
-//box
-Line(1)  = {1,2};
-Line(2)  = {2,3};
-Line(3)  = {3,4};
-Line(4)  = {4,1};
-Line(5)  = {1,5};
-Line(6)  = {2,6};
-Line(7)  = {3,7};
-Line(8)  = {4,8};
-Line(9)  = {5,6};
-Line(10)  = {6,7};
-Line(11)  = {7,8};
-Line(12)  = {8,5};
-
-//outer conductor
-Circle(17) = {15,14,16};
-Circle(18) = {16,14,17};
-Circle(19) = {17,14,18};
-Circle(20) = {18,14,15};
-
-//inner conductor
-Circle(21) = {20,19,21};
-Circle(22) = {21,19,22};
-Circle(23) = {22,19,23};
-Circle(24) = {23,19,20};
-
-//Side Walls
-Line Loop(25) = {9,-6,-1,5};   Plane Surface(1) = {25};//CW
-Line Loop(26) = {-10,-6,2,7};   Plane Surface(2) = {26};
-Line Loop(27) = {-11,-7,3,8};   Plane Surface(3) = {27};
-Line Loop(28) = {12,-5,-4,8};   Plane Surface(4) = {28};//CW
-
-Line Loop(31) = {21,22,23,24};   Plane Surface(7) = {31}; 
-
-//upper inner conductor volume
-innerCond[] = Extrude {0,-1*cm,0}  { Surface{7}; Recombine;};
-
-//middle inner conductor plate
-Line Loop(33) = {33,34,35,36};  
-
-//Bottom
-Line Loop(30) = {1,2,3,4};   Plane Surface(6) = {30,33};   
-
-//middle inner conductor + upper outer conductor
-Line Loop(29) = {17,18,19,20};  Plane Surface(10) = {29,33};
-
-//extrudes outside the box
-outterCond[] = Extrude {0,-1*cm,0}  { Surface{10}; Recombine;};
-
-//top
-LL1 = newll;  Line Loop(LL1) = {9,10,11,12};   
-S1 = news;  Plane Surface(S1) = {LL1};
-
-SL1 = newsl;  Surface Loop(SL1) = {S1,-1,2,3,-4,-6,40,44,48,52,7};
-Volume(4) = {SL1};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/benchmarks/extrude/sphere_boundary_layer.geo b/benchmarks/extrude/sphere_boundary_layer.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1f52d6249e4ae14dd7706253d38063fc94e69818
--- /dev/null
+++ b/benchmarks/extrude/sphere_boundary_layer.geo
@@ -0,0 +1,44 @@
+lc = .2;
+Point(1) = {0.0,0.0,0.0,lc};
+Point(2) = {1,0.0,0.0,lc};
+Point(3) = {0,1,0.0,lc};
+Circle(1) = {2,1,3};
+Point(4) = {-1,0,0.0,lc};
+Point(5) = {0,-1,0.0,lc};
+Circle(2) = {3,1,4};
+Circle(3) = {4,1,5};
+Circle(4) = {5,1,2};
+Point(6) = {0,0,-1,lc};
+Point(7) = {0,0,1,lc};
+Circle(5) = {3,1,6};
+Circle(6) = {6,1,5};
+Circle(7) = {5,1,7};
+Circle(8) = {7,1,3};
+Circle(9) = {2,1,7};
+Circle(10) = {7,1,4};
+Circle(11) = {4,1,6};
+Circle(12) = {6,1,2};
+Line Loop(13) = {2,8,-10};
+Ruled Surface(14) = {13};
+Line Loop(15) = {10,3,7};
+Ruled Surface(16) = {15};
+Line Loop(17) = {-8,-9,1};
+Ruled Surface(18) = {17};
+Line Loop(19) = {-11,-2,5};
+Ruled Surface(20) = {19};
+Line Loop(21) = {-5,-12,-1};
+Ruled Surface(22) = {21};
+Line Loop(23) = {-3,11,6};
+Ruled Surface(24) = {23};
+Line Loop(25) = {-7,4,9};
+Ruled Surface(26) = {25};
+Line Loop(27) = {-4,12,-6};
+Ruled Surface(28) = {27};
+Surface Loop(29) = {28,26,16,14,20,24,22,18};
+Volume(30) = {29};
+
+Extrude {
+  Surface{14:28:2}; Layers{10, 0.1}; // Recombine; 
+}
+
+Mesh.Algorithm3D = 4;
diff --git a/benchmarks/extrude/t1_boundary_layer.geo b/benchmarks/extrude/t1_boundary_layer.geo
new file mode 100644
index 0000000000000000000000000000000000000000..6121adb6aa4eace865791c7ec677c281fbbcdf35
--- /dev/null
+++ b/benchmarks/extrude/t1_boundary_layer.geo
@@ -0,0 +1,91 @@
+/********************************************************************* 
+ *
+ *  Gmsh tutorial 1
+ * 
+ *  Variables, elementary entities (points, lines, surfaces), physical
+ *  entities (points, lines, surfaces)
+ *
+ *********************************************************************/
+
+// The simplest construction in Gmsh's scripting language is the
+// `affectation'. The following command defines a new variable `lc':
+
+lc = 0.009;
+
+// This variable can then be used in the definition of Gmsh's simplest
+// `elementary entity', a `Point'. A Point is defined by a list of
+// four numbers: three coordinates (X, Y and Z), and a characteristic
+// length (lc) that sets the target element size at the point:
+
+Point(1) = {0, 0, 0, lc};
+
+// The distribution of the mesh element sizes is then obtained by
+// interpolation of these characteristic lengths throughout the
+// geometry. Another method to specify characteristic lengths is to
+// use a background mesh (see `t7.geo' and `bgmesh.pos').
+
+// We can then define some additional points as well as our first
+// curve.  Curves are Gmsh's second type of elementery entities, and,
+// amongst curves, straight lines are the simplest. A straight line is
+// defined by a list of point numbers. In the commands below, for
+// example, the line 1 starts at point 1 and ends at point 2:
+
+Point(2) = {.1, 0,  0, lc} ;
+Point(3) = {.1, .3, 0, lc} ;
+Point(4) = {0,  .3, 0, lc} ;
+
+Line(1) = {1,2} ;
+Line(2) = {3,2} ;
+Line(3) = {3,4} ;
+Line(4) = {4,1} ;
+
+// The third elementary entity is the surface. In order to define a
+// simple rectangular surface from the four lines defined above, a
+// line loop has first to be defined. A line loop is a list of
+// connected lines, a sign being associated with each line (depending
+// on the orientation of the line):
+
+Line Loop(5) = {4,1,-2,3} ;
+
+// We can then define the surface as a list of line loops (only one
+// here, since there are no holes--see `t4.geo'):
+
+Plane Surface(6) = {5} ;
+
+// At this level, Gmsh knows everything to display the rectangular
+// surface 6 and to mesh it. An optional step is needed if we want to
+// associate specific region numbers to the various elements in the
+// mesh (e.g. to the line segments discretizing lines 1 to 4 or to the
+// triangles discretizing surface 6). This is achieved by the
+// definition of `physical entities'. Physical entities will group
+// elements belonging to several elementary entities by giving them a
+// common number (a region number), and specifying their orientation.
+
+// We can for example group the points 1 and 2 into the physical
+// entity 1:
+
+Physical Point(1) = {1,2} ;
+
+// Consequently, two punctual elements will be saved in the output
+// mesh file, both with the region number 1. The mechanism is
+// identical for line or surface elements:
+
+MyLine = 99;
+Physical Line(MyLine) = {1,2,4} ;
+
+Physical Surface("My fancy surface label") = {6} ;
+
+// All the line elements created during the meshing of lines 1, 2 and
+// 4 will be saved in the output mesh file with the region number 99;
+// and all the triangular elements resulting from the discretization
+// of surface 6 will be given an automatic region number (100,
+// associated with the label "My fancy surface label").
+
+// Note that if no physical entities are defined, then all the
+// elements in the mesh will be saved "as is", with their default
+// orientation.
+
+Extrude {
+  Surface{6}; Layers{5, 0.1}; Recombine;
+
+}
diff --git a/doc/VERSIONS b/doc/VERSIONS
index 88f328c6178dd18b401ce50448f2c595dc53e72e..00f59b186fada15c69ffe08885db5620f434fe62 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,6 +1,6 @@
-$Id: VERSIONS,v 1.379 2007-02-21 08:17:16 geuzaine Exp $
+$Id: VERSIONS,v 1.380 2007-02-26 08:25:46 geuzaine Exp $
 
-since 2.0: volumes can now be defined from external CAD surfaces;
+new since 2.0: volumes can now be defined from external CAD surfaces;
 Delaunay/Tetgen algorithm is now used by default when available; fixed
 various bugs.
 
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index 2b3996fc31a1ada0ba4d4d5eabd94a12845121f6..17efb0a233868548a366bf83677a881ea5018577 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -1,5 +1,5 @@
 \input texinfo.tex @c -*-texinfo-*-
-@c $Id: gmsh.texi,v 1.229 2007-02-13 07:51:48 geuzaine Exp $
+@c $Id: gmsh.texi,v 1.230 2007-02-26 08:25:46 geuzaine Exp $
 @c
 @c Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 @c
@@ -2038,6 +2038,9 @@ Extrudes both the geometry and the mesh using a combined translation and
 rotation (@pxref{Extrusions}). The @var{layers} option is defined as
 above.
 
+@item Extrude @{ Surface @{ @var{expression-list} @}; @var{layers} @}
+Extrudes a boundary layer along the normals of the specified surfaces.
+
 @item Transfinite Line @{ @var{expression-list} @} = @var{expression} < Using Progression | Bump @var{expression} >;
 Selects the lines in @var{expression-list} to be meshed with the 1D
 transfinite algorithm. The @var{expression} on the right hand side gives the