diff --git a/classes/BasicSpecialFunction.php b/classes/BasicSpecialFunction.php
index 602c7eec8af535d9499aa2971d2c08ad71e45d10..5b5a78f0cd9d6297859883cb200d274ba424650e 100644
--- a/classes/BasicSpecialFunction.php
+++ b/classes/BasicSpecialFunction.php
@@ -40,27 +40,17 @@ class SpecialFunction extends AbstractSpecialFunction{
   	try{
   	  $viewFile = $conf['special']['uri'].".".$f.$conf['view']['extension'].".".$extension;
   	  $modelFile = $conf['special']['uri'].".".$f.$conf['model']['extension'].".".$extension;
-  	  if(!(is_dir($conf['model']['directory'].$modelFile) || is_file($conf['model']['directory'].$modelFile)) || !is_file($conf['view']['directory'].$viewFile)){
-  	  	throw new Exception('Method does not exist!');
+  	  if(!(is_dir($conf['model']['directory'].$modelFile) || is_file($conf['model']['directory'].$modelFile))){
+  	  	$msg = '<h1>Method does not exist!</h1><br/>This means that <tt>'.$conf['model']['directory'].$modelFile."</tt> doesn't exist.<br/>Please refer to this tutorial to create one.<br/>";
+  	  	throw new Exception($msg);
+  	  }
+  	  if(!is_file($conf['view']['directory'].$viewFile)){
+  	  	  $msg='<h1>Method does not exist!</h1><br/>This means that <tt>'.$conf['view']['directory'].$viewFile."</tt> doesn't exist.<br/>Please refer to this tutorial to create one.<br/>";
+  	  	  throw new Exception($msg);
   	  }
   	  $endpoints = $context['endpoints'];
   	  array_pop($params);
   	  array_shift($params);
-  	  //$query = file_get_contents($conf['model']['directory'].$modelFile);
-  	  /*$queryHeader = "";
-  	  $prefixHeader = array();
-  	  for($i=0;$i<sizeof($params);$i++){
-  	  $auxPrefix = Utils::getPrefix($params[$i]);
-  	  if($auxPrefix['ns'] != NULL){
-  	  $prefixHeader[$auxPrefix['ns']] = $auxPrefix['prefix'];
-  	  }
-  	  $query = preg_replace("|%".$i."|", $params[$i], $query);
-  	  }
-  	  foreach($prefixHeader as $n => $p){
-  	  $queryHeader .= "PREFIX $p: <$n> \n";
-  	  }
-  	  $data['query'] =$queryHeader . $query;*/
-  	  //$e->query($data['query'], Utils::getResultsType($query));
   	  
   	  $prefixHeader = array();
   	  for($i=0;$i<sizeof($params);$i++){
@@ -81,12 +71,15 @@ class SpecialFunction extends AbstractSpecialFunction{
  	  $data['params'] = $params;
  	  $base = $conf['view']['standard'];
  	  $base['type'] = $modelFile;
+ 	  $base['root'] = $conf['root'];
+ 	  $base['home'] = $conf['basedir'];
  	  $base['this']['value'] = $uri;
  	  $base['this']['curie'] = Utils::uri2curie($uri);
  	  $base['this']['contentType'] = $acceptContentType;
  	  $base['model']['directory'] = $conf['model']['directory'];
  	  $base['view']['directory'] = $conf['view']['directory'];
- 	  $base['ns'] = $conf['ns'];  	  $base['ns'] = $conf['ns'];
+ 	  $base['ns'] = $conf['ns'];
+ 	  $base['endpoint'] = $conf['endpoint'];
   	  $base['type'] = $modelFile;
   	  $base['header'] = $prefixHeader;
   	  $base['args'] = $args;
@@ -96,8 +89,9 @@ class SpecialFunction extends AbstractSpecialFunction{
   	  $base['view']['directory'] = $conf['home'].$conf['view']['directory'];
   	  $base['model']['directory'] = $conf['home'].$conf['model']['directory'];
   	  chdir($conf['model']['directory']);
-  	  Utils::queryFile($modelFile, $endpoints['local'], $data);
-  	  chdir("..");
+  	  $first = array();
+  	  Utils::queryFile($modelFile, $endpoints['local'], $data, $first);
+  	  chdir($conf['home']);
   	  $data = Utils::internalize($data);
 
   	  if(is_array($data)){
diff --git a/classes/MetaDb.php b/classes/MetaDb.php
index 6bed8c9096fdccb8c1a7496d379ebd4d5e230ae8..5cf0d89a8d04cc9a2cd58341c2edf11b09912946 100644
--- a/classes/MetaDb.php
+++ b/classes/MetaDb.php
@@ -30,13 +30,13 @@ class MetaDb{
         global $conf;
         try{
 	    	$db = new PDO('sqlite:'.$this->dbLocation);
-	    	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
-
-	        $results = $db->exec($q);
+	    	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+	    	$results = $db->exec($q);
 			$db = NULL;
-		}catch(PDOException $e){
-				print 'Exception exec: '.$e->getMessage()."\n\n";
-				exit(10);
+		}catch(Exception $e){
+				echo "Can't write in SQLite database. Please check you have granted write permissions to <tt>meta/</tt> and <tt>meta/db.sqlite</tt>.";
+		  		trigger_error('Exception exec: '.$e->getMessage(), E_USER_ERROR);
+				exit(1);
 		}
         return $results;
   }
diff --git a/classes/Utils.php b/classes/Utils.php
index e1cb69feb3b0c14a44d1a2e218ac0399c9f792db..2c7581fd54bca5b4accc910fee429ab5075d4802 100644
--- a/classes/Utils.php
+++ b/classes/Utils.php
@@ -12,7 +12,7 @@ class Utils{
   
   public static function send404($uri){
   	header("HTTP/1.0 404 Not Found");
-  	echo "I could not find ".$uri." or information about it.\n\n";
+  	echo "LODSPeaKr could not find ".$uri." or information about it.\n\n";
   	exit(0);
   }
   
@@ -22,9 +22,12 @@ class Utils{
   	exit(0);
   }
   
-  public static function send500($uri){
+  public static function send500($msg = null){
   	header("HTTP/1.0 500 Internal Server Error");
   	echo "An internal error ocurred. Please try later\n\n";
+  	if($msg != null){
+  	  echo $msg;
+  	}
   	exit(0);
   }
   
@@ -272,7 +275,7 @@ class Utils{
   	  	Utils::queryDir($v, $r);
   	  }
   	}  	
-  	chdir("..");
+  	chdir($conf['home']);
   	//return $data;
   }
   
diff --git a/common.inc.php b/common.inc.php
index 04ac77fa5fa6ccc31bc918f06be5df3aba7e2e47..5f443ea60be8a22eb0b4b75cf1848d00db45594d 100644
--- a/common.inc.php
+++ b/common.inc.php
@@ -36,7 +36,7 @@ $conf['special']['uri'] = 'special';
 $conf['special']['class'] = 'classes/BasicSpecialFunction.php';
 
 //Frontpage when user goes to http://example.org/
-$conf['root'] = 'special/index';
+$conf['root'] = 'index.html';
 $conf['extension_connector'] = '.';
 
 //Priority for rdfs:Resource (default). Priorities should be >=0
diff --git a/index.php b/index.php
index d0f06e6a185eda0aa323fd53451f8f37432bbf5d..577d3a83e5d78bc7aef666291fefc3da08990317 100755
--- a/index.php
+++ b/index.php
@@ -128,7 +128,7 @@ chdir($conf['model']['directory']);
 Utils::queryFile($modelFile, $endpoints['local'], $results, $first);
 $results = Utils::internalize($results); 
 $base['first'] = Utils::getFirsts($results);
-chdir("..");
+chdir($conf['home']);
 if(is_array($results)){
   $resultsObj = Convert::array_to_object($results);
 }else{
diff --git a/install.sh b/install.sh
index b03bd452d7ada372fc2a6c92a2bbbdd09a2ae2fb..fb259b95b3eeea5fddf9563ebffcd62958ec9a0e 100755
--- a/install.sh
+++ b/install.sh
@@ -27,7 +27,7 @@ while [ "$everything_ok" != "y" ]; do
   echo
   echo "LODSPeaKr needs to know three (3) URIs to minimally configure itself:"
   echo 
-  echo    "(1/3) At what URL will `pwd` be available? (e.g. http://localhost/$parent/)"
+  echo    "(1/3) At what URL will `pwd |sed -e 's/lodspeakr$//'` be available? (e.g. http://localhost/$parent/)"
   echo    "**Note** DO NOT include 'lodspeakr/' in the URL"
   echo -n "(default '$basedir'): "
   read -u 1 aux_basedir
diff --git a/lib/Haanga/LICENSE b/lib/Haanga/LICENSE
index 97bf9bbfac53a96c84c42b5675258ed018f03187..f70e9f63bb37f8e2d662309eb31ab5164b7fec88 100644
--- a/lib/Haanga/LICENSE
+++ b/lib/Haanga/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010, César D. Rodas <crodas@php.net> and Menéame Comunicacions S.L.
+Copyright (c) 2011, César D. Rodas <crodas@php.net> and Menéame Comunicacions S.L.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/lib/Haanga/lib/Haanga/Compiler/Parser.php b/lib/Haanga/lib/Haanga/Compiler/Parser.php
index 369fa610dc6fe57d0581f2ba2a67409aeb15e43b..9d16bb5f7e9d5f2be97322ff60ed730ca6bdf014 100644
--- a/lib/Haanga/lib/Haanga/Compiler/Parser.php
+++ b/lib/Haanga/lib/Haanga/Compiler/Parser.php
@@ -1,99 +1,99 @@
-<?php
-/* Driver template for the PHP_Haanga_rGenerator parser generator. (PHP port of LEMON)
-*/
-
-/**
- * This can be used to store both the string representation of
- * a token, and any useful meta-data associated with the token.
- *
- * meta-data should be stored as an array
- */
-class Haanga_yyToken implements ArrayAccess
-{
-    public $string = '';
-    public $metadata = array();
-
-    function __construct($s, $m = array())
-    {
-        if ($s instanceof Haanga_yyToken) {
-            $this->string = $s->string;
-            $this->metadata = $s->metadata;
-        } else {
-            $this->string = (string) $s;
-            if ($m instanceof Haanga_yyToken) {
-                $this->metadata = $m->metadata;
-            } elseif (is_array($m)) {
-                $this->metadata = $m;
-            }
-        }
-    }
-
-    function __toString()
-    {
-        return $this->_string;
-    }
-
-    function offsetExists($offset)
-    {
-        return isset($this->metadata[$offset]);
-    }
-
-    function offsetGet($offset)
-    {
-        return $this->metadata[$offset];
-    }
-
-    function offsetSet($offset, $value)
-    {
-        if ($offset === null) {
-            if (isset($value[0])) {
-                $x = ($value instanceof Haanga_yyToken) ?
-                    $value->metadata : $value;
-                $this->metadata = array_merge($this->metadata, $x);
-                return;
-            }
-            $offset = count($this->metadata);
-        }
-        if ($value === null) {
-            return;
-        }
-        if ($value instanceof Haanga_yyToken) {
-            if ($value->metadata) {
-                $this->metadata[$offset] = $value->metadata;
-            }
-        } elseif ($value) {
-            $this->metadata[$offset] = $value;
-        }
-    }
-
-    function offsetUnset($offset)
-    {
-        unset($this->metadata[$offset]);
-    }
-}
-
-/** The following structure represents a single element of the
- * parser's stack.  Information stored includes:
- *
- *   +  The state number for the parser at this level of the stack.
- *
- *   +  The value of the token stored at this level of the stack.
- *      (In other words, the "major" token.)
- *
- *   +  The semantic value stored at this level of the stack.  This is
- *      the information used by the action routines in the grammar.
- *      It is sometimes called the "minor" token.
- */
-class Haanga_yyStackEntry
-{
-    public $stateno;       /* The state-number */
-    public $major;         /* The major token value.  This is the code
-                     ** number for the token at this stack level */
-    public $minor; /* The user-supplied minor token value.  This
-                     ** is the value of the token  */
-};
-
-// code external to the class is included here
+<?php
+/* Driver template for the PHP_Haanga_rGenerator parser generator. (PHP port of LEMON)
+*/
+
+/**
+ * This can be used to store both the string representation of
+ * a token, and any useful meta-data associated with the token.
+ *
+ * meta-data should be stored as an array
+ */
+class Haanga_yyToken implements ArrayAccess
+{
+    public $string = '';
+    public $metadata = array();
+
+    function __construct($s, $m = array())
+    {
+        if ($s instanceof Haanga_yyToken) {
+            $this->string = $s->string;
+            $this->metadata = $s->metadata;
+        } else {
+            $this->string = (string) $s;
+            if ($m instanceof Haanga_yyToken) {
+                $this->metadata = $m->metadata;
+            } elseif (is_array($m)) {
+                $this->metadata = $m;
+            }
+        }
+    }
+
+    function __toString()
+    {
+        return $this->string;
+    }
+
+    function offsetExists($offset)
+    {
+        return isset($this->metadata[$offset]);
+    }
+
+    function offsetGet($offset)
+    {
+        return $this->metadata[$offset];
+    }
+
+    function offsetSet($offset, $value)
+    {
+        if ($offset === null) {
+            if (isset($value[0])) {
+                $x = ($value instanceof Haanga_yyToken) ?
+                    $value->metadata : $value;
+                $this->metadata = array_merge($this->metadata, $x);
+                return;
+            }
+            $offset = count($this->metadata);
+        }
+        if ($value === null) {
+            return;
+        }
+        if ($value instanceof Haanga_yyToken) {
+            if ($value->metadata) {
+                $this->metadata[$offset] = $value->metadata;
+            }
+        } elseif ($value) {
+            $this->metadata[$offset] = $value;
+        }
+    }
+
+    function offsetUnset($offset)
+    {
+        unset($this->metadata[$offset]);
+    }
+}
+
+/** The following structure represents a single element of the
+ * parser's stack.  Information stored includes:
+ *
+ *   +  The state number for the parser at this level of the stack.
+ *
+ *   +  The value of the token stored at this level of the stack.
+ *      (In other words, the "major" token.)
+ *
+ *   +  The semantic value stored at this level of the stack.  This is
+ *      the information used by the action routines in the grammar.
+ *      It is sometimes called the "minor" token.
+ */
+class Haanga_yyStackEntry
+{
+    public $stateno;       /* The state-number */
+    public $major;         /* The major token value.  This is the code
+                     ** number for the token at this stack level */
+    public $minor; /* The user-supplied minor token value.  This
+                     ** is the value of the token  */
+};
+
+// code external to the class is included here
 #line 2 "Parser.y"
 
 /*
@@ -132,13 +132,13 @@ class Haanga_yyStackEntry
   +---------------------------------------------------------------------------------+
 */
 #line 136 "Parser.php"
-
-// declare_class is output here
+
+// declare_class is output here
 #line 39 "Parser.y"
  class Haanga_Compiler_Parser #line 141 "Parser.php"
-{
-/* First off, code is included which follows the "include_class" declaration
-** in the input file. */
+{
+/* First off, code is included which follows the "include_class" declaration
+** in the input file. */
 #line 40 "Parser.y"
 
     protected $lex;
@@ -156,16 +156,16 @@ class Haanga_yyStackEntry
     }
 
 #line 162 "Parser.php"
-
-/* Next is all token values, as class constants
-*/
-/* 
-** These constants (all generated automatically by the parser generator)
-** specify the various kinds of tokens (terminals) that the parser
-** understands. 
-**
-** Each symbol here is a terminal symbol in the grammar.
-*/
+
+/* Next is all token values, as class constants
+*/
+/* 
+** These constants (all generated automatically by the parser generator)
+** specify the various kinds of tokens (terminals) that the parser
+** understands. 
+**
+** Each symbol here is a terminal symbol in the grammar.
+*/
     const T_TAG_OPEN                     =  1;
     const T_NOT                          =  2;
     const T_AND                          =  3;
@@ -224,383 +224,399 @@ class Haanga_yyStackEntry
     const T_LPARENT                      = 56;
     const T_OBJ                          = 57;
     const T_DOT                          = 58;
-    const T_ALPHA                        = 59;
-    const T_CLASS                        = 60;
-    const T_BRACKETS_OPEN                = 61;
-    const T_BRACKETS_CLOSE               = 62;
+    const T_CLASS                        = 59;
+    const T_BRACKETS_OPEN                = 60;
+    const T_BRACKETS_CLOSE               = 61;
+    const T_ALPHA                        = 62;
     const T_DOTDOT                       = 63;
     const T_NUMERIC                      = 64;
     const YY_NO_ACTION = 356;
     const YY_ACCEPT_ACTION = 355;
     const YY_ERROR_ACTION = 354;
-
-/* Next are that tables used to determine what action to take based on the
-** current state and lookahead token.  These tables are used to implement
-** functions that take a state number and lookahead value and return an
-** action integer.  
-**
-** Suppose the action integer is N.  Then the action is determined as
-** follows
-**
-**   0 <= N < self::YYNSTATE                              Shift N.  That is,
-**                                                        push the lookahead
-**                                                        token onto the stack
-**                                                        and goto state N.
-**
-**   self::YYNSTATE <= N < self::YYNSTATE+self::YYNRULE   Reduce by rule N-YYNSTATE.
-**
-**   N == self::YYNSTATE+self::YYNRULE                    A syntax error has occurred.
-**
-**   N == self::YYNSTATE+self::YYNRULE+1                  The parser accepts its
-**                                                        input. (and concludes parsing)
-**
-**   N == self::YYNSTATE+self::YYNRULE+2                  No such action.  Denotes unused
-**                                                        slots in the yy_action[] table.
-**
-** The action table is constructed as a single large static array $yy_action.
-** Given state S and lookahead X, the action is computed as
-**
-**      self::$yy_action[self::$yy_shift_ofst[S] + X ]
-**
-** If the index value self::$yy_shift_ofst[S]+X is out of range or if the value
-** self::$yy_lookahead[self::$yy_shift_ofst[S]+X] is not equal to X or if
-** self::$yy_shift_ofst[S] is equal to self::YY_SHIFT_USE_DFLT, it means that
-** the action is not in the table and that self::$yy_default[S] should be used instead.  
-**
-** The formula above is for computing the action when the lookahead is
-** a terminal symbol.  If the lookahead is a non-terminal (as occurs after
-** a reduce action) then the static $yy_reduce_ofst array is used in place of
-** the static $yy_shift_ofst array and self::YY_REDUCE_USE_DFLT is used in place of
-** self::YY_SHIFT_USE_DFLT.
-**
-** The following are the tables generated in this section:
-**
-**  self::$yy_action        A single table containing all actions.
-**  self::$yy_lookahead     A table containing the lookahead for each entry in
-**                          yy_action.  Used to detect hash collisions.
-**  self::$yy_shift_ofst    For each state, the offset into self::$yy_action for
-**                          shifting terminals.
-**  self::$yy_reduce_ofst   For each state, the offset into self::$yy_action for
-**                          shifting non-terminals after a reduce.
-**  self::$yy_default       Default action for each state.
-*/
-    const YY_SZ_ACTTAB = 1328;
+
+/* Next are that tables used to determine what action to take based on the
+** current state and lookahead token.  These tables are used to implement
+** functions that take a state number and lookahead value and return an
+** action integer.  
+**
+** Suppose the action integer is N.  Then the action is determined as
+** follows
+**
+**   0 <= N < self::YYNSTATE                              Shift N.  That is,
+**                                                        push the lookahead
+**                                                        token onto the stack
+**                                                        and goto state N.
+**
+**   self::YYNSTATE <= N < self::YYNSTATE+self::YYNRULE   Reduce by rule N-YYNSTATE.
+**
+**   N == self::YYNSTATE+self::YYNRULE                    A syntax error has occurred.
+**
+**   N == self::YYNSTATE+self::YYNRULE+1                  The parser accepts its
+**                                                        input. (and concludes parsing)
+**
+**   N == self::YYNSTATE+self::YYNRULE+2                  No such action.  Denotes unused
+**                                                        slots in the yy_action[] table.
+**
+** The action table is constructed as a single large static array $yy_action.
+** Given state S and lookahead X, the action is computed as
+**
+**      self::$yy_action[self::$yy_shift_ofst[S] + X ]
+**
+** If the index value self::$yy_shift_ofst[S]+X is out of range or if the value
+** self::$yy_lookahead[self::$yy_shift_ofst[S]+X] is not equal to X or if
+** self::$yy_shift_ofst[S] is equal to self::YY_SHIFT_USE_DFLT, it means that
+** the action is not in the table and that self::$yy_default[S] should be used instead.  
+**
+** The formula above is for computing the action when the lookahead is
+** a terminal symbol.  If the lookahead is a non-terminal (as occurs after
+** a reduce action) then the static $yy_reduce_ofst array is used in place of
+** the static $yy_shift_ofst array and self::YY_REDUCE_USE_DFLT is used in place of
+** self::YY_SHIFT_USE_DFLT.
+**
+** The following are the tables generated in this section:
+**
+**  self::$yy_action        A single table containing all actions.
+**  self::$yy_lookahead     A table containing the lookahead for each entry in
+**                          yy_action.  Used to detect hash collisions.
+**  self::$yy_shift_ofst    For each state, the offset into self::$yy_action for
+**                          shifting terminals.
+**  self::$yy_reduce_ofst   For each state, the offset into self::$yy_action for
+**                          shifting non-terminals after a reduce.
+**  self::$yy_default       Default action for each state.
+*/
+    const YY_SZ_ACTTAB = 1402;
 static public $yy_action = array(
- /*     0 */    47,   57,   49,   65,  152,   39,  194,   40,  172,   64,
- /*    10 */    59,  195,   93,   67,  233,  155,  212,   29,  153,   41,
- /*    20 */    37,   36,   56,   53,   55,   47,   57,   49,   65,  177,
- /*    30 */    39,  247,   40,  172,   64,   59,   57,   93,   67,   25,
- /*    40 */    25,  178,   29,  202,   41,   37,   36,   56,   53,   55,
- /*    50 */    47,  161,   49,   65,  165,   39,  248,   40,  172,   64,
- /*    60 */    59,  224,   93,   67,  242,  126,  238,   29,  162,   41,
- /*    70 */    37,   36,   56,   53,   55,   47,  231,   49,   65,  182,
- /*    80 */    39,   97,   40,  172,   64,   59,  253,   93,   67,  109,
- /*    90 */   128,  201,   29,  189,   41,   37,   36,   56,   53,   55,
- /*   100 */    47,  231,   49,   65,  187,   39,  107,   40,  172,   64,
- /*   110 */    59,  204,   93,   67,  215,  124,  251,   29,  183,   41,
- /*   120 */    37,   36,   56,   53,   55,   47,  231,   49,   65,  169,
- /*   130 */    39,  191,   40,  172,   64,   59,  237,   93,   67,  196,
- /*   140 */   139,  111,   29,  171,   41,   37,   36,   56,   53,   55,
- /*   150 */    47,  231,   49,   65,  158,   39,  199,   40,  172,   64,
- /*   160 */    59,   57,   93,   67,  108,  127,  104,   29,   95,   41,
- /*   170 */    37,   36,   56,   53,   55,   47,  231,   49,   65,  151,
- /*   180 */    39,  197,   40,  172,   64,   59,   57,   93,   67,  106,
- /*   190 */   135,  193,   29,  239,   41,   37,   36,   56,   53,   55,
- /*   200 */    47,  231,   49,   65,   92,   39,  100,   40,  172,   64,
- /*   210 */    59,  244,   93,   67,  210,  125,  110,   29,  115,   41,
- /*   220 */    37,   36,   56,   53,   55,   47,  231,   49,   65,  160,
- /*   230 */    39,  243,   40,  172,   64,   59,  236,   93,   67,  252,
- /*   240 */   130,  209,   29,   50,   41,   37,   36,   56,   53,   55,
- /*   250 */    47,  231,   49,   65,  184,   39,  229,   40,  172,   64,
- /*   260 */    59,  246,   93,   67,  102,  131,  225,   29,  232,   41,
- /*   270 */    37,   36,   56,   53,   55,   47,  231,   49,   65,  173,
- /*   280 */    39,  241,   40,  172,   64,   59,   83,   93,   67,   88,
- /*   290 */   133,   87,   29,  179,   41,   37,   36,   56,   53,   55,
- /*   300 */    47,  231,   49,   65,  188,   39,  184,   40,  172,   64,
- /*   310 */    59,   90,   93,   67,   89,  129,   85,   29,  184,   41,
- /*   320 */    37,   36,   56,   53,   55,   47,  231,   49,   65,  168,
- /*   330 */    39,   84,   40,  172,   64,   59,   86,   93,   67,  355,
- /*   340 */    78,   79,   29,  184,   41,   37,   36,   56,   53,   55,
- /*   350 */    47,   76,   49,   65,  170,   39,   81,   40,  172,   64,
- /*   360 */    59,   74,   93,   67,   75,   71,   77,   29,  184,   41,
- /*   370 */    37,   36,   56,   53,   55,   47,   80,   49,   65,  181,
- /*   380 */    39,   73,   40,  172,   64,   59,  184,   93,   67,   82,
- /*   390 */    72,   70,   29,  184,   41,   37,   36,   56,   53,   55,
- /*   400 */    47,   91,   49,   65,   58,   39,   69,   40,  172,   64,
- /*   410 */    59,  184,   93,   67,  184,  184,  184,   29,  184,   41,
- /*   420 */    37,   36,   56,   53,   55,   47,  184,   49,   65,  185,
- /*   430 */    39,  184,   40,  172,   64,   59,  184,   93,   67,  184,
- /*   440 */   184,  184,   29,  184,   41,   37,   36,   56,   53,   55,
- /*   450 */    47,  184,   49,   65,  149,   39,  184,   40,  172,   64,
- /*   460 */    59,  184,   93,   67,  184,  184,  184,   29,  184,   41,
- /*   470 */    37,   36,   56,   53,   55,   47,  184,   49,   65,  175,
- /*   480 */    39,  184,   40,  172,   64,   59,  184,   93,   67,  184,
- /*   490 */   184,  184,   29,   57,   41,   37,   36,   56,   53,   55,
- /*   500 */    30,   31,   32,   32,   32,   32,   32,   32,   32,   27,
- /*   510 */    27,   27,   26,   26,   26,   25,   25,   26,   26,   26,
- /*   520 */    25,   25,  113,   47,   66,   49,   65,  156,   39,  184,
- /*   530 */    40,  172,   64,   59,  184,   93,   67,  184,  184,  184,
- /*   540 */    29,  184,   41,   37,   36,   56,   53,   55,   47,  184,
- /*   550 */    49,   65,  180,   39,  184,   40,  172,   64,   59,  184,
- /*   560 */    93,   67,  184,  184,  184,   29,  184,   41,   37,   36,
- /*   570 */    56,   53,   55,   30,   31,   32,   32,   32,   32,   32,
- /*   580 */    32,   32,   27,   27,   27,   26,   26,   26,   25,   25,
- /*   590 */    47,  184,   49,   65,  132,   39,  184,   40,  172,   64,
- /*   600 */    59,  184,   93,   67,  257,  231,  143,   29,   45,   41,
- /*   610 */    37,   36,   56,   53,   55,  140,  140,  123,  141,   48,
- /*   620 */   184,  351,  184,  148,  164,  250,  198,  263,  231,   30,
- /*   630 */    31,   32,   32,   32,   32,   32,   32,   32,   27,   27,
- /*   640 */    27,   26,   26,   26,   25,   25,   31,   32,   32,   32,
- /*   650 */    32,   32,   32,   32,   27,   27,   27,   26,   26,   26,
- /*   660 */    25,   25,   32,   32,   32,   32,   32,   32,   32,   27,
- /*   670 */    27,   27,   26,   26,   26,   25,   25,  167,  245,  223,
- /*   680 */    45,  223,  220,  184,  220,  174,  184,  140,  140,  234,
- /*   690 */   141,   48,  144,  220,   61,  220,  132,   28,  122,  220,
- /*   700 */   259,   15,   46,  132,  249,  262,  263,  231,  167,  223,
- /*   710 */   220,   94,  230,  263,  231,  227,  227,  233,  155,  184,
- /*   720 */   203,  200,   54,  230,  220,   51,  220,  226,  219,  184,
- /*   730 */   154,  208,  207,  205,  206,  211,  217,  218,  216,  147,
- /*   740 */   167,  220,  240,    4,   96,  184,  261,  261,  233,  155,
- /*   750 */   132,   24,  213,  184,  230,  184,  220,   62,  220,  219,
- /*   760 */   263,  231,  203,  200,   54,  184,  264,  184,  184,  184,
- /*   770 */   184,  167,  184,  220,  254,  184,  184,  184,  227,  227,
- /*   780 */   233,  155,  184,   99,  138,   42,  230,  220,  228,  220,
- /*   790 */   184,  219,  184,  222,  167,  231,   46,  112,  140,  140,
- /*   800 */   184,  141,   48,  167,  220,  174,  190,  184,  184,  227,
- /*   810 */   227,  233,  155,  184,  184,   98,  132,  230,  116,  220,
- /*   820 */   259,  220,  219,  105,  249,  262,  263,  231,   46,  140,
- /*   830 */   140,  184,  141,   48,  184,  167,  220,  184,  184,  184,
- /*   840 */   184,  227,  227,  233,  155,  219,  184,  101,  184,  230,
- /*   850 */   174,  220,  184,  220,  219,  140,  140,  184,  141,   48,
- /*   860 */   221,  132,  221,  117,  167,  259,  184,  167,  220,  249,
- /*   870 */   262,  263,  231,  227,  227,  233,  155,  254,  184,  103,
- /*   880 */   220,  230,  220,  220,  184,  220,  219,  138,   43,  184,
- /*   890 */   221,  228,  184,  167,   63,  184,  222,  220,  231,  220,
- /*   900 */   220,  220,  184,  184,  184,  227,  227,  233,  155,  220,
- /*   910 */   230,  220,  184,  230,  235,  219,  220,  184,  219,  167,
- /*   920 */   184,  140,  140,  184,  141,   48,  220,  134,  184,  230,
- /*   930 */   184,  227,  227,  233,  155,  220,  176,  220,  231,  230,
- /*   940 */   184,  184,  184,  184,  219,  184,  140,  140,  184,  141,
- /*   950 */    48,  184,  220,  184,  184,  137,  174,  261,  261,  233,
- /*   960 */   155,  184,  192,  184,  198,  230,  231,  132,   13,  260,
- /*   970 */   219,  259,  254,  184,  184,  249,  262,  263,  231,  174,
- /*   980 */   184,  184,  138,   44,   22,  142,  228,  203,  200,   54,
- /*   990 */   132,  222,  121,  231,  259,  184,  132,  174,  249,  262,
- /*  1000 */   263,  231,    9,  203,  200,   54,  263,  231,  132,  184,
- /*  1010 */   118,  184,  259,  184,  184,  174,  249,  262,  263,  231,
- /*  1020 */   184,  203,  200,   54,   38,  184,  132,  174,  145,  184,
- /*  1030 */   259,  184,  184,  184,  249,  262,  263,  231,  132,  184,
- /*  1040 */   120,  174,  259,  184,  184,  184,  249,  262,  263,  231,
- /*  1050 */   184,   68,  132,  184,  119,  184,  259,  184,  184,  184,
- /*  1060 */   249,  262,  263,  231,  184,  174,   33,  184,  184,  184,
- /*  1070 */   140,  140,  184,  141,   48,  184,  132,  184,  136,  174,
- /*  1080 */   259,  184,  184,  184,  249,  262,  263,  231,  140,  140,
- /*  1090 */   132,  141,   48,  146,  259,  184,  184,  174,  163,  262,
- /*  1100 */   263,  231,   52,  184,  132,   60,  184,  184,  132,  174,
- /*  1110 */   184,  184,  259,  184,  263,  231,   35,  262,  263,  231,
- /*  1120 */   132,  184,  184,  174,  259,  114,  184,  184,  186,  262,
- /*  1130 */   263,  231,  140,  140,  132,  141,   48,  184,  259,  184,
- /*  1140 */   184,  184,   34,  262,  263,  231,  214,  184,  140,  140,
- /*  1150 */   184,  141,   48,  184,  184,  184,  159,  140,  140,  184,
- /*  1160 */   141,   48,  184,  184,  184,  184,  138,  184,  184,  184,
- /*  1170 */   228,  184,  184,  166,  256,  222,  184,  231,  140,  140,
- /*  1180 */   184,  141,   48,  138,  138,  184,   21,  228,  228,  258,
- /*  1190 */   255,  184,  222,  222,  231,  231,  184,  184,  184,  138,
- /*  1200 */   138,  184,  150,  228,  228,  203,  200,   54,  222,  222,
- /*  1210 */   231,  231,  138,    3,  184,  137,  228,  184,   20,  184,
- /*  1220 */   184,  222,  157,  231,  198,   23,  231,  184,  184,  184,
- /*  1230 */   184,  184,  203,  200,   54,   18,  184,  203,  200,   54,
- /*  1240 */    11,  184,  184,  184,  203,  200,   54,    1,  140,  140,
- /*  1250 */   184,  141,   48,    2,  203,  200,   54,   17,  184,  203,
- /*  1260 */   200,   54,   10,  184,  184,  184,  203,  200,   54,   14,
- /*  1270 */   184,  184,  203,  200,   54,    5,  203,  200,   54,   16,
- /*  1280 */   184,  203,  200,   54,    6,  184,  184,  184,  203,  200,
- /*  1290 */    54,   19,  184,  184,  203,  200,   54,    7,  203,  200,
- /*  1300 */    54,   12,  184,  203,  200,   54,    8,  184,  184,  184,
- /*  1310 */   203,  200,   54,  184,  184,  184,  203,  200,   54,  184,
- /*  1320 */   203,  200,   54,  184,  184,  203,  200,   54,
+ /*     0 */    49,   57,   47,   66,  163,   39,  188,   41,  186,   61,
+ /*    10 */    63,  225,   95,   67,   28,   28,  104,   33,  165,   40,
+ /*    20 */    35,   37,   56,   52,   53,   49,  232,   47,   66,  157,
+ /*    30 */    39,  195,   41,  186,   61,   63,  247,   95,   67,  228,
+ /*    40 */   150,  210,   33,  158,   40,   35,   37,   56,   52,   53,
+ /*    50 */    49,  229,   47,   66,  179,   39,  212,   41,  186,   61,
+ /*    60 */    63,  235,   95,   67,   38,  355,   86,   33,  183,   40,
+ /*    70 */    35,   37,   56,   52,   53,   49,   57,   47,   66,  185,
+ /*    80 */    39,  200,   41,  186,   61,   63,  108,   95,   67,  116,
+ /*    90 */   117,   68,   33,  181,   40,   35,   37,   56,   52,   53,
+ /*   100 */    49,  230,   47,   66,  171,   39,  106,   41,  186,   61,
+ /*   110 */    63,   57,   95,   67,  105,  215,  173,   33,  239,   40,
+ /*   120 */    35,   37,   56,   52,   53,   49,  209,   47,   66,  146,
+ /*   130 */    39,  242,   41,  186,   61,   63,  214,   95,   67,  102,
+ /*   140 */   253,  251,   33,  147,   40,   35,   37,   56,   52,   53,
+ /*   150 */    49,   59,   47,   66,  153,   39,  110,   41,  186,   61,
+ /*   160 */    63,   57,   95,   67,  191,  199,  248,   33,  190,   40,
+ /*   170 */    35,   37,   56,   52,   53,   49,   60,   47,   66,  184,
+ /*   180 */    39,  244,   41,  186,   61,   63,  204,   95,   67,  246,
+ /*   190 */   103,  115,   33,   25,   40,   35,   37,   56,   52,   53,
+ /*   200 */    49,   50,   47,   66,  138,   39,  243,   41,  186,   61,
+ /*   210 */    63,  252,   95,   67,  236,   98,  194,   33,   45,   40,
+ /*   220 */    35,   37,   56,   52,   53,   49,  154,   47,   66,  139,
+ /*   230 */    39,  351,   41,  186,   61,   63,   57,   95,   67,  238,
+ /*   240 */    54,  237,   33,   97,   40,   35,   37,   56,   52,   53,
+ /*   250 */    49,  233,   47,   66,  160,   39,  107,   41,  186,   61,
+ /*   260 */    63,   45,   95,   67,  264,   99,  113,   33,  189,   40,
+ /*   270 */    35,   37,   56,   52,   53,   49,   76,   47,   66,  164,
+ /*   280 */    39,  224,   41,  186,   61,   63,  203,   95,   67,   89,
+ /*   290 */    71,   83,   33,  241,   40,   35,   37,   56,   52,   53,
+ /*   300 */    49,   82,   47,   66,  187,   39,  185,   41,  186,   61,
+ /*   310 */    63,   78,   95,   67,   73,   84,   80,   33,  174,   40,
+ /*   320 */    35,   37,   56,   52,   53,   49,   75,   47,   66,  167,
+ /*   330 */    39,   74,   41,  186,   61,   63,   72,   95,   67,   81,
+ /*   340 */    85,   77,   33,  185,   40,   35,   37,   56,   52,   53,
+ /*   350 */    49,   79,   47,   66,  176,   39,   90,   41,  186,   61,
+ /*   360 */    63,   92,   95,   67,   88,   91,   93,   33,  185,   40,
+ /*   370 */    35,   37,   56,   52,   53,   49,   87,   47,   66,  140,
+ /*   380 */    39,  185,   41,  186,   61,   63,  185,   95,   67,  185,
+ /*   390 */   185,  185,   33,  185,   40,   35,   37,   56,   52,   53,
+ /*   400 */    49,  185,   47,   66,  149,   39,  185,   41,  186,   61,
+ /*   410 */    63,  185,   95,   67,  185,  185,  185,   33,  185,   40,
+ /*   420 */    35,   37,   56,   52,   53,   49,  185,   47,   66,   94,
+ /*   430 */    39,  185,   41,  186,   61,   63,  185,   95,   67,  185,
+ /*   440 */   185,  185,   33,  185,   40,   35,   37,   56,   52,   53,
+ /*   450 */    49,  185,   47,   66,  166,   39,  161,   41,  186,   61,
+ /*   460 */    63,  185,   95,   67,  185,  185,  185,   33,  192,   40,
+ /*   470 */    35,   37,   56,   52,   53,   32,   26,   29,   29,   29,
+ /*   480 */    29,   29,   29,   29,   30,   30,   30,   27,   27,   27,
+ /*   490 */    28,   28,   49,  185,   47,   66,  142,   39,  185,   41,
+ /*   500 */   186,   61,   63,  185,   95,   67,   57,  219,  100,   33,
+ /*   510 */   185,   40,   35,   37,   56,   52,   53,   70,   70,   69,
+ /*   520 */    48,   49,   51,   47,   66,   58,   39,  250,   41,  186,
+ /*   530 */    61,   63,  185,   95,   67,  185,  185,   62,   33,  185,
+ /*   540 */    40,   35,   37,   56,   52,   53,   32,   26,   29,   29,
+ /*   550 */    29,   29,   29,   29,   29,   30,   30,   30,   27,   27,
+ /*   560 */    27,   28,   28,   27,   27,   27,   28,   28,  111,   49,
+ /*   570 */   185,   47,   66,  177,   39,  185,   41,  186,   61,   63,
+ /*   580 */   185,   95,   67,  185,  185,  185,   33,  127,   40,   35,
+ /*   590 */    37,   56,   52,   53,   49,  185,   47,   66,  175,   39,
+ /*   600 */   185,   41,  186,   61,   63,  185,   95,   67,  263,  126,
+ /*   610 */   220,   33,  185,   40,   35,   37,   56,   52,   53,   32,
+ /*   620 */    26,   29,   29,   29,   29,   29,   29,   29,   30,   30,
+ /*   630 */    30,   27,   27,   27,   28,   28,   26,   29,   29,   29,
+ /*   640 */    29,   29,   29,   29,   30,   30,   30,   27,   27,   27,
+ /*   650 */    28,   28,   29,   29,   29,   29,   29,   29,   29,   30,
+ /*   660 */    30,   30,   27,   27,   27,   28,   28,  161,  231,  231,
+ /*   670 */    24,  231,  185,  185,  185,  185,  185,  185,  175,  234,
+ /*   680 */   185,  161,  231,  231,   64,  231,  231,  185,  257,  126,
+ /*   690 */   220,  185,   46,  185,  185,  185,  231,  231,  185,  231,
+ /*   700 */   231,  155,  231,  185,  185,  222,  222,  228,  150,  185,
+ /*   710 */   172,  161,  126,  220,  231,  185,  231,  185,  219,  261,
+ /*   720 */   261,  228,  150,  213,   31,  131,  231,  231,   65,  231,
+ /*   730 */   231,  185,  219,  185,  185,  185,  134,  185,  185,  185,
+ /*   740 */   185,  161,  129,  156,  231,  201,  263,  126,  220,  222,
+ /*   750 */   222,  228,  150,  112,  254,  185,  231,  231,  185,  231,
+ /*   760 */   231,  185,  219,  185,  223,   42,   46,  185,  227,  185,
+ /*   770 */   185,  161,  185,  221,  231,  126,  220,  185,  185,  222,
+ /*   780 */   222,  228,  150,  114,  185,  185,  231,  231,  196,  231,
+ /*   790 */   231,  185,  219,  185,  197,  202,   46,  201,  185,  126,
+ /*   800 */   220,  161,  185,  180,  231,  126,  220,  185,  185,  222,
+ /*   810 */   222,  228,  150,  109,  126,  220,  231,  231,  185,  231,
+ /*   820 */   231,  226,  219,  185,  137,  208,  207,  205,  206,  211,
+ /*   830 */   217,  218,  216,  161,  231,  185,  240,  185,   96,  222,
+ /*   840 */   222,  228,  150,  185,  168,  101,  185,  161,  231,  231,
+ /*   850 */   231,  231,  219,  185,  245,  126,  220,  231,  231,  185,
+ /*   860 */   231,  161,  231,  231,  185,  231,  231,  185,  185,  185,
+ /*   870 */   185,  222,  222,  228,  150,  231,  231,  231,  182,  231,
+ /*   880 */   231,  143,  231,  185,  219,  222,  222,  228,  150,  126,
+ /*   890 */   220,  231,  126,  220,  231,  151,  231,  162,  219,  261,
+ /*   900 */   261,  228,  150,  170,  185,  185,  126,  220,  126,  220,
+ /*   910 */   231,  185,  219,  185,  175,  185,  125,  185,  259,  170,
+ /*   920 */   185,  185,  249,  262,  263,  126,  220,  185,  185,  185,
+ /*   930 */   175,  185,  118,  170,  259,  185,  185,  185,  249,  262,
+ /*   940 */   263,  126,  220,  185,  175,  185,  124,  170,  259,  185,
+ /*   950 */   135,  185,  249,  262,  263,  126,  220,  185,  175,  185,
+ /*   960 */   130,  175,  259,  169,  185,  170,  249,  262,  263,  126,
+ /*   970 */   220,  263,  126,  220,  126,  220,  175,  185,  121,  132,
+ /*   980 */   259,  170,  185,  185,  249,  262,  263,  126,  220,  185,
+ /*   990 */   126,  220,  175,  185,  120,  170,  259,  185,  185,  185,
+ /*  1000 */   249,  262,  263,  126,  220,  185,  175,  185,  123,  170,
+ /*  1010 */   259,  185,  185,  185,  249,  262,  263,  126,  220,  185,
+ /*  1020 */   175,  185,  122,  170,  259,  185,  185,  185,  249,  262,
+ /*  1030 */   263,  126,  220,  185,  175,  185,  260,  170,  259,  185,
+ /*  1040 */   185,  185,  249,  262,  263,  126,  220,  185,  175,  185,
+ /*  1050 */   119,  170,  259,  185,  185,  185,  249,  262,  263,  126,
+ /*  1060 */   220,  185,  175,  185,  185,  170,  259,  185,  185,  185,
+ /*  1070 */    36,  262,  263,  126,  220,  185,  175,  185,  185,  170,
+ /*  1080 */   259,  185,  185,  185,  144,  262,  263,  126,  220,  185,
+ /*  1090 */   175,  185,  185,  170,  259,  185,  185,  185,   34,  262,
+ /*  1100 */   263,  126,  220,  185,  175,  185,  148,  161,  259,  185,
+ /*  1110 */   254,  185,  141,  262,  263,  126,  220,  126,  220,  185,
+ /*  1120 */   223,   43,  231,  231,  227,  231,  185,  185,  254,  221,
+ /*  1130 */   185,  126,  220,  178,  185,  185,  185,  185,  223,   44,
+ /*  1140 */   231,  185,  227,  255,  126,  220,  185,  221,  185,  126,
+ /*  1150 */   220,  185,  185,  223,  185,  185,  231,  227,  219,  159,
+ /*  1160 */   185,  185,  221,  185,  126,  220,  185,  185,  185,  223,
+ /*  1170 */   185,  185,  152,  227,  185,  185,  185,  185,  221,  185,
+ /*  1180 */   126,  220,  223,  185,  185,  256,  227,  185,  185,  185,
+ /*  1190 */   185,  221,  185,  126,  220,  223,  185,   20,  185,  227,
+ /*  1200 */   136,  185,  185,  185,  221,  185,  126,  220,  185,  185,
+ /*  1210 */   223,  185,  185,  185,  227,  258,  198,  193,   55,  221,
+ /*  1220 */   185,  126,  220,  185,  128,  223,  185,  185,  133,  227,
+ /*  1230 */   185,  196,  185,   12,  221,  175,  126,  220,  145,  175,
+ /*  1240 */   201,   11,  126,  220,   19,  263,  126,  220,   16,  263,
+ /*  1250 */   126,  220,  198,  193,   55,    4,  185,  185,  185,  185,
+ /*  1260 */   198,  193,   55,  198,  193,   55,    7,  198,  193,   55,
+ /*  1270 */    14,  185,  185,  185,  198,  193,   55,   21,  185,  185,
+ /*  1280 */   185,  185,  185,  185,  185,  198,  193,   55,   17,  198,
+ /*  1290 */   193,   55,    3,  185,  185,  185,  198,  193,   55,   23,
+ /*  1300 */   185,  185,  185,  185,  185,  185,  185,  198,  193,   55,
+ /*  1310 */    13,  198,  193,   55,   22,  185,  185,  185,  198,  193,
+ /*  1320 */    55,    9,  185,  185,  185,  185,  185,  185,  185,  198,
+ /*  1330 */   193,   55,    2,  198,  193,   55,   10,  185,  185,  185,
+ /*  1340 */   198,  193,   55,   15,  185,  185,  185,  185,  185,  185,
+ /*  1350 */   185,  198,  193,   55,   18,  198,  193,   55,    8,  185,
+ /*  1360 */   185,  185,  198,  193,   55,    5,  185,  185,  185,  185,
+ /*  1370 */   185,  185,  185,  198,  193,   55,    1,  198,  193,   55,
+ /*  1380 */     6,  185,  185,  185,  198,  193,   55,  185,  185,  185,
+ /*  1390 */   185,  185,  185,  185,  185,  198,  193,   55,  185,  198,
+ /*  1400 */   193,   55,
     );
     static public $yy_lookahead = array(
  /*     0 */    24,   18,   26,   27,   28,   29,   23,   31,   32,   33,
- /*    10 */    34,   25,   36,   37,   53,   54,   25,   41,   42,   43,
- /*    20 */    44,   45,   46,   47,   48,   24,   18,   26,   27,   28,
- /*    30 */    29,   25,   31,   32,   33,   34,   18,   36,   37,   18,
- /*    40 */    19,   40,   41,   25,   43,   44,   45,   46,   47,   48,
- /*    50 */    24,   53,   26,   27,   28,   29,   25,   31,   32,   33,
- /*    60 */    34,   25,   36,   37,   25,   81,   25,   41,   42,   43,
- /*    70 */    44,   45,   46,   47,   48,   24,   92,   26,   27,   28,
+ /*    10 */    34,   68,   36,   37,   18,   19,   25,   41,   42,   43,
+ /*    20 */    44,   45,   46,   47,   48,   24,   93,   26,   27,   28,
+ /*    30 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   53,
+ /*    40 */    54,   25,   41,   42,   43,   44,   45,   46,   47,   48,
+ /*    50 */    24,   93,   26,   27,   28,   29,   25,   31,   32,   33,
+ /*    60 */    34,   25,   36,   37,   11,   66,   67,   41,   42,   43,
+ /*    70 */    44,   45,   46,   47,   48,   24,   18,   26,   27,   28,
  /*    80 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   25,
- /*    90 */    81,   25,   41,   42,   43,   44,   45,   46,   47,   48,
- /*   100 */    24,   92,   26,   27,   28,   29,   25,   31,   32,   33,
- /*   110 */    34,   25,   36,   37,   25,   81,   25,   41,   42,   43,
- /*   120 */    44,   45,   46,   47,   48,   24,   92,   26,   27,   28,
+ /*    90 */    25,   38,   41,   42,   43,   44,   45,   46,   47,   48,
+ /*   100 */    24,   61,   26,   27,   28,   29,   25,   31,   32,   33,
+ /*   110 */    34,   18,   36,   37,   25,   25,   40,   41,   25,   43,
+ /*   120 */    44,   45,   46,   47,   48,   24,   64,   26,   27,   28,
  /*   130 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   25,
- /*   140 */    81,   25,   41,   42,   43,   44,   45,   46,   47,   48,
- /*   150 */    24,   92,   26,   27,   28,   29,   25,   31,   32,   33,
- /*   160 */    34,   18,   36,   37,   25,   81,   25,   41,   25,   43,
- /*   170 */    44,   45,   46,   47,   48,   24,   92,   26,   27,   28,
- /*   180 */    29,   25,   31,   32,   33,   34,   18,   36,   37,   25,
- /*   190 */    81,   25,   41,   25,   43,   44,   45,   46,   47,   48,
- /*   200 */    24,   92,   26,   27,   28,   29,   25,   31,   32,   33,
- /*   210 */    34,   25,   36,   37,   25,   81,   25,   41,   25,   43,
- /*   220 */    44,   45,   46,   47,   48,   24,   92,   26,   27,   28,
- /*   230 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   25,
- /*   240 */    81,   64,   41,   63,   43,   44,   45,   46,   47,   48,
- /*   250 */    24,   92,   26,   27,   28,   29,   62,   31,   32,   33,
- /*   260 */    34,   25,   36,   37,   25,   81,   68,   41,   55,   43,
- /*   270 */    44,   45,   46,   47,   48,   24,   92,   26,   27,   28,
- /*   280 */    29,   85,   31,   32,   33,   34,   67,   36,   37,   67,
- /*   290 */    81,   67,   41,   90,   43,   44,   45,   46,   47,   48,
- /*   300 */    24,   92,   26,   27,   28,   29,   93,   31,   32,   33,
- /*   310 */    34,   67,   36,   37,   67,   81,   67,   41,   93,   43,
- /*   320 */    44,   45,   46,   47,   48,   24,   92,   26,   27,   28,
- /*   330 */    29,   67,   31,   32,   33,   34,   67,   36,   37,   66,
- /*   340 */    67,   67,   41,   93,   43,   44,   45,   46,   47,   48,
+ /*   140 */    25,   25,   41,   42,   43,   44,   45,   46,   47,   48,
+ /*   150 */    24,   30,   26,   27,   28,   29,   25,   31,   32,   33,
+ /*   160 */    34,   18,   36,   37,   25,   25,   25,   41,   25,   43,
+ /*   170 */    44,   45,   46,   47,   48,   24,   30,   26,   27,   28,
+ /*   180 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   25,
+ /*   190 */    25,   25,   41,   35,   43,   44,   45,   46,   47,   48,
+ /*   200 */    24,   63,   26,   27,   28,   29,   25,   31,   32,   33,
+ /*   210 */    34,   25,   36,   37,   25,   25,   25,   41,   50,   43,
+ /*   220 */    44,   45,   46,   47,   48,   24,   53,   26,   27,   28,
+ /*   230 */    29,   63,   31,   32,   33,   34,   18,   36,   37,   25,
+ /*   240 */    11,   25,   41,   25,   43,   44,   45,   46,   47,   48,
+ /*   250 */    24,   55,   26,   27,   28,   29,   25,   31,   32,   33,
+ /*   260 */    34,   50,   36,   37,   25,   25,   25,   41,   25,   43,
+ /*   270 */    44,   45,   46,   47,   48,   24,   67,   26,   27,   28,
+ /*   280 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   67,
+ /*   290 */    67,   67,   41,   85,   43,   44,   45,   46,   47,   48,
+ /*   300 */    24,   67,   26,   27,   28,   29,   94,   31,   32,   33,
+ /*   310 */    34,   67,   36,   37,   67,   67,   67,   41,   90,   43,
+ /*   320 */    44,   45,   46,   47,   48,   24,   67,   26,   27,   28,
+ /*   330 */    29,   67,   31,   32,   33,   34,   67,   36,   37,   67,
+ /*   340 */    67,   67,   41,   94,   43,   44,   45,   46,   47,   48,
  /*   350 */    24,   67,   26,   27,   28,   29,   67,   31,   32,   33,
- /*   360 */    34,   67,   36,   37,   67,   67,   67,   41,   93,   43,
+ /*   360 */    34,   67,   36,   37,   67,   67,   67,   41,   94,   43,
  /*   370 */    44,   45,   46,   47,   48,   24,   67,   26,   27,   28,
- /*   380 */    29,   67,   31,   32,   33,   34,   93,   36,   37,   67,
- /*   390 */    67,   67,   41,   93,   43,   44,   45,   46,   47,   48,
- /*   400 */    24,   67,   26,   27,   28,   29,   67,   31,   32,   33,
- /*   410 */    34,   93,   36,   37,   93,   93,   93,   41,   93,   43,
- /*   420 */    44,   45,   46,   47,   48,   24,   93,   26,   27,   28,
- /*   430 */    29,   93,   31,   32,   33,   34,   93,   36,   37,   93,
- /*   440 */    93,   93,   41,   93,   43,   44,   45,   46,   47,   48,
- /*   450 */    24,   93,   26,   27,   28,   29,   93,   31,   32,   33,
- /*   460 */    34,   93,   36,   37,   93,   93,   93,   41,   93,   43,
- /*   470 */    44,   45,   46,   47,   48,   24,   93,   26,   27,   28,
- /*   480 */    29,   93,   31,   32,   33,   34,   93,   36,   37,   93,
- /*   490 */    93,   93,   41,   18,   43,   44,   45,   46,   47,   48,
- /*   500 */     3,    4,    5,    6,    7,    8,    9,   10,   11,   12,
- /*   510 */    13,   14,   15,   16,   17,   18,   19,   15,   16,   17,
- /*   520 */    18,   19,   25,   24,   49,   26,   27,   28,   29,   93,
- /*   530 */    31,   32,   33,   34,   93,   36,   37,   93,   93,   93,
- /*   540 */    41,   93,   43,   44,   45,   46,   47,   48,   24,   93,
- /*   550 */    26,   27,   28,   29,   93,   31,   32,   33,   34,   93,
- /*   560 */    36,   37,   93,   93,   93,   41,   93,   43,   44,   45,
- /*   570 */    46,   47,   48,    3,    4,    5,    6,    7,    8,    9,
- /*   580 */    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
- /*   590 */    24,   93,   26,   27,   81,   29,   93,   31,   32,   33,
- /*   600 */    34,   93,   36,   37,   91,   92,   70,   41,   50,   43,
- /*   610 */    44,   45,   46,   47,   48,   57,   58,   81,   60,   61,
- /*   620 */    93,   63,   93,   87,   88,   55,   90,   91,   92,    3,
- /*   630 */     4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
- /*   640 */    14,   15,   16,   17,   18,   19,    4,    5,    6,    7,
- /*   650 */     8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
- /*   660 */    18,   19,    5,    6,    7,    8,    9,   10,   11,   12,
- /*   670 */    13,   14,   15,   16,   17,   18,   19,   13,   25,   29,
- /*   680 */    50,   31,   29,   93,   31,   70,   93,   57,   58,   25,
- /*   690 */    60,   61,   70,   29,   30,   31,   81,    2,   83,   46,
- /*   700 */    85,    1,   38,   81,   89,   90,   91,   92,   13,   59,
- /*   710 */    46,   25,   59,   91,   92,   51,   52,   53,   54,   93,
- /*   720 */    20,   21,   22,   59,   29,   39,   31,   69,   64,   93,
- /*   730 */    72,   73,   74,   75,   76,   77,   78,   79,   80,   70,
- /*   740 */    13,   46,   84,    1,   86,   93,   51,   52,   53,   54,
- /*   750 */    81,   56,   25,   93,   59,   93,   29,   30,   31,   64,
- /*   760 */    91,   92,   20,   21,   22,   93,   25,   93,   93,   93,
- /*   770 */    93,   13,   93,   46,   71,   93,   93,   93,   51,   52,
- /*   780 */    53,   54,   93,   25,   81,   82,   59,   29,   85,   31,
- /*   790 */    93,   64,   93,   90,   13,   92,   38,   25,   57,   58,
- /*   800 */    93,   60,   61,   13,   46,   70,   25,   93,   93,   51,
- /*   810 */    52,   53,   54,   93,   93,   25,   81,   59,   83,   29,
- /*   820 */    85,   31,   64,   25,   89,   90,   91,   92,   38,   57,
- /*   830 */    58,   93,   60,   61,   93,   13,   46,   93,   93,   93,
- /*   840 */    93,   51,   52,   53,   54,   64,   93,   25,   93,   59,
- /*   850 */    70,   29,   93,   31,   64,   57,   58,   93,   60,   61,
- /*   860 */    29,   81,   31,   83,   13,   85,   93,   13,   46,   89,
- /*   870 */    90,   91,   92,   51,   52,   53,   54,   71,   93,   25,
- /*   880 */    29,   59,   31,   29,   93,   31,   64,   81,   82,   93,
- /*   890 */    59,   85,   93,   13,   30,   93,   90,   46,   92,   29,
- /*   900 */    46,   31,   93,   93,   93,   51,   52,   53,   54,   29,
- /*   910 */    59,   31,   93,   59,   25,   64,   46,   93,   64,   13,
- /*   920 */    93,   57,   58,   93,   60,   61,   46,   81,   93,   59,
- /*   930 */    93,   51,   52,   53,   54,   29,   90,   31,   92,   59,
- /*   940 */    93,   93,   93,   93,   64,   93,   57,   58,   93,   60,
- /*   950 */    61,   93,   46,   93,   93,   81,   70,   51,   52,   53,
- /*   960 */    54,   93,   88,   93,   90,   59,   92,   81,    1,   83,
- /*   970 */    64,   85,   71,   93,   93,   89,   90,   91,   92,   70,
- /*   980 */    93,   93,   81,   82,    1,   70,   85,   20,   21,   22,
- /*   990 */    81,   90,   83,   92,   85,   93,   81,   70,   89,   90,
- /*  1000 */    91,   92,    1,   20,   21,   22,   91,   92,   81,   93,
- /*  1010 */    83,   93,   85,   93,   93,   70,   89,   90,   91,   92,
- /*  1020 */    93,   20,   21,   22,   11,   93,   81,   70,   83,   93,
- /*  1030 */    85,   93,   93,   93,   89,   90,   91,   92,   81,   93,
- /*  1040 */    83,   70,   85,   93,   93,   93,   89,   90,   91,   92,
- /*  1050 */    93,   38,   81,   93,   83,   93,   85,   93,   93,   93,
- /*  1060 */    89,   90,   91,   92,   93,   70,   35,   93,   93,   93,
- /*  1070 */    57,   58,   93,   60,   61,   93,   81,   93,   83,   70,
- /*  1080 */    85,   93,   93,   93,   89,   90,   91,   92,   57,   58,
- /*  1090 */    81,   60,   61,   70,   85,   93,   93,   70,   89,   90,
- /*  1100 */    91,   92,   11,   93,   81,   30,   93,   93,   81,   70,
- /*  1110 */    93,   93,   85,   93,   91,   92,   89,   90,   91,   92,
- /*  1120 */    81,   93,   93,   70,   85,   25,   93,   93,   89,   90,
- /*  1130 */    91,   92,   57,   58,   81,   60,   61,   93,   85,   93,
- /*  1140 */    93,   93,   89,   90,   91,   92,   25,   93,   57,   58,
- /*  1150 */    93,   60,   61,   93,   93,   93,   71,   57,   58,   93,
- /*  1160 */    60,   61,   93,   93,   93,   93,   81,   93,   93,   93,
- /*  1170 */    85,   93,   93,   71,   71,   90,   93,   92,   57,   58,
- /*  1180 */    93,   60,   61,   81,   81,   93,    1,   85,   85,   71,
- /*  1190 */    71,   93,   90,   90,   92,   92,   93,   93,   93,   81,
- /*  1200 */    81,   93,   71,   85,   85,   20,   21,   22,   90,   90,
- /*  1210 */    92,   92,   81,    1,   93,   81,   85,   93,    1,   93,
- /*  1220 */    93,   90,   88,   92,   90,    1,   92,   93,   93,   93,
- /*  1230 */    93,   93,   20,   21,   22,    1,   93,   20,   21,   22,
- /*  1240 */     1,   93,   93,   93,   20,   21,   22,    1,   57,   58,
- /*  1250 */    93,   60,   61,    1,   20,   21,   22,    1,   93,   20,
- /*  1260 */    21,   22,    1,   93,   93,   93,   20,   21,   22,    1,
- /*  1270 */    93,   93,   20,   21,   22,    1,   20,   21,   22,    1,
- /*  1280 */    93,   20,   21,   22,    1,   93,   93,   93,   20,   21,
- /*  1290 */    22,    1,   93,   93,   20,   21,   22,    1,   20,   21,
- /*  1300 */    22,    1,   93,   20,   21,   22,    1,   93,   93,   93,
- /*  1310 */    20,   21,   22,   93,   93,   93,   20,   21,   22,   93,
- /*  1320 */    20,   21,   22,   93,   93,   20,   21,   22,
+ /*   380 */    29,   94,   31,   32,   33,   34,   94,   36,   37,   94,
+ /*   390 */    94,   94,   41,   94,   43,   44,   45,   46,   47,   48,
+ /*   400 */    24,   94,   26,   27,   28,   29,   94,   31,   32,   33,
+ /*   410 */    34,   94,   36,   37,   94,   94,   94,   41,   94,   43,
+ /*   420 */    44,   45,   46,   47,   48,   24,   94,   26,   27,   28,
+ /*   430 */    29,   94,   31,   32,   33,   34,   94,   36,   37,   94,
+ /*   440 */    94,   94,   41,   94,   43,   44,   45,   46,   47,   48,
+ /*   450 */    24,   94,   26,   27,   28,   29,   13,   31,   32,   33,
+ /*   460 */    34,   94,   36,   37,   94,   94,   94,   41,   25,   43,
+ /*   470 */    44,   45,   46,   47,   48,    3,    4,    5,    6,    7,
+ /*   480 */     8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
+ /*   490 */    18,   19,   24,   94,   26,   27,   28,   29,   94,   31,
+ /*   500 */    32,   33,   34,   94,   36,   37,   18,   64,   25,   41,
+ /*   510 */    94,   43,   44,   45,   46,   47,   48,   57,   58,   59,
+ /*   520 */    60,   24,   39,   26,   27,   28,   29,   55,   31,   32,
+ /*   530 */    33,   34,   94,   36,   37,   94,   94,   49,   41,   94,
+ /*   540 */    43,   44,   45,   46,   47,   48,    3,    4,    5,    6,
+ /*   550 */     7,    8,    9,   10,   11,   12,   13,   14,   15,   16,
+ /*   560 */    17,   18,   19,   15,   16,   17,   18,   19,   25,   24,
+ /*   570 */    94,   26,   27,   28,   29,   94,   31,   32,   33,   34,
+ /*   580 */    94,   36,   37,   94,   94,   94,   41,   70,   43,   44,
+ /*   590 */    45,   46,   47,   48,   24,   94,   26,   27,   81,   29,
+ /*   600 */    94,   31,   32,   33,   34,   94,   36,   37,   91,   92,
+ /*   610 */    93,   41,   94,   43,   44,   45,   46,   47,   48,    3,
+ /*   620 */     4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
+ /*   630 */    14,   15,   16,   17,   18,   19,    4,    5,    6,    7,
+ /*   640 */     8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
+ /*   650 */    18,   19,    5,    6,    7,    8,    9,   10,   11,   12,
+ /*   660 */    13,   14,   15,   16,   17,   18,   19,   13,   28,   29,
+ /*   670 */     2,   31,   94,   94,   94,   94,   94,   94,   81,   25,
+ /*   680 */    94,   13,   28,   29,   30,   31,   46,   94,   91,   92,
+ /*   690 */    93,   94,   38,   94,   94,   94,   28,   29,   94,   31,
+ /*   700 */    46,   81,   62,   94,   94,   51,   52,   53,   54,   94,
+ /*   710 */    90,   13,   92,   93,   46,   94,   62,   94,   64,   51,
+ /*   720 */    52,   53,   54,   25,   56,   70,   28,   29,   30,   31,
+ /*   730 */    62,   94,   64,   94,   94,   94,   81,   94,   94,   94,
+ /*   740 */    94,   13,   87,   88,   46,   90,   91,   92,   93,   51,
+ /*   750 */    52,   53,   54,   25,   71,   94,   28,   29,   94,   31,
+ /*   760 */    62,   94,   64,   94,   81,   82,   38,   94,   85,   94,
+ /*   770 */    94,   13,   94,   90,   46,   92,   93,   94,   94,   51,
+ /*   780 */    52,   53,   54,   25,   94,   94,   28,   29,   81,   31,
+ /*   790 */    62,   94,   64,   94,   81,   88,   38,   90,   94,   92,
+ /*   800 */    93,   13,   94,   81,   46,   92,   93,   94,   94,   51,
+ /*   810 */    52,   53,   54,   25,   92,   93,   28,   29,   94,   31,
+ /*   820 */    62,   69,   64,   94,   72,   73,   74,   75,   76,   77,
+ /*   830 */    78,   79,   80,   13,   46,   94,   84,   94,   86,   51,
+ /*   840 */    52,   53,   54,   94,   81,   25,   94,   13,   28,   29,
+ /*   850 */    62,   31,   64,   94,   25,   92,   93,   28,   29,   94,
+ /*   860 */    31,   13,   28,   29,   94,   31,   46,   94,   94,   94,
+ /*   870 */    94,   51,   52,   53,   54,   46,   28,   29,   81,   31,
+ /*   880 */    46,   81,   62,   94,   64,   51,   52,   53,   54,   92,
+ /*   890 */    93,   62,   92,   93,   46,   81,   62,   81,   64,   51,
+ /*   900 */    52,   53,   54,   70,   94,   94,   92,   93,   92,   93,
+ /*   910 */    62,   94,   64,   94,   81,   94,   83,   94,   85,   70,
+ /*   920 */    94,   94,   89,   90,   91,   92,   93,   94,   94,   94,
+ /*   930 */    81,   94,   83,   70,   85,   94,   94,   94,   89,   90,
+ /*   940 */    91,   92,   93,   94,   81,   94,   83,   70,   85,   94,
+ /*   950 */    70,   94,   89,   90,   91,   92,   93,   94,   81,   94,
+ /*   960 */    83,   81,   85,   81,   94,   70,   89,   90,   91,   92,
+ /*   970 */    93,   91,   92,   93,   92,   93,   81,   94,   83,   81,
+ /*   980 */    85,   70,   94,   94,   89,   90,   91,   92,   93,   94,
+ /*   990 */    92,   93,   81,   94,   83,   70,   85,   94,   94,   94,
+ /*  1000 */    89,   90,   91,   92,   93,   94,   81,   94,   83,   70,
+ /*  1010 */    85,   94,   94,   94,   89,   90,   91,   92,   93,   94,
+ /*  1020 */    81,   94,   83,   70,   85,   94,   94,   94,   89,   90,
+ /*  1030 */    91,   92,   93,   94,   81,   94,   83,   70,   85,   94,
+ /*  1040 */    94,   94,   89,   90,   91,   92,   93,   94,   81,   94,
+ /*  1050 */    83,   70,   85,   94,   94,   94,   89,   90,   91,   92,
+ /*  1060 */    93,   94,   81,   94,   94,   70,   85,   94,   94,   94,
+ /*  1070 */    89,   90,   91,   92,   93,   94,   81,   94,   94,   70,
+ /*  1080 */    85,   94,   94,   94,   89,   90,   91,   92,   93,   94,
+ /*  1090 */    81,   94,   94,   70,   85,   94,   94,   94,   89,   90,
+ /*  1100 */    91,   92,   93,   94,   81,   94,   81,   13,   85,   94,
+ /*  1110 */    71,   94,   89,   90,   91,   92,   93,   92,   93,   94,
+ /*  1120 */    81,   82,   28,   29,   85,   31,   94,   94,   71,   90,
+ /*  1130 */    94,   92,   93,   81,   94,   94,   94,   94,   81,   82,
+ /*  1140 */    46,   94,   85,   71,   92,   93,   94,   90,   94,   92,
+ /*  1150 */    93,   94,   94,   81,   94,   94,   62,   85,   64,   71,
+ /*  1160 */    94,   94,   90,   94,   92,   93,   94,   94,   94,   81,
+ /*  1170 */    94,   94,   71,   85,   94,   94,   94,   94,   90,   94,
+ /*  1180 */    92,   93,   81,   94,   94,   71,   85,   94,   94,   94,
+ /*  1190 */    94,   90,   94,   92,   93,   81,   94,    1,   94,   85,
+ /*  1200 */    71,   94,   94,   94,   90,   94,   92,   93,   94,   94,
+ /*  1210 */    81,   94,   94,   94,   85,   71,   20,   21,   22,   90,
+ /*  1220 */    94,   92,   93,   94,   70,   81,   94,   94,   70,   85,
+ /*  1230 */    94,   81,   94,    1,   90,   81,   92,   93,   88,   81,
+ /*  1240 */    90,    1,   92,   93,    1,   91,   92,   93,    1,   91,
+ /*  1250 */    92,   93,   20,   21,   22,    1,   94,   94,   94,   94,
+ /*  1260 */    20,   21,   22,   20,   21,   22,    1,   20,   21,   22,
+ /*  1270 */     1,   94,   94,   94,   20,   21,   22,    1,   94,   94,
+ /*  1280 */    94,   94,   94,   94,   94,   20,   21,   22,    1,   20,
+ /*  1290 */    21,   22,    1,   94,   94,   94,   20,   21,   22,    1,
+ /*  1300 */    94,   94,   94,   94,   94,   94,   94,   20,   21,   22,
+ /*  1310 */     1,   20,   21,   22,    1,   94,   94,   94,   20,   21,
+ /*  1320 */    22,    1,   94,   94,   94,   94,   94,   94,   94,   20,
+ /*  1330 */    21,   22,    1,   20,   21,   22,    1,   94,   94,   94,
+ /*  1340 */    20,   21,   22,    1,   94,   94,   94,   94,   94,   94,
+ /*  1350 */    94,   20,   21,   22,    1,   20,   21,   22,    1,   94,
+ /*  1360 */    94,   94,   20,   21,   22,    1,   94,   94,   94,   94,
+ /*  1370 */    94,   94,   94,   20,   21,   22,    1,   20,   21,   22,
+ /*  1380 */     1,   94,   94,   94,   20,   21,   22,   94,   94,   94,
+ /*  1390 */    94,   94,   94,   94,   94,   20,   21,   22,   94,   20,
+ /*  1400 */    21,   22,
 );
-    const YY_SHIFT_USE_DFLT = -40;
-    const YY_SHIFT_MAX = 189;
+    const YY_SHIFT_USE_DFLT = -25;
+    const YY_SHIFT_MAX = 187;
     static public $yy_shift_ofst = array(
- /*     0 */   -40,  101,   51,  -24,   76,    1,   26,  451,  499,  524,
- /*    10 */   351,  426,  201,  226,  176,  151,  126,  276,  376,  326,
- /*    20 */   401,  301,  251,  566,  695,  695,  695,  695,  695,  695,
- /*    30 */   695,  695,  695,  695,  906,  906,  906,  906,  851,  727,
- /*    40 */   822,  854,  664,  758,  790,  880,  880,  880,  880,  880,
- /*    50 */   851,  851,  870,  870,  870,  870,  851,  870,  653,  870,
- /*    60 */   870,  870,  870,  870,  870,  870,  870,  870,  870, 1296,
- /*    70 */  1283, 1278, 1274, 1290, 1305, 1300,  967, 1234, 1224, 1239,
- /*    80 */  1246, 1256, 1217, 1212,  742,  700,  983, 1252, 1185, 1001,
- /*    90 */  1261, 1268,  781,  -39,  -40,  -40,  -40,  -40,  -40,  -40,
- /*   100 */   -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
- /*   110 */   -40,  -40,  -40,  -40,  -40,  -40,  570,  497,  626,  626,
- /*   120 */   642,  657,  657,  558, 1013, 1100,  798, 1031,  889, 1075,
- /*   130 */  1121, 1091,  630,  864,  772,  741,  502, 1191, 1191, 1191,
- /*   140 */   650,  831,  -17,  168,  143,   21,  475,   18,  686,    6,
- /*   150 */    -9,  -14,   31,  239,  189,   -2,  186,  181,  156,   36,
- /*   160 */   166,  213,  191,  193,  180,  236,  194,  177,  206,  211,
- /*   170 */   214,  139,   64,   61,    8,   41,   56,   86,  116,  114,
- /*   180 */   111,   91,  106,  164,   89,  131,   81,   39,   66,  141,
+ /*     0 */   -25,  101,   51,  -24,   76,    1,   26,  468,  426,  351,
+ /*    10 */   201,  176,  126,  276,  326,  401,  251,  545,  301,  376,
+ /*    20 */   151,  497,  226,  570,  668,  668,  668,  668,  668,  668,
+ /*    30 */   668,  668,  668,  668,  848,  848,  848,  848, 1094,  698,
+ /*    40 */   788,  820,  654,  728,  758,  834,  834,  834,  834,  834,
+ /*    50 */  1094, 1094,  640,  640,  640,  640, 1094,  640,  829,  640,
+ /*    60 */   640,  640,  640,  640,  640,  640,  640,  640,  640,  640,
+ /*    70 */   640, 1357, 1375, 1364, 1379, 1353, 1313, 1254, 1265, 1243,
+ /*    80 */  1232, 1269, 1320, 1309, 1291, 1342, 1298, 1287, 1331, 1196,
+ /*    90 */  1276, 1247, 1240, 1335,  443,  -14,  -25,  -25,  -25,  -25,
+ /*   100 */   -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
+ /*   110 */   -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  472,  543,
+ /*   120 */   616,  616,  632,  647,  647,  548,  460,  143,  488,  483,
+ /*   130 */    -4,   93,   53,  -17,  168,  218,   31,   16,   11,    6,
+ /*   140 */    56,   61,   90,   89,   81,   65,  141,  231,  229,  191,
+ /*   150 */   173,  239,  256,  243,  196,  241,  138,  164,  165,   40,
+ /*   160 */   156,   62,  121,  189,  186,  166,  181,  116,  146,  158,
+ /*   170 */    58,  161,  190,  240,  261,  211,  214,  216,   64,  106,
+ /*   180 */   111,   -9,   36,  114,  139,  140,  131,  115,
 );
-    const YY_REDUCE_USE_DFLT = -17;
-    const YY_REDUCE_MAX = 115;
+    const YY_REDUCE_USE_DFLT = -68;
+    const YY_REDUCE_MAX = 117;
     static public $yy_reduce_ofst = array(
- /*     0 */   273,  658,  658,  658,  658,  658,  658,  658,  658,  658,
- /*    10 */   658,  658,  658,  658,  658,  658,  658,  658,  658,  658,
- /*    20 */   658,  658,  658,  658,  735,  886,  945,  995,  927,  780,
- /*    30 */   957,  909,  615,  971, 1039, 1009, 1027, 1053,  536,  703,
- /*    40 */   901,  806, 1119, 1119, 1119, 1118, 1103, 1085, 1102, 1131,
- /*    50 */   874, 1134,  669,  622,  915, 1023,  846,  513,  109,   84,
- /*    60 */    59,    9,  159,  134,  209,  -16,  234,   34,  184,  198,
- /*    70 */   198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
- /*    80 */   198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
- /*    90 */   198,  198,  203,  196,  322,  298,  323,  334,  297,  224,
- /*   100 */   249,  269,  274,  264,  289,  284,  222,  219,  247,  244,
- /*   110 */   294,  339,  299,  309,  314,  324,
+ /*     0 */    -1,  752,  752,  752,  752,  752,  752,  752,  752,  752,
+ /*    10 */   752,  752,  752,  752,  752,  752,  752,  752,  752,  752,
+ /*    20 */   752,  752,  752,  752,  895,  911,  925,  877,  953,  863,
+ /*    30 */   833,  849,  939,  967, 1023, 1009,  995,  981,  655,  683,
+ /*    40 */  1057, 1039, 1072, 1072, 1072, 1144, 1114, 1129, 1088, 1101,
+ /*    50 */   707, 1150,  880, 1154,  517, 1158,  620,  597,  814,  713,
+ /*    60 */  1052,  763,  816,  882,  797,  722,  800,  898, 1025,  -42,
+ /*    70 */   -67,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+ /*    80 */   -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+ /*    90 */   -57,  -57,  -57,  -57,  228,  208,  274,  284,  273,  272,
+ /*   100 */   234,  224,  223,  209,  222,  244,  247,  294,  269,  264,
+ /*   110 */   259,  248,  249,  289,  297,  309,  298,  299,
 );
     static public $yyExpectedTokens = array(
         /* 0 */ array(),
         /* 1 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
         /* 2 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
         /* 3 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
-        /* 4 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
-        /* 5 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 40, 41, 43, 44, 45, 46, 47, 48, ),
+        /* 4 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 40, 41, 43, 44, 45, 46, 47, 48, ),
+        /* 5 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
         /* 6 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
         /* 7 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
         /* 8 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
@@ -619,53 +635,53 @@ static public $yy_action = array(
         /* 21 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
         /* 22 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
         /* 23 */ array(24, 26, 27, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 24 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 25 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 26 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 27 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 28 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 29 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 30 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 31 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 32 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 33 */ array(2, 13, 29, 31, 46, 51, 52, 53, 54, 56, 59, 64, ),
-        /* 34 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 35 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 36 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 37 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 38 */ array(13, 29, 31, 46, 59, 64, ),
-        /* 39 */ array(13, 25, 29, 30, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 40 */ array(13, 25, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 41 */ array(13, 25, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 42 */ array(13, 25, 29, 30, 31, 38, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 43 */ array(13, 25, 29, 31, 38, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 44 */ array(13, 25, 29, 31, 38, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 45 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 46 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 47 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 48 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 49 */ array(13, 29, 31, 46, 51, 52, 53, 54, 59, 64, ),
-        /* 50 */ array(13, 29, 31, 46, 59, 64, ),
-        /* 51 */ array(13, 29, 31, 46, 59, 64, ),
-        /* 52 */ array(29, 31, 46, 59, ),
-        /* 53 */ array(29, 31, 46, 59, ),
-        /* 54 */ array(29, 31, 46, 59, ),
-        /* 55 */ array(29, 31, 46, 59, ),
-        /* 56 */ array(13, 29, 31, 46, 59, 64, ),
-        /* 57 */ array(29, 31, 46, 59, ),
-        /* 58 */ array(25, 29, 31, 46, 59, ),
-        /* 59 */ array(29, 31, 46, 59, ),
-        /* 60 */ array(29, 31, 46, 59, ),
-        /* 61 */ array(29, 31, 46, 59, ),
-        /* 62 */ array(29, 31, 46, 59, ),
-        /* 63 */ array(29, 31, 46, 59, ),
-        /* 64 */ array(29, 31, 46, 59, ),
-        /* 65 */ array(29, 31, 46, 59, ),
-        /* 66 */ array(29, 31, 46, 59, ),
-        /* 67 */ array(29, 31, 46, 59, ),
-        /* 68 */ array(29, 31, 46, 59, ),
-        /* 69 */ array(1, 20, 21, 22, ),
-        /* 70 */ array(1, 20, 21, 22, ),
+        /* 24 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 25 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 26 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 27 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 28 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 29 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 30 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 31 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 32 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 33 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
+        /* 34 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 35 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 36 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 37 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 38 */ array(13, 28, 29, 31, 46, 62, 64, ),
+        /* 39 */ array(13, 25, 28, 29, 30, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 40 */ array(13, 25, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 41 */ array(13, 25, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 42 */ array(13, 25, 28, 29, 30, 31, 38, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 43 */ array(13, 25, 28, 29, 31, 38, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 44 */ array(13, 25, 28, 29, 31, 38, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 45 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 46 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 47 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 48 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 49 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
+        /* 50 */ array(13, 28, 29, 31, 46, 62, 64, ),
+        /* 51 */ array(13, 28, 29, 31, 46, 62, 64, ),
+        /* 52 */ array(28, 29, 31, 46, 62, ),
+        /* 53 */ array(28, 29, 31, 46, 62, ),
+        /* 54 */ array(28, 29, 31, 46, 62, ),
+        /* 55 */ array(28, 29, 31, 46, 62, ),
+        /* 56 */ array(13, 28, 29, 31, 46, 62, 64, ),
+        /* 57 */ array(28, 29, 31, 46, 62, ),
+        /* 58 */ array(25, 28, 29, 31, 46, 62, ),
+        /* 59 */ array(28, 29, 31, 46, 62, ),
+        /* 60 */ array(28, 29, 31, 46, 62, ),
+        /* 61 */ array(28, 29, 31, 46, 62, ),
+        /* 62 */ array(28, 29, 31, 46, 62, ),
+        /* 63 */ array(28, 29, 31, 46, 62, ),
+        /* 64 */ array(28, 29, 31, 46, 62, ),
+        /* 65 */ array(28, 29, 31, 46, 62, ),
+        /* 66 */ array(28, 29, 31, 46, 62, ),
+        /* 67 */ array(28, 29, 31, 46, 62, ),
+        /* 68 */ array(28, 29, 31, 46, 62, ),
+        /* 69 */ array(28, 29, 31, 46, 62, ),
+        /* 70 */ array(28, 29, 31, 46, 62, ),
         /* 71 */ array(1, 20, 21, 22, ),
         /* 72 */ array(1, 20, 21, 22, ),
         /* 73 */ array(1, 20, 21, 22, ),
@@ -687,10 +703,10 @@ static public $yy_action = array(
         /* 89 */ array(1, 20, 21, 22, ),
         /* 90 */ array(1, 20, 21, 22, ),
         /* 91 */ array(1, 20, 21, 22, ),
-        /* 92 */ array(13, 25, 64, ),
-        /* 93 */ array(53, 54, ),
-        /* 94 */ array(),
-        /* 95 */ array(),
+        /* 92 */ array(1, 20, 21, 22, ),
+        /* 93 */ array(1, 20, 21, 22, ),
+        /* 94 */ array(13, 25, 64, ),
+        /* 95 */ array(53, 54, ),
         /* 96 */ array(),
         /* 97 */ array(),
         /* 98 */ array(),
@@ -711,66 +727,66 @@ static public $yy_action = array(
         /* 113 */ array(),
         /* 114 */ array(),
         /* 115 */ array(),
-        /* 116 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 55, ),
-        /* 117 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 25, ),
-        /* 118 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 119 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 120 */ array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 121 */ array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 122 */ array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 123 */ array(50, 57, 58, 60, 61, 63, ),
-        /* 124 */ array(11, 38, 57, 58, 60, 61, ),
-        /* 125 */ array(25, 57, 58, 60, 61, ),
-        /* 126 */ array(25, 57, 58, 60, 61, ),
-        /* 127 */ array(35, 57, 58, 60, 61, ),
-        /* 128 */ array(25, 57, 58, 60, 61, ),
-        /* 129 */ array(30, 57, 58, 60, 61, ),
-        /* 130 */ array(25, 57, 58, 60, 61, ),
-        /* 131 */ array(11, 57, 58, 60, 61, ),
-        /* 132 */ array(50, 57, 58, 60, 61, ),
-        /* 133 */ array(30, 57, 58, 60, 61, ),
-        /* 134 */ array(25, 57, 58, 60, 61, ),
-        /* 135 */ array(25, 57, 58, 60, 61, ),
-        /* 136 */ array(15, 16, 17, 18, 19, ),
-        /* 137 */ array(57, 58, 60, 61, ),
-        /* 138 */ array(57, 58, 60, 61, ),
-        /* 139 */ array(57, 58, 60, 61, ),
-        /* 140 */ array(29, 31, 59, ),
-        /* 141 */ array(29, 31, 59, ),
-        /* 142 */ array(18, 23, ),
-        /* 143 */ array(18, 25, ),
-        /* 144 */ array(18, 25, ),
-        /* 145 */ array(18, 19, ),
-        /* 146 */ array(18, 49, ),
-        /* 147 */ array(18, 25, ),
-        /* 148 */ array(25, 39, ),
+        /* 116 */ array(),
+        /* 117 */ array(),
+        /* 118 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 55, ),
+        /* 119 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 25, ),
+        /* 120 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
+        /* 121 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
+        /* 122 */ array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
+        /* 123 */ array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
+        /* 124 */ array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
+        /* 125 */ array(15, 16, 17, 18, 19, ),
+        /* 126 */ array(57, 58, 59, 60, ),
+        /* 127 */ array(18, 25, ),
+        /* 128 */ array(18, 49, ),
+        /* 129 */ array(25, 39, ),
+        /* 130 */ array(18, 19, ),
+        /* 131 */ array(18, 25, ),
+        /* 132 */ array(11, 38, ),
+        /* 133 */ array(18, 23, ),
+        /* 134 */ array(50, 63, ),
+        /* 135 */ array(18, 25, ),
+        /* 136 */ array(25, ),
+        /* 137 */ array(25, ),
+        /* 138 */ array(25, ),
+        /* 139 */ array(25, ),
+        /* 140 */ array(25, ),
+        /* 141 */ array(25, ),
+        /* 142 */ array(25, ),
+        /* 143 */ array(25, ),
+        /* 144 */ array(25, ),
+        /* 145 */ array(25, ),
+        /* 146 */ array(25, ),
+        /* 147 */ array(25, ),
+        /* 148 */ array(11, ),
         /* 149 */ array(25, ),
-        /* 150 */ array(25, ),
+        /* 150 */ array(53, ),
         /* 151 */ array(25, ),
         /* 152 */ array(25, ),
         /* 153 */ array(25, ),
-        /* 154 */ array(25, ),
-        /* 155 */ array(53, ),
-        /* 156 */ array(25, ),
+        /* 154 */ array(55, ),
+        /* 155 */ array(25, ),
+        /* 156 */ array(63, ),
         /* 157 */ array(25, ),
         /* 158 */ array(25, ),
-        /* 159 */ array(25, ),
+        /* 159 */ array(61, ),
         /* 160 */ array(25, ),
-        /* 161 */ array(55, ),
-        /* 162 */ array(25, ),
+        /* 161 */ array(64, ),
+        /* 162 */ array(30, ),
         /* 163 */ array(25, ),
-        /* 164 */ array(63, ),
+        /* 164 */ array(25, ),
         /* 165 */ array(25, ),
-        /* 166 */ array(62, ),
-        /* 167 */ array(64, ),
-        /* 168 */ array(25, ),
-        /* 169 */ array(25, ),
-        /* 170 */ array(25, ),
+        /* 166 */ array(25, ),
+        /* 167 */ array(25, ),
+        /* 168 */ array(30, ),
+        /* 169 */ array(35, ),
+        /* 170 */ array(18, ),
         /* 171 */ array(25, ),
         /* 172 */ array(25, ),
         /* 173 */ array(25, ),
-        /* 174 */ array(18, ),
-        /* 175 */ array(25, ),
+        /* 174 */ array(25, ),
+        /* 175 */ array(50, ),
         /* 176 */ array(25, ),
         /* 177 */ array(25, ),
         /* 178 */ array(25, ),
@@ -783,8 +799,8 @@ static public $yy_action = array(
         /* 185 */ array(25, ),
         /* 186 */ array(25, ),
         /* 187 */ array(25, ),
-        /* 188 */ array(25, ),
-        /* 189 */ array(25, ),
+        /* 188 */ array(),
+        /* 189 */ array(),
         /* 190 */ array(),
         /* 191 */ array(),
         /* 192 */ array(),
@@ -869,128 +885,128 @@ static public $yy_action = array(
  /*    40 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
  /*    50 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
  /*    60 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    70 */   354,  354,  354,  354,  354,  354,  354,  354,  265,  354,
- /*    80 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    90 */   354,  354,  354,  354,  267,  267,  267,  267,  267,  267,
+ /*    70 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+ /*    80 */   354,  354,  354,  354,  354,  354,  265,  354,  354,  354,
+ /*    90 */   354,  354,  354,  354,  354,  354,  267,  267,  267,  267,
  /*   100 */   267,  267,  267,  267,  267,  267,  267,  267,  267,  267,
- /*   110 */   267,  267,  267,  267,  267,  267,  354,  354,  334,  292,
- /*   120 */   335,  336,  338,  320,  354,  354,  354,  354,  354,  354,
- /*   130 */   354,  354,  320,  354,  354,  354,  337,  351,  324,  316,
- /*   140 */   354,  354,  354,  354,  354,  339,  354,  354,  354,  354,
+ /*   110 */   267,  267,  267,  267,  267,  267,  267,  267,  354,  354,
+ /*   120 */   292,  334,  335,  336,  338,  337,  343,  354,  354,  354,
+ /*   130 */   339,  354,  354,  354,  320,  354,  354,  354,  354,  354,
+ /*   140 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
  /*   150 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
  /*   160 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*   170 */   354,  354,  354,  354,  328,  354,  354,  354,  354,  354,
- /*   180 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*   190 */   313,  304,  349,  289,  271,  299,  314,  315,  350,  298,
- /*   200 */   270,  306,  296,  269,  297,  276,  277,  275,  274,  353,
+ /*   170 */   328,  354,  354,  354,  354,  320,  354,  354,  354,  354,
+ /*   180 */   354,  354,  354,  354,  354,  354,  354,  354,  271,  289,
+ /*   190 */   296,  306,  313,  270,  315,  299,  351,  316,  269,  304,
+ /*   200 */   298,  350,  349,  314,  297,  276,  277,  275,  274,  353,
  /*   210 */   273,  278,  279,  284,  285,  283,  282,  280,  281,  352,
- /*   220 */   348,  345,  325,  344,  272,  266,  268,  326,  327,  346,
- /*   230 */   347,  343,  333,  332,  286,  287,  301,  302,  300,  295,
+ /*   220 */   347,  325,  326,  324,  272,  266,  268,  327,  332,  345,
+ /*   230 */   346,  348,  344,  333,  286,  287,  301,  302,  300,  295,
  /*   240 */   293,  294,  303,  305,  310,  311,  309,  308,  307,  342,
  /*   250 */   341,  290,  291,  288,  323,  321,  322,  317,  319,  331,
  /*   260 */   340,  330,  329,  318,  312,
 );
-/* The next thing included is series of defines which control
-** various aspects of the generated parser.
-**    self::YYNOCODE      is a number which corresponds
-**                        to no legal terminal or nonterminal number.  This
-**                        number is used to fill in empty slots of the hash 
-**                        table.
-**    self::YYFALLBACK    If defined, this indicates that one or more tokens
-**                        have fall-back values which should be used if the
-**                        original value of the token will not parse.
-**    self::YYSTACKDEPTH  is the maximum depth of the parser's stack.
-**    self::YYNSTATE      the combined number of states.
-**    self::YYNRULE       the number of rules in the grammar
-**    self::YYERRORSYMBOL is the code number of the error symbol.  If not
-**                        defined, then do no error processing.
-*/
-    const YYNOCODE = 94;
+/* The next thing included is series of defines which control
+** various aspects of the generated parser.
+**    self::YYNOCODE      is a number which corresponds
+**                        to no legal terminal or nonterminal number.  This
+**                        number is used to fill in empty slots of the hash 
+**                        table.
+**    self::YYFALLBACK    If defined, this indicates that one or more tokens
+**                        have fall-back values which should be used if the
+**                        original value of the token will not parse.
+**    self::YYSTACKDEPTH  is the maximum depth of the parser's stack.
+**    self::YYNSTATE      the combined number of states.
+**    self::YYNRULE       the number of rules in the grammar
+**    self::YYERRORSYMBOL is the code number of the error symbol.  If not
+**                        defined, then do no error processing.
+*/
+    const YYNOCODE = 95;
     const YYSTACKDEPTH = 100;
     const YYNSTATE = 265;
     const YYNRULE = 89;
     const YYERRORSYMBOL = 65;
     const YYERRSYMDT = 'yy0';
     const YYFALLBACK = 0;
-    /** The next table maps tokens into fallback tokens.  If a construct
-     * like the following:
-     * 
-     *      %fallback ID X Y Z.
-     *
-     * appears in the grammer, then ID becomes a fallback token for X, Y,
-     * and Z.  Whenever one of the tokens X, Y, or Z is input to the parser
-     * but it does not parse, the type of the token is changed to ID and
-     * the parse is retried before an error is thrown.
-     */
-    static public $yyFallback = array(
-    );
-    /**
-     * Turn parser tracing on by giving a stream to which to write the trace
-     * and a prompt to preface each trace message.  Tracing is turned off
-     * by making either argument NULL 
-     *
-     * Inputs:
-     * 
-     * - A stream resource to which trace output should be written.
-     *   If NULL, then tracing is turned off.
-     * - A prefix string written at the beginning of every
-     *   line of trace output.  If NULL, then tracing is
-     *   turned off.
-     *
-     * Outputs:
-     * 
-     * - None.
-     * @param resource
-     * @param string
-     */
-    static function Trace($TraceFILE, $zTracePrompt)
-    {
-        if (!$TraceFILE) {
-            $zTracePrompt = 0;
-        } elseif (!$zTracePrompt) {
-            $TraceFILE = 0;
-        }
-        self::$yyTraceFILE = $TraceFILE;
-        self::$yyTracePrompt = $zTracePrompt;
-    }
-
-    /**
-     * Output debug information to output (php://output stream)
-     */
-    static function PrintTrace()
-    {
-        self::$yyTraceFILE = fopen('php://output', 'w');
-        self::$yyTracePrompt = '';
-    }
-
-    /**
-     * @var resource|0
-     */
-    static public $yyTraceFILE;
-    /**
-     * String to prepend to debug output
-     * @var string|0
-     */
-    static public $yyTracePrompt;
-    /**
-     * @var int
-     */
-    public $yyidx;                    /* Index of top element in stack */
-    /**
-     * @var int
-     */
-    public $yyerrcnt;                 /* Shifts left before out of the error */
-    /**
-     * @var array
-     */
-    public $yystack = array();  /* The parser's stack */
-
-    /**
-     * For tracing shifts, the names of all terminals and nonterminals
-     * are required.  The following table supplies these names
-     * @var array
-     */
-    static public $yyTokenName = array( 
+    /** The next table maps tokens into fallback tokens.  If a construct
+     * like the following:
+     * 
+     *      %fallback ID X Y Z.
+     *
+     * appears in the grammer, then ID becomes a fallback token for X, Y,
+     * and Z.  Whenever one of the tokens X, Y, or Z is input to the parser
+     * but it does not parse, the type of the token is changed to ID and
+     * the parse is retried before an error is thrown.
+     */
+    static public $yyFallback = array(
+    );
+    /**
+     * Turn parser tracing on by giving a stream to which to write the trace
+     * and a prompt to preface each trace message.  Tracing is turned off
+     * by making either argument NULL 
+     *
+     * Inputs:
+     * 
+     * - A stream resource to which trace output should be written.
+     *   If NULL, then tracing is turned off.
+     * - A prefix string written at the beginning of every
+     *   line of trace output.  If NULL, then tracing is
+     *   turned off.
+     *
+     * Outputs:
+     * 
+     * - None.
+     * @param resource
+     * @param string
+     */
+    static function Trace($TraceFILE, $zTracePrompt)
+    {
+        if (!$TraceFILE) {
+            $zTracePrompt = 0;
+        } elseif (!$zTracePrompt) {
+            $TraceFILE = 0;
+        }
+        self::$yyTraceFILE = $TraceFILE;
+        self::$yyTracePrompt = $zTracePrompt;
+    }
+
+    /**
+     * Output debug information to output (php://output stream)
+     */
+    static function PrintTrace()
+    {
+        self::$yyTraceFILE = fopen('php://output', 'w');
+        self::$yyTracePrompt = '';
+    }
+
+    /**
+     * @var resource|0
+     */
+    static public $yyTraceFILE;
+    /**
+     * String to prepend to debug output
+     * @var string|0
+     */
+    static public $yyTracePrompt;
+    /**
+     * @var int
+     */
+    public $yyidx = -1;                    /* Index of top element in stack */
+    /**
+     * @var int
+     */
+    public $yyerrcnt;                 /* Shifts left before out of the error */
+    /**
+     * @var array
+     */
+    public $yystack = array();  /* The parser's stack */
+
+    /**
+     * For tracing shifts, the names of all terminals and nonterminals
+     * are required.  The following table supplies these names
+     * @var array
+     */
+    static public $yyTokenName = array( 
   '$',             'T_TAG_OPEN',    'T_NOT',         'T_AND',       
   'T_OR',          'T_EQ',          'T_NE',          'T_GT',        
   'T_GE',          'T_LT',          'T_LE',          'T_IN',        
@@ -1005,8 +1021,8 @@ static public $yy_action = array(
   'T_IFEQUAL',     'T_IFNOTEQUAL',  'T_BLOCK',       'T_FILTER',    
   'T_REGROUP',     'T_BY',          'T_COLON',       'T_TRUE',      
   'T_FALSE',       'T_STRING',      'T_INTL',        'T_RPARENT',   
-  'T_LPARENT',     'T_OBJ',         'T_DOT',         'T_ALPHA',     
-  'T_CLASS',       'T_BRACKETS_OPEN',  'T_BRACKETS_CLOSE',  'T_DOTDOT',    
+  'T_LPARENT',     'T_OBJ',         'T_DOT',         'T_CLASS',     
+  'T_BRACKETS_OPEN',  'T_BRACKETS_CLOSE',  'T_ALPHA',       'T_DOTDOT',    
   'T_NUMERIC',     'error',         'start',         'body',        
   'code',          'stmts',         'filtered_var',  'var_or_string',
   'stmt',          'for_stmt',      'ifchanged_stmt',  'block_stmt',  
@@ -1014,14 +1030,14 @@ static public $yy_action = array(
   'ifequal',       'varname',       'params',        'expr',        
   'regroup',       'string',        'for_def',       'range',       
   'numvar',        'fvar_or_string',  'number',        'varname_args',
-  'varpart',     
-    );
-
-    /**
-     * For tracing reduce actions, the names of all rules are required.
-     * @var array
-     */
-    static public $yyRuleName = array(
+  'varpart',       'varpart_single',
+    );
+
+    /**
+     * For tracing reduce actions, the names of all rules are required.
+     * @var array
+     */
+    static public $yyRuleName = array(
  /*   0 */ "start ::= body",
  /*   1 */ "body ::= body code",
  /*   2 */ "body ::=",
@@ -1101,380 +1117,380 @@ static public $yy_action = array(
  /*  76 */ "expr ::= T_LPARENT expr T_RPARENT",
  /*  77 */ "expr ::= fvar_or_string",
  /*  78 */ "varname ::= varpart",
- /*  79 */ "varpart ::= varname T_OBJ|T_DOT T_ALPHA|T_CUSTOM_TAG|T_CUSTOM_BLOCK",
- /*  80 */ "varpart ::= varname T_CLASS T_ALPHA|T_CUSTOM_TAG|T_CUSTOM_BLOCK",
- /*  81 */ "varpart ::= varname T_BRACKETS_OPEN var_or_string T_BRACKETS_CLOSE",
- /*  82 */ "varpart ::= T_ALPHA",
- /*  83 */ "varpart ::= T_BLOCK|T_CUSTOM_TAG|T_CUSTOM_BLOCK",
+ /*  79 */ "varpart ::= varpart T_OBJ|T_DOT varpart_single",
+ /*  80 */ "varpart ::= varpart T_CLASS varpart_single",
+ /*  81 */ "varpart ::= varpart T_BRACKETS_OPEN var_or_string T_BRACKETS_CLOSE",
+ /*  82 */ "varpart ::= varpart_single",
+ /*  83 */ "varpart_single ::= T_ALPHA|T_BLOCK|T_CUSTOM_TAG|T_CUSTOM_END|T_CUSTOM_BLOCK",
  /*  84 */ "range ::= numvar T_DOTDOT numvar",
  /*  85 */ "numvar ::= number",
  /*  86 */ "numvar ::= varname",
  /*  87 */ "number ::= T_NUMERIC",
  /*  88 */ "number ::= T_MINUS T_NUMERIC",
-    );
-
-    /**
-     * This function returns the symbolic name associated with a token
-     * value.
-     * @param int
-     * @return string
-     */
-    function tokenName($tokenType)
-    {
-        if ($tokenType === 0) {
-            return 'End of Input';
-        }
-        if ($tokenType > 0 && $tokenType < count(self::$yyTokenName)) {
-            return self::$yyTokenName[$tokenType];
-        } else {
-            return "Unknown";
-        }
-    }
-
-    /**
-     * The following function deletes the value associated with a
-     * symbol.  The symbol can be either a terminal or nonterminal.
-     * @param int the symbol code
-     * @param mixed the symbol's value
-     */
-    static function yy_destructor($yymajor, $yypminor)
-    {
-        switch ($yymajor) {
-        /* Here is inserted the actions which take place when a
-        ** terminal or non-terminal is destroyed.  This can happen
-        ** when the symbol is popped from the stack during a
-        ** reduce or during error processing or when a parser is 
-        ** being destroyed before it is finished parsing.
-        **
-        ** Note: during a reduce, the only symbols destroyed are those
-        ** which appear on the RHS of the rule, but which are not used
-        ** inside the C code.
-        */
-            default:  break;   /* If no destructor action specified: do nothing */
-        }
-    }
-
-    /**
-     * Pop the parser's stack once.
-     *
-     * If there is a destructor routine associated with the token which
-     * is popped from the stack, then call it.
-     *
-     * Return the major token number for the symbol popped.
-     * @param Haanga_yyParser
-     * @return int
-     */
-    function yy_pop_parser_stack()
-    {
-        if (!count($this->yystack)) {
-            return;
-        }
-        $yytos = array_pop($this->yystack);
-        if (self::$yyTraceFILE && $this->yyidx >= 0) {
-            fwrite(self::$yyTraceFILE,
-                self::$yyTracePrompt . 'Popping ' . self::$yyTokenName[$yytos->major] .
-                    "\n");
-        }
-        $yymajor = $yytos->major;
-        self::yy_destructor($yymajor, $yytos->minor);
-        $this->yyidx--;
-        return $yymajor;
-    }
-
-    /**
-     * Deallocate and destroy a parser.  Destructors are all called for
-     * all stack elements before shutting the parser down.
-     */
-    function __destruct()
-    {
-        while ($this->yyidx >= 0) {
-            $this->yy_pop_parser_stack();
-        }
-        if (is_resource(self::$yyTraceFILE)) {
-            fclose(self::$yyTraceFILE);
-        }
-    }
-
-    /**
-     * Based on the current state and parser stack, get a list of all
-     * possible lookahead tokens
-     * @param int
-     * @return array
-     */
-    function yy_get_expected_tokens($token)
-    {
-        $state = $this->yystack[$this->yyidx]->stateno;
-        $expected = self::$yyExpectedTokens[$state];
-        if (in_array($token, self::$yyExpectedTokens[$state], true)) {
-            return $expected;
-        }
-        $stack = $this->yystack;
-        $yyidx = $this->yyidx;
-        do {
-            $yyact = $this->yy_find_shift_action($token);
-            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
-                // reduce action
-                $done = 0;
-                do {
-                    if ($done++ == 100) {
-                        $this->yyidx = $yyidx;
-                        $this->yystack = $stack;
-                        // too much recursion prevents proper detection
-                        // so give up
-                        return array_unique($expected);
-                    }
-                    $yyruleno = $yyact - self::YYNSTATE;
-                    $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
-                    $nextstate = $this->yy_find_reduce_action(
-                        $this->yystack[$this->yyidx]->stateno,
-                        self::$yyRuleInfo[$yyruleno]['lhs']);
-                    if (isset(self::$yyExpectedTokens[$nextstate])) {
-                        $expected += self::$yyExpectedTokens[$nextstate];
-                            if (in_array($token,
-                                  self::$yyExpectedTokens[$nextstate], true)) {
-                            $this->yyidx = $yyidx;
-                            $this->yystack = $stack;
-                            return array_unique($expected);
-                        }
-                    }
-                    if ($nextstate < self::YYNSTATE) {
-                        // we need to shift a non-terminal
-                        $this->yyidx++;
-                        $x = new Haanga_yyStackEntry;
-                        $x->stateno = $nextstate;
-                        $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
-                        $this->yystack[$this->yyidx] = $x;
-                        continue 2;
-                    } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
-                        $this->yyidx = $yyidx;
-                        $this->yystack = $stack;
-                        // the last token was just ignored, we can't accept
-                        // by ignoring input, this is in essence ignoring a
-                        // syntax error!
-                        return array_unique($expected);
-                    } elseif ($nextstate === self::YY_NO_ACTION) {
-                        $this->yyidx = $yyidx;
-                        $this->yystack = $stack;
-                        // input accepted, but not shifted (I guess)
-                        return $expected;
-                    } else {
-                        $yyact = $nextstate;
-                    }
-                } while (true);
-            }
-            break;
-        } while (true);
-        return array_unique($expected);
-    }
-
-    /**
-     * Based on the parser state and current parser stack, determine whether
-     * the lookahead token is possible.
-     * 
-     * The parser will convert the token value to an error token if not.  This
-     * catches some unusual edge cases where the parser would fail.
-     * @param int
-     * @return bool
-     */
-    function yy_is_expected_token($token)
-    {
-        if ($token === 0) {
-            return true; // 0 is not part of this
-        }
-        $state = $this->yystack[$this->yyidx]->stateno;
-        if (in_array($token, self::$yyExpectedTokens[$state], true)) {
-            return true;
-        }
-        $stack = $this->yystack;
-        $yyidx = $this->yyidx;
-        do {
-            $yyact = $this->yy_find_shift_action($token);
-            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
-                // reduce action
-                $done = 0;
-                do {
-                    if ($done++ == 100) {
-                        $this->yyidx = $yyidx;
-                        $this->yystack = $stack;
-                        // too much recursion prevents proper detection
-                        // so give up
-                        return true;
-                    }
-                    $yyruleno = $yyact - self::YYNSTATE;
-                    $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
-                    $nextstate = $this->yy_find_reduce_action(
-                        $this->yystack[$this->yyidx]->stateno,
-                        self::$yyRuleInfo[$yyruleno]['lhs']);
-                    if (isset(self::$yyExpectedTokens[$nextstate]) &&
-                          in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
-                        $this->yyidx = $yyidx;
-                        $this->yystack = $stack;
-                        return true;
-                    }
-                    if ($nextstate < self::YYNSTATE) {
-                        // we need to shift a non-terminal
-                        $this->yyidx++;
-                        $x = new Haanga_yyStackEntry;
-                        $x->stateno = $nextstate;
-                        $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
-                        $this->yystack[$this->yyidx] = $x;
-                        continue 2;
-                    } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
-                        $this->yyidx = $yyidx;
-                        $this->yystack = $stack;
-                        if (!$token) {
-                            // end of input: this is valid
-                            return true;
-                        }
-                        // the last token was just ignored, we can't accept
-                        // by ignoring input, this is in essence ignoring a
-                        // syntax error!
-                        return false;
-                    } elseif ($nextstate === self::YY_NO_ACTION) {
-                        $this->yyidx = $yyidx;
-                        $this->yystack = $stack;
-                        // input accepted, but not shifted (I guess)
-                        return true;
-                    } else {
-                        $yyact = $nextstate;
-                    }
-                } while (true);
-            }
-            break;
-        } while (true);
-        $this->yyidx = $yyidx;
-        $this->yystack = $stack;
-        return true;
-    }
-
-    /**
-     * Find the appropriate action for a parser given the terminal
-     * look-ahead token iLookAhead.
-     *
-     * If the look-ahead token is YYNOCODE, then check to see if the action is
-     * independent of the look-ahead.  If it is, return the action, otherwise
-     * return YY_NO_ACTION.
-     * @param int The look-ahead token
-     */
-    function yy_find_shift_action($iLookAhead)
-    {
-        $stateno = $this->yystack[$this->yyidx]->stateno;
-     
-        /* if ($this->yyidx < 0) return self::YY_NO_ACTION;  */
-        if (!isset(self::$yy_shift_ofst[$stateno])) {
-            // no shift actions
-            return self::$yy_default[$stateno];
-        }
-        $i = self::$yy_shift_ofst[$stateno];
-        if ($i === self::YY_SHIFT_USE_DFLT) {
-            return self::$yy_default[$stateno];
-        }
-        if ($iLookAhead == self::YYNOCODE) {
-            return self::YY_NO_ACTION;
-        }
-        $i += $iLookAhead;
-        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
-              self::$yy_lookahead[$i] != $iLookAhead) {
-            if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
-                   && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
-                if (self::$yyTraceFILE) {
-                    fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
-                        self::$yyTokenName[$iLookAhead] . " => " .
-                        self::$yyTokenName[$iFallback] . "\n");
-                }
-                return $this->yy_find_shift_action($iFallback);
-            }
-            return self::$yy_default[$stateno];
-        } else {
-            return self::$yy_action[$i];
-        }
-    }
-
-    /**
-     * Find the appropriate action for a parser given the non-terminal
-     * look-ahead token $iLookAhead.
-     *
-     * If the look-ahead token is self::YYNOCODE, then check to see if the action is
-     * independent of the look-ahead.  If it is, return the action, otherwise
-     * return self::YY_NO_ACTION.
-     * @param int Current state number
-     * @param int The look-ahead token
-     */
-    function yy_find_reduce_action($stateno, $iLookAhead)
-    {
-        /* $stateno = $this->yystack[$this->yyidx]->stateno; */
-
-        if (!isset(self::$yy_reduce_ofst[$stateno])) {
-            return self::$yy_default[$stateno];
-        }
-        $i = self::$yy_reduce_ofst[$stateno];
-        if ($i == self::YY_REDUCE_USE_DFLT) {
-            return self::$yy_default[$stateno];
-        }
-        if ($iLookAhead == self::YYNOCODE) {
-            return self::YY_NO_ACTION;
-        }
-        $i += $iLookAhead;
-        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
-              self::$yy_lookahead[$i] != $iLookAhead) {
-            return self::$yy_default[$stateno];
-        } else {
-            return self::$yy_action[$i];
-        }
-    }
-
-    /**
-     * Perform a shift action.
-     * @param int The new state to shift in
-     * @param int The major token to shift in
-     * @param mixed the minor token to shift in
-     */
-    function yy_shift($yyNewState, $yyMajor, $yypMinor)
-    {
-        $this->yyidx++;
-        if ($this->yyidx >= self::YYSTACKDEPTH) {
-            $this->yyidx--;
-            if (self::$yyTraceFILE) {
-                fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
-            }
-            while ($this->yyidx >= 0) {
-                $this->yy_pop_parser_stack();
-            }
-            /* Here code is inserted which will execute if the parser
-            ** stack ever overflows */
-            return;
-        }
-        $yytos = new Haanga_yyStackEntry;
-        $yytos->stateno = $yyNewState;
-        $yytos->major = $yyMajor;
-        $yytos->minor = $yypMinor;
-        array_push($this->yystack, $yytos);
-        if (self::$yyTraceFILE && $this->yyidx > 0) {
-            fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
-                $yyNewState);
-            fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
-            for($i = 1; $i <= $this->yyidx; $i++) {
-                fprintf(self::$yyTraceFILE, " %s",
-                    self::$yyTokenName[$this->yystack[$i]->major]);
-            }
-            fwrite(self::$yyTraceFILE,"\n");
-        }
-    }
-
-    /**
-     * The following table contains information about every rule that
-     * is used during the reduce.
-     *
-     * <pre>
-     * array(
-     *  array(
-     *   int $lhs;         Symbol on the left-hand side of the rule
-     *   int $nrhs;     Number of right-hand side symbols in the rule
-     *  ),...
-     * );
-     * </pre>
-     */
-    static public $yyRuleInfo = array(
+    );
+
+    /**
+     * This function returns the symbolic name associated with a token
+     * value.
+     * @param int
+     * @return string
+     */
+    function tokenName($tokenType)
+    {
+        if ($tokenType === 0) {
+            return 'End of Input';
+        }
+        if ($tokenType > 0 && $tokenType < count(self::$yyTokenName)) {
+            return self::$yyTokenName[$tokenType];
+        } else {
+            return "Unknown";
+        }
+    }
+
+    /**
+     * The following function deletes the value associated with a
+     * symbol.  The symbol can be either a terminal or nonterminal.
+     * @param int the symbol code
+     * @param mixed the symbol's value
+     */
+    static function yy_destructor($yymajor, $yypminor)
+    {
+        switch ($yymajor) {
+        /* Here is inserted the actions which take place when a
+        ** terminal or non-terminal is destroyed.  This can happen
+        ** when the symbol is popped from the stack during a
+        ** reduce or during error processing or when a parser is 
+        ** being destroyed before it is finished parsing.
+        **
+        ** Note: during a reduce, the only symbols destroyed are those
+        ** which appear on the RHS of the rule, but which are not used
+        ** inside the C code.
+        */
+            default:  break;   /* If no destructor action specified: do nothing */
+        }
+    }
+
+    /**
+     * Pop the parser's stack once.
+     *
+     * If there is a destructor routine associated with the token which
+     * is popped from the stack, then call it.
+     *
+     * Return the major token number for the symbol popped.
+     * @param Haanga_yyParser
+     * @return int
+     */
+    function yy_pop_parser_stack()
+    {
+        if (!count($this->yystack)) {
+            return;
+        }
+        $yytos = array_pop($this->yystack);
+        if (self::$yyTraceFILE && $this->yyidx >= 0) {
+            fwrite(self::$yyTraceFILE,
+                self::$yyTracePrompt . 'Popping ' . self::$yyTokenName[$yytos->major] .
+                    "\n");
+        }
+        $yymajor = $yytos->major;
+        self::yy_destructor($yymajor, $yytos->minor);
+        $this->yyidx--;
+        return $yymajor;
+    }
+
+    /**
+     * Deallocate and destroy a parser.  Destructors are all called for
+     * all stack elements before shutting the parser down.
+     */
+    function __destruct()
+    {
+        while ($this->yyidx >= 0) {
+            $this->yy_pop_parser_stack();
+        }
+        if (is_resource(self::$yyTraceFILE)) {
+            fclose(self::$yyTraceFILE);
+        }
+    }
+
+    /**
+     * Based on the current state and parser stack, get a list of all
+     * possible lookahead tokens
+     * @param int
+     * @return array
+     */
+    function yy_get_expected_tokens($token)
+    {
+        $state = $this->yystack[$this->yyidx]->stateno;
+        $expected = self::$yyExpectedTokens[$state];
+        if (in_array($token, self::$yyExpectedTokens[$state], true)) {
+            return $expected;
+        }
+        $stack = $this->yystack;
+        $yyidx = $this->yyidx;
+        do {
+            $yyact = $this->yy_find_shift_action($token);
+            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+                // reduce action
+                $done = 0;
+                do {
+                    if ($done++ == 100) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // too much recursion prevents proper detection
+                        // so give up
+                        return array_unique($expected);
+                    }
+                    $yyruleno = $yyact - self::YYNSTATE;
+                    $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
+                    $nextstate = $this->yy_find_reduce_action(
+                        $this->yystack[$this->yyidx]->stateno,
+                        self::$yyRuleInfo[$yyruleno]['lhs']);
+                    if (isset(self::$yyExpectedTokens[$nextstate])) {
+                        $expected += self::$yyExpectedTokens[$nextstate];
+                            if (in_array($token,
+                                  self::$yyExpectedTokens[$nextstate], true)) {
+                            $this->yyidx = $yyidx;
+                            $this->yystack = $stack;
+                            return array_unique($expected);
+                        }
+                    }
+                    if ($nextstate < self::YYNSTATE) {
+                        // we need to shift a non-terminal
+                        $this->yyidx++;
+                        $x = new Haanga_yyStackEntry;
+                        $x->stateno = $nextstate;
+                        $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+                        $this->yystack[$this->yyidx] = $x;
+                        continue 2;
+                    } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // the last token was just ignored, we can't accept
+                        // by ignoring input, this is in essence ignoring a
+                        // syntax error!
+                        return array_unique($expected);
+                    } elseif ($nextstate === self::YY_NO_ACTION) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // input accepted, but not shifted (I guess)
+                        return $expected;
+                    } else {
+                        $yyact = $nextstate;
+                    }
+                } while (true);
+            }
+            break;
+        } while (true);
+        return array_unique($expected);
+    }
+
+    /**
+     * Based on the parser state and current parser stack, determine whether
+     * the lookahead token is possible.
+     * 
+     * The parser will convert the token value to an error token if not.  This
+     * catches some unusual edge cases where the parser would fail.
+     * @param int
+     * @return bool
+     */
+    function yy_is_expected_token($token)
+    {
+        if ($token === 0) {
+            return true; // 0 is not part of this
+        }
+        $state = $this->yystack[$this->yyidx]->stateno;
+        if (in_array($token, self::$yyExpectedTokens[$state], true)) {
+            return true;
+        }
+        $stack = $this->yystack;
+        $yyidx = $this->yyidx;
+        do {
+            $yyact = $this->yy_find_shift_action($token);
+            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+                // reduce action
+                $done = 0;
+                do {
+                    if ($done++ == 100) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // too much recursion prevents proper detection
+                        // so give up
+                        return true;
+                    }
+                    $yyruleno = $yyact - self::YYNSTATE;
+                    $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
+                    $nextstate = $this->yy_find_reduce_action(
+                        $this->yystack[$this->yyidx]->stateno,
+                        self::$yyRuleInfo[$yyruleno]['lhs']);
+                    if (isset(self::$yyExpectedTokens[$nextstate]) &&
+                          in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        return true;
+                    }
+                    if ($nextstate < self::YYNSTATE) {
+                        // we need to shift a non-terminal
+                        $this->yyidx++;
+                        $x = new Haanga_yyStackEntry;
+                        $x->stateno = $nextstate;
+                        $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+                        $this->yystack[$this->yyidx] = $x;
+                        continue 2;
+                    } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        if (!$token) {
+                            // end of input: this is valid
+                            return true;
+                        }
+                        // the last token was just ignored, we can't accept
+                        // by ignoring input, this is in essence ignoring a
+                        // syntax error!
+                        return false;
+                    } elseif ($nextstate === self::YY_NO_ACTION) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // input accepted, but not shifted (I guess)
+                        return true;
+                    } else {
+                        $yyact = $nextstate;
+                    }
+                } while (true);
+            }
+            break;
+        } while (true);
+        $this->yyidx = $yyidx;
+        $this->yystack = $stack;
+        return true;
+    }
+
+    /**
+     * Find the appropriate action for a parser given the terminal
+     * look-ahead token iLookAhead.
+     *
+     * If the look-ahead token is YYNOCODE, then check to see if the action is
+     * independent of the look-ahead.  If it is, return the action, otherwise
+     * return YY_NO_ACTION.
+     * @param int The look-ahead token
+     */
+    function yy_find_shift_action($iLookAhead)
+    {
+        $stateno = $this->yystack[$this->yyidx]->stateno;
+     
+        /* if ($this->yyidx < 0) return self::YY_NO_ACTION;  */
+        if (!isset(self::$yy_shift_ofst[$stateno])) {
+            // no shift actions
+            return self::$yy_default[$stateno];
+        }
+        $i = self::$yy_shift_ofst[$stateno];
+        if ($i === self::YY_SHIFT_USE_DFLT) {
+            return self::$yy_default[$stateno];
+        }
+        if ($iLookAhead == self::YYNOCODE) {
+            return self::YY_NO_ACTION;
+        }
+        $i += $iLookAhead;
+        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+              self::$yy_lookahead[$i] != $iLookAhead) {
+            if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
+                   && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
+                if (self::$yyTraceFILE) {
+                    fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
+                        self::$yyTokenName[$iLookAhead] . " => " .
+                        self::$yyTokenName[$iFallback] . "\n");
+                }
+                return $this->yy_find_shift_action($iFallback);
+            }
+            return self::$yy_default[$stateno];
+        } else {
+            return self::$yy_action[$i];
+        }
+    }
+
+    /**
+     * Find the appropriate action for a parser given the non-terminal
+     * look-ahead token $iLookAhead.
+     *
+     * If the look-ahead token is self::YYNOCODE, then check to see if the action is
+     * independent of the look-ahead.  If it is, return the action, otherwise
+     * return self::YY_NO_ACTION.
+     * @param int Current state number
+     * @param int The look-ahead token
+     */
+    function yy_find_reduce_action($stateno, $iLookAhead)
+    {
+        /* $stateno = $this->yystack[$this->yyidx]->stateno; */
+
+        if (!isset(self::$yy_reduce_ofst[$stateno])) {
+            return self::$yy_default[$stateno];
+        }
+        $i = self::$yy_reduce_ofst[$stateno];
+        if ($i == self::YY_REDUCE_USE_DFLT) {
+            return self::$yy_default[$stateno];
+        }
+        if ($iLookAhead == self::YYNOCODE) {
+            return self::YY_NO_ACTION;
+        }
+        $i += $iLookAhead;
+        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+              self::$yy_lookahead[$i] != $iLookAhead) {
+            return self::$yy_default[$stateno];
+        } else {
+            return self::$yy_action[$i];
+        }
+    }
+
+    /**
+     * Perform a shift action.
+     * @param int The new state to shift in
+     * @param int The major token to shift in
+     * @param mixed the minor token to shift in
+     */
+    function yy_shift($yyNewState, $yyMajor, $yypMinor)
+    {
+        $this->yyidx++;
+        if ($this->yyidx >= self::YYSTACKDEPTH) {
+            $this->yyidx--;
+            if (self::$yyTraceFILE) {
+                fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
+            }
+            while ($this->yyidx >= 0) {
+                $this->yy_pop_parser_stack();
+            }
+            /* Here code is inserted which will execute if the parser
+            ** stack ever overflows */
+            return;
+        }
+        $yytos = new Haanga_yyStackEntry;
+        $yytos->stateno = $yyNewState;
+        $yytos->major = $yyMajor;
+        $yytos->minor = $yypMinor;
+        array_push($this->yystack, $yytos);
+        if (self::$yyTraceFILE && $this->yyidx > 0) {
+            fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
+                $yyNewState);
+            fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
+            for ($i = 1; $i <= $this->yyidx; $i++) {
+                fprintf(self::$yyTraceFILE, " %s",
+                    self::$yyTokenName[$this->yystack[$i]->major]);
+            }
+            fwrite(self::$yyTraceFILE,"\n");
+        }
+    }
+
+    /**
+     * The following table contains information about every rule that
+     * is used during the reduce.
+     *
+     * <pre>
+     * array(
+     *  array(
+     *   int $lhs;         Symbol on the left-hand side of the rule
+     *   int $nrhs;     Number of right-hand side symbols in the rule
+     *  ),...
+     * );
+     * </pre>
+     */
+    static public $yyRuleInfo = array(
   array( 'lhs' => 66, 'rhs' => 1 ),
   array( 'lhs' => 67, 'rhs' => 2 ),
   array( 'lhs' => 67, 'rhs' => 0 ),
@@ -1558,21 +1574,21 @@ static public $yy_action = array(
   array( 'lhs' => 92, 'rhs' => 3 ),
   array( 'lhs' => 92, 'rhs' => 4 ),
   array( 'lhs' => 92, 'rhs' => 1 ),
-  array( 'lhs' => 92, 'rhs' => 1 ),
+  array( 'lhs' => 93, 'rhs' => 1 ),
   array( 'lhs' => 87, 'rhs' => 3 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
   array( 'lhs' => 90, 'rhs' => 1 ),
   array( 'lhs' => 90, 'rhs' => 2 ),
-    );
-
-    /**
-     * The following table contains a mapping of reduce action to method name
-     * that handles the reduction.
-     * 
-     * If a rule is not set, it has no handler.
-     */
-    static public $yyReduceMap = array(
+    );
+
+    /**
+     * The following table contains a mapping of reduce action to method name
+     * that handles the reduction.
+     * 
+     * If a rule is not set, it has no handler.
+     */
+    static public $yyReduceMap = array(
         0 => 0,
         1 => 1,
         2 => 2,
@@ -1662,53 +1678,53 @@ static public $yy_action = array(
         81 => 81,
         84 => 84,
         88 => 88,
-    );
-    /* Beginning here are the reduction cases.  A typical example
-    ** follows:
-    **  #line <lineno> <grammarfile>
-    **   function yy_r0($yymsp){ ... }           // User supplied code
-    **  #line <lineno> <thisfile>
-    */
+    );
+    /* Beginning here are the reduction cases.  A typical example
+    ** follows:
+    **  #line <lineno> <grammarfile>
+    **   function yy_r0($yymsp){ ... }           // User supplied code
+    **  #line <lineno> <thisfile>
+    */
 #line 80 "Parser.y"
     function yy_r0(){ $this->body = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1680 "Parser.php"
+#line 1696 "Parser.php"
 #line 82 "Parser.y"
     function yy_r1(){ $this->_retvalue=$this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1683 "Parser.php"
+#line 1699 "Parser.php"
 #line 83 "Parser.y"
     function yy_r2(){ $this->_retvalue = array();     }
-#line 1686 "Parser.php"
+#line 1702 "Parser.php"
 #line 86 "Parser.y"
     function yy_r3(){ if (count($this->yystack[$this->yyidx + 0]->minor)) $this->yystack[$this->yyidx + 0]->minor['line'] = $this->lex->getLine();  $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1689 "Parser.php"
-#line 87 "Parser.y"
+#line 1705 "Parser.php"
+#line 88 "Parser.y"
     function yy_r4(){
     $this->_retvalue = array('operation' => 'html', 'html' => $this->yystack[$this->yyidx + 0]->minor, 'line' => $this->lex->getLine() ); 
     }
-#line 1694 "Parser.php"
-#line 90 "Parser.y"
+#line 1710 "Parser.php"
+#line 92 "Parser.y"
     function yy_r5(){
     $this->yystack[$this->yyidx + 0]->minor=rtrim($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = array('operation' => 'comment', 'comment' => $this->yystack[$this->yyidx + 0]->minor); 
     }
-#line 1699 "Parser.php"
-#line 93 "Parser.y"
+#line 1715 "Parser.php"
+#line 96 "Parser.y"
     function yy_r6(){
     $this->_retvalue = array('operation' => 'print_var', 'variable' => $this->yystack[$this->yyidx + -1]->minor, 'line' => $this->lex->getLine() ); 
     }
-#line 1704 "Parser.php"
-#line 97 "Parser.y"
+#line 1720 "Parser.php"
+#line 100 "Parser.y"
     function yy_r7(){ $this->_retvalue = array('operation' => 'base', $this->yystack[$this->yyidx + -1]->minor);     }
-#line 1707 "Parser.php"
-#line 98 "Parser.y"
+#line 1723 "Parser.php"
+#line 101 "Parser.y"
     function yy_r8(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;     }
-#line 1710 "Parser.php"
-#line 99 "Parser.y"
+#line 1726 "Parser.php"
+#line 102 "Parser.y"
     function yy_r9(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1713 "Parser.php"
-#line 104 "Parser.y"
+#line 1729 "Parser.php"
+#line 107 "Parser.y"
     function yy_r14(){ $this->_retvalue = array('operation' => 'include', $this->yystack[$this->yyidx + -1]->minor);     }
-#line 1716 "Parser.php"
-#line 108 "Parser.y"
+#line 1732 "Parser.php"
+#line 111 "Parser.y"
     function yy_r18(){ 
     $this->yystack[$this->yyidx + -5]->minor = strtolower($this->yystack[$this->yyidx + -5]->minor);
     if ($this->yystack[$this->yyidx + -5]->minor != 'on' && $this->yystack[$this->yyidx + -5]->minor != 'off') {
@@ -1719,71 +1735,71 @@ static public $yy_action = array(
     }
     $this->_retvalue = array('operation' => 'autoescape', 'value' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1728 "Parser.php"
-#line 122 "Parser.y"
+#line 1744 "Parser.php"
+#line 125 "Parser.y"
     function yy_r19(){
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -1]->minor, 'list'=>array()); 
     }
-#line 1733 "Parser.php"
-#line 125 "Parser.y"
+#line 1749 "Parser.php"
+#line 128 "Parser.y"
     function yy_r20(){
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -3]->minor, 'as' => $this->yystack[$this->yyidx + -1]->minor, 'list'=>array()); 
     }
-#line 1738 "Parser.php"
-#line 128 "Parser.y"
+#line 1754 "Parser.php"
+#line 131 "Parser.y"
     function yy_r21(){ 
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -2]->minor, 'list' => $this->yystack[$this->yyidx + -1]->minor); 
     }
-#line 1743 "Parser.php"
-#line 131 "Parser.y"
+#line 1759 "Parser.php"
+#line 134 "Parser.y"
     function yy_r22(){
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -4]->minor, 'as' => $this->yystack[$this->yyidx + -1]->minor, 'list' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1748 "Parser.php"
-#line 136 "Parser.y"
+#line 1764 "Parser.php"
+#line 139 "Parser.y"
     function yy_r23(){
     if ('end'.$this->yystack[$this->yyidx + -5]->minor != $this->yystack[$this->yyidx + -1]->minor) { 
         $this->error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor); 
     } 
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'list' => array());
     }
-#line 1756 "Parser.php"
-#line 142 "Parser.y"
+#line 1772 "Parser.php"
+#line 145 "Parser.y"
     function yy_r24(){
     if ('end'.$this->yystack[$this->yyidx + -6]->minor != $this->yystack[$this->yyidx + -1]->minor) { 
         $this->error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor); 
     } 
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -6]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'list' => $this->yystack[$this->yyidx + -5]->minor);
     }
-#line 1764 "Parser.php"
-#line 150 "Parser.y"
+#line 1780 "Parser.php"
+#line 153 "Parser.y"
     function yy_r25(){
     if ('endspacefull' != $this->yystack[$this->yyidx + -1]->minor) {
         $this->error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor);
     } 
     $this->_retvalue = array('operation' => 'spacefull', 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1772 "Parser.php"
-#line 158 "Parser.y"
+#line 1788 "Parser.php"
+#line 161 "Parser.y"
     function yy_r26(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endwith") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endwith");
     }
     $this->_retvalue = array('operation' => 'alias', 'var' => $this->yystack[$this->yyidx + -7]->minor, 'as' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1780 "Parser.php"
-#line 166 "Parser.y"
+#line 1796 "Parser.php"
+#line 169 "Parser.y"
     function yy_r27(){ $this->_retvalue = array('operation' => 'set', 'var' => $this->yystack[$this->yyidx + -2]->minor,'expr' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1783 "Parser.php"
-#line 168 "Parser.y"
+#line 1799 "Parser.php"
+#line 171 "Parser.y"
     function yy_r29(){
     if (!is_file($this->yystack[$this->yyidx + 0]->minor) || !Haanga_Compiler::getOption('enable_load')) {
         $this->error($this->yystack[$this->yyidx + 0]->minor." is not a valid file"); 
     } 
     require_once $this->yystack[$this->yyidx + 0]->minor;
     }
-#line 1791 "Parser.php"
-#line 177 "Parser.y"
+#line 1807 "Parser.php"
+#line 180 "Parser.y"
     function yy_r30(){
     $var = $this->compiler->get_context($this->yystack[$this->yyidx + -1]->minor[0]);
     if (is_array($var) || $var instanceof Iterator) {
@@ -1792,8 +1808,8 @@ static public $yy_action = array(
     }
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -3]->minor, 'index' => NULL, 'array' => $this->yystack[$this->yyidx + -1]->minor);
     }
-#line 1801 "Parser.php"
-#line 185 "Parser.y"
+#line 1817 "Parser.php"
+#line 188 "Parser.y"
     function yy_r31(){
     $var = $this->compiler->get_context($this->yystack[$this->yyidx + -1]->minor[0]);
     if (is_array($var) || $var instanceof Iterator) {
@@ -1803,8 +1819,8 @@ static public $yy_action = array(
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -3]->minor, 'index' => $this->yystack[$this->yyidx + -5]->minor, 'array' => $this->yystack[$this->yyidx + -1]->minor);
 
     }
-#line 1812 "Parser.php"
-#line 195 "Parser.y"
+#line 1828 "Parser.php"
+#line 198 "Parser.y"
     function yy_r32(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
@@ -1812,24 +1828,24 @@ static public $yy_action = array(
     $this->_retvalue = $this->yystack[$this->yyidx + -4]->minor;
     $this->_retvalue['body'] = $this->yystack[$this->yyidx + -3]->minor;
     }
-#line 1821 "Parser.php"
-#line 203 "Parser.y"
+#line 1837 "Parser.php"
+#line 206 "Parser.y"
     function yy_r33(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
     }
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -7]->minor, 'range' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'variable' => $this->yystack[$this->yyidx + -7]->minor, 'step' => 1);
     }
-#line 1829 "Parser.php"
-#line 210 "Parser.y"
+#line 1845 "Parser.php"
+#line 213 "Parser.y"
     function yy_r34(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
     }
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -9]->minor, 'range' => $this->yystack[$this->yyidx + -7]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'variable' => $this->yystack[$this->yyidx + -9]->minor, 'step' => $this->yystack[$this->yyidx + -5]->minor);
     }
-#line 1837 "Parser.php"
-#line 217 "Parser.y"
+#line 1853 "Parser.php"
+#line 220 "Parser.y"
     function yy_r35(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
@@ -1838,462 +1854,476 @@ static public $yy_action = array(
     $this->_retvalue['body']  = $this->yystack[$this->yyidx + -7]->minor;
     $this->_retvalue['empty'] = $this->yystack[$this->yyidx + -3]->minor;
     }
-#line 1847 "Parser.php"
-#line 226 "Parser.y"
+#line 1863 "Parser.php"
+#line 229 "Parser.y"
     function yy_r36(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endif") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endif");
     }
     $this->_retvalue = array('operation' => 'if', 'expr' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1855 "Parser.php"
-#line 232 "Parser.y"
+#line 1871 "Parser.php"
+#line 235 "Parser.y"
     function yy_r37(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endif") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endif");
     }
     $this->_retvalue = array('operation' => 'if', 'expr' => $this->yystack[$this->yyidx + -9]->minor, 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1863 "Parser.php"
-#line 240 "Parser.y"
+#line 1879 "Parser.php"
+#line 243 "Parser.y"
     function yy_r38(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1871 "Parser.php"
-#line 247 "Parser.y"
+#line 1887 "Parser.php"
+#line 250 "Parser.y"
     function yy_r39(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -3]->minor, 'check' => $this->yystack[$this->yyidx + -5]->minor);
     }
-#line 1879 "Parser.php"
-#line 253 "Parser.y"
+#line 1895 "Parser.php"
+#line 256 "Parser.y"
     function yy_r40(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1887 "Parser.php"
-#line 260 "Parser.y"
+#line 1903 "Parser.php"
+#line 263 "Parser.y"
     function yy_r41(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -7]->minor, 'check' => $this->yystack[$this->yyidx + -9]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1895 "Parser.php"
-#line 268 "Parser.y"
+#line 1911 "Parser.php"
+#line 271 "Parser.y"
     function yy_r42(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '==', 1 => $this->yystack[$this->yyidx + -6]->minor, 2 => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1903 "Parser.php"
-#line 274 "Parser.y"
+#line 1919 "Parser.php"
+#line 277 "Parser.y"
     function yy_r43(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '==', 1 => $this->yystack[$this->yyidx + -10]->minor, 2 => $this->yystack[$this->yyidx + -9]->minor, 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1911 "Parser.php"
-#line 280 "Parser.y"
+#line 1927 "Parser.php"
+#line 283 "Parser.y"
     function yy_r44(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifnotequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifnotequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '!=', 1 => $this->yystack[$this->yyidx + -6]->minor, 2 => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1919 "Parser.php"
-#line 286 "Parser.y"
+#line 1935 "Parser.php"
+#line 289 "Parser.y"
     function yy_r45(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifnotequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifnotequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '!=', 1 => $this->yystack[$this->yyidx + -10]->minor, 2 => $this->yystack[$this->yyidx + -9]->minor, 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1927 "Parser.php"
-#line 294 "Parser.y"
+#line 1943 "Parser.php"
+#line 297 "Parser.y"
     function yy_r46(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endblock") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endblock");
     }
     $this->_retvalue = array('operation' => 'block', 'name' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1935 "Parser.php"
-#line 301 "Parser.y"
+#line 1951 "Parser.php"
+#line 304 "Parser.y"
     function yy_r47(){
     if ($this->yystack[$this->yyidx + -2]->minor != "endblock") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -2]->minor.", expecting endblock");
     }
     $this->_retvalue = array('operation' => 'block', 'name' => $this->yystack[$this->yyidx + -6]->minor, 'body' => $this->yystack[$this->yyidx + -4]->minor); 
     }
-#line 1943 "Parser.php"
-#line 308 "Parser.y"
+#line 1959 "Parser.php"
+#line 311 "Parser.y"
     function yy_r48(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endblock") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endblock");
     }
     $this->_retvalue = array('operation' => 'block', 'name' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1951 "Parser.php"
-#line 323 "Parser.y"
+#line 1967 "Parser.php"
+#line 326 "Parser.y"
     function yy_r50(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endfilter") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfilter");
     }
     $this->_retvalue = array('operation' => 'filter', 'functions' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1959 "Parser.php"
-#line 331 "Parser.y"
-    function yy_r51(){ $this->_retvalue=array('operation' => 'regroup', 'array' => $this->yystack[$this->yyidx + -4]->minor, 'row' => $this->yystack[$this->yyidx + -2]->minor, 'as' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1962 "Parser.php"
+#line 1975 "Parser.php"
 #line 334 "Parser.y"
+    function yy_r51(){ $this->_retvalue=array('operation' => 'regroup', 'array' => $this->yystack[$this->yyidx + -4]->minor, 'row' => $this->yystack[$this->yyidx + -2]->minor, 'as' => $this->yystack[$this->yyidx + 0]->minor);     }
+#line 1978 "Parser.php"
+#line 337 "Parser.y"
     function yy_r52(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1965 "Parser.php"
-#line 335 "Parser.y"
+#line 1981 "Parser.php"
+#line 338 "Parser.y"
     function yy_r53(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);     }
-#line 1968 "Parser.php"
-#line 337 "Parser.y"
+#line 1984 "Parser.php"
+#line 340 "Parser.y"
     function yy_r54(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, 'args'=>array($this->yystack[$this->yyidx + 0]->minor));     }
-#line 1971 "Parser.php"
-#line 341 "Parser.y"
+#line 1987 "Parser.php"
+#line 344 "Parser.y"
     function yy_r56(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1974 "Parser.php"
-#line 347 "Parser.y"
+#line 1990 "Parser.php"
+#line 350 "Parser.y"
     function yy_r59(){ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1977 "Parser.php"
-#line 348 "Parser.y"
+#line 1993 "Parser.php"
+#line 351 "Parser.y"
     function yy_r60(){ $this->_retvalue = array('number' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1980 "Parser.php"
-#line 349 "Parser.y"
+#line 1996 "Parser.php"
+#line 352 "Parser.y"
     function yy_r61(){ $this->_retvalue = trim(@$this->yystack[$this->yyidx + 0]->minor);     }
-#line 1983 "Parser.php"
-#line 350 "Parser.y"
-    function yy_r62(){ $this->_retvalue = array('string' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1986 "Parser.php"
+#line 1999 "Parser.php"
 #line 353 "Parser.y"
+    function yy_r62(){ $this->_retvalue = array('string' => $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2002 "Parser.php"
+#line 356 "Parser.y"
     function yy_r63(){ $this->_retvalue = array('var_filter' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1989 "Parser.php"
-#line 363 "Parser.y"
+#line 2005 "Parser.php"
+#line 366 "Parser.y"
     function yy_r69(){ $this->_retvalue = array('op_expr' => 'not', $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1992 "Parser.php"
-#line 364 "Parser.y"
-    function yy_r70(){ $this->_retvalue = array('op_expr' => @$this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1995 "Parser.php"
+#line 2008 "Parser.php"
 #line 367 "Parser.y"
+    function yy_r70(){ $this->_retvalue = array('op_expr' => @$this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2011 "Parser.php"
+#line 370 "Parser.y"
     function yy_r73(){ $this->_retvalue = array('op_expr' => trim(@$this->yystack[$this->yyidx + -1]->minor), $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1998 "Parser.php"
-#line 369 "Parser.y"
+#line 2014 "Parser.php"
+#line 372 "Parser.y"
     function yy_r75(){ $this->_retvalue = array('op_expr' => 'expr', array('op_expr' => @$this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor));     }
-#line 2001 "Parser.php"
-#line 370 "Parser.y"
+#line 2017 "Parser.php"
+#line 373 "Parser.y"
     function yy_r76(){ $this->_retvalue = array('op_expr' => 'expr', $this->yystack[$this->yyidx + -1]->minor);     }
-#line 2004 "Parser.php"
-#line 375 "Parser.y"
+#line 2020 "Parser.php"
+#line 378 "Parser.y"
     function yy_r78(){ $this->_retvalue = current($this->compiler->generate_variable_name($this->yystack[$this->yyidx + 0]->minor, false));     }
-#line 2007 "Parser.php"
-#line 376 "Parser.y"
+#line 2023 "Parser.php"
+#line 380 "Parser.y"
     function yy_r79(){ 
     if (!is_array($this->yystack[$this->yyidx + -2]->minor)) { $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor); } 
     else { $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; }  $this->_retvalue[]=array('object' => $this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2013 "Parser.php"
-#line 380 "Parser.y"
+#line 2029 "Parser.php"
+#line 385 "Parser.y"
     function yy_r80(){ 
     if (!is_array($this->yystack[$this->yyidx + -2]->minor)) { $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor); } 
     else { $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; }  $this->_retvalue[]=array('class' => '$'.$this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2019 "Parser.php"
-#line 384 "Parser.y"
+#line 2035 "Parser.php"
+#line 390 "Parser.y"
     function yy_r81(){
     if (!is_array($this->yystack[$this->yyidx + -3]->minor)) { $this->_retvalue = array($this->yystack[$this->yyidx + -3]->minor); } 
     else { $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor; }  $this->_retvalue[]=$this->yystack[$this->yyidx + -1]->minor;
     }
-#line 2025 "Parser.php"
-#line 392 "Parser.y"
+#line 2041 "Parser.php"
+#line 399 "Parser.y"
     function yy_r84(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2028 "Parser.php"
-#line 398 "Parser.y"
+#line 2044 "Parser.php"
+#line 405 "Parser.y"
     function yy_r88(){ $this->_retvalue = -1 * ($this->yystack[$this->yyidx + 0]->minor);     }
-#line 2031 "Parser.php"
-
-    /**
-     * placeholder for the left hand side in a reduce operation.
-     * 
-     * For a parser with a rule like this:
-     * <pre>
-     * rule(A) ::= B. { A = 1; }
-     * </pre>
-     * 
-     * The parser will translate to something like:
-     * 
-     * <code>
-     * function yy_r0(){$this->_retvalue = 1;}
-     * </code>
-     */
-    private $_retvalue;
-
-    /**
-     * Perform a reduce action and the shift that must immediately
-     * follow the reduce.
-     * 
-     * For a rule such as:
-     * 
-     * <pre>
-     * A ::= B blah C. { dosomething(); }
-     * </pre>
-     * 
-     * This function will first call the action, if any, ("dosomething();" in our
-     * example), and then it will pop three states from the stack,
-     * one for each entry on the right-hand side of the expression
-     * (B, blah, and C in our example rule), and then push the result of the action
-     * back on to the stack with the resulting state reduced to (as described in the .out
-     * file)
-     * @param int Number of the rule by which to reduce
-     */
-    function yy_reduce($yyruleno)
-    {
-        //int $yygoto;                     /* The next state */
-        //int $yyact;                      /* The next action */
-        //mixed $yygotominor;        /* The LHS of the rule reduced */
-        //Haanga_yyStackEntry $yymsp;            /* The top of the parser's stack */
-        //int $yysize;                     /* Amount to pop the stack */
-        $yymsp = $this->yystack[$this->yyidx];
-        if (self::$yyTraceFILE && $yyruleno >= 0 
-              && $yyruleno < count(self::$yyRuleName)) {
-            fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n",
-                self::$yyTracePrompt, $yyruleno,
-                self::$yyRuleName[$yyruleno]);
-        }
-
-        $this->_retvalue = $yy_lefthand_side = null;
-        if (array_key_exists($yyruleno, self::$yyReduceMap)) {
-            // call the action
-            $this->_retvalue = null;
-            $this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
-            $yy_lefthand_side = $this->_retvalue;
-        }
-        $yygoto = self::$yyRuleInfo[$yyruleno]['lhs'];
-        $yysize = self::$yyRuleInfo[$yyruleno]['rhs'];
-        $this->yyidx -= $yysize;
-        for($i = $yysize; $i; $i--) {
-            // pop all of the right-hand side parameters
-            array_pop($this->yystack);
-        }
-        $yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
-        if ($yyact < self::YYNSTATE) {
-            /* If we are not debugging and the reduce action popped at least
-            ** one element off the stack, then we can push the new element back
-            ** onto the stack here, and skip the stack overflow test in yy_shift().
-            ** That gives a significant speed improvement. */
-            if (!self::$yyTraceFILE && $yysize) {
-                $this->yyidx++;
-                $x = new Haanga_yyStackEntry;
-                $x->stateno = $yyact;
-                $x->major = $yygoto;
-                $x->minor = $yy_lefthand_side;
-                $this->yystack[$this->yyidx] = $x;
-            } else {
-                $this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
-            }
-        } elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) {
-            $this->yy_accept();
-        }
-    }
-
-    /**
-     * The following code executes when the parse fails
-     * 
-     * Code from %parse_fail is inserted here
-     */
-    function yy_parse_failed()
-    {
-        if (self::$yyTraceFILE) {
-            fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt);
-        }
-        while ($this->yyidx >= 0) {
-            $this->yy_pop_parser_stack();
-        }
-        /* Here code is inserted which will be executed whenever the
-        ** parser fails */
-    }
-
-    /**
-     * The following code executes when a syntax error first occurs.
-     * 
-     * %syntax_error code is inserted here
-     * @param int The major type of the error token
-     * @param mixed The minor type of the error token
-     */
-    function yy_syntax_error($yymajor, $TOKEN)
-    {
+#line 2047 "Parser.php"
+
+    /**
+     * placeholder for the left hand side in a reduce operation.
+     * 
+     * For a parser with a rule like this:
+     * <pre>
+     * rule(A) ::= B. { A = 1; }
+     * </pre>
+     * 
+     * The parser will translate to something like:
+     * 
+     * <code>
+     * function yy_r0(){$this->_retvalue = 1;}
+     * </code>
+     */
+    private $_retvalue;
+
+    /**
+     * Perform a reduce action and the shift that must immediately
+     * follow the reduce.
+     * 
+     * For a rule such as:
+     * 
+     * <pre>
+     * A ::= B blah C. { dosomething(); }
+     * </pre>
+     * 
+     * This function will first call the action, if any, ("dosomething();" in our
+     * example), and then it will pop three states from the stack,
+     * one for each entry on the right-hand side of the expression
+     * (B, blah, and C in our example rule), and then push the result of the action
+     * back on to the stack with the resulting state reduced to (as described in the .out
+     * file)
+     * @param int Number of the rule by which to reduce
+     */
+    function yy_reduce($yyruleno)
+    {
+        //int $yygoto;                     /* The next state */
+        //int $yyact;                      /* The next action */
+        //mixed $yygotominor;        /* The LHS of the rule reduced */
+        //Haanga_yyStackEntry $yymsp;            /* The top of the parser's stack */
+        //int $yysize;                     /* Amount to pop the stack */
+        $yymsp = $this->yystack[$this->yyidx];
+        if (self::$yyTraceFILE && $yyruleno >= 0 
+              && $yyruleno < count(self::$yyRuleName)) {
+            fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n",
+                self::$yyTracePrompt, $yyruleno,
+                self::$yyRuleName[$yyruleno]);
+        }
+
+        $this->_retvalue = $yy_lefthand_side = null;
+        if (array_key_exists($yyruleno, self::$yyReduceMap)) {
+            // call the action
+            $this->_retvalue = null;
+            $this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
+            $yy_lefthand_side = $this->_retvalue;
+        }
+        $yygoto = self::$yyRuleInfo[$yyruleno]['lhs'];
+        $yysize = self::$yyRuleInfo[$yyruleno]['rhs'];
+        $this->yyidx -= $yysize;
+        for ($i = $yysize; $i; $i--) {
+            // pop all of the right-hand side parameters
+            array_pop($this->yystack);
+        }
+        $yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
+        if ($yyact < self::YYNSTATE) {
+            /* If we are not debugging and the reduce action popped at least
+            ** one element off the stack, then we can push the new element back
+            ** onto the stack here, and skip the stack overflow test in yy_shift().
+            ** That gives a significant speed improvement. */
+            if (!self::$yyTraceFILE && $yysize) {
+                $this->yyidx++;
+                $x = new Haanga_yyStackEntry;
+                $x->stateno = $yyact;
+                $x->major = $yygoto;
+                $x->minor = $yy_lefthand_side;
+                $this->yystack[$this->yyidx] = $x;
+            } else {
+                $this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
+            }
+        } elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) {
+            $this->yy_accept();
+        }
+    }
+
+    /**
+     * The following code executes when the parse fails
+     * 
+     * Code from %parse_fail is inserted here
+     */
+    function yy_parse_failed()
+    {
+        if (self::$yyTraceFILE) {
+            fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt);
+        }
+        while ($this->yyidx >= 0) {
+            $this->yy_pop_parser_stack();
+        }
+        /* Here code is inserted which will be executed whenever the
+        ** parser fails */
+    }
+
+    /**
+     * The following code executes when a syntax error first occurs.
+     * 
+     * %syntax_error code is inserted here
+     * @param int The major type of the error token
+     * @param mixed The minor type of the error token
+     */
+    function yy_syntax_error($yymajor, $TOKEN)
+    {
 #line 71 "Parser.y"
 
     $expect = array();
     foreach ($this->yy_get_expected_tokens($yymajor) as $token) {
         $expect[] = self::$yyTokenName[$token];
     }
-    $this->Error('Unexpected ' . $this->tokenName($yymajor) . '(' . $TOKEN. '), expected one of: ' . implode(',', $expect));
-#line 2151 "Parser.php"
-    }
-
-    /**
-     * The following is executed when the parser accepts
-     * 
-     * %parse_accept code is inserted here
-     */
-    function yy_accept()
-    {
-        if (self::$yyTraceFILE) {
-            fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt);
-        }
-        while ($this->yyidx >= 0) {
-            $stack = $this->yy_pop_parser_stack();
-        }
-        /* Here code is inserted which will be executed whenever the
-        ** parser accepts */
+    $this->Error('Unexpected ' . $this->tokenName($yymajor) . '(' . $TOKEN. ')');
+#line 2167 "Parser.php"
+    }
+
+    /**
+     * The following is executed when the parser accepts
+     * 
+     * %parse_accept code is inserted here
+     */
+    function yy_accept()
+    {
+        if (self::$yyTraceFILE) {
+            fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt);
+        }
+        while ($this->yyidx >= 0) {
+            $stack = $this->yy_pop_parser_stack();
+        }
+        /* Here code is inserted which will be executed whenever the
+        ** parser accepts */
 #line 57 "Parser.y"
 
-#line 2172 "Parser.php"
-    }
-
-    /**
-     * The main parser program.
-     * 
-     * The first argument is the major token number.  The second is
-     * the token value string as scanned from the input.
-     *
-     * @param int the token number
-     * @param mixed the token value
-     * @param mixed any extra arguments that should be passed to handlers
-     */
-    function doParse($yymajor, $yytokenvalue)
-    {
-//        $yyact;            /* The parser action. */
-//        $yyendofinput;     /* True if we are at the end of input */
-        $yyerrorhit = 0;   /* True if yymajor has invoked an error */
-        
-        /* (re)initialize the parser, if necessary */
-        if ($this->yyidx === null || $this->yyidx < 0) {
-            /* if ($yymajor == 0) return; // not sure why this was here... */
-            $this->yyidx = 0;
-            $this->yyerrcnt = -1;
-            $x = new Haanga_yyStackEntry;
-            $x->stateno = 0;
-            $x->major = 0;
-            $this->yystack = array();
-            array_push($this->yystack, $x);
-        }
-        $yyendofinput = ($yymajor==0);
-        
-        if (self::$yyTraceFILE) {
-            fprintf(self::$yyTraceFILE, "%sInput %s\n",
-                self::$yyTracePrompt, self::$yyTokenName[$yymajor]);
-        }
-        
-        do {
-            $yyact = $this->yy_find_shift_action($yymajor);
-            if ($yymajor < self::YYERRORSYMBOL &&
-                  !$this->yy_is_expected_token($yymajor)) {
-                // force a syntax error
-                $yyact = self::YY_ERROR_ACTION;
-            }
-            if ($yyact < self::YYNSTATE) {
-                $this->yy_shift($yyact, $yymajor, $yytokenvalue);
-                $this->yyerrcnt--;
-                if ($yyendofinput && $this->yyidx >= 0) {
-                    $yymajor = 0;
-                } else {
-                    $yymajor = self::YYNOCODE;
-                }
-            } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
-                $this->yy_reduce($yyact - self::YYNSTATE);
-            } elseif ($yyact == self::YY_ERROR_ACTION) {
-                if (self::$yyTraceFILE) {
-                    fprintf(self::$yyTraceFILE, "%sSyntax Error!\n",
-                        self::$yyTracePrompt);
-                }
-                if (self::YYERRORSYMBOL) {
-                    /* A syntax error has occurred.
-                    ** The response to an error depends upon whether or not the
-                    ** grammar defines an error token "ERROR".  
-                    **
-                    ** This is what we do if the grammar does define ERROR:
-                    **
-                    **  * Call the %syntax_error function.
-                    **
-                    **  * Begin popping the stack until we enter a state where
-                    **    it is legal to shift the error symbol, then shift
-                    **    the error symbol.
-                    **
-                    **  * Set the error count to three.
-                    **
-                    **  * Begin accepting and shifting new tokens.  No new error
-                    **    processing will occur until three tokens have been
-                    **    shifted successfully.
-                    **
-                    */
-                    if ($this->yyerrcnt < 0) {
-                        $this->yy_syntax_error($yymajor, $yytokenvalue);
-                    }
-                    $yymx = $this->yystack[$this->yyidx]->major;
-                    if ($yymx == self::YYERRORSYMBOL || $yyerrorhit ){
-                        if (self::$yyTraceFILE) {
-                            fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n",
-                                self::$yyTracePrompt, self::$yyTokenName[$yymajor]);
-                        }
-                        $this->yy_destructor($yymajor, $yytokenvalue);
-                        $yymajor = self::YYNOCODE;
-                    } else {
-                        while ($this->yyidx >= 0 &&
-                                 $yymx != self::YYERRORSYMBOL &&
-        ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
-                              ){
-                            $this->yy_pop_parser_stack();
-                        }
-                        if ($this->yyidx < 0 || $yymajor==0) {
-                            $this->yy_destructor($yymajor, $yytokenvalue);
-                            $this->yy_parse_failed();
-                            $yymajor = self::YYNOCODE;
-                        } elseif ($yymx != self::YYERRORSYMBOL) {
-                            $u2 = 0;
-                            $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
-                        }
-                    }
-                    $this->yyerrcnt = 3;
-                    $yyerrorhit = 1;
-                } else {
-                    /* YYERRORSYMBOL is not defined */
-                    /* This is what we do if the grammar does not define ERROR:
-                    **
-                    **  * Report an error message, and throw away the input token.
-                    **
-                    **  * If the input token is $, then fail the parse.
-                    **
-                    ** As before, subsequent error messages are suppressed until
-                    ** three input tokens have been successfully shifted.
-                    */
-                    if ($this->yyerrcnt <= 0) {
-                        $this->yy_syntax_error($yymajor, $yytokenvalue);
-                    }
-                    $this->yyerrcnt = 3;
-                    $this->yy_destructor($yymajor, $yytokenvalue);
-                    if ($yyendofinput) {
-                        $this->yy_parse_failed();
-                    }
-                    $yymajor = self::YYNOCODE;
-                }
-            } else {
-                $this->yy_accept();
-                $yymajor = self::YYNOCODE;
-            }            
-        } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
-    }
-}
\ No newline at end of file
+#line 2188 "Parser.php"
+    }
+
+    /**
+     * The main parser program.
+     * 
+     * The first argument is the major token number.  The second is
+     * the token value string as scanned from the input.
+     *
+     * @param int   $yymajor      the token number
+     * @param mixed $yytokenvalue the token value
+     * @param mixed ...           any extra arguments that should be passed to handlers
+     *
+     * @return void
+     */
+    function doParse($yymajor, $yytokenvalue)
+    {
+//        $yyact;            /* The parser action. */
+//        $yyendofinput;     /* True if we are at the end of input */
+        $yyerrorhit = 0;   /* True if yymajor has invoked an error */
+        
+        /* (re)initialize the parser, if necessary */
+        if ($this->yyidx === null || $this->yyidx < 0) {
+            /* if ($yymajor == 0) return; // not sure why this was here... */
+            $this->yyidx = 0;
+            $this->yyerrcnt = -1;
+            $x = new Haanga_yyStackEntry;
+            $x->stateno = 0;
+            $x->major = 0;
+            $this->yystack = array();
+            array_push($this->yystack, $x);
+        }
+        $yyendofinput = ($yymajor==0);
+        
+        if (self::$yyTraceFILE) {
+            fprintf(
+                self::$yyTraceFILE,
+                "%sInput %s\n",
+                self::$yyTracePrompt,
+                self::$yyTokenName[$yymajor]
+            );
+        }
+        
+        do {
+            $yyact = $this->yy_find_shift_action($yymajor);
+            if ($yymajor < self::YYERRORSYMBOL
+                && !$this->yy_is_expected_token($yymajor)
+            ) {
+                // force a syntax error
+                $yyact = self::YY_ERROR_ACTION;
+            }
+            if ($yyact < self::YYNSTATE) {
+                $this->yy_shift($yyact, $yymajor, $yytokenvalue);
+                $this->yyerrcnt--;
+                if ($yyendofinput && $this->yyidx >= 0) {
+                    $yymajor = 0;
+                } else {
+                    $yymajor = self::YYNOCODE;
+                }
+            } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
+                $this->yy_reduce($yyact - self::YYNSTATE);
+            } elseif ($yyact == self::YY_ERROR_ACTION) {
+                if (self::$yyTraceFILE) {
+                    fprintf(
+                        self::$yyTraceFILE,
+                        "%sSyntax Error!\n",
+                        self::$yyTracePrompt
+                    );
+                }
+                if (self::YYERRORSYMBOL) {
+                    /* A syntax error has occurred.
+                    ** The response to an error depends upon whether or not the
+                    ** grammar defines an error token "ERROR".  
+                    **
+                    ** This is what we do if the grammar does define ERROR:
+                    **
+                    **  * Call the %syntax_error function.
+                    **
+                    **  * Begin popping the stack until we enter a state where
+                    **    it is legal to shift the error symbol, then shift
+                    **    the error symbol.
+                    **
+                    **  * Set the error count to three.
+                    **
+                    **  * Begin accepting and shifting new tokens.  No new error
+                    **    processing will occur until three tokens have been
+                    **    shifted successfully.
+                    **
+                    */
+                    if ($this->yyerrcnt < 0) {
+                        $this->yy_syntax_error($yymajor, $yytokenvalue);
+                    }
+                    $yymx = $this->yystack[$this->yyidx]->major;
+                    if ($yymx == self::YYERRORSYMBOL || $yyerrorhit ) {
+                        if (self::$yyTraceFILE) {
+                            fprintf(
+                                self::$yyTraceFILE,
+                                "%sDiscard input token %s\n",
+                                self::$yyTracePrompt,
+                                self::$yyTokenName[$yymajor]
+                            );
+                        }
+                        $this->yy_destructor($yymajor, $yytokenvalue);
+                        $yymajor = self::YYNOCODE;
+                    } else {
+                        while ($this->yyidx >= 0
+                            && $yymx != self::YYERRORSYMBOL
+                            && ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
+                        ) {
+                            $this->yy_pop_parser_stack();
+                        }
+                        if ($this->yyidx < 0 || $yymajor==0) {
+                            $this->yy_destructor($yymajor, $yytokenvalue);
+                            $this->yy_parse_failed();
+                            $yymajor = self::YYNOCODE;
+                        } elseif ($yymx != self::YYERRORSYMBOL) {
+                            $u2 = 0;
+                            $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
+                        }
+                    }
+                    $this->yyerrcnt = 3;
+                    $yyerrorhit = 1;
+                } else {
+                    /* YYERRORSYMBOL is not defined */
+                    /* This is what we do if the grammar does not define ERROR:
+                    **
+                    **  * Report an error message, and throw away the input token.
+                    **
+                    **  * If the input token is $, then fail the parse.
+                    **
+                    ** As before, subsequent error messages are suppressed until
+                    ** three input tokens have been successfully shifted.
+                    */
+                    if ($this->yyerrcnt <= 0) {
+                        $this->yy_syntax_error($yymajor, $yytokenvalue);
+                    }
+                    $this->yyerrcnt = 3;
+                    $this->yy_destructor($yymajor, $yytokenvalue);
+                    if ($yyendofinput) {
+                        $this->yy_parse_failed();
+                    }
+                    $yymajor = self::YYNOCODE;
+                }
+            } else {
+                $this->yy_accept();
+                $yymajor = self::YYNOCODE;
+            }            
+        } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
+    }
+}
diff --git a/lib/Haanga/lib/Haanga/Compiler/Parser.y b/lib/Haanga/lib/Haanga/Compiler/Parser.y
index 445dc3851a3e71c65fb3f851966e7d6d527ebc5b..ee70e510a06946a7761a3bb69b935c0c032cfc60 100644
--- a/lib/Haanga/lib/Haanga/Compiler/Parser.y
+++ b/lib/Haanga/lib/Haanga/Compiler/Parser.y
@@ -74,7 +74,7 @@
     foreach ($this->yy_get_expected_tokens($yymajor) as $token) {
         $expect[] = self::$yyTokenName[$token];
     }
-    $this->Error('Unexpected ' . $this->tokenName($yymajor) . '(' . $TOKEN. '), expected one of: ' . implode(',', $expect));
+    $this->Error('Unexpected ' . $this->tokenName($yymajor) . '(' . $TOKEN. ')');
 }
 
 
@@ -379,21 +379,25 @@ expr(A) ::= fvar_or_string(B). { A = B; }
 /* Variable name */
 
 varname(A) ::= varpart(B). { A = current($this->compiler->generate_variable_name(B, false)); }
-varpart(A) ::= varname(B) T_OBJ|T_DOT T_ALPHA|T_CUSTOM_TAG|T_CUSTOM_BLOCK(C). { 
+
+varpart(A) ::= varpart(B) T_OBJ|T_DOT varpart_single(C). { 
     if (!is_array(B)) { A = array(B); } 
     else { A = B; }  A[]=array('object' => C);
 }
-varpart(A) ::= varname(B) T_CLASS T_ALPHA|T_CUSTOM_TAG|T_CUSTOM_BLOCK(C). { 
+
+varpart(A) ::= varpart(B) T_CLASS varpart_single(C). { 
     if (!is_array(B)) { A = array(B); } 
     else { A = B; }  A[]=array('class' => '$'.C);
 }
-varpart(A) ::= varname(B) T_BRACKETS_OPEN var_or_string(C) T_BRACKETS_CLOSE. {
+
+varpart(A) ::= varpart(B) T_BRACKETS_OPEN var_or_string(C) T_BRACKETS_CLOSE. {
     if (!is_array(B)) { A = array(B); } 
     else { A = B; }  A[]=C;
 }
-varpart(A) ::= T_ALPHA(B). { A = B; } 
+varpart(A) ::= varpart_single(B). { A = B; }
+
 /* T_BLOCK|T_CUSTOM|T_CUSTOM_BLOCK are also T_ALPHA */
-varpart(A) ::= T_BLOCK|T_CUSTOM_TAG|T_CUSTOM_BLOCK(B). { A = B; } 
+varpart_single(A) ::= T_ALPHA|T_BLOCK|T_CUSTOM_TAG|T_CUSTOM_END|T_CUSTOM_BLOCK(B). { A = B; } 
 
 range(A)  ::= numvar(B) T_DOTDOT numvar(C). { A = array(B, C); }
 
diff --git a/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php b/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php
index 7db11392a1b0cfdcaefe639cd87699d1d5f59349..e618b7a025629bd743b339a5e6664a53848b37c4 100644
--- a/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php
+++ b/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php
@@ -560,7 +560,7 @@ class Haanga_Compiler_Tokenizer
             /* destroy the parser */
             try {
                 $parser->doParse(0,0); 
-            } catch (Exception $e) {}
+            } catch (Exception $y) {}
             throw $e; /* re-throw exception */
         }
 
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Isarray.php b/lib/Haanga/lib/Haanga/Extension/Filter/Isarray.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bf113780f40706f5ca8a6f0e5132b9d8deaeca4
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Isarray.php
@@ -0,0 +1,7 @@
+<?php
+
+class Haanga_Extension_Filter_IsArray
+{
+    public $php_alias = "is_array";
+    public $is_safe = TRUE; /* boolean if safe */
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Length.php b/lib/Haanga/lib/Haanga/Extension/Filter/Length.php
index 60d40594a35372024dca6706b63a68bcdb435356..d0fb526222eff1a0a67b739bfb575686a093a222 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Length.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Length.php
@@ -7,7 +7,6 @@ class Haanga_Extension_Filter_Length
     {
         $count  = hexec('count', $args[0]);
         $strlen = hexec('strlen', $args[0]);
-        $props  = hexec('count', hexec('array_keys', hexec('get_object_vars', $args[0])));
         $guess  = hexpr_cond(hexec('is_array', $args[0]), hexec('count', $args[0]),
                             hexec('strlen', $args[0]));
 
@@ -19,8 +18,6 @@ class Haanga_Extension_Filter_Length
                 return $count;
             } else if  (is_string($value)) {
                 return $strlen;
-            } else if  (is_object($value)) {
-                return $props;
             } else {
                 return $guess;
             }
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Null.php b/lib/Haanga/lib/Haanga/Extension/Filter/Null.php
new file mode 100644
index 0000000000000000000000000000000000000000..ebf3fdfb7cd81a399750e205856dba352d4de526
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Null.php
@@ -0,0 +1,6 @@
+<?php
+
+class Haanga_Extension_Filter_Null
+{
+    public $php_alias = 'is_null';
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Substr.php b/lib/Haanga/lib/Haanga/Extension/Filter/Substr.php
index 34373d58b9ee8b057de18abe7d880eee12729653..35b393a001e150976b81f18d16594e1a9d26a103 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Substr.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Substr.php
@@ -2,7 +2,7 @@
 
 class Haanga_Extension_Filter_Substr
 {
-    public static function generator($compiler, $args)
+    public static function generator($cmp, $args)
     {
         if (count($args) != 2) {
             $cmp->Error("substr parameter must have one param");
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Truncatechars.php b/lib/Haanga/lib/Haanga/Extension/Filter/Truncatechars.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f1f228df6a6a90cd81d8bf1b2b8a187fabd0582
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Truncatechars.php
@@ -0,0 +1,16 @@
+<?php
+
+class Haanga_Extension_Filter_Truncatechars
+{
+    static function main($text, $limit)
+    {
+        if(strlen($text) <= $limit)
+                return $text;
+        $trunctext = substr($text, 0, $limit);
+        $trunctext[$limit-3] = '.';
+        $trunctext[$limit-2] = '.';
+        $trunctext[$limit-1] = '.';
+        return $trunctext;
+    }
+}
+
diff --git a/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php b/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php
index 44fb3ce938f17d18d368f0fa1d32789959ce1e47..e4390b2940d8ec58f548e081f82cd5e40bdd239c 100644
--- a/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php
+++ b/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php
@@ -37,6 +37,9 @@ class Haanga_Extension_Tag_Exec
         $exec->end();
         if ($assign) {
             $code->decl($assign, $exec);
+
+            // make it global
+            $code->decl(hvar('vars', $assign), hvar($assign));
         } else {
             $cmp->do_print($code, $exec);
         }
diff --git a/lib/Haanga/lib/Haanga/Generator/PHP.php b/lib/Haanga/lib/Haanga/Generator/PHP.php
index 1c272c68cea568ed6f53e9fc9bcbe099a2502e6b..addf66453d2605377ac8596832211bc31971a80f 100644
--- a/lib/Haanga/lib/Haanga/Generator/PHP.php
+++ b/lib/Haanga/lib/Haanga/Generator/PHP.php
@@ -331,7 +331,7 @@ class Haanga_Generator_PHP
     {
         $op['array'] = $this->php_get_varname($op['array']);
         $op['value'] = $this->php_get_varname($op['value']);
-        $code = "foreach ({$op['array']} as ";
+        $code = "foreach ((array) {$op['array']} as ";
         if (!isset($op['key'])) {
             $code .= " {$op['value']}";
         } else {
diff --git a/lib/Haanga/tests/assert_templates/bug_#14.html b/lib/Haanga/tests/assert_templates/bug_#14.html
new file mode 100644
index 0000000000000000000000000000000000000000..7ed6ff82de6bcc2a78243fc9c54d3ef5ac14da69
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/bug_#14.html
@@ -0,0 +1 @@
+5
diff --git a/lib/Haanga/tests/assert_templates/bug_#14.php b/lib/Haanga/tests/assert_templates/bug_#14.php
new file mode 100644
index 0000000000000000000000000000000000000000..de1a98c0ba5c6ba549f278c684ba7b6e684bb3ae
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/bug_#14.php
@@ -0,0 +1,5 @@
+<?php
+
+$data = array(
+    'endsomething' => array('endbar' => 5),
+);
diff --git a/lib/Haanga/tests/assert_templates/bug_#14.tpl b/lib/Haanga/tests/assert_templates/bug_#14.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..c1a6b843e5ec3489ee796286c2ac9df43eb8b80c
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/bug_#14.tpl
@@ -0,0 +1 @@
+{{ endsomething.endbar }}
diff --git a/lib/Haanga/tests/assert_templates/exec-inc.tpl b/lib/Haanga/tests/assert_templates/exec-inc.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..db8a8a4090c9ec68311e233db93e761cf06852dc
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/exec-inc.tpl
@@ -0,0 +1 @@
+{{ foo }}
diff --git a/lib/Haanga/tests/assert_templates/exec.html.php b/lib/Haanga/tests/assert_templates/exec.html.php
index 0733e2a5a3ac336840764a99b6b493ea96538633..4a179f65ec80f6cc616ab678df2bd659c559c132 100644
--- a/lib/Haanga/tests/assert_templates/exec.html.php
+++ b/lib/Haanga/tests/assert_templates/exec.html.php
@@ -1,2 +1,6 @@
 <?php echo php_uname();?>
 
+
+<?php echo php_uname();?>
+
+
diff --git a/lib/Haanga/tests/assert_templates/exec.tpl b/lib/Haanga/tests/assert_templates/exec.tpl
index 817865a1460c7a8460ad1a612a7ff1b77340bf0e..b57c7e320799cf8884fb8286f1d9b99d72fb6495 100644
--- a/lib/Haanga/tests/assert_templates/exec.tpl
+++ b/lib/Haanga/tests/assert_templates/exec.tpl
@@ -1 +1,3 @@
 {% exec php_uname %}
+{% exec php_uname as foo %}
+{% include "assert_templates/exec-inc.tpl" %}
diff --git a/lib/Haanga/tests/assert_templates/expr.html b/lib/Haanga/tests/assert_templates/expr.html
new file mode 100644
index 0000000000000000000000000000000000000000..39c7ef6e387c80a104f0f935aba476a4964674cc
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/expr.html
@@ -0,0 +1,3 @@
+
+    hola
+
diff --git a/lib/Haanga/tests/assert_templates/expr.php b/lib/Haanga/tests/assert_templates/expr.php
new file mode 100644
index 0000000000000000000000000000000000000000..b80db9ce6ca932b3a73129af3d4b444516245436
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/expr.php
@@ -0,0 +1,8 @@
+<?php
+$data = array(
+    'self' => array(
+        'status' => true,
+        'tiene_negativos' => true,
+        'nsfw' => false,
+    )
+);
diff --git a/lib/Haanga/tests/assert_templates/expr.tpl b/lib/Haanga/tests/assert_templates/expr.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..85ffb69c45da41a86d0fae36a39d9fd3354dec77
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/expr.tpl
@@ -0,0 +1,3 @@
+{% if self.status == 'published' AND self.tiene_negativos AND !self.nsfw  %}
+    hola
+{% endif %}
diff --git a/lib/Haanga/tests/assert_templates/is_array.html b/lib/Haanga/tests/assert_templates/is_array.html
new file mode 100644
index 0000000000000000000000000000000000000000..8180953eec624616e288e98056e86fdb896e2edc
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/is_array.html
@@ -0,0 +1,2 @@
+ true 
+
diff --git a/lib/Haanga/tests/assert_templates/is_array.php b/lib/Haanga/tests/assert_templates/is_array.php
new file mode 100644
index 0000000000000000000000000000000000000000..d07615fe56cc5acc5fd43d76542613276b294fd1
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/is_array.php
@@ -0,0 +1,3 @@
+<?php
+
+$data = array('zfoo' => new stdclass, 'foo' => array());
diff --git a/lib/Haanga/tests/assert_templates/is_array.tpl b/lib/Haanga/tests/assert_templates/is_array.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..18f742972737275535cc9186abf07e74f7c54c8b
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/is_array.tpl
@@ -0,0 +1,2 @@
+{%if foo|isarray %} true {% endif %}
+{%if zfoo|isarray %} true {% endif %}
diff --git a/lib/Haanga/tests/assert_templates/null.html b/lib/Haanga/tests/assert_templates/null.html
new file mode 100644
index 0000000000000000000000000000000000000000..1af338ce1e8aed346e4702a1f50a81810e2a68c9
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/null.html
@@ -0,0 +1,13 @@
+
+    
+        foo is null
+    
+
+    
+        bar is not null
+    
+
+    
+        foobar is not null
+    
+
diff --git a/lib/Haanga/tests/assert_templates/null.php b/lib/Haanga/tests/assert_templates/null.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c0ae20e7a1fab8a4535c927f56b696b447f9b41
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/null.php
@@ -0,0 +1,8 @@
+<?php
+
+$data = array(
+'obj' => array(
+    'foo' => NULL,
+    'bar' => false,
+    'foobar' => 0,
+));
diff --git a/lib/Haanga/tests/assert_templates/null.tpl b/lib/Haanga/tests/assert_templates/null.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..bd47ea72f48bcabcf23765e1b2c04ae37a2b2780
--- /dev/null
+++ b/lib/Haanga/tests/assert_templates/null.tpl
@@ -0,0 +1,7 @@
+{% for k,val in obj %}
+    {% if val|null %}
+        {{ k }} is null
+    {% else %}
+        {{ k }} is not null
+    {% endif %}
+{% endfor %}
diff --git a/models/special.classes.model.html b/models/special.classes.model.html
new file mode 100644
index 0000000000000000000000000000000000000000..754216a5d06ad3f63d94f16f9d259fb1a255a73a
--- /dev/null
+++ b/models/special.classes.model.html
@@ -0,0 +1,8 @@
+{%for h in base.header %}
+PREFIX {{h.prefix}}: <{{h.ns}}>
+{%endfor%}
+SELECT DISTINCT ?resource WHERE {
+  {%if base.args.arg0 %}GRAPH <{{base.args.arg0}}>{ {%endif%}
+  	[] a ?resource .
+  {%if base.args.arg0 %} } {%endif%}
+}
diff --git a/models/special.index.model.html b/models/special.index.model.html
deleted file mode 100644
index e32cb2a17ecb5248772260b936078ae00a52624b..0000000000000000000000000000000000000000
--- a/models/special.index.model.html
+++ /dev/null
@@ -1,3 +0,0 @@
-SELECT DISTINCT ?resource WHERE {
-  	[] a ?resource .
-}
diff --git a/models/special.namedGraphs.model.html b/models/special.namedGraphs.model.html
new file mode 100644
index 0000000000000000000000000000000000000000..b73ae66e3f2a16aed3d8342b2b913e4984f7885a
--- /dev/null
+++ b/models/special.namedGraphs.model.html
@@ -0,0 +1,5 @@
+SELECT DISTINCT ?g WHERE {
+  GRAPH ?g{
+  	?s ?p ?o .
+  }
+}
diff --git a/static/index.html b/static/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..7a29d7e7569c5b9b554bbd8ef752c5c68cf4b90f
--- /dev/null
+++ b/static/index.html
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
+    "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:local="http://localhost/lodspeakr/" 
+    version="XHTML+RDFa 1.0" xml:lang="en">
+  <head>
+    <title>Main</title>
+    <link href="http://localhost/lodspeakr//lodspeakr/css/basic.css" rel="stylesheet" type="text/css" media="screen" />
+  </head>
+  <body>
+    <h1>Services available</h1>
+	<ul>
+        <li><a href='special/classes'>List of classes in the triple store</a></li>
+        <li><a href='special/namedGraphs'>Named graphs in the triple store</a></li>
+    </ul>
+  </body>
+</html>
+
+
diff --git a/utils/install b/utils/install
new file mode 100644
index 0000000000000000000000000000000000000000..29935f55980c9422e4f73ee8790ad5cfe2373b9c
--- /dev/null
+++ b/utils/install
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+# Installation script for LODSPeaKr (http://lodspeakr.org)
+# Author: Alvaro Graves (alvaro@graves.cl)
+# Modified by: Tim Lebo (lebot@rpi.edu)
+
+lodspeakr_repository="git://github.com/alangrafu/lodspeakr.git"
+home=`basename $lodspeakr_repository | sed 's/.git//'`
+
+source ~/.bashrc
+GIT=`which git`
+
+if [ -z "$GIT" ]; then
+  echo "git is required to continue installation. Please add git to your \$PATH."
+  exit 1
+fi
+
+if [ ! -e "$home" ]; then
+   $GIT clone $lodspeakr_repository
+   cd $home
+   ./install.sh
+else
+   echo "There is already an existing directory called '$home'. Installation cancelled. Remove it first and try again."
+fi
diff --git a/utils/link-components.sh b/utils/link-components.sh
new file mode 100755
index 0000000000000000000000000000000000000000..430311398d71bf34fd0b12bf568641ed8752c980
--- /dev/null
+++ b/utils/link-components.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# Script to borrow essential bits ;rom another lodspeakr instance on local machine.
+# Desired when lodspeakr essentials are maintained in a project-specfic repository.
+# Contributed by Tim Lebo when trying to apply lodspeakr for DataFAQs.
+#
+# Usage:
+#  bash-3.2$ pwd
+#  /Applications/XAMPP/htdocs/hello/lodspeakr
+#
+#  bash-3.2$ sudo rm -rf .htaccess settings.inc.php models views
+#
+#  bash-3.2$ sudo /Users/lebo/projects/lodspeakr/github/lodspeakr/utils/link-components.sh /Users/lebo/projects/DataFAQs/github/DataFAQs/ui/configure-epoch/lodspeakr
+#  ln -s /Users/lebo/projects/DataFAQs/github/DataFAQs/ui/configure-epoch/lodspeakr/settings.inc.php settings.inc.php
+#  ln -s /Users/lebo/projects/DataFAQs/github/DataFAQs/ui/configure-epoch/lodspeakr/.htaccess .htaccess
+#  ln -s /Users/lebo/projects/DataFAQs/github/DataFAQs/ui/configure-epoch/lodspeakr/models models
+#  ln -s /Users/lebo/projects/DataFAQs/github/DataFAQs/ui/configure-epoch/lodspeakr/views views
+#
+#  bash-3.2$ sudo /Users/lebo/projects/lodspeakr/github/lodspeakr/utils/link-components.sh /Users/lebo/projects/DataFAQs/github/DataFAQs/ui/configure-epoch/lodspeakr
+#  WARNING: not linking settings.inc.php because it exists.
+#  WARNING: not linking .htaccess because it exists.
+#  WARNING: not linking models because it exists.
+#  WARNING: not linking views because it exists.
+
+essentials='settings.inc.php .htaccess models views'
+if [ $# -lt 1 ]; then
+   echo "usage: `basename $0` other-lodspeakr-directory"
+   echo "  soft links the following from other-lodspeakr-director to current directory: $essentials"
+   exit 1 
+fi
+
+otherDir="$1"
+if [[ ! -d $otherDir && "$otherDir" != "/" ]]; then
+   echo "$otherDir does not exist."
+   exit 1
+fi
+
+for essential in $essentials; do
+   if [[ ! -e $essential && -e $otherDir/$essential ]]; then
+      echo ln -s $otherDir/$essential $essential
+      ln -s $otherDir/$essential
+   else
+      echo "WARNING: not linking $essential because it exists."
+   fi
+done
diff --git a/views/header.inc b/views/header.inc
new file mode 100644
index 0000000000000000000000000000000000000000..adbefad22dc773222ab0ae36e0d78cecb89e691f
--- /dev/null
+++ b/views/header.inc
@@ -0,0 +1,5 @@
+<h4>Endpoint: {{base.endpoint.local}}</h4>
+<div style='float:center'>
+<a href='{{base.home}}'>Home</a> | <a href='{{base.home}}special/classes'>Classes</a> | <a href='{{base.home}}special/namedGraphs'>Named Graphs</a>
+</div>
+
diff --git a/views/rdfs:Resource.view.html b/views/rdfs:Resource.view.html
index b0cb351b4c3c9055da6cfef476274da9601f3a67..59f3631899154cb32d0456a682340ac5adfff40f 100644
--- a/views/rdfs:Resource.view.html
+++ b/views/rdfs:Resource.view.html
@@ -6,6 +6,10 @@
     <head>
     <title>Page about {{base.this.value}}</title>
     <link href="{{base.baseUrl}}/lodspeakr/css/basic.css" rel="stylesheet" type="text/css" media="screen" />
+    <link rel="alternate" type="application/rdf+xml" title="RDF/XML Version" href="{{base.this.value}}.rdf" />
+    <link rel="alternate" type="text/turtle" title="Turtle Version" href="{{base.this.value}}.ttl" />
+    <link rel="alternate" type="text/plain" title="N-Triples Version" href="{{base.this.value}}.nt" />
+    <link rel="alternate" type="application/json" title="RDFJSON Version" href="{{base.this.value}}.json" />
   </head>
   <body about="{{base.this.value}}"> 
     <h1>Page about <a href='{{base.this.value}}'>{{base.this.curie}}</a></h1>
diff --git a/views/special.index.view.html b/views/special.classes.view.html
similarity index 73%
rename from views/special.index.view.html
rename to views/special.classes.view.html
index 7258ca945ff4944e18cd4778493d3482e3a157fa..8a7777fe863303235d9f846e0be11cfbb70b9f00 100644
--- a/views/special.index.view.html
+++ b/views/special.classes.view.html
@@ -9,15 +9,10 @@
   </head>
   <body>
     <h1>Classes available</h1>
+{%include "header.inc"%}
 	<ul>
-	{% if r.resource.value != null %}
-	    <!-- Only one class available -->
-        <li><a href='{{base.baseUrl}}special/instances/{{ r.resource.curie }}'>{{r.resource.curie}}</a></li>
-    {% endif %}
     {% for row in r %}
-      {% if row.resource.value %}
         <li><a href='{{base.baseUrl}}special/instances/{{ row.resource.curie }}'>{{row.resource.curie}}</a></li>
-      {% endif %}
     {% endfor %}
     </ul>
   </body>
diff --git a/views/special.instances.view.html b/views/special.instances.view.html
index 3a8247c16e73456ff2f6f174b70995afaeeebcf6..b164024cf0adbbd522503ca1bd7e72e2066057ae 100644
--- a/views/special.instances.view.html
+++ b/views/special.instances.view.html
@@ -9,6 +9,7 @@
   </head>
   <body>
     <h1>Instances of {{base.args.arg0}}</h1>
+{%include "header.inc"%}
 	<ul>
 	{% for row in r %}
         <li><a href='{{ row.resource.value }}'>{{row.resource.curie}}</a></li>
diff --git a/views/special.namedGraphs.view.html b/views/special.namedGraphs.view.html
new file mode 100644
index 0000000000000000000000000000000000000000..65ee0d422589ded5522de1f6a0330367f293fefc
--- /dev/null
+++ b/views/special.namedGraphs.view.html
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
+    "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml" {% for i, ns in base.ns %}xmlns:{{i}}="{{ns}}" 
+    {%endfor%}version="XHTML+RDFa 1.0" xml:lang="en">
+  <head>
+    <title>Graphs available in the triple store</title>
+    <link href="{{base.baseUrl}}/lodspeakr/css/basic.css" rel="stylesheet" type="text/css" media="screen" />
+  </head>
+  <body>
+    <h1>Graphs available</h1>
+{%include "header.inc"%}
+	<ul>
+    {% for row in r %}
+        <li>{{row.g.curie}}</li>
+    {% endfor %}
+    </ul>
+  </body>
+</html>
+