From 9bb342811bf6a93a574a648c5848feedbaaef8f2 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 12 Sep 2009 22:12:09 +0000
Subject: [PATCH] Rewrite the planner's handling of materialized plan types so
 that there is an explicit model of rescan costs being different from
 first-time costs. The costing of Material nodes in particular now has some
 visible relationship to the actual runtime behavior, where before it was
 essentially fantasy. This also fixes up a couple of places where different
 materialized plan types were treated differently for no very good reason
 (probably just oversights).

A couple of the regression tests are affected, because the planner now chooses
to put the other relation on the inside of a nestloop-with-materialize.
So far as I can see both changes are sane, and the planner is now more
consistently following the expectation that it should prefer to materialize
the smaller of two relations.

Per a recent discussion with Robert Haas.
---
 src/backend/executor/execAmi.c           |   29 +-
 src/backend/optimizer/path/costsize.c    |  212 ++-
 src/backend/optimizer/path/joinpath.c    |   17 +-
 src/backend/optimizer/plan/createplan.c  |    3 +-
 src/backend/optimizer/plan/subselect.c   |   30 +-
 src/backend/optimizer/util/pathnode.c    |    6 +-
 src/include/executor/executor.h          |    3 +-
 src/include/optimizer/cost.h             |    5 +-
 src/test/regress/expected/geometry.out   |   24 +-
 src/test/regress/expected/geometry_1.out |   24 +-
 src/test/regress/expected/geometry_2.out |   24 +-
 src/test/regress/expected/join.out       | 1578 +++++++++++-----------
 12 files changed, 1034 insertions(+), 921 deletions(-)

diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c
index cd23d8d8b64..51923c436ad 100644
--- a/src/backend/executor/execAmi.c
+++ b/src/backend/executor/execAmi.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	$PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.103 2009/01/01 17:23:41 momjian Exp $
+ *	$PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.104 2009/09/12 22:12:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -496,3 +496,30 @@ IndexSupportsBackwardScan(Oid indexid)
 
 	return result;
 }
+
+/*
+ * ExecMaterializesOutput - does a plan type materialize its output?
+ *
+ * Returns true if the plan node type is one that automatically materializes
+ * its output (typically by keeping it in a tuplestore).  For such plans,
+ * a rescan without any parameter change will have zero startup cost and
+ * very low per-tuple cost.
+ */
+bool
+ExecMaterializesOutput(NodeTag plantype)
+{
+	switch (plantype)
+	{
+		case T_Material:
+		case T_FunctionScan:
+		case T_CteScan:
+		case T_WorkTableScan:
+		case T_Sort:
+			return true;
+
+		default:
+			break;
+	}
+
+	return false;
+}
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 1ede488c13b..6acc5ae34b0 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -54,7 +54,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.210 2009/07/11 04:09:33 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.211 2009/09/12 22:12:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -63,6 +63,7 @@
 
 #include <math.h>
 
+#include "executor/executor.h"
 #include "executor/nodeHash.h"
 #include "miscadmin.h"
 #include "nodes/nodeFuncs.h"
@@ -119,6 +120,8 @@ typedef struct
 static MergeScanSelCache *cached_scansel(PlannerInfo *root,
 			   RestrictInfo *rinfo,
 			   PathKey *pathkey);
+static void cost_rescan(PlannerInfo *root, Path *path,
+			Cost *rescan_startup_cost, Cost *rescan_total_cost);
 static bool cost_qual_eval_walker(Node *node, cost_qual_eval_context *context);
 static bool adjust_semi_join(PlannerInfo *root, JoinPath *path,
 				 SpecialJoinInfo *sjinfo,
@@ -895,15 +898,26 @@ cost_functionscan(Path *path, PlannerInfo *root, RelOptInfo *baserel)
 	rte = planner_rt_fetch(baserel->relid, root);
 	Assert(rte->rtekind == RTE_FUNCTION);
 
-	/* Estimate costs of executing the function expression */
+	/*
+	 * Estimate costs of executing the function expression.
+	 *
+	 * Currently, nodeFunctionscan.c always executes the function to
+	 * completion before returning any rows, and caches the results in a
+	 * tuplestore.  So the function eval cost is all startup cost, and
+	 * per-row costs are minimal.
+	 *
+	 * XXX in principle we ought to charge tuplestore spill costs if the
+	 * number of rows is large.  However, given how phony our rowcount
+	 * estimates for functions tend to be, there's not a lot of point
+	 * in that refinement right now.
+	 */
 	cost_qual_eval_node(&exprcost, rte->funcexpr, root);
 
-	startup_cost += exprcost.startup;
-	cpu_per_tuple = exprcost.per_tuple;
+	startup_cost += exprcost.startup + exprcost.per_tuple;
 
 	/* Add scanning CPU costs */
 	startup_cost += baserel->baserestrictcost.startup;
-	cpu_per_tuple += cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
+	cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
 	run_cost += cpu_per_tuple * baserel->tuples;
 
 	path->startup_cost = startup_cost;
@@ -1176,41 +1190,44 @@ sort_exceeds_work_mem(Sort *sort)
  *
  * If the total volume of data to materialize exceeds work_mem, we will need
  * to write it to disk, so the cost is much higher in that case.
+ *
+ * Note that here we are estimating the costs for the first scan of the
+ * relation, so the materialization is all overhead --- any savings will
+ * occur only on rescan, which is estimated in cost_rescan.
  */
 void
 cost_material(Path *path,
-			  Cost input_cost, double tuples, int width)
+			  Cost input_startup_cost, Cost input_total_cost,
+			  double tuples, int width)
 {
-	Cost		startup_cost = input_cost;
-	Cost		run_cost = 0;
+	Cost		startup_cost = input_startup_cost;
+	Cost		run_cost = input_total_cost - input_startup_cost;
 	double		nbytes = relation_byte_size(tuples, width);
 	long		work_mem_bytes = work_mem * 1024L;
 
-	/* disk costs */
+	/*
+	 * Whether spilling or not, charge 2x cpu_tuple_cost per tuple to reflect
+	 * bookkeeping overhead.  (This rate must be more than cpu_tuple_cost;
+	 * if it is exactly the same then there will be a cost tie between
+	 * nestloop with A outer, materialized B inner and nestloop with B outer,
+	 * materialized A inner.  The extra cost ensures we'll prefer
+	 * materializing the smaller rel.)
+	 */
+	run_cost += 2 * cpu_tuple_cost * tuples;
+
+	/*
+	 * If we will spill to disk, charge at the rate of seq_page_cost per page.
+	 * This cost is assumed to be evenly spread through the plan run phase,
+	 * which isn't exactly accurate but our cost model doesn't allow for
+	 * nonuniform costs within the run phase.
+	 */
 	if (nbytes > work_mem_bytes)
 	{
 		double		npages = ceil(nbytes / BLCKSZ);
 
-		/* We'll write during startup and read during retrieval */
-		startup_cost += seq_page_cost * npages;
 		run_cost += seq_page_cost * npages;
 	}
 
-	/*
-	 * Charge a very small amount per inserted tuple, to reflect bookkeeping
-	 * costs.  We use cpu_tuple_cost/10 for this.  This is needed to break the
-	 * tie that would otherwise exist between nestloop with A outer,
-	 * materialized B inner and nestloop with B outer, materialized A inner.
-	 * The extra cost ensures we'll prefer materializing the smaller rel.
-	 */
-	startup_cost += cpu_tuple_cost * 0.1 * tuples;
-
-	/*
-	 * Also charge a small amount per extracted tuple.	We use cpu_tuple_cost
-	 * so that it doesn't appear worthwhile to materialize a bare seqscan.
-	 */
-	run_cost += cpu_tuple_cost * tuples;
-
 	path->startup_cost = startup_cost;
 	path->total_cost = startup_cost + run_cost;
 }
@@ -1400,7 +1417,10 @@ cost_nestloop(NestPath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo)
 	Path	   *inner_path = path->innerjoinpath;
 	Cost		startup_cost = 0;
 	Cost		run_cost = 0;
+	Cost		inner_rescan_start_cost;
+	Cost		inner_rescan_total_cost;
 	Cost		inner_run_cost;
+	Cost		inner_rescan_run_cost;
 	Cost		cpu_per_tuple;
 	QualCost	restrict_qual_cost;
 	double		outer_path_rows = PATH_ROWS(outer_path);
@@ -1413,32 +1433,26 @@ cost_nestloop(NestPath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo)
 	if (!enable_nestloop)
 		startup_cost += disable_cost;
 
+	/* estimate costs to rescan the inner relation */
+	cost_rescan(root, inner_path,
+				&inner_rescan_start_cost,
+				&inner_rescan_total_cost);
+
 	/* cost of source data */
 
 	/*
 	 * NOTE: clearly, we must pay both outer and inner paths' startup_cost
 	 * before we can start returning tuples, so the join's startup cost is
-	 * their sum.  What's not so clear is whether the inner path's
-	 * startup_cost must be paid again on each rescan of the inner path. This
-	 * is not true if the inner path is materialized or is a hashjoin, but
-	 * probably is true otherwise.
+	 * their sum.  We'll also pay the inner path's rescan startup cost
+	 * multiple times.
 	 */
 	startup_cost += outer_path->startup_cost + inner_path->startup_cost;
 	run_cost += outer_path->total_cost - outer_path->startup_cost;
-	if (IsA(inner_path, MaterialPath) ||
-		IsA(inner_path, HashPath))
-	{
-		/* charge only run cost for each iteration of inner path */
-	}
-	else
-	{
-		/*
-		 * charge startup cost for each iteration of inner path, except we
-		 * already charged the first startup_cost in our own startup
-		 */
-		run_cost += (outer_path_rows - 1) * inner_path->startup_cost;
-	}
+	if (outer_path_rows > 1)
+		run_cost += (outer_path_rows - 1) * inner_rescan_start_cost;
+
 	inner_run_cost = inner_path->total_cost - inner_path->startup_cost;
+	inner_rescan_run_cost = inner_rescan_total_cost - inner_rescan_start_cost;
 
 	if (adjust_semi_join(root, path, sjinfo,
 						 &outer_match_frac,
@@ -1458,12 +1472,22 @@ cost_nestloop(NestPath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo)
 		 * that fraction.  (If we used a larger fuzz factor, we'd have to
 		 * clamp inner_scan_frac to at most 1.0; but since match_count is at
 		 * least 1, no such clamp is needed now.)
+		 *
+		 * A complicating factor is that rescans may be cheaper than first
+		 * scans.  If we never scan all the way to the end of the inner rel,
+		 * it might be (depending on the plan type) that we'd never pay the
+		 * whole inner first-scan run cost.  However it is difficult to
+		 * estimate whether that will happen, so be conservative and always
+		 * charge the whole first-scan cost once.
 		 */
+		run_cost += inner_run_cost;
+
 		outer_matched_rows = rint(outer_path_rows * outer_match_frac);
 		inner_scan_frac = 2.0 / (match_count + 1.0);
 
-		/* Add inner run cost for outer tuples having matches */
-		run_cost += outer_matched_rows * inner_run_cost * inner_scan_frac;
+		/* Add inner run cost for additional outer tuples having matches */
+		if (outer_matched_rows > 1)
+			run_cost += (outer_matched_rows - 1) * inner_rescan_run_cost * inner_scan_frac;
 
 		/* Compute number of tuples processed (not number emitted!) */
 		ntuples = outer_matched_rows * inner_path_rows * inner_scan_frac;
@@ -1479,13 +1503,16 @@ cost_nestloop(NestPath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo)
 		if (indexed_join_quals)
 		{
 			run_cost += (outer_path_rows - outer_matched_rows) *
-				inner_run_cost / inner_path_rows;
-			/* We won't be evaluating any quals at all for these rows */
+				inner_rescan_run_cost / inner_path_rows;
+			/*
+			 * We won't be evaluating any quals at all for these rows,
+			 * so don't add them to ntuples.
+			 */
 		}
 		else
 		{
 			run_cost += (outer_path_rows - outer_matched_rows) *
-				inner_run_cost;
+				inner_rescan_run_cost;
 			ntuples += (outer_path_rows - outer_matched_rows) *
 				inner_path_rows;
 		}
@@ -1493,7 +1520,9 @@ cost_nestloop(NestPath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo)
 	else
 	{
 		/* Normal case; we'll scan whole input rel for each outer row */
-		run_cost += outer_path_rows * inner_run_cost;
+		run_cost += inner_run_cost;
+		if (outer_path_rows > 1)
+			run_cost += (outer_path_rows - 1) * inner_rescan_run_cost;
 
 		/* Compute number of tuples processed (not number emitted!) */
 		ntuples = outer_path_rows * inner_path_rows;
@@ -2190,13 +2219,13 @@ cost_subplan(PlannerInfo *root, SubPlan *subplan, Plan *plan)
 
 		/*
 		 * Also account for subplan's startup cost. If the subplan is
-		 * uncorrelated or undirect correlated, AND its topmost node is a Sort
-		 * or Material node, assume that we'll only need to pay its startup
-		 * cost once; otherwise assume we pay the startup cost every time.
+		 * uncorrelated or undirect correlated, AND its topmost node is one
+		 * that materializes its output, assume that we'll only need to pay
+		 * its startup cost once; otherwise assume we pay the startup cost
+		 * every time.
 		 */
 		if (subplan->parParam == NIL &&
-			(IsA(plan, Sort) ||
-			 IsA(plan, Material)))
+			ExecMaterializesOutput(nodeTag(plan)))
 			sp_cost.startup += plan->startup_cost;
 		else
 			sp_cost.per_tuple += plan->startup_cost;
@@ -2207,6 +2236,81 @@ cost_subplan(PlannerInfo *root, SubPlan *subplan, Plan *plan)
 }
 
 
+/*
+ * cost_rescan
+ *		Given a finished Path, estimate the costs of rescanning it after
+ *		having done so the first time.  For some Path types a rescan is
+ *		cheaper than an original scan (if no parameters change), and this
+ *		function embodies knowledge about that.  The default is to return
+ *		the same costs stored in the Path.  (Note that the cost estimates
+ *		actually stored in Paths are always for first scans.)
+ *
+ * This function is not currently intended to model effects such as rescans
+ * being cheaper due to disk block caching; what we are concerned with is
+ * plan types wherein the executor caches results explicitly, or doesn't
+ * redo startup calculations, etc.
+ */
+static void
+cost_rescan(PlannerInfo *root, Path *path,
+			Cost *rescan_startup_cost,		/* output parameters */
+			Cost *rescan_total_cost)
+{
+	switch (path->pathtype)
+	{
+		case T_FunctionScan:
+			/*
+			 * Currently, nodeFunctionscan.c always executes the function
+			 * to completion before returning any rows, and caches the
+			 * results in a tuplestore.  So the function eval cost is
+			 * all startup cost and isn't paid over again on rescans.
+			 * However, all run costs will be paid over again.
+			 */
+			*rescan_startup_cost = 0;
+			*rescan_total_cost = path->total_cost - path->startup_cost;
+			break;
+		case T_HashJoin:
+			/*
+			 * Assume that all of the startup cost represents hash table
+			 * building, which we won't have to do over.
+			 */
+			*rescan_startup_cost = 0;
+			*rescan_total_cost = path->total_cost - path->startup_cost;
+			break;
+		case T_Material:
+		case T_CteScan:
+		case T_WorkTableScan:
+		case T_Sort:
+			{
+				/*
+				 * These plan types materialize their final result in a
+				 * tuplestore or tuplesort object.  So the rescan cost is only
+				 * cpu_tuple_cost per tuple, unless the result is large enough
+				 * to spill to disk.
+				 */
+				Cost	run_cost = cpu_tuple_cost * path->parent->rows;
+				double	nbytes = relation_byte_size(path->parent->rows,
+													path->parent->width);
+				long	work_mem_bytes = work_mem * 1024L;
+
+				if (nbytes > work_mem_bytes)
+				{
+					/* It will spill, so account for re-read cost */
+					double		npages = ceil(nbytes / BLCKSZ);
+
+					run_cost += seq_page_cost * npages;
+				}
+				*rescan_startup_cost = 0;
+				*rescan_total_cost = run_cost;
+			}
+			break;
+		default:
+			*rescan_startup_cost = path->startup_cost;
+			*rescan_total_cost = path->total_cost;
+			break;
+	}
+}
+
+
 /*
  * cost_qual_eval
  *		Estimate the CPU costs of evaluating a WHERE clause.
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index bc0831933e3..269c4824b6a 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/path/joinpath.c,v 1.122 2009/06/11 14:48:59 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/path/joinpath.c,v 1.123 2009/09/12 22:12:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,6 +16,7 @@
 
 #include <math.h>
 
+#include "executor/executor.h"
 #include "optimizer/cost.h"
 #include "optimizer/pathnode.h"
 #include "optimizer/paths.h"
@@ -405,18 +406,10 @@ match_unsorted_outer(PlannerInfo *root,
 	else if (nestjoinOK)
 	{
 		/*
-		 * If the cheapest inner path is a join or seqscan, we should consider
-		 * materializing it.  (This is a heuristic: we could consider it
-		 * always, but for inner indexscans it's probably a waste of time.)
-		 * Also skip it if the inner path materializes its output anyway.
+		 * Consider materializing the cheapest inner path, unless it is one
+		 * that materializes its output anyway.
 		 */
-		if (!(inner_cheapest_total->pathtype == T_IndexScan ||
-			  inner_cheapest_total->pathtype == T_BitmapHeapScan ||
-			  inner_cheapest_total->pathtype == T_TidScan ||
-			  inner_cheapest_total->pathtype == T_Material ||
-			  inner_cheapest_total->pathtype == T_FunctionScan ||
-			  inner_cheapest_total->pathtype == T_CteScan ||
-			  inner_cheapest_total->pathtype == T_WorkTableScan))
+		if (!ExecMaterializesOutput(inner_cheapest_total->pathtype))
 			matpath = (Path *)
 				create_material_path(innerrel, inner_cheapest_total);
 
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 3f211508a1f..ac9b96229a1 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.261 2009/07/17 23:19:34 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.262 2009/09/12 22:12:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3266,6 +3266,7 @@ materialize_finished_plan(Plan *subplan)
 
 	/* Set cost data */
 	cost_material(&matpath,
+				  subplan->startup_cost,
 				  subplan->total_cost,
 				  subplan->plan_rows,
 				  subplan->plan_width);
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index e56c0755d02..78809474a3b 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.152 2009/07/16 06:33:43 petere Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.153 2009/09/12 22:12:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -15,6 +15,7 @@
 
 #include "catalog/pg_operator.h"
 #include "catalog/pg_type.h"
+#include "executor/executor.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "nodes/nodeFuncs.h"
@@ -564,33 +565,16 @@ build_subplan(PlannerInfo *root, Plan *plan, List *rtable,
 			splan->useHashTable = true;
 
 		/*
-		 * Otherwise, we have the option to tack a MATERIAL node onto the top
+		 * Otherwise, we have the option to tack a Material node onto the top
 		 * of the subplan, to reduce the cost of reading it repeatedly.  This
 		 * is pointless for a direct-correlated subplan, since we'd have to
 		 * recompute its results each time anyway.	For uncorrelated/undirect
-		 * correlated subplans, we add MATERIAL unless the subplan's top plan
+		 * correlated subplans, we add Material unless the subplan's top plan
 		 * node would materialize its output anyway.
 		 */
-		else if (splan->parParam == NIL)
-		{
-			bool		use_material;
-
-			switch (nodeTag(plan))
-			{
-				case T_Material:
-				case T_FunctionScan:
-				case T_CteScan:
-				case T_WorkTableScan:
-				case T_Sort:
-					use_material = false;
-					break;
-				default:
-					use_material = true;
-					break;
-			}
-			if (use_material)
-				plan = materialize_finished_plan(plan);
-		}
+		else if (splan->parParam == NIL &&
+				 !ExecMaterializesOutput(nodeTag(plan)))
+			plan = materialize_finished_plan(plan);
 
 		result = (Node *) splan;
 		isInitPlan = false;
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c
index b0358cb112e..e2de24956a2 100644
--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.152 2009/06/11 14:48:59 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.153 2009/09/12 22:12:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -711,6 +711,7 @@ create_material_path(RelOptInfo *rel, Path *subpath)
 	pathnode->subpath = subpath;
 
 	cost_material(&pathnode->path,
+				  subpath->startup_cost,
 				  subpath->total_cost,
 				  rel->rows,
 				  rel->width);
@@ -1424,7 +1425,8 @@ create_mergejoin_path(PlannerInfo *root,
 		 * cost_mergejoin will avoid choosing anyway).	Therefore
 		 * cost_material's cost estimate is bogus and we should charge just
 		 * cpu_tuple_cost per tuple.  (Keep this estimate in sync with similar
-		 * ones in cost_mergejoin and create_mergejoin_plan.)
+		 * ones in cost_mergejoin and create_mergejoin_plan; also see
+		 * cost_rescan.)
 		 */
 		mpath->startup_cost = inner_path->startup_cost;
 		mpath->total_cost = inner_path->total_cost;
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 2ad1e26b2a1..c395eadc370 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.158 2009/07/29 20:56:20 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.159 2009/09/12 22:12:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,6 +83,7 @@ extern void ExecMarkPos(PlanState *node);
 extern void ExecRestrPos(PlanState *node);
 extern bool ExecSupportsMarkRestore(NodeTag plantype);
 extern bool ExecSupportsBackwardScan(Plan *node);
+extern bool ExecMaterializesOutput(NodeTag plantype);
 
 /*
  * prototypes from functions in execCurrent.c
diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h
index 343662f6b87..f862979c084 100644
--- a/src/include/optimizer/cost.h
+++ b/src/include/optimizer/cost.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/optimizer/cost.h,v 1.97 2009/06/11 14:49:11 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/optimizer/cost.h,v 1.98 2009/09/12 22:12:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -86,7 +86,8 @@ extern void cost_sort(Path *path, PlannerInfo *root,
 		  double limit_tuples);
 extern bool sort_exceeds_work_mem(Sort *sort);
 extern void cost_material(Path *path,
-			  Cost input_cost, double tuples, int width);
+			  Cost input_startup_cost, Cost input_total_cost,
+			  double tuples, int width);
 extern void cost_agg(Path *path, PlannerInfo *root,
 		 AggStrategy aggstrategy, int numAggs,
 		 int numGroupCols, double numGroups,
diff --git a/src/test/regress/expected/geometry.out b/src/test/regress/expected/geometry.out
index 6910e54ec66..81237252eb7 100644
--- a/src/test/regress/expected/geometry.out
+++ b/src/test/regress/expected/geometry.out
@@ -260,24 +260,24 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
  twenty |                               rotation                               
 --------+----------------------------------------------------------------------
         | (0,-0),(-0.2,-0.2)
-        | (-0.1,-0.1),(-0.3,-0.3)
-        | (-0.25,-0.25),(-0.25,-0.35)
-        | (-0.3,-0.3),(-0.3,-0.3)
         | (0.08,-0),(0,-0.56)
-        | (0.12,-0.28),(0.04,-0.84)
-        | (0.26,-0.7),(0.1,-0.82)
-        | (0.12,-0.84),(0.12,-0.84)
         | (0.0651176557644,0),(0,-0.0483449262493)
-        | (0.0976764836466,-0.0241724631247),(0.0325588278822,-0.072517389374)
-        | (0.109762715209,-0.0562379754329),(0.0813970697055,-0.0604311578117)
-        | (0.0976764836466,-0.072517389374),(0.0976764836466,-0.072517389374)
         | (-0,0.0828402366864),(-0.201183431953,0)
-        | (-0.100591715976,0.12426035503),(-0.301775147929,0.0414201183432)
-        | (-0.251479289941,0.103550295858),(-0.322485207101,0.0739644970414)
-        | (-0.301775147929,0.12426035503),(-0.301775147929,0.12426035503)
         | (0.2,0),(0,0)
+        | (-0.1,-0.1),(-0.3,-0.3)
+        | (0.12,-0.28),(0.04,-0.84)
+        | (0.0976764836466,-0.0241724631247),(0.0325588278822,-0.072517389374)
+        | (-0.100591715976,0.12426035503),(-0.301775147929,0.0414201183432)
         | (0.3,0),(0.1,0)
+        | (-0.25,-0.25),(-0.25,-0.35)
+        | (0.26,-0.7),(0.1,-0.82)
+        | (0.109762715209,-0.0562379754329),(0.0813970697055,-0.0604311578117)
+        | (-0.251479289941,0.103550295858),(-0.322485207101,0.0739644970414)
         | (0.3,0.05),(0.25,0)
+        | (-0.3,-0.3),(-0.3,-0.3)
+        | (0.12,-0.84),(0.12,-0.84)
+        | (0.0976764836466,-0.072517389374),(0.0976764836466,-0.072517389374)
+        | (-0.301775147929,0.12426035503),(-0.301775147929,0.12426035503)
         | (0.3,0),(0.3,0)
 (20 rows)
 
diff --git a/src/test/regress/expected/geometry_1.out b/src/test/regress/expected/geometry_1.out
index 0e014925257..684ccd71683 100644
--- a/src/test/regress/expected/geometry_1.out
+++ b/src/test/regress/expected/geometry_1.out
@@ -260,24 +260,24 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
  twenty |                               rotation                               
 --------+----------------------------------------------------------------------
         | (0,0),(-0.2,-0.2)
-        | (-0.1,-0.1),(-0.3,-0.3)
-        | (-0.25,-0.25),(-0.25,-0.35)
-        | (-0.3,-0.3),(-0.3,-0.3)
         | (0.08,0),(0,-0.56)
-        | (0.12,-0.28),(0.04,-0.84)
-        | (0.26,-0.7),(0.1,-0.82)
-        | (0.12,-0.84),(0.12,-0.84)
         | (0.0651176557644,0),(0,-0.0483449262493)
-        | (0.0976764836466,-0.0241724631247),(0.0325588278822,-0.072517389374)
-        | (0.109762715209,-0.0562379754329),(0.0813970697055,-0.0604311578117)
-        | (0.0976764836466,-0.072517389374),(0.0976764836466,-0.072517389374)
         | (0,0.0828402366864),(-0.201183431953,0)
-        | (-0.100591715976,0.12426035503),(-0.301775147929,0.0414201183432)
-        | (-0.251479289941,0.103550295858),(-0.322485207101,0.0739644970414)
-        | (-0.301775147929,0.12426035503),(-0.301775147929,0.12426035503)
         | (0.2,0),(0,0)
+        | (-0.1,-0.1),(-0.3,-0.3)
+        | (0.12,-0.28),(0.04,-0.84)
+        | (0.0976764836466,-0.0241724631247),(0.0325588278822,-0.072517389374)
+        | (-0.100591715976,0.12426035503),(-0.301775147929,0.0414201183432)
         | (0.3,0),(0.1,0)
+        | (-0.25,-0.25),(-0.25,-0.35)
+        | (0.26,-0.7),(0.1,-0.82)
+        | (0.109762715209,-0.0562379754329),(0.0813970697055,-0.0604311578117)
+        | (-0.251479289941,0.103550295858),(-0.322485207101,0.0739644970414)
         | (0.3,0.05),(0.25,0)
+        | (-0.3,-0.3),(-0.3,-0.3)
+        | (0.12,-0.84),(0.12,-0.84)
+        | (0.0976764836466,-0.072517389374),(0.0976764836466,-0.072517389374)
+        | (-0.301775147929,0.12426035503),(-0.301775147929,0.12426035503)
         | (0.3,0),(0.3,0)
 (20 rows)
 
diff --git a/src/test/regress/expected/geometry_2.out b/src/test/regress/expected/geometry_2.out
index 7787dab0618..658dba48aa5 100644
--- a/src/test/regress/expected/geometry_2.out
+++ b/src/test/regress/expected/geometry_2.out
@@ -260,24 +260,24 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
  twenty |                               rotation                               
 --------+----------------------------------------------------------------------
         | (0,-0),(-0.2,-0.2)
-        | (-0.1,-0.1),(-0.3,-0.3)
-        | (-0.25,-0.25),(-0.25,-0.35)
-        | (-0.3,-0.3),(-0.3,-0.3)
         | (0.08,-0),(0,-0.56)
-        | (0.12,-0.28),(0.04,-0.84)
-        | (0.26,-0.7),(0.1,-0.82)
-        | (0.12,-0.84),(0.12,-0.84)
         | (0.0651176557644,0),(0,-0.0483449262493)
-        | (0.0976764836466,-0.0241724631247),(0.0325588278822,-0.072517389374)
-        | (0.109762715209,-0.0562379754329),(0.0813970697055,-0.0604311578117)
-        | (0.0976764836466,-0.072517389374),(0.0976764836466,-0.072517389374)
         | (-0,0.0828402366864),(-0.201183431953,0)
-        | (-0.100591715976,0.12426035503),(-0.301775147929,0.0414201183432)
-        | (-0.251479289941,0.103550295858),(-0.322485207101,0.0739644970414)
-        | (-0.301775147929,0.12426035503),(-0.301775147929,0.12426035503)
         | (0.2,0),(0,0)
+        | (-0.1,-0.1),(-0.3,-0.3)
+        | (0.12,-0.28),(0.04,-0.84)
+        | (0.0976764836466,-0.0241724631247),(0.0325588278822,-0.072517389374)
+        | (-0.100591715976,0.12426035503),(-0.301775147929,0.0414201183432)
         | (0.3,0),(0.1,0)
+        | (-0.25,-0.25),(-0.25,-0.35)
+        | (0.26,-0.7),(0.1,-0.82)
+        | (0.109762715209,-0.0562379754329),(0.0813970697055,-0.0604311578117)
+        | (-0.251479289941,0.103550295858),(-0.322485207101,0.0739644970414)
         | (0.3,0.05),(0.25,0)
+        | (-0.3,-0.3),(-0.3,-0.3)
+        | (0.12,-0.84),(0.12,-0.84)
+        | (0.0976764836466,-0.072517389374),(0.0976764836466,-0.072517389374)
+        | (-0.301775147929,0.12426035503),(-0.301775147929,0.12426035503)
         | (0.3,0),(0.3,0)
 (20 rows)
 
diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out
index dd9bf9c43f0..0dc3e569603 100644
--- a/src/test/regress/expected/join.out
+++ b/src/test/regress/expected/join.out
@@ -662,895 +662,895 @@ SELECT '' AS "xxx", *
  xxx | i | j |   t   | i | k  | i | k  
 -----+---+---+-------+---+----+---+----
      | 1 | 4 | one   | 1 | -1 | 1 | -1
-     | 2 | 3 | two   | 1 | -1 | 1 | -1
-     | 3 | 2 | three | 1 | -1 | 1 | -1
-     | 4 | 1 | four  | 1 | -1 | 1 | -1
-     | 5 | 0 | five  | 1 | -1 | 1 | -1
-     | 6 | 6 | six   | 1 | -1 | 1 | -1
-     | 7 | 7 | seven | 1 | -1 | 1 | -1
-     | 8 | 8 | eight | 1 | -1 | 1 | -1
-     | 0 |   | zero  | 1 | -1 | 1 | -1
-     |   |   | null  | 1 | -1 | 1 | -1
-     |   | 0 | zero  | 1 | -1 | 1 | -1
-     | 1 | 4 | one   | 1 | -1 | 2 |  2
-     | 2 | 3 | two   | 1 | -1 | 2 |  2
-     | 3 | 2 | three | 1 | -1 | 2 |  2
-     | 4 | 1 | four  | 1 | -1 | 2 |  2
-     | 5 | 0 | five  | 1 | -1 | 2 |  2
-     | 6 | 6 | six   | 1 | -1 | 2 |  2
-     | 7 | 7 | seven | 1 | -1 | 2 |  2
-     | 8 | 8 | eight | 1 | -1 | 2 |  2
-     | 0 |   | zero  | 1 | -1 | 2 |  2
-     |   |   | null  | 1 | -1 | 2 |  2
-     |   | 0 | zero  | 1 | -1 | 2 |  2
-     | 1 | 4 | one   | 1 | -1 | 3 | -3
-     | 2 | 3 | two   | 1 | -1 | 3 | -3
-     | 3 | 2 | three | 1 | -1 | 3 | -3
-     | 4 | 1 | four  | 1 | -1 | 3 | -3
-     | 5 | 0 | five  | 1 | -1 | 3 | -3
-     | 6 | 6 | six   | 1 | -1 | 3 | -3
-     | 7 | 7 | seven | 1 | -1 | 3 | -3
-     | 8 | 8 | eight | 1 | -1 | 3 | -3
-     | 0 |   | zero  | 1 | -1 | 3 | -3
-     |   |   | null  | 1 | -1 | 3 | -3
-     |   | 0 | zero  | 1 | -1 | 3 | -3
-     | 1 | 4 | one   | 1 | -1 | 2 |  4
-     | 2 | 3 | two   | 1 | -1 | 2 |  4
-     | 3 | 2 | three | 1 | -1 | 2 |  4
-     | 4 | 1 | four  | 1 | -1 | 2 |  4
-     | 5 | 0 | five  | 1 | -1 | 2 |  4
-     | 6 | 6 | six   | 1 | -1 | 2 |  4
-     | 7 | 7 | seven | 1 | -1 | 2 |  4
-     | 8 | 8 | eight | 1 | -1 | 2 |  4
-     | 0 |   | zero  | 1 | -1 | 2 |  4
-     |   |   | null  | 1 | -1 | 2 |  4
-     |   | 0 | zero  | 1 | -1 | 2 |  4
-     | 1 | 4 | one   | 1 | -1 | 5 | -5
-     | 2 | 3 | two   | 1 | -1 | 5 | -5
-     | 3 | 2 | three | 1 | -1 | 5 | -5
-     | 4 | 1 | four  | 1 | -1 | 5 | -5
-     | 5 | 0 | five  | 1 | -1 | 5 | -5
-     | 6 | 6 | six   | 1 | -1 | 5 | -5
-     | 7 | 7 | seven | 1 | -1 | 5 | -5
-     | 8 | 8 | eight | 1 | -1 | 5 | -5
-     | 0 |   | zero  | 1 | -1 | 5 | -5
-     |   |   | null  | 1 | -1 | 5 | -5
-     |   | 0 | zero  | 1 | -1 | 5 | -5
-     | 1 | 4 | one   | 1 | -1 | 5 | -5
-     | 2 | 3 | two   | 1 | -1 | 5 | -5
-     | 3 | 2 | three | 1 | -1 | 5 | -5
-     | 4 | 1 | four  | 1 | -1 | 5 | -5
-     | 5 | 0 | five  | 1 | -1 | 5 | -5
-     | 6 | 6 | six   | 1 | -1 | 5 | -5
-     | 7 | 7 | seven | 1 | -1 | 5 | -5
-     | 8 | 8 | eight | 1 | -1 | 5 | -5
-     | 0 |   | zero  | 1 | -1 | 5 | -5
-     |   |   | null  | 1 | -1 | 5 | -5
-     |   | 0 | zero  | 1 | -1 | 5 | -5
-     | 1 | 4 | one   | 1 | -1 | 0 |   
-     | 2 | 3 | two   | 1 | -1 | 0 |   
-     | 3 | 2 | three | 1 | -1 | 0 |   
-     | 4 | 1 | four  | 1 | -1 | 0 |   
-     | 5 | 0 | five  | 1 | -1 | 0 |   
-     | 6 | 6 | six   | 1 | -1 | 0 |   
-     | 7 | 7 | seven | 1 | -1 | 0 |   
-     | 8 | 8 | eight | 1 | -1 | 0 |   
-     | 0 |   | zero  | 1 | -1 | 0 |   
-     |   |   | null  | 1 | -1 | 0 |   
-     |   | 0 | zero  | 1 | -1 | 0 |   
-     | 1 | 4 | one   | 1 | -1 |   |   
-     | 2 | 3 | two   | 1 | -1 |   |   
-     | 3 | 2 | three | 1 | -1 |   |   
-     | 4 | 1 | four  | 1 | -1 |   |   
-     | 5 | 0 | five  | 1 | -1 |   |   
-     | 6 | 6 | six   | 1 | -1 |   |   
-     | 7 | 7 | seven | 1 | -1 |   |   
-     | 8 | 8 | eight | 1 | -1 |   |   
-     | 0 |   | zero  | 1 | -1 |   |   
-     |   |   | null  | 1 | -1 |   |   
-     |   | 0 | zero  | 1 | -1 |   |   
-     | 1 | 4 | one   | 1 | -1 |   |  0
-     | 2 | 3 | two   | 1 | -1 |   |  0
-     | 3 | 2 | three | 1 | -1 |   |  0
-     | 4 | 1 | four  | 1 | -1 |   |  0
-     | 5 | 0 | five  | 1 | -1 |   |  0
-     | 6 | 6 | six   | 1 | -1 |   |  0
-     | 7 | 7 | seven | 1 | -1 |   |  0
-     | 8 | 8 | eight | 1 | -1 |   |  0
-     | 0 |   | zero  | 1 | -1 |   |  0
-     |   |   | null  | 1 | -1 |   |  0
-     |   | 0 | zero  | 1 | -1 |   |  0
-     | 1 | 4 | one   | 2 |  2 | 1 | -1
-     | 2 | 3 | two   | 2 |  2 | 1 | -1
-     | 3 | 2 | three | 2 |  2 | 1 | -1
-     | 4 | 1 | four  | 2 |  2 | 1 | -1
-     | 5 | 0 | five  | 2 |  2 | 1 | -1
-     | 6 | 6 | six   | 2 |  2 | 1 | -1
-     | 7 | 7 | seven | 2 |  2 | 1 | -1
-     | 8 | 8 | eight | 2 |  2 | 1 | -1
-     | 0 |   | zero  | 2 |  2 | 1 | -1
-     |   |   | null  | 2 |  2 | 1 | -1
-     |   | 0 | zero  | 2 |  2 | 1 | -1
-     | 1 | 4 | one   | 2 |  2 | 2 |  2
-     | 2 | 3 | two   | 2 |  2 | 2 |  2
-     | 3 | 2 | three | 2 |  2 | 2 |  2
-     | 4 | 1 | four  | 2 |  2 | 2 |  2
-     | 5 | 0 | five  | 2 |  2 | 2 |  2
-     | 6 | 6 | six   | 2 |  2 | 2 |  2
-     | 7 | 7 | seven | 2 |  2 | 2 |  2
-     | 8 | 8 | eight | 2 |  2 | 2 |  2
-     | 0 |   | zero  | 2 |  2 | 2 |  2
-     |   |   | null  | 2 |  2 | 2 |  2
-     |   | 0 | zero  | 2 |  2 | 2 |  2
-     | 1 | 4 | one   | 2 |  2 | 3 | -3
-     | 2 | 3 | two   | 2 |  2 | 3 | -3
-     | 3 | 2 | three | 2 |  2 | 3 | -3
-     | 4 | 1 | four  | 2 |  2 | 3 | -3
-     | 5 | 0 | five  | 2 |  2 | 3 | -3
-     | 6 | 6 | six   | 2 |  2 | 3 | -3
-     | 7 | 7 | seven | 2 |  2 | 3 | -3
-     | 8 | 8 | eight | 2 |  2 | 3 | -3
-     | 0 |   | zero  | 2 |  2 | 3 | -3
-     |   |   | null  | 2 |  2 | 3 | -3
-     |   | 0 | zero  | 2 |  2 | 3 | -3
-     | 1 | 4 | one   | 2 |  2 | 2 |  4
-     | 2 | 3 | two   | 2 |  2 | 2 |  4
-     | 3 | 2 | three | 2 |  2 | 2 |  4
-     | 4 | 1 | four  | 2 |  2 | 2 |  4
-     | 5 | 0 | five  | 2 |  2 | 2 |  4
-     | 6 | 6 | six   | 2 |  2 | 2 |  4
-     | 7 | 7 | seven | 2 |  2 | 2 |  4
-     | 8 | 8 | eight | 2 |  2 | 2 |  4
-     | 0 |   | zero  | 2 |  2 | 2 |  4
-     |   |   | null  | 2 |  2 | 2 |  4
-     |   | 0 | zero  | 2 |  2 | 2 |  4
-     | 1 | 4 | one   | 2 |  2 | 5 | -5
-     | 2 | 3 | two   | 2 |  2 | 5 | -5
-     | 3 | 2 | three | 2 |  2 | 5 | -5
-     | 4 | 1 | four  | 2 |  2 | 5 | -5
-     | 5 | 0 | five  | 2 |  2 | 5 | -5
-     | 6 | 6 | six   | 2 |  2 | 5 | -5
-     | 7 | 7 | seven | 2 |  2 | 5 | -5
-     | 8 | 8 | eight | 2 |  2 | 5 | -5
-     | 0 |   | zero  | 2 |  2 | 5 | -5
-     |   |   | null  | 2 |  2 | 5 | -5
-     |   | 0 | zero  | 2 |  2 | 5 | -5
-     | 1 | 4 | one   | 2 |  2 | 5 | -5
-     | 2 | 3 | two   | 2 |  2 | 5 | -5
-     | 3 | 2 | three | 2 |  2 | 5 | -5
-     | 4 | 1 | four  | 2 |  2 | 5 | -5
-     | 5 | 0 | five  | 2 |  2 | 5 | -5
-     | 6 | 6 | six   | 2 |  2 | 5 | -5
-     | 7 | 7 | seven | 2 |  2 | 5 | -5
-     | 8 | 8 | eight | 2 |  2 | 5 | -5
-     | 0 |   | zero  | 2 |  2 | 5 | -5
-     |   |   | null  | 2 |  2 | 5 | -5
-     |   | 0 | zero  | 2 |  2 | 5 | -5
-     | 1 | 4 | one   | 2 |  2 | 0 |   
-     | 2 | 3 | two   | 2 |  2 | 0 |   
-     | 3 | 2 | three | 2 |  2 | 0 |   
-     | 4 | 1 | four  | 2 |  2 | 0 |   
-     | 5 | 0 | five  | 2 |  2 | 0 |   
-     | 6 | 6 | six   | 2 |  2 | 0 |   
-     | 7 | 7 | seven | 2 |  2 | 0 |   
-     | 8 | 8 | eight | 2 |  2 | 0 |   
-     | 0 |   | zero  | 2 |  2 | 0 |   
-     |   |   | null  | 2 |  2 | 0 |   
-     |   | 0 | zero  | 2 |  2 | 0 |   
-     | 1 | 4 | one   | 2 |  2 |   |   
-     | 2 | 3 | two   | 2 |  2 |   |   
-     | 3 | 2 | three | 2 |  2 |   |   
-     | 4 | 1 | four  | 2 |  2 |   |   
-     | 5 | 0 | five  | 2 |  2 |   |   
-     | 6 | 6 | six   | 2 |  2 |   |   
-     | 7 | 7 | seven | 2 |  2 |   |   
-     | 8 | 8 | eight | 2 |  2 |   |   
-     | 0 |   | zero  | 2 |  2 |   |   
-     |   |   | null  | 2 |  2 |   |   
-     |   | 0 | zero  | 2 |  2 |   |   
-     | 1 | 4 | one   | 2 |  2 |   |  0
-     | 2 | 3 | two   | 2 |  2 |   |  0
-     | 3 | 2 | three | 2 |  2 |   |  0
-     | 4 | 1 | four  | 2 |  2 |   |  0
-     | 5 | 0 | five  | 2 |  2 |   |  0
-     | 6 | 6 | six   | 2 |  2 |   |  0
-     | 7 | 7 | seven | 2 |  2 |   |  0
-     | 8 | 8 | eight | 2 |  2 |   |  0
-     | 0 |   | zero  | 2 |  2 |   |  0
-     |   |   | null  | 2 |  2 |   |  0
-     |   | 0 | zero  | 2 |  2 |   |  0
-     | 1 | 4 | one   | 3 | -3 | 1 | -1
-     | 2 | 3 | two   | 3 | -3 | 1 | -1
-     | 3 | 2 | three | 3 | -3 | 1 | -1
-     | 4 | 1 | four  | 3 | -3 | 1 | -1
-     | 5 | 0 | five  | 3 | -3 | 1 | -1
-     | 6 | 6 | six   | 3 | -3 | 1 | -1
-     | 7 | 7 | seven | 3 | -3 | 1 | -1
-     | 8 | 8 | eight | 3 | -3 | 1 | -1
-     | 0 |   | zero  | 3 | -3 | 1 | -1
-     |   |   | null  | 3 | -3 | 1 | -1
-     |   | 0 | zero  | 3 | -3 | 1 | -1
-     | 1 | 4 | one   | 3 | -3 | 2 |  2
-     | 2 | 3 | two   | 3 | -3 | 2 |  2
-     | 3 | 2 | three | 3 | -3 | 2 |  2
-     | 4 | 1 | four  | 3 | -3 | 2 |  2
-     | 5 | 0 | five  | 3 | -3 | 2 |  2
-     | 6 | 6 | six   | 3 | -3 | 2 |  2
-     | 7 | 7 | seven | 3 | -3 | 2 |  2
-     | 8 | 8 | eight | 3 | -3 | 2 |  2
-     | 0 |   | zero  | 3 | -3 | 2 |  2
-     |   |   | null  | 3 | -3 | 2 |  2
-     |   | 0 | zero  | 3 | -3 | 2 |  2
-     | 1 | 4 | one   | 3 | -3 | 3 | -3
-     | 2 | 3 | two   | 3 | -3 | 3 | -3
-     | 3 | 2 | three | 3 | -3 | 3 | -3
-     | 4 | 1 | four  | 3 | -3 | 3 | -3
-     | 5 | 0 | five  | 3 | -3 | 3 | -3
-     | 6 | 6 | six   | 3 | -3 | 3 | -3
-     | 7 | 7 | seven | 3 | -3 | 3 | -3
-     | 8 | 8 | eight | 3 | -3 | 3 | -3
-     | 0 |   | zero  | 3 | -3 | 3 | -3
-     |   |   | null  | 3 | -3 | 3 | -3
-     |   | 0 | zero  | 3 | -3 | 3 | -3
-     | 1 | 4 | one   | 3 | -3 | 2 |  4
-     | 2 | 3 | two   | 3 | -3 | 2 |  4
-     | 3 | 2 | three | 3 | -3 | 2 |  4
-     | 4 | 1 | four  | 3 | -3 | 2 |  4
-     | 5 | 0 | five  | 3 | -3 | 2 |  4
-     | 6 | 6 | six   | 3 | -3 | 2 |  4
-     | 7 | 7 | seven | 3 | -3 | 2 |  4
-     | 8 | 8 | eight | 3 | -3 | 2 |  4
-     | 0 |   | zero  | 3 | -3 | 2 |  4
-     |   |   | null  | 3 | -3 | 2 |  4
-     |   | 0 | zero  | 3 | -3 | 2 |  4
-     | 1 | 4 | one   | 3 | -3 | 5 | -5
-     | 2 | 3 | two   | 3 | -3 | 5 | -5
-     | 3 | 2 | three | 3 | -3 | 5 | -5
-     | 4 | 1 | four  | 3 | -3 | 5 | -5
-     | 5 | 0 | five  | 3 | -3 | 5 | -5
-     | 6 | 6 | six   | 3 | -3 | 5 | -5
-     | 7 | 7 | seven | 3 | -3 | 5 | -5
-     | 8 | 8 | eight | 3 | -3 | 5 | -5
-     | 0 |   | zero  | 3 | -3 | 5 | -5
-     |   |   | null  | 3 | -3 | 5 | -5
-     |   | 0 | zero  | 3 | -3 | 5 | -5
-     | 1 | 4 | one   | 3 | -3 | 5 | -5
-     | 2 | 3 | two   | 3 | -3 | 5 | -5
-     | 3 | 2 | three | 3 | -3 | 5 | -5
-     | 4 | 1 | four  | 3 | -3 | 5 | -5
-     | 5 | 0 | five  | 3 | -3 | 5 | -5
-     | 6 | 6 | six   | 3 | -3 | 5 | -5
-     | 7 | 7 | seven | 3 | -3 | 5 | -5
-     | 8 | 8 | eight | 3 | -3 | 5 | -5
-     | 0 |   | zero  | 3 | -3 | 5 | -5
-     |   |   | null  | 3 | -3 | 5 | -5
-     |   | 0 | zero  | 3 | -3 | 5 | -5
-     | 1 | 4 | one   | 3 | -3 | 0 |   
-     | 2 | 3 | two   | 3 | -3 | 0 |   
-     | 3 | 2 | three | 3 | -3 | 0 |   
-     | 4 | 1 | four  | 3 | -3 | 0 |   
-     | 5 | 0 | five  | 3 | -3 | 0 |   
-     | 6 | 6 | six   | 3 | -3 | 0 |   
-     | 7 | 7 | seven | 3 | -3 | 0 |   
-     | 8 | 8 | eight | 3 | -3 | 0 |   
-     | 0 |   | zero  | 3 | -3 | 0 |   
-     |   |   | null  | 3 | -3 | 0 |   
-     |   | 0 | zero  | 3 | -3 | 0 |   
-     | 1 | 4 | one   | 3 | -3 |   |   
-     | 2 | 3 | two   | 3 | -3 |   |   
-     | 3 | 2 | three | 3 | -3 |   |   
-     | 4 | 1 | four  | 3 | -3 |   |   
-     | 5 | 0 | five  | 3 | -3 |   |   
-     | 6 | 6 | six   | 3 | -3 |   |   
-     | 7 | 7 | seven | 3 | -3 |   |   
-     | 8 | 8 | eight | 3 | -3 |   |   
-     | 0 |   | zero  | 3 | -3 |   |   
-     |   |   | null  | 3 | -3 |   |   
-     |   | 0 | zero  | 3 | -3 |   |   
-     | 1 | 4 | one   | 3 | -3 |   |  0
-     | 2 | 3 | two   | 3 | -3 |   |  0
-     | 3 | 2 | three | 3 | -3 |   |  0
-     | 4 | 1 | four  | 3 | -3 |   |  0
-     | 5 | 0 | five  | 3 | -3 |   |  0
-     | 6 | 6 | six   | 3 | -3 |   |  0
-     | 7 | 7 | seven | 3 | -3 |   |  0
-     | 8 | 8 | eight | 3 | -3 |   |  0
-     | 0 |   | zero  | 3 | -3 |   |  0
-     |   |   | null  | 3 | -3 |   |  0
-     |   | 0 | zero  | 3 | -3 |   |  0
-     | 1 | 4 | one   | 2 |  4 | 1 | -1
-     | 2 | 3 | two   | 2 |  4 | 1 | -1
-     | 3 | 2 | three | 2 |  4 | 1 | -1
-     | 4 | 1 | four  | 2 |  4 | 1 | -1
-     | 5 | 0 | five  | 2 |  4 | 1 | -1
-     | 6 | 6 | six   | 2 |  4 | 1 | -1
-     | 7 | 7 | seven | 2 |  4 | 1 | -1
-     | 8 | 8 | eight | 2 |  4 | 1 | -1
-     | 0 |   | zero  | 2 |  4 | 1 | -1
-     |   |   | null  | 2 |  4 | 1 | -1
-     |   | 0 | zero  | 2 |  4 | 1 | -1
-     | 1 | 4 | one   | 2 |  4 | 2 |  2
-     | 2 | 3 | two   | 2 |  4 | 2 |  2
-     | 3 | 2 | three | 2 |  4 | 2 |  2
-     | 4 | 1 | four  | 2 |  4 | 2 |  2
-     | 5 | 0 | five  | 2 |  4 | 2 |  2
-     | 6 | 6 | six   | 2 |  4 | 2 |  2
-     | 7 | 7 | seven | 2 |  4 | 2 |  2
-     | 8 | 8 | eight | 2 |  4 | 2 |  2
-     | 0 |   | zero  | 2 |  4 | 2 |  2
-     |   |   | null  | 2 |  4 | 2 |  2
-     |   | 0 | zero  | 2 |  4 | 2 |  2
-     | 1 | 4 | one   | 2 |  4 | 3 | -3
-     | 2 | 3 | two   | 2 |  4 | 3 | -3
-     | 3 | 2 | three | 2 |  4 | 3 | -3
-     | 4 | 1 | four  | 2 |  4 | 3 | -3
-     | 5 | 0 | five  | 2 |  4 | 3 | -3
-     | 6 | 6 | six   | 2 |  4 | 3 | -3
-     | 7 | 7 | seven | 2 |  4 | 3 | -3
-     | 8 | 8 | eight | 2 |  4 | 3 | -3
-     | 0 |   | zero  | 2 |  4 | 3 | -3
-     |   |   | null  | 2 |  4 | 3 | -3
-     |   | 0 | zero  | 2 |  4 | 3 | -3
-     | 1 | 4 | one   | 2 |  4 | 2 |  4
-     | 2 | 3 | two   | 2 |  4 | 2 |  4
-     | 3 | 2 | three | 2 |  4 | 2 |  4
-     | 4 | 1 | four  | 2 |  4 | 2 |  4
-     | 5 | 0 | five  | 2 |  4 | 2 |  4
-     | 6 | 6 | six   | 2 |  4 | 2 |  4
-     | 7 | 7 | seven | 2 |  4 | 2 |  4
-     | 8 | 8 | eight | 2 |  4 | 2 |  4
-     | 0 |   | zero  | 2 |  4 | 2 |  4
-     |   |   | null  | 2 |  4 | 2 |  4
-     |   | 0 | zero  | 2 |  4 | 2 |  4
-     | 1 | 4 | one   | 2 |  4 | 5 | -5
-     | 2 | 3 | two   | 2 |  4 | 5 | -5
-     | 3 | 2 | three | 2 |  4 | 5 | -5
-     | 4 | 1 | four  | 2 |  4 | 5 | -5
-     | 5 | 0 | five  | 2 |  4 | 5 | -5
-     | 6 | 6 | six   | 2 |  4 | 5 | -5
-     | 7 | 7 | seven | 2 |  4 | 5 | -5
-     | 8 | 8 | eight | 2 |  4 | 5 | -5
-     | 0 |   | zero  | 2 |  4 | 5 | -5
-     |   |   | null  | 2 |  4 | 5 | -5
-     |   | 0 | zero  | 2 |  4 | 5 | -5
-     | 1 | 4 | one   | 2 |  4 | 5 | -5
-     | 2 | 3 | two   | 2 |  4 | 5 | -5
-     | 3 | 2 | three | 2 |  4 | 5 | -5
-     | 4 | 1 | four  | 2 |  4 | 5 | -5
-     | 5 | 0 | five  | 2 |  4 | 5 | -5
-     | 6 | 6 | six   | 2 |  4 | 5 | -5
-     | 7 | 7 | seven | 2 |  4 | 5 | -5
-     | 8 | 8 | eight | 2 |  4 | 5 | -5
-     | 0 |   | zero  | 2 |  4 | 5 | -5
-     |   |   | null  | 2 |  4 | 5 | -5
-     |   | 0 | zero  | 2 |  4 | 5 | -5
-     | 1 | 4 | one   | 2 |  4 | 0 |   
-     | 2 | 3 | two   | 2 |  4 | 0 |   
-     | 3 | 2 | three | 2 |  4 | 0 |   
-     | 4 | 1 | four  | 2 |  4 | 0 |   
-     | 5 | 0 | five  | 2 |  4 | 0 |   
-     | 6 | 6 | six   | 2 |  4 | 0 |   
-     | 7 | 7 | seven | 2 |  4 | 0 |   
-     | 8 | 8 | eight | 2 |  4 | 0 |   
-     | 0 |   | zero  | 2 |  4 | 0 |   
-     |   |   | null  | 2 |  4 | 0 |   
-     |   | 0 | zero  | 2 |  4 | 0 |   
-     | 1 | 4 | one   | 2 |  4 |   |   
-     | 2 | 3 | two   | 2 |  4 |   |   
-     | 3 | 2 | three | 2 |  4 |   |   
-     | 4 | 1 | four  | 2 |  4 |   |   
-     | 5 | 0 | five  | 2 |  4 |   |   
-     | 6 | 6 | six   | 2 |  4 |   |   
-     | 7 | 7 | seven | 2 |  4 |   |   
-     | 8 | 8 | eight | 2 |  4 |   |   
-     | 0 |   | zero  | 2 |  4 |   |   
-     |   |   | null  | 2 |  4 |   |   
-     |   | 0 | zero  | 2 |  4 |   |   
-     | 1 | 4 | one   | 2 |  4 |   |  0
-     | 2 | 3 | two   | 2 |  4 |   |  0
-     | 3 | 2 | three | 2 |  4 |   |  0
-     | 4 | 1 | four  | 2 |  4 |   |  0
-     | 5 | 0 | five  | 2 |  4 |   |  0
-     | 6 | 6 | six   | 2 |  4 |   |  0
-     | 7 | 7 | seven | 2 |  4 |   |  0
-     | 8 | 8 | eight | 2 |  4 |   |  0
-     | 0 |   | zero  | 2 |  4 |   |  0
-     |   |   | null  | 2 |  4 |   |  0
-     |   | 0 | zero  | 2 |  4 |   |  0
-     | 1 | 4 | one   | 5 | -5 | 1 | -1
-     | 2 | 3 | two   | 5 | -5 | 1 | -1
-     | 3 | 2 | three | 5 | -5 | 1 | -1
-     | 4 | 1 | four  | 5 | -5 | 1 | -1
-     | 5 | 0 | five  | 5 | -5 | 1 | -1
-     | 6 | 6 | six   | 5 | -5 | 1 | -1
-     | 7 | 7 | seven | 5 | -5 | 1 | -1
-     | 8 | 8 | eight | 5 | -5 | 1 | -1
-     | 0 |   | zero  | 5 | -5 | 1 | -1
-     |   |   | null  | 5 | -5 | 1 | -1
-     |   | 0 | zero  | 5 | -5 | 1 | -1
-     | 1 | 4 | one   | 5 | -5 | 2 |  2
-     | 2 | 3 | two   | 5 | -5 | 2 |  2
-     | 3 | 2 | three | 5 | -5 | 2 |  2
-     | 4 | 1 | four  | 5 | -5 | 2 |  2
-     | 5 | 0 | five  | 5 | -5 | 2 |  2
-     | 6 | 6 | six   | 5 | -5 | 2 |  2
-     | 7 | 7 | seven | 5 | -5 | 2 |  2
-     | 8 | 8 | eight | 5 | -5 | 2 |  2
-     | 0 |   | zero  | 5 | -5 | 2 |  2
-     |   |   | null  | 5 | -5 | 2 |  2
-     |   | 0 | zero  | 5 | -5 | 2 |  2
-     | 1 | 4 | one   | 5 | -5 | 3 | -3
-     | 2 | 3 | two   | 5 | -5 | 3 | -3
-     | 3 | 2 | three | 5 | -5 | 3 | -3
-     | 4 | 1 | four  | 5 | -5 | 3 | -3
-     | 5 | 0 | five  | 5 | -5 | 3 | -3
-     | 6 | 6 | six   | 5 | -5 | 3 | -3
-     | 7 | 7 | seven | 5 | -5 | 3 | -3
-     | 8 | 8 | eight | 5 | -5 | 3 | -3
-     | 0 |   | zero  | 5 | -5 | 3 | -3
-     |   |   | null  | 5 | -5 | 3 | -3
-     |   | 0 | zero  | 5 | -5 | 3 | -3
-     | 1 | 4 | one   | 5 | -5 | 2 |  4
-     | 2 | 3 | two   | 5 | -5 | 2 |  4
-     | 3 | 2 | three | 5 | -5 | 2 |  4
-     | 4 | 1 | four  | 5 | -5 | 2 |  4
-     | 5 | 0 | five  | 5 | -5 | 2 |  4
-     | 6 | 6 | six   | 5 | -5 | 2 |  4
-     | 7 | 7 | seven | 5 | -5 | 2 |  4
-     | 8 | 8 | eight | 5 | -5 | 2 |  4
-     | 0 |   | zero  | 5 | -5 | 2 |  4
-     |   |   | null  | 5 | -5 | 2 |  4
-     |   | 0 | zero  | 5 | -5 | 2 |  4
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 0 |   
-     | 2 | 3 | two   | 5 | -5 | 0 |   
-     | 3 | 2 | three | 5 | -5 | 0 |   
-     | 4 | 1 | four  | 5 | -5 | 0 |   
-     | 5 | 0 | five  | 5 | -5 | 0 |   
-     | 6 | 6 | six   | 5 | -5 | 0 |   
-     | 7 | 7 | seven | 5 | -5 | 0 |   
-     | 8 | 8 | eight | 5 | -5 | 0 |   
-     | 0 |   | zero  | 5 | -5 | 0 |   
-     |   |   | null  | 5 | -5 | 0 |   
-     |   | 0 | zero  | 5 | -5 | 0 |   
-     | 1 | 4 | one   | 5 | -5 |   |   
-     | 2 | 3 | two   | 5 | -5 |   |   
-     | 3 | 2 | three | 5 | -5 |   |   
-     | 4 | 1 | four  | 5 | -5 |   |   
-     | 5 | 0 | five  | 5 | -5 |   |   
-     | 6 | 6 | six   | 5 | -5 |   |   
-     | 7 | 7 | seven | 5 | -5 |   |   
-     | 8 | 8 | eight | 5 | -5 |   |   
-     | 0 |   | zero  | 5 | -5 |   |   
-     |   |   | null  | 5 | -5 |   |   
-     |   | 0 | zero  | 5 | -5 |   |   
-     | 1 | 4 | one   | 5 | -5 |   |  0
-     | 2 | 3 | two   | 5 | -5 |   |  0
-     | 3 | 2 | three | 5 | -5 |   |  0
-     | 4 | 1 | four  | 5 | -5 |   |  0
-     | 5 | 0 | five  | 5 | -5 |   |  0
-     | 6 | 6 | six   | 5 | -5 |   |  0
-     | 7 | 7 | seven | 5 | -5 |   |  0
-     | 8 | 8 | eight | 5 | -5 |   |  0
-     | 0 |   | zero  | 5 | -5 |   |  0
-     |   |   | null  | 5 | -5 |   |  0
-     |   | 0 | zero  | 5 | -5 |   |  0
-     | 1 | 4 | one   | 5 | -5 | 1 | -1
-     | 2 | 3 | two   | 5 | -5 | 1 | -1
-     | 3 | 2 | three | 5 | -5 | 1 | -1
-     | 4 | 1 | four  | 5 | -5 | 1 | -1
-     | 5 | 0 | five  | 5 | -5 | 1 | -1
-     | 6 | 6 | six   | 5 | -5 | 1 | -1
-     | 7 | 7 | seven | 5 | -5 | 1 | -1
-     | 8 | 8 | eight | 5 | -5 | 1 | -1
-     | 0 |   | zero  | 5 | -5 | 1 | -1
-     |   |   | null  | 5 | -5 | 1 | -1
-     |   | 0 | zero  | 5 | -5 | 1 | -1
-     | 1 | 4 | one   | 5 | -5 | 2 |  2
-     | 2 | 3 | two   | 5 | -5 | 2 |  2
-     | 3 | 2 | three | 5 | -5 | 2 |  2
-     | 4 | 1 | four  | 5 | -5 | 2 |  2
-     | 5 | 0 | five  | 5 | -5 | 2 |  2
-     | 6 | 6 | six   | 5 | -5 | 2 |  2
-     | 7 | 7 | seven | 5 | -5 | 2 |  2
-     | 8 | 8 | eight | 5 | -5 | 2 |  2
-     | 0 |   | zero  | 5 | -5 | 2 |  2
-     |   |   | null  | 5 | -5 | 2 |  2
-     |   | 0 | zero  | 5 | -5 | 2 |  2
-     | 1 | 4 | one   | 5 | -5 | 3 | -3
-     | 2 | 3 | two   | 5 | -5 | 3 | -3
-     | 3 | 2 | three | 5 | -5 | 3 | -3
-     | 4 | 1 | four  | 5 | -5 | 3 | -3
-     | 5 | 0 | five  | 5 | -5 | 3 | -3
-     | 6 | 6 | six   | 5 | -5 | 3 | -3
-     | 7 | 7 | seven | 5 | -5 | 3 | -3
-     | 8 | 8 | eight | 5 | -5 | 3 | -3
-     | 0 |   | zero  | 5 | -5 | 3 | -3
-     |   |   | null  | 5 | -5 | 3 | -3
-     |   | 0 | zero  | 5 | -5 | 3 | -3
-     | 1 | 4 | one   | 5 | -5 | 2 |  4
-     | 2 | 3 | two   | 5 | -5 | 2 |  4
-     | 3 | 2 | three | 5 | -5 | 2 |  4
-     | 4 | 1 | four  | 5 | -5 | 2 |  4
-     | 5 | 0 | five  | 5 | -5 | 2 |  4
-     | 6 | 6 | six   | 5 | -5 | 2 |  4
-     | 7 | 7 | seven | 5 | -5 | 2 |  4
-     | 8 | 8 | eight | 5 | -5 | 2 |  4
-     | 0 |   | zero  | 5 | -5 | 2 |  4
-     |   |   | null  | 5 | -5 | 2 |  4
-     |   | 0 | zero  | 5 | -5 | 2 |  4
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 0 |   
-     | 2 | 3 | two   | 5 | -5 | 0 |   
-     | 3 | 2 | three | 5 | -5 | 0 |   
-     | 4 | 1 | four  | 5 | -5 | 0 |   
-     | 5 | 0 | five  | 5 | -5 | 0 |   
-     | 6 | 6 | six   | 5 | -5 | 0 |   
-     | 7 | 7 | seven | 5 | -5 | 0 |   
-     | 8 | 8 | eight | 5 | -5 | 0 |   
-     | 0 |   | zero  | 5 | -5 | 0 |   
-     |   |   | null  | 5 | -5 | 0 |   
-     |   | 0 | zero  | 5 | -5 | 0 |   
-     | 1 | 4 | one   | 5 | -5 |   |   
-     | 2 | 3 | two   | 5 | -5 |   |   
-     | 3 | 2 | three | 5 | -5 |   |   
-     | 4 | 1 | four  | 5 | -5 |   |   
-     | 5 | 0 | five  | 5 | -5 |   |   
-     | 6 | 6 | six   | 5 | -5 |   |   
-     | 7 | 7 | seven | 5 | -5 |   |   
-     | 8 | 8 | eight | 5 | -5 |   |   
-     | 0 |   | zero  | 5 | -5 |   |   
-     |   |   | null  | 5 | -5 |   |   
-     |   | 0 | zero  | 5 | -5 |   |   
-     | 1 | 4 | one   | 5 | -5 |   |  0
-     | 2 | 3 | two   | 5 | -5 |   |  0
-     | 3 | 2 | three | 5 | -5 |   |  0
-     | 4 | 1 | four  | 5 | -5 |   |  0
-     | 5 | 0 | five  | 5 | -5 |   |  0
-     | 6 | 6 | six   | 5 | -5 |   |  0
-     | 7 | 7 | seven | 5 | -5 |   |  0
-     | 8 | 8 | eight | 5 | -5 |   |  0
-     | 0 |   | zero  | 5 | -5 |   |  0
-     |   |   | null  | 5 | -5 |   |  0
-     |   | 0 | zero  | 5 | -5 |   |  0
+     | 1 | 4 | one   | 2 |  2 | 1 | -1
+     | 1 | 4 | one   | 3 | -3 | 1 | -1
+     | 1 | 4 | one   | 2 |  4 | 1 | -1
+     | 1 | 4 | one   | 5 | -5 | 1 | -1
+     | 1 | 4 | one   | 5 | -5 | 1 | -1
      | 1 | 4 | one   | 0 |    | 1 | -1
-     | 2 | 3 | two   | 0 |    | 1 | -1
-     | 3 | 2 | three | 0 |    | 1 | -1
-     | 4 | 1 | four  | 0 |    | 1 | -1
-     | 5 | 0 | five  | 0 |    | 1 | -1
-     | 6 | 6 | six   | 0 |    | 1 | -1
-     | 7 | 7 | seven | 0 |    | 1 | -1
-     | 8 | 8 | eight | 0 |    | 1 | -1
-     | 0 |   | zero  | 0 |    | 1 | -1
-     |   |   | null  | 0 |    | 1 | -1
-     |   | 0 | zero  | 0 |    | 1 | -1
-     | 1 | 4 | one   | 0 |    | 2 |  2
-     | 2 | 3 | two   | 0 |    | 2 |  2
-     | 3 | 2 | three | 0 |    | 2 |  2
-     | 4 | 1 | four  | 0 |    | 2 |  2
-     | 5 | 0 | five  | 0 |    | 2 |  2
-     | 6 | 6 | six   | 0 |    | 2 |  2
-     | 7 | 7 | seven | 0 |    | 2 |  2
-     | 8 | 8 | eight | 0 |    | 2 |  2
-     | 0 |   | zero  | 0 |    | 2 |  2
-     |   |   | null  | 0 |    | 2 |  2
-     |   | 0 | zero  | 0 |    | 2 |  2
-     | 1 | 4 | one   | 0 |    | 3 | -3
-     | 2 | 3 | two   | 0 |    | 3 | -3
-     | 3 | 2 | three | 0 |    | 3 | -3
-     | 4 | 1 | four  | 0 |    | 3 | -3
-     | 5 | 0 | five  | 0 |    | 3 | -3
-     | 6 | 6 | six   | 0 |    | 3 | -3
-     | 7 | 7 | seven | 0 |    | 3 | -3
-     | 8 | 8 | eight | 0 |    | 3 | -3
-     | 0 |   | zero  | 0 |    | 3 | -3
-     |   |   | null  | 0 |    | 3 | -3
-     |   | 0 | zero  | 0 |    | 3 | -3
-     | 1 | 4 | one   | 0 |    | 2 |  4
-     | 2 | 3 | two   | 0 |    | 2 |  4
-     | 3 | 2 | three | 0 |    | 2 |  4
-     | 4 | 1 | four  | 0 |    | 2 |  4
-     | 5 | 0 | five  | 0 |    | 2 |  4
-     | 6 | 6 | six   | 0 |    | 2 |  4
-     | 7 | 7 | seven | 0 |    | 2 |  4
-     | 8 | 8 | eight | 0 |    | 2 |  4
-     | 0 |   | zero  | 0 |    | 2 |  4
-     |   |   | null  | 0 |    | 2 |  4
-     |   | 0 | zero  | 0 |    | 2 |  4
-     | 1 | 4 | one   | 0 |    | 5 | -5
-     | 2 | 3 | two   | 0 |    | 5 | -5
-     | 3 | 2 | three | 0 |    | 5 | -5
-     | 4 | 1 | four  | 0 |    | 5 | -5
-     | 5 | 0 | five  | 0 |    | 5 | -5
-     | 6 | 6 | six   | 0 |    | 5 | -5
-     | 7 | 7 | seven | 0 |    | 5 | -5
-     | 8 | 8 | eight | 0 |    | 5 | -5
-     | 0 |   | zero  | 0 |    | 5 | -5
-     |   |   | null  | 0 |    | 5 | -5
-     |   | 0 | zero  | 0 |    | 5 | -5
-     | 1 | 4 | one   | 0 |    | 5 | -5
-     | 2 | 3 | two   | 0 |    | 5 | -5
-     | 3 | 2 | three | 0 |    | 5 | -5
-     | 4 | 1 | four  | 0 |    | 5 | -5
-     | 5 | 0 | five  | 0 |    | 5 | -5
-     | 6 | 6 | six   | 0 |    | 5 | -5
-     | 7 | 7 | seven | 0 |    | 5 | -5
-     | 8 | 8 | eight | 0 |    | 5 | -5
-     | 0 |   | zero  | 0 |    | 5 | -5
-     |   |   | null  | 0 |    | 5 | -5
-     |   | 0 | zero  | 0 |    | 5 | -5
-     | 1 | 4 | one   | 0 |    | 0 |   
-     | 2 | 3 | two   | 0 |    | 0 |   
-     | 3 | 2 | three | 0 |    | 0 |   
-     | 4 | 1 | four  | 0 |    | 0 |   
-     | 5 | 0 | five  | 0 |    | 0 |   
-     | 6 | 6 | six   | 0 |    | 0 |   
-     | 7 | 7 | seven | 0 |    | 0 |   
-     | 8 | 8 | eight | 0 |    | 0 |   
-     | 0 |   | zero  | 0 |    | 0 |   
-     |   |   | null  | 0 |    | 0 |   
-     |   | 0 | zero  | 0 |    | 0 |   
-     | 1 | 4 | one   | 0 |    |   |   
-     | 2 | 3 | two   | 0 |    |   |   
-     | 3 | 2 | three | 0 |    |   |   
-     | 4 | 1 | four  | 0 |    |   |   
-     | 5 | 0 | five  | 0 |    |   |   
-     | 6 | 6 | six   | 0 |    |   |   
-     | 7 | 7 | seven | 0 |    |   |   
-     | 8 | 8 | eight | 0 |    |   |   
-     | 0 |   | zero  | 0 |    |   |   
-     |   |   | null  | 0 |    |   |   
-     |   | 0 | zero  | 0 |    |   |   
-     | 1 | 4 | one   | 0 |    |   |  0
-     | 2 | 3 | two   | 0 |    |   |  0
-     | 3 | 2 | three | 0 |    |   |  0
-     | 4 | 1 | four  | 0 |    |   |  0
-     | 5 | 0 | five  | 0 |    |   |  0
-     | 6 | 6 | six   | 0 |    |   |  0
-     | 7 | 7 | seven | 0 |    |   |  0
-     | 8 | 8 | eight | 0 |    |   |  0
-     | 0 |   | zero  | 0 |    |   |  0
-     |   |   | null  | 0 |    |   |  0
-     |   | 0 | zero  | 0 |    |   |  0
      | 1 | 4 | one   |   |    | 1 | -1
-     | 2 | 3 | two   |   |    | 1 | -1
-     | 3 | 2 | three |   |    | 1 | -1
-     | 4 | 1 | four  |   |    | 1 | -1
-     | 5 | 0 | five  |   |    | 1 | -1
-     | 6 | 6 | six   |   |    | 1 | -1
-     | 7 | 7 | seven |   |    | 1 | -1
-     | 8 | 8 | eight |   |    | 1 | -1
-     | 0 |   | zero  |   |    | 1 | -1
-     |   |   | null  |   |    | 1 | -1
-     |   | 0 | zero  |   |    | 1 | -1
-     | 1 | 4 | one   |   |    | 2 |  2
-     | 2 | 3 | two   |   |    | 2 |  2
-     | 3 | 2 | three |   |    | 2 |  2
-     | 4 | 1 | four  |   |    | 2 |  2
-     | 5 | 0 | five  |   |    | 2 |  2
-     | 6 | 6 | six   |   |    | 2 |  2
-     | 7 | 7 | seven |   |    | 2 |  2
-     | 8 | 8 | eight |   |    | 2 |  2
-     | 0 |   | zero  |   |    | 2 |  2
-     |   |   | null  |   |    | 2 |  2
-     |   | 0 | zero  |   |    | 2 |  2
-     | 1 | 4 | one   |   |    | 3 | -3
-     | 2 | 3 | two   |   |    | 3 | -3
-     | 3 | 2 | three |   |    | 3 | -3
-     | 4 | 1 | four  |   |    | 3 | -3
-     | 5 | 0 | five  |   |    | 3 | -3
-     | 6 | 6 | six   |   |    | 3 | -3
-     | 7 | 7 | seven |   |    | 3 | -3
-     | 8 | 8 | eight |   |    | 3 | -3
-     | 0 |   | zero  |   |    | 3 | -3
-     |   |   | null  |   |    | 3 | -3
-     |   | 0 | zero  |   |    | 3 | -3
-     | 1 | 4 | one   |   |    | 2 |  4
-     | 2 | 3 | two   |   |    | 2 |  4
-     | 3 | 2 | three |   |    | 2 |  4
-     | 4 | 1 | four  |   |    | 2 |  4
-     | 5 | 0 | five  |   |    | 2 |  4
-     | 6 | 6 | six   |   |    | 2 |  4
-     | 7 | 7 | seven |   |    | 2 |  4
-     | 8 | 8 | eight |   |    | 2 |  4
-     | 0 |   | zero  |   |    | 2 |  4
-     |   |   | null  |   |    | 2 |  4
-     |   | 0 | zero  |   |    | 2 |  4
-     | 1 | 4 | one   |   |    | 5 | -5
-     | 2 | 3 | two   |   |    | 5 | -5
-     | 3 | 2 | three |   |    | 5 | -5
-     | 4 | 1 | four  |   |    | 5 | -5
-     | 5 | 0 | five  |   |    | 5 | -5
-     | 6 | 6 | six   |   |    | 5 | -5
-     | 7 | 7 | seven |   |    | 5 | -5
-     | 8 | 8 | eight |   |    | 5 | -5
-     | 0 |   | zero  |   |    | 5 | -5
-     |   |   | null  |   |    | 5 | -5
-     |   | 0 | zero  |   |    | 5 | -5
-     | 1 | 4 | one   |   |    | 5 | -5
-     | 2 | 3 | two   |   |    | 5 | -5
-     | 3 | 2 | three |   |    | 5 | -5
-     | 4 | 1 | four  |   |    | 5 | -5
-     | 5 | 0 | five  |   |    | 5 | -5
-     | 6 | 6 | six   |   |    | 5 | -5
-     | 7 | 7 | seven |   |    | 5 | -5
-     | 8 | 8 | eight |   |    | 5 | -5
-     | 0 |   | zero  |   |    | 5 | -5
-     |   |   | null  |   |    | 5 | -5
-     |   | 0 | zero  |   |    | 5 | -5
-     | 1 | 4 | one   |   |    | 0 |   
-     | 2 | 3 | two   |   |    | 0 |   
-     | 3 | 2 | three |   |    | 0 |   
-     | 4 | 1 | four  |   |    | 0 |   
-     | 5 | 0 | five  |   |    | 0 |   
-     | 6 | 6 | six   |   |    | 0 |   
-     | 7 | 7 | seven |   |    | 0 |   
-     | 8 | 8 | eight |   |    | 0 |   
-     | 0 |   | zero  |   |    | 0 |   
-     |   |   | null  |   |    | 0 |   
-     |   | 0 | zero  |   |    | 0 |   
-     | 1 | 4 | one   |   |    |   |   
-     | 2 | 3 | two   |   |    |   |   
-     | 3 | 2 | three |   |    |   |   
-     | 4 | 1 | four  |   |    |   |   
-     | 5 | 0 | five  |   |    |   |   
-     | 6 | 6 | six   |   |    |   |   
-     | 7 | 7 | seven |   |    |   |   
-     | 8 | 8 | eight |   |    |   |   
-     | 0 |   | zero  |   |    |   |   
-     |   |   | null  |   |    |   |   
-     |   | 0 | zero  |   |    |   |   
-     | 1 | 4 | one   |   |    |   |  0
-     | 2 | 3 | two   |   |    |   |  0
-     | 3 | 2 | three |   |    |   |  0
-     | 4 | 1 | four  |   |    |   |  0
-     | 5 | 0 | five  |   |    |   |  0
-     | 6 | 6 | six   |   |    |   |  0
-     | 7 | 7 | seven |   |    |   |  0
-     | 8 | 8 | eight |   |    |   |  0
-     | 0 |   | zero  |   |    |   |  0
-     |   |   | null  |   |    |   |  0
-     |   | 0 | zero  |   |    |   |  0
      | 1 | 4 | one   |   |  0 | 1 | -1
+     | 2 | 3 | two   | 1 | -1 | 1 | -1
+     | 2 | 3 | two   | 2 |  2 | 1 | -1
+     | 2 | 3 | two   | 3 | -3 | 1 | -1
+     | 2 | 3 | two   | 2 |  4 | 1 | -1
+     | 2 | 3 | two   | 5 | -5 | 1 | -1
+     | 2 | 3 | two   | 5 | -5 | 1 | -1
+     | 2 | 3 | two   | 0 |    | 1 | -1
+     | 2 | 3 | two   |   |    | 1 | -1
      | 2 | 3 | two   |   |  0 | 1 | -1
+     | 3 | 2 | three | 1 | -1 | 1 | -1
+     | 3 | 2 | three | 2 |  2 | 1 | -1
+     | 3 | 2 | three | 3 | -3 | 1 | -1
+     | 3 | 2 | three | 2 |  4 | 1 | -1
+     | 3 | 2 | three | 5 | -5 | 1 | -1
+     | 3 | 2 | three | 5 | -5 | 1 | -1
+     | 3 | 2 | three | 0 |    | 1 | -1
+     | 3 | 2 | three |   |    | 1 | -1
      | 3 | 2 | three |   |  0 | 1 | -1
+     | 4 | 1 | four  | 1 | -1 | 1 | -1
+     | 4 | 1 | four  | 2 |  2 | 1 | -1
+     | 4 | 1 | four  | 3 | -3 | 1 | -1
+     | 4 | 1 | four  | 2 |  4 | 1 | -1
+     | 4 | 1 | four  | 5 | -5 | 1 | -1
+     | 4 | 1 | four  | 5 | -5 | 1 | -1
+     | 4 | 1 | four  | 0 |    | 1 | -1
+     | 4 | 1 | four  |   |    | 1 | -1
      | 4 | 1 | four  |   |  0 | 1 | -1
+     | 5 | 0 | five  | 1 | -1 | 1 | -1
+     | 5 | 0 | five  | 2 |  2 | 1 | -1
+     | 5 | 0 | five  | 3 | -3 | 1 | -1
+     | 5 | 0 | five  | 2 |  4 | 1 | -1
+     | 5 | 0 | five  | 5 | -5 | 1 | -1
+     | 5 | 0 | five  | 5 | -5 | 1 | -1
+     | 5 | 0 | five  | 0 |    | 1 | -1
+     | 5 | 0 | five  |   |    | 1 | -1
      | 5 | 0 | five  |   |  0 | 1 | -1
+     | 6 | 6 | six   | 1 | -1 | 1 | -1
+     | 6 | 6 | six   | 2 |  2 | 1 | -1
+     | 6 | 6 | six   | 3 | -3 | 1 | -1
+     | 6 | 6 | six   | 2 |  4 | 1 | -1
+     | 6 | 6 | six   | 5 | -5 | 1 | -1
+     | 6 | 6 | six   | 5 | -5 | 1 | -1
+     | 6 | 6 | six   | 0 |    | 1 | -1
+     | 6 | 6 | six   |   |    | 1 | -1
      | 6 | 6 | six   |   |  0 | 1 | -1
+     | 7 | 7 | seven | 1 | -1 | 1 | -1
+     | 7 | 7 | seven | 2 |  2 | 1 | -1
+     | 7 | 7 | seven | 3 | -3 | 1 | -1
+     | 7 | 7 | seven | 2 |  4 | 1 | -1
+     | 7 | 7 | seven | 5 | -5 | 1 | -1
+     | 7 | 7 | seven | 5 | -5 | 1 | -1
+     | 7 | 7 | seven | 0 |    | 1 | -1
+     | 7 | 7 | seven |   |    | 1 | -1
      | 7 | 7 | seven |   |  0 | 1 | -1
+     | 8 | 8 | eight | 1 | -1 | 1 | -1
+     | 8 | 8 | eight | 2 |  2 | 1 | -1
+     | 8 | 8 | eight | 3 | -3 | 1 | -1
+     | 8 | 8 | eight | 2 |  4 | 1 | -1
+     | 8 | 8 | eight | 5 | -5 | 1 | -1
+     | 8 | 8 | eight | 5 | -5 | 1 | -1
+     | 8 | 8 | eight | 0 |    | 1 | -1
+     | 8 | 8 | eight |   |    | 1 | -1
      | 8 | 8 | eight |   |  0 | 1 | -1
+     | 0 |   | zero  | 1 | -1 | 1 | -1
+     | 0 |   | zero  | 2 |  2 | 1 | -1
+     | 0 |   | zero  | 3 | -3 | 1 | -1
+     | 0 |   | zero  | 2 |  4 | 1 | -1
+     | 0 |   | zero  | 5 | -5 | 1 | -1
+     | 0 |   | zero  | 5 | -5 | 1 | -1
+     | 0 |   | zero  | 0 |    | 1 | -1
+     | 0 |   | zero  |   |    | 1 | -1
      | 0 |   | zero  |   |  0 | 1 | -1
+     |   |   | null  | 1 | -1 | 1 | -1
+     |   |   | null  | 2 |  2 | 1 | -1
+     |   |   | null  | 3 | -3 | 1 | -1
+     |   |   | null  | 2 |  4 | 1 | -1
+     |   |   | null  | 5 | -5 | 1 | -1
+     |   |   | null  | 5 | -5 | 1 | -1
+     |   |   | null  | 0 |    | 1 | -1
+     |   |   | null  |   |    | 1 | -1
      |   |   | null  |   |  0 | 1 | -1
+     |   | 0 | zero  | 1 | -1 | 1 | -1
+     |   | 0 | zero  | 2 |  2 | 1 | -1
+     |   | 0 | zero  | 3 | -3 | 1 | -1
+     |   | 0 | zero  | 2 |  4 | 1 | -1
+     |   | 0 | zero  | 5 | -5 | 1 | -1
+     |   | 0 | zero  | 5 | -5 | 1 | -1
+     |   | 0 | zero  | 0 |    | 1 | -1
+     |   | 0 | zero  |   |    | 1 | -1
      |   | 0 | zero  |   |  0 | 1 | -1
+     | 1 | 4 | one   | 1 | -1 | 2 |  2
+     | 1 | 4 | one   | 2 |  2 | 2 |  2
+     | 1 | 4 | one   | 3 | -3 | 2 |  2
+     | 1 | 4 | one   | 2 |  4 | 2 |  2
+     | 1 | 4 | one   | 5 | -5 | 2 |  2
+     | 1 | 4 | one   | 5 | -5 | 2 |  2
+     | 1 | 4 | one   | 0 |    | 2 |  2
+     | 1 | 4 | one   |   |    | 2 |  2
      | 1 | 4 | one   |   |  0 | 2 |  2
+     | 2 | 3 | two   | 1 | -1 | 2 |  2
+     | 2 | 3 | two   | 2 |  2 | 2 |  2
+     | 2 | 3 | two   | 3 | -3 | 2 |  2
+     | 2 | 3 | two   | 2 |  4 | 2 |  2
+     | 2 | 3 | two   | 5 | -5 | 2 |  2
+     | 2 | 3 | two   | 5 | -5 | 2 |  2
+     | 2 | 3 | two   | 0 |    | 2 |  2
+     | 2 | 3 | two   |   |    | 2 |  2
      | 2 | 3 | two   |   |  0 | 2 |  2
+     | 3 | 2 | three | 1 | -1 | 2 |  2
+     | 3 | 2 | three | 2 |  2 | 2 |  2
+     | 3 | 2 | three | 3 | -3 | 2 |  2
+     | 3 | 2 | three | 2 |  4 | 2 |  2
+     | 3 | 2 | three | 5 | -5 | 2 |  2
+     | 3 | 2 | three | 5 | -5 | 2 |  2
+     | 3 | 2 | three | 0 |    | 2 |  2
+     | 3 | 2 | three |   |    | 2 |  2
      | 3 | 2 | three |   |  0 | 2 |  2
+     | 4 | 1 | four  | 1 | -1 | 2 |  2
+     | 4 | 1 | four  | 2 |  2 | 2 |  2
+     | 4 | 1 | four  | 3 | -3 | 2 |  2
+     | 4 | 1 | four  | 2 |  4 | 2 |  2
+     | 4 | 1 | four  | 5 | -5 | 2 |  2
+     | 4 | 1 | four  | 5 | -5 | 2 |  2
+     | 4 | 1 | four  | 0 |    | 2 |  2
+     | 4 | 1 | four  |   |    | 2 |  2
      | 4 | 1 | four  |   |  0 | 2 |  2
+     | 5 | 0 | five  | 1 | -1 | 2 |  2
+     | 5 | 0 | five  | 2 |  2 | 2 |  2
+     | 5 | 0 | five  | 3 | -3 | 2 |  2
+     | 5 | 0 | five  | 2 |  4 | 2 |  2
+     | 5 | 0 | five  | 5 | -5 | 2 |  2
+     | 5 | 0 | five  | 5 | -5 | 2 |  2
+     | 5 | 0 | five  | 0 |    | 2 |  2
+     | 5 | 0 | five  |   |    | 2 |  2
      | 5 | 0 | five  |   |  0 | 2 |  2
+     | 6 | 6 | six   | 1 | -1 | 2 |  2
+     | 6 | 6 | six   | 2 |  2 | 2 |  2
+     | 6 | 6 | six   | 3 | -3 | 2 |  2
+     | 6 | 6 | six   | 2 |  4 | 2 |  2
+     | 6 | 6 | six   | 5 | -5 | 2 |  2
+     | 6 | 6 | six   | 5 | -5 | 2 |  2
+     | 6 | 6 | six   | 0 |    | 2 |  2
+     | 6 | 6 | six   |   |    | 2 |  2
      | 6 | 6 | six   |   |  0 | 2 |  2
+     | 7 | 7 | seven | 1 | -1 | 2 |  2
+     | 7 | 7 | seven | 2 |  2 | 2 |  2
+     | 7 | 7 | seven | 3 | -3 | 2 |  2
+     | 7 | 7 | seven | 2 |  4 | 2 |  2
+     | 7 | 7 | seven | 5 | -5 | 2 |  2
+     | 7 | 7 | seven | 5 | -5 | 2 |  2
+     | 7 | 7 | seven | 0 |    | 2 |  2
+     | 7 | 7 | seven |   |    | 2 |  2
      | 7 | 7 | seven |   |  0 | 2 |  2
+     | 8 | 8 | eight | 1 | -1 | 2 |  2
+     | 8 | 8 | eight | 2 |  2 | 2 |  2
+     | 8 | 8 | eight | 3 | -3 | 2 |  2
+     | 8 | 8 | eight | 2 |  4 | 2 |  2
+     | 8 | 8 | eight | 5 | -5 | 2 |  2
+     | 8 | 8 | eight | 5 | -5 | 2 |  2
+     | 8 | 8 | eight | 0 |    | 2 |  2
+     | 8 | 8 | eight |   |    | 2 |  2
      | 8 | 8 | eight |   |  0 | 2 |  2
+     | 0 |   | zero  | 1 | -1 | 2 |  2
+     | 0 |   | zero  | 2 |  2 | 2 |  2
+     | 0 |   | zero  | 3 | -3 | 2 |  2
+     | 0 |   | zero  | 2 |  4 | 2 |  2
+     | 0 |   | zero  | 5 | -5 | 2 |  2
+     | 0 |   | zero  | 5 | -5 | 2 |  2
+     | 0 |   | zero  | 0 |    | 2 |  2
+     | 0 |   | zero  |   |    | 2 |  2
      | 0 |   | zero  |   |  0 | 2 |  2
+     |   |   | null  | 1 | -1 | 2 |  2
+     |   |   | null  | 2 |  2 | 2 |  2
+     |   |   | null  | 3 | -3 | 2 |  2
+     |   |   | null  | 2 |  4 | 2 |  2
+     |   |   | null  | 5 | -5 | 2 |  2
+     |   |   | null  | 5 | -5 | 2 |  2
+     |   |   | null  | 0 |    | 2 |  2
+     |   |   | null  |   |    | 2 |  2
      |   |   | null  |   |  0 | 2 |  2
+     |   | 0 | zero  | 1 | -1 | 2 |  2
+     |   | 0 | zero  | 2 |  2 | 2 |  2
+     |   | 0 | zero  | 3 | -3 | 2 |  2
+     |   | 0 | zero  | 2 |  4 | 2 |  2
+     |   | 0 | zero  | 5 | -5 | 2 |  2
+     |   | 0 | zero  | 5 | -5 | 2 |  2
+     |   | 0 | zero  | 0 |    | 2 |  2
+     |   | 0 | zero  |   |    | 2 |  2
      |   | 0 | zero  |   |  0 | 2 |  2
+     | 1 | 4 | one   | 1 | -1 | 3 | -3
+     | 1 | 4 | one   | 2 |  2 | 3 | -3
+     | 1 | 4 | one   | 3 | -3 | 3 | -3
+     | 1 | 4 | one   | 2 |  4 | 3 | -3
+     | 1 | 4 | one   | 5 | -5 | 3 | -3
+     | 1 | 4 | one   | 5 | -5 | 3 | -3
+     | 1 | 4 | one   | 0 |    | 3 | -3
+     | 1 | 4 | one   |   |    | 3 | -3
      | 1 | 4 | one   |   |  0 | 3 | -3
+     | 2 | 3 | two   | 1 | -1 | 3 | -3
+     | 2 | 3 | two   | 2 |  2 | 3 | -3
+     | 2 | 3 | two   | 3 | -3 | 3 | -3
+     | 2 | 3 | two   | 2 |  4 | 3 | -3
+     | 2 | 3 | two   | 5 | -5 | 3 | -3
+     | 2 | 3 | two   | 5 | -5 | 3 | -3
+     | 2 | 3 | two   | 0 |    | 3 | -3
+     | 2 | 3 | two   |   |    | 3 | -3
      | 2 | 3 | two   |   |  0 | 3 | -3
+     | 3 | 2 | three | 1 | -1 | 3 | -3
+     | 3 | 2 | three | 2 |  2 | 3 | -3
+     | 3 | 2 | three | 3 | -3 | 3 | -3
+     | 3 | 2 | three | 2 |  4 | 3 | -3
+     | 3 | 2 | three | 5 | -5 | 3 | -3
+     | 3 | 2 | three | 5 | -5 | 3 | -3
+     | 3 | 2 | three | 0 |    | 3 | -3
+     | 3 | 2 | three |   |    | 3 | -3
      | 3 | 2 | three |   |  0 | 3 | -3
+     | 4 | 1 | four  | 1 | -1 | 3 | -3
+     | 4 | 1 | four  | 2 |  2 | 3 | -3
+     | 4 | 1 | four  | 3 | -3 | 3 | -3
+     | 4 | 1 | four  | 2 |  4 | 3 | -3
+     | 4 | 1 | four  | 5 | -5 | 3 | -3
+     | 4 | 1 | four  | 5 | -5 | 3 | -3
+     | 4 | 1 | four  | 0 |    | 3 | -3
+     | 4 | 1 | four  |   |    | 3 | -3
      | 4 | 1 | four  |   |  0 | 3 | -3
+     | 5 | 0 | five  | 1 | -1 | 3 | -3
+     | 5 | 0 | five  | 2 |  2 | 3 | -3
+     | 5 | 0 | five  | 3 | -3 | 3 | -3
+     | 5 | 0 | five  | 2 |  4 | 3 | -3
+     | 5 | 0 | five  | 5 | -5 | 3 | -3
+     | 5 | 0 | five  | 5 | -5 | 3 | -3
+     | 5 | 0 | five  | 0 |    | 3 | -3
+     | 5 | 0 | five  |   |    | 3 | -3
      | 5 | 0 | five  |   |  0 | 3 | -3
+     | 6 | 6 | six   | 1 | -1 | 3 | -3
+     | 6 | 6 | six   | 2 |  2 | 3 | -3
+     | 6 | 6 | six   | 3 | -3 | 3 | -3
+     | 6 | 6 | six   | 2 |  4 | 3 | -3
+     | 6 | 6 | six   | 5 | -5 | 3 | -3
+     | 6 | 6 | six   | 5 | -5 | 3 | -3
+     | 6 | 6 | six   | 0 |    | 3 | -3
+     | 6 | 6 | six   |   |    | 3 | -3
      | 6 | 6 | six   |   |  0 | 3 | -3
+     | 7 | 7 | seven | 1 | -1 | 3 | -3
+     | 7 | 7 | seven | 2 |  2 | 3 | -3
+     | 7 | 7 | seven | 3 | -3 | 3 | -3
+     | 7 | 7 | seven | 2 |  4 | 3 | -3
+     | 7 | 7 | seven | 5 | -5 | 3 | -3
+     | 7 | 7 | seven | 5 | -5 | 3 | -3
+     | 7 | 7 | seven | 0 |    | 3 | -3
+     | 7 | 7 | seven |   |    | 3 | -3
      | 7 | 7 | seven |   |  0 | 3 | -3
+     | 8 | 8 | eight | 1 | -1 | 3 | -3
+     | 8 | 8 | eight | 2 |  2 | 3 | -3
+     | 8 | 8 | eight | 3 | -3 | 3 | -3
+     | 8 | 8 | eight | 2 |  4 | 3 | -3
+     | 8 | 8 | eight | 5 | -5 | 3 | -3
+     | 8 | 8 | eight | 5 | -5 | 3 | -3
+     | 8 | 8 | eight | 0 |    | 3 | -3
+     | 8 | 8 | eight |   |    | 3 | -3
      | 8 | 8 | eight |   |  0 | 3 | -3
+     | 0 |   | zero  | 1 | -1 | 3 | -3
+     | 0 |   | zero  | 2 |  2 | 3 | -3
+     | 0 |   | zero  | 3 | -3 | 3 | -3
+     | 0 |   | zero  | 2 |  4 | 3 | -3
+     | 0 |   | zero  | 5 | -5 | 3 | -3
+     | 0 |   | zero  | 5 | -5 | 3 | -3
+     | 0 |   | zero  | 0 |    | 3 | -3
+     | 0 |   | zero  |   |    | 3 | -3
      | 0 |   | zero  |   |  0 | 3 | -3
+     |   |   | null  | 1 | -1 | 3 | -3
+     |   |   | null  | 2 |  2 | 3 | -3
+     |   |   | null  | 3 | -3 | 3 | -3
+     |   |   | null  | 2 |  4 | 3 | -3
+     |   |   | null  | 5 | -5 | 3 | -3
+     |   |   | null  | 5 | -5 | 3 | -3
+     |   |   | null  | 0 |    | 3 | -3
+     |   |   | null  |   |    | 3 | -3
      |   |   | null  |   |  0 | 3 | -3
+     |   | 0 | zero  | 1 | -1 | 3 | -3
+     |   | 0 | zero  | 2 |  2 | 3 | -3
+     |   | 0 | zero  | 3 | -3 | 3 | -3
+     |   | 0 | zero  | 2 |  4 | 3 | -3
+     |   | 0 | zero  | 5 | -5 | 3 | -3
+     |   | 0 | zero  | 5 | -5 | 3 | -3
+     |   | 0 | zero  | 0 |    | 3 | -3
+     |   | 0 | zero  |   |    | 3 | -3
      |   | 0 | zero  |   |  0 | 3 | -3
+     | 1 | 4 | one   | 1 | -1 | 2 |  4
+     | 1 | 4 | one   | 2 |  2 | 2 |  4
+     | 1 | 4 | one   | 3 | -3 | 2 |  4
+     | 1 | 4 | one   | 2 |  4 | 2 |  4
+     | 1 | 4 | one   | 5 | -5 | 2 |  4
+     | 1 | 4 | one   | 5 | -5 | 2 |  4
+     | 1 | 4 | one   | 0 |    | 2 |  4
+     | 1 | 4 | one   |   |    | 2 |  4
      | 1 | 4 | one   |   |  0 | 2 |  4
+     | 2 | 3 | two   | 1 | -1 | 2 |  4
+     | 2 | 3 | two   | 2 |  2 | 2 |  4
+     | 2 | 3 | two   | 3 | -3 | 2 |  4
+     | 2 | 3 | two   | 2 |  4 | 2 |  4
+     | 2 | 3 | two   | 5 | -5 | 2 |  4
+     | 2 | 3 | two   | 5 | -5 | 2 |  4
+     | 2 | 3 | two   | 0 |    | 2 |  4
+     | 2 | 3 | two   |   |    | 2 |  4
      | 2 | 3 | two   |   |  0 | 2 |  4
+     | 3 | 2 | three | 1 | -1 | 2 |  4
+     | 3 | 2 | three | 2 |  2 | 2 |  4
+     | 3 | 2 | three | 3 | -3 | 2 |  4
+     | 3 | 2 | three | 2 |  4 | 2 |  4
+     | 3 | 2 | three | 5 | -5 | 2 |  4
+     | 3 | 2 | three | 5 | -5 | 2 |  4
+     | 3 | 2 | three | 0 |    | 2 |  4
+     | 3 | 2 | three |   |    | 2 |  4
      | 3 | 2 | three |   |  0 | 2 |  4
+     | 4 | 1 | four  | 1 | -1 | 2 |  4
+     | 4 | 1 | four  | 2 |  2 | 2 |  4
+     | 4 | 1 | four  | 3 | -3 | 2 |  4
+     | 4 | 1 | four  | 2 |  4 | 2 |  4
+     | 4 | 1 | four  | 5 | -5 | 2 |  4
+     | 4 | 1 | four  | 5 | -5 | 2 |  4
+     | 4 | 1 | four  | 0 |    | 2 |  4
+     | 4 | 1 | four  |   |    | 2 |  4
      | 4 | 1 | four  |   |  0 | 2 |  4
+     | 5 | 0 | five  | 1 | -1 | 2 |  4
+     | 5 | 0 | five  | 2 |  2 | 2 |  4
+     | 5 | 0 | five  | 3 | -3 | 2 |  4
+     | 5 | 0 | five  | 2 |  4 | 2 |  4
+     | 5 | 0 | five  | 5 | -5 | 2 |  4
+     | 5 | 0 | five  | 5 | -5 | 2 |  4
+     | 5 | 0 | five  | 0 |    | 2 |  4
+     | 5 | 0 | five  |   |    | 2 |  4
      | 5 | 0 | five  |   |  0 | 2 |  4
+     | 6 | 6 | six   | 1 | -1 | 2 |  4
+     | 6 | 6 | six   | 2 |  2 | 2 |  4
+     | 6 | 6 | six   | 3 | -3 | 2 |  4
+     | 6 | 6 | six   | 2 |  4 | 2 |  4
+     | 6 | 6 | six   | 5 | -5 | 2 |  4
+     | 6 | 6 | six   | 5 | -5 | 2 |  4
+     | 6 | 6 | six   | 0 |    | 2 |  4
+     | 6 | 6 | six   |   |    | 2 |  4
      | 6 | 6 | six   |   |  0 | 2 |  4
+     | 7 | 7 | seven | 1 | -1 | 2 |  4
+     | 7 | 7 | seven | 2 |  2 | 2 |  4
+     | 7 | 7 | seven | 3 | -3 | 2 |  4
+     | 7 | 7 | seven | 2 |  4 | 2 |  4
+     | 7 | 7 | seven | 5 | -5 | 2 |  4
+     | 7 | 7 | seven | 5 | -5 | 2 |  4
+     | 7 | 7 | seven | 0 |    | 2 |  4
+     | 7 | 7 | seven |   |    | 2 |  4
      | 7 | 7 | seven |   |  0 | 2 |  4
+     | 8 | 8 | eight | 1 | -1 | 2 |  4
+     | 8 | 8 | eight | 2 |  2 | 2 |  4
+     | 8 | 8 | eight | 3 | -3 | 2 |  4
+     | 8 | 8 | eight | 2 |  4 | 2 |  4
+     | 8 | 8 | eight | 5 | -5 | 2 |  4
+     | 8 | 8 | eight | 5 | -5 | 2 |  4
+     | 8 | 8 | eight | 0 |    | 2 |  4
+     | 8 | 8 | eight |   |    | 2 |  4
      | 8 | 8 | eight |   |  0 | 2 |  4
+     | 0 |   | zero  | 1 | -1 | 2 |  4
+     | 0 |   | zero  | 2 |  2 | 2 |  4
+     | 0 |   | zero  | 3 | -3 | 2 |  4
+     | 0 |   | zero  | 2 |  4 | 2 |  4
+     | 0 |   | zero  | 5 | -5 | 2 |  4
+     | 0 |   | zero  | 5 | -5 | 2 |  4
+     | 0 |   | zero  | 0 |    | 2 |  4
+     | 0 |   | zero  |   |    | 2 |  4
      | 0 |   | zero  |   |  0 | 2 |  4
+     |   |   | null  | 1 | -1 | 2 |  4
+     |   |   | null  | 2 |  2 | 2 |  4
+     |   |   | null  | 3 | -3 | 2 |  4
+     |   |   | null  | 2 |  4 | 2 |  4
+     |   |   | null  | 5 | -5 | 2 |  4
+     |   |   | null  | 5 | -5 | 2 |  4
+     |   |   | null  | 0 |    | 2 |  4
+     |   |   | null  |   |    | 2 |  4
      |   |   | null  |   |  0 | 2 |  4
+     |   | 0 | zero  | 1 | -1 | 2 |  4
+     |   | 0 | zero  | 2 |  2 | 2 |  4
+     |   | 0 | zero  | 3 | -3 | 2 |  4
+     |   | 0 | zero  | 2 |  4 | 2 |  4
+     |   | 0 | zero  | 5 | -5 | 2 |  4
+     |   | 0 | zero  | 5 | -5 | 2 |  4
+     |   | 0 | zero  | 0 |    | 2 |  4
+     |   | 0 | zero  |   |    | 2 |  4
      |   | 0 | zero  |   |  0 | 2 |  4
+     | 1 | 4 | one   | 1 | -1 | 5 | -5
+     | 1 | 4 | one   | 2 |  2 | 5 | -5
+     | 1 | 4 | one   | 3 | -3 | 5 | -5
+     | 1 | 4 | one   | 2 |  4 | 5 | -5
+     | 1 | 4 | one   | 5 | -5 | 5 | -5
+     | 1 | 4 | one   | 5 | -5 | 5 | -5
+     | 1 | 4 | one   | 0 |    | 5 | -5
+     | 1 | 4 | one   |   |    | 5 | -5
      | 1 | 4 | one   |   |  0 | 5 | -5
+     | 2 | 3 | two   | 1 | -1 | 5 | -5
+     | 2 | 3 | two   | 2 |  2 | 5 | -5
+     | 2 | 3 | two   | 3 | -3 | 5 | -5
+     | 2 | 3 | two   | 2 |  4 | 5 | -5
+     | 2 | 3 | two   | 5 | -5 | 5 | -5
+     | 2 | 3 | two   | 5 | -5 | 5 | -5
+     | 2 | 3 | two   | 0 |    | 5 | -5
+     | 2 | 3 | two   |   |    | 5 | -5
      | 2 | 3 | two   |   |  0 | 5 | -5
+     | 3 | 2 | three | 1 | -1 | 5 | -5
+     | 3 | 2 | three | 2 |  2 | 5 | -5
+     | 3 | 2 | three | 3 | -3 | 5 | -5
+     | 3 | 2 | three | 2 |  4 | 5 | -5
+     | 3 | 2 | three | 5 | -5 | 5 | -5
+     | 3 | 2 | three | 5 | -5 | 5 | -5
+     | 3 | 2 | three | 0 |    | 5 | -5
+     | 3 | 2 | three |   |    | 5 | -5
      | 3 | 2 | three |   |  0 | 5 | -5
+     | 4 | 1 | four  | 1 | -1 | 5 | -5
+     | 4 | 1 | four  | 2 |  2 | 5 | -5
+     | 4 | 1 | four  | 3 | -3 | 5 | -5
+     | 4 | 1 | four  | 2 |  4 | 5 | -5
+     | 4 | 1 | four  | 5 | -5 | 5 | -5
+     | 4 | 1 | four  | 5 | -5 | 5 | -5
+     | 4 | 1 | four  | 0 |    | 5 | -5
+     | 4 | 1 | four  |   |    | 5 | -5
      | 4 | 1 | four  |   |  0 | 5 | -5
+     | 5 | 0 | five  | 1 | -1 | 5 | -5
+     | 5 | 0 | five  | 2 |  2 | 5 | -5
+     | 5 | 0 | five  | 3 | -3 | 5 | -5
+     | 5 | 0 | five  | 2 |  4 | 5 | -5
+     | 5 | 0 | five  | 5 | -5 | 5 | -5
+     | 5 | 0 | five  | 5 | -5 | 5 | -5
+     | 5 | 0 | five  | 0 |    | 5 | -5
+     | 5 | 0 | five  |   |    | 5 | -5
      | 5 | 0 | five  |   |  0 | 5 | -5
+     | 6 | 6 | six   | 1 | -1 | 5 | -5
+     | 6 | 6 | six   | 2 |  2 | 5 | -5
+     | 6 | 6 | six   | 3 | -3 | 5 | -5
+     | 6 | 6 | six   | 2 |  4 | 5 | -5
+     | 6 | 6 | six   | 5 | -5 | 5 | -5
+     | 6 | 6 | six   | 5 | -5 | 5 | -5
+     | 6 | 6 | six   | 0 |    | 5 | -5
+     | 6 | 6 | six   |   |    | 5 | -5
      | 6 | 6 | six   |   |  0 | 5 | -5
+     | 7 | 7 | seven | 1 | -1 | 5 | -5
+     | 7 | 7 | seven | 2 |  2 | 5 | -5
+     | 7 | 7 | seven | 3 | -3 | 5 | -5
+     | 7 | 7 | seven | 2 |  4 | 5 | -5
+     | 7 | 7 | seven | 5 | -5 | 5 | -5
+     | 7 | 7 | seven | 5 | -5 | 5 | -5
+     | 7 | 7 | seven | 0 |    | 5 | -5
+     | 7 | 7 | seven |   |    | 5 | -5
      | 7 | 7 | seven |   |  0 | 5 | -5
+     | 8 | 8 | eight | 1 | -1 | 5 | -5
+     | 8 | 8 | eight | 2 |  2 | 5 | -5
+     | 8 | 8 | eight | 3 | -3 | 5 | -5
+     | 8 | 8 | eight | 2 |  4 | 5 | -5
+     | 8 | 8 | eight | 5 | -5 | 5 | -5
+     | 8 | 8 | eight | 5 | -5 | 5 | -5
+     | 8 | 8 | eight | 0 |    | 5 | -5
+     | 8 | 8 | eight |   |    | 5 | -5
      | 8 | 8 | eight |   |  0 | 5 | -5
+     | 0 |   | zero  | 1 | -1 | 5 | -5
+     | 0 |   | zero  | 2 |  2 | 5 | -5
+     | 0 |   | zero  | 3 | -3 | 5 | -5
+     | 0 |   | zero  | 2 |  4 | 5 | -5
+     | 0 |   | zero  | 5 | -5 | 5 | -5
+     | 0 |   | zero  | 5 | -5 | 5 | -5
+     | 0 |   | zero  | 0 |    | 5 | -5
+     | 0 |   | zero  |   |    | 5 | -5
      | 0 |   | zero  |   |  0 | 5 | -5
+     |   |   | null  | 1 | -1 | 5 | -5
+     |   |   | null  | 2 |  2 | 5 | -5
+     |   |   | null  | 3 | -3 | 5 | -5
+     |   |   | null  | 2 |  4 | 5 | -5
+     |   |   | null  | 5 | -5 | 5 | -5
+     |   |   | null  | 5 | -5 | 5 | -5
+     |   |   | null  | 0 |    | 5 | -5
+     |   |   | null  |   |    | 5 | -5
      |   |   | null  |   |  0 | 5 | -5
+     |   | 0 | zero  | 1 | -1 | 5 | -5
+     |   | 0 | zero  | 2 |  2 | 5 | -5
+     |   | 0 | zero  | 3 | -3 | 5 | -5
+     |   | 0 | zero  | 2 |  4 | 5 | -5
+     |   | 0 | zero  | 5 | -5 | 5 | -5
+     |   | 0 | zero  | 5 | -5 | 5 | -5
+     |   | 0 | zero  | 0 |    | 5 | -5
+     |   | 0 | zero  |   |    | 5 | -5
      |   | 0 | zero  |   |  0 | 5 | -5
+     | 1 | 4 | one   | 1 | -1 | 5 | -5
+     | 1 | 4 | one   | 2 |  2 | 5 | -5
+     | 1 | 4 | one   | 3 | -3 | 5 | -5
+     | 1 | 4 | one   | 2 |  4 | 5 | -5
+     | 1 | 4 | one   | 5 | -5 | 5 | -5
+     | 1 | 4 | one   | 5 | -5 | 5 | -5
+     | 1 | 4 | one   | 0 |    | 5 | -5
+     | 1 | 4 | one   |   |    | 5 | -5
      | 1 | 4 | one   |   |  0 | 5 | -5
+     | 2 | 3 | two   | 1 | -1 | 5 | -5
+     | 2 | 3 | two   | 2 |  2 | 5 | -5
+     | 2 | 3 | two   | 3 | -3 | 5 | -5
+     | 2 | 3 | two   | 2 |  4 | 5 | -5
+     | 2 | 3 | two   | 5 | -5 | 5 | -5
+     | 2 | 3 | two   | 5 | -5 | 5 | -5
+     | 2 | 3 | two   | 0 |    | 5 | -5
+     | 2 | 3 | two   |   |    | 5 | -5
      | 2 | 3 | two   |   |  0 | 5 | -5
+     | 3 | 2 | three | 1 | -1 | 5 | -5
+     | 3 | 2 | three | 2 |  2 | 5 | -5
+     | 3 | 2 | three | 3 | -3 | 5 | -5
+     | 3 | 2 | three | 2 |  4 | 5 | -5
+     | 3 | 2 | three | 5 | -5 | 5 | -5
+     | 3 | 2 | three | 5 | -5 | 5 | -5
+     | 3 | 2 | three | 0 |    | 5 | -5
+     | 3 | 2 | three |   |    | 5 | -5
      | 3 | 2 | three |   |  0 | 5 | -5
+     | 4 | 1 | four  | 1 | -1 | 5 | -5
+     | 4 | 1 | four  | 2 |  2 | 5 | -5
+     | 4 | 1 | four  | 3 | -3 | 5 | -5
+     | 4 | 1 | four  | 2 |  4 | 5 | -5
+     | 4 | 1 | four  | 5 | -5 | 5 | -5
+     | 4 | 1 | four  | 5 | -5 | 5 | -5
+     | 4 | 1 | four  | 0 |    | 5 | -5
+     | 4 | 1 | four  |   |    | 5 | -5
      | 4 | 1 | four  |   |  0 | 5 | -5
+     | 5 | 0 | five  | 1 | -1 | 5 | -5
+     | 5 | 0 | five  | 2 |  2 | 5 | -5
+     | 5 | 0 | five  | 3 | -3 | 5 | -5
+     | 5 | 0 | five  | 2 |  4 | 5 | -5
+     | 5 | 0 | five  | 5 | -5 | 5 | -5
+     | 5 | 0 | five  | 5 | -5 | 5 | -5
+     | 5 | 0 | five  | 0 |    | 5 | -5
+     | 5 | 0 | five  |   |    | 5 | -5
      | 5 | 0 | five  |   |  0 | 5 | -5
+     | 6 | 6 | six   | 1 | -1 | 5 | -5
+     | 6 | 6 | six   | 2 |  2 | 5 | -5
+     | 6 | 6 | six   | 3 | -3 | 5 | -5
+     | 6 | 6 | six   | 2 |  4 | 5 | -5
+     | 6 | 6 | six   | 5 | -5 | 5 | -5
+     | 6 | 6 | six   | 5 | -5 | 5 | -5
+     | 6 | 6 | six   | 0 |    | 5 | -5
+     | 6 | 6 | six   |   |    | 5 | -5
      | 6 | 6 | six   |   |  0 | 5 | -5
+     | 7 | 7 | seven | 1 | -1 | 5 | -5
+     | 7 | 7 | seven | 2 |  2 | 5 | -5
+     | 7 | 7 | seven | 3 | -3 | 5 | -5
+     | 7 | 7 | seven | 2 |  4 | 5 | -5
+     | 7 | 7 | seven | 5 | -5 | 5 | -5
+     | 7 | 7 | seven | 5 | -5 | 5 | -5
+     | 7 | 7 | seven | 0 |    | 5 | -5
+     | 7 | 7 | seven |   |    | 5 | -5
      | 7 | 7 | seven |   |  0 | 5 | -5
+     | 8 | 8 | eight | 1 | -1 | 5 | -5
+     | 8 | 8 | eight | 2 |  2 | 5 | -5
+     | 8 | 8 | eight | 3 | -3 | 5 | -5
+     | 8 | 8 | eight | 2 |  4 | 5 | -5
+     | 8 | 8 | eight | 5 | -5 | 5 | -5
+     | 8 | 8 | eight | 5 | -5 | 5 | -5
+     | 8 | 8 | eight | 0 |    | 5 | -5
+     | 8 | 8 | eight |   |    | 5 | -5
      | 8 | 8 | eight |   |  0 | 5 | -5
+     | 0 |   | zero  | 1 | -1 | 5 | -5
+     | 0 |   | zero  | 2 |  2 | 5 | -5
+     | 0 |   | zero  | 3 | -3 | 5 | -5
+     | 0 |   | zero  | 2 |  4 | 5 | -5
+     | 0 |   | zero  | 5 | -5 | 5 | -5
+     | 0 |   | zero  | 5 | -5 | 5 | -5
+     | 0 |   | zero  | 0 |    | 5 | -5
+     | 0 |   | zero  |   |    | 5 | -5
      | 0 |   | zero  |   |  0 | 5 | -5
+     |   |   | null  | 1 | -1 | 5 | -5
+     |   |   | null  | 2 |  2 | 5 | -5
+     |   |   | null  | 3 | -3 | 5 | -5
+     |   |   | null  | 2 |  4 | 5 | -5
+     |   |   | null  | 5 | -5 | 5 | -5
+     |   |   | null  | 5 | -5 | 5 | -5
+     |   |   | null  | 0 |    | 5 | -5
+     |   |   | null  |   |    | 5 | -5
      |   |   | null  |   |  0 | 5 | -5
+     |   | 0 | zero  | 1 | -1 | 5 | -5
+     |   | 0 | zero  | 2 |  2 | 5 | -5
+     |   | 0 | zero  | 3 | -3 | 5 | -5
+     |   | 0 | zero  | 2 |  4 | 5 | -5
+     |   | 0 | zero  | 5 | -5 | 5 | -5
+     |   | 0 | zero  | 5 | -5 | 5 | -5
+     |   | 0 | zero  | 0 |    | 5 | -5
+     |   | 0 | zero  |   |    | 5 | -5
      |   | 0 | zero  |   |  0 | 5 | -5
+     | 1 | 4 | one   | 1 | -1 | 0 |   
+     | 1 | 4 | one   | 2 |  2 | 0 |   
+     | 1 | 4 | one   | 3 | -3 | 0 |   
+     | 1 | 4 | one   | 2 |  4 | 0 |   
+     | 1 | 4 | one   | 5 | -5 | 0 |   
+     | 1 | 4 | one   | 5 | -5 | 0 |   
+     | 1 | 4 | one   | 0 |    | 0 |   
+     | 1 | 4 | one   |   |    | 0 |   
      | 1 | 4 | one   |   |  0 | 0 |   
+     | 2 | 3 | two   | 1 | -1 | 0 |   
+     | 2 | 3 | two   | 2 |  2 | 0 |   
+     | 2 | 3 | two   | 3 | -3 | 0 |   
+     | 2 | 3 | two   | 2 |  4 | 0 |   
+     | 2 | 3 | two   | 5 | -5 | 0 |   
+     | 2 | 3 | two   | 5 | -5 | 0 |   
+     | 2 | 3 | two   | 0 |    | 0 |   
+     | 2 | 3 | two   |   |    | 0 |   
      | 2 | 3 | two   |   |  0 | 0 |   
+     | 3 | 2 | three | 1 | -1 | 0 |   
+     | 3 | 2 | three | 2 |  2 | 0 |   
+     | 3 | 2 | three | 3 | -3 | 0 |   
+     | 3 | 2 | three | 2 |  4 | 0 |   
+     | 3 | 2 | three | 5 | -5 | 0 |   
+     | 3 | 2 | three | 5 | -5 | 0 |   
+     | 3 | 2 | three | 0 |    | 0 |   
+     | 3 | 2 | three |   |    | 0 |   
      | 3 | 2 | three |   |  0 | 0 |   
+     | 4 | 1 | four  | 1 | -1 | 0 |   
+     | 4 | 1 | four  | 2 |  2 | 0 |   
+     | 4 | 1 | four  | 3 | -3 | 0 |   
+     | 4 | 1 | four  | 2 |  4 | 0 |   
+     | 4 | 1 | four  | 5 | -5 | 0 |   
+     | 4 | 1 | four  | 5 | -5 | 0 |   
+     | 4 | 1 | four  | 0 |    | 0 |   
+     | 4 | 1 | four  |   |    | 0 |   
      | 4 | 1 | four  |   |  0 | 0 |   
+     | 5 | 0 | five  | 1 | -1 | 0 |   
+     | 5 | 0 | five  | 2 |  2 | 0 |   
+     | 5 | 0 | five  | 3 | -3 | 0 |   
+     | 5 | 0 | five  | 2 |  4 | 0 |   
+     | 5 | 0 | five  | 5 | -5 | 0 |   
+     | 5 | 0 | five  | 5 | -5 | 0 |   
+     | 5 | 0 | five  | 0 |    | 0 |   
+     | 5 | 0 | five  |   |    | 0 |   
      | 5 | 0 | five  |   |  0 | 0 |   
+     | 6 | 6 | six   | 1 | -1 | 0 |   
+     | 6 | 6 | six   | 2 |  2 | 0 |   
+     | 6 | 6 | six   | 3 | -3 | 0 |   
+     | 6 | 6 | six   | 2 |  4 | 0 |   
+     | 6 | 6 | six   | 5 | -5 | 0 |   
+     | 6 | 6 | six   | 5 | -5 | 0 |   
+     | 6 | 6 | six   | 0 |    | 0 |   
+     | 6 | 6 | six   |   |    | 0 |   
      | 6 | 6 | six   |   |  0 | 0 |   
+     | 7 | 7 | seven | 1 | -1 | 0 |   
+     | 7 | 7 | seven | 2 |  2 | 0 |   
+     | 7 | 7 | seven | 3 | -3 | 0 |   
+     | 7 | 7 | seven | 2 |  4 | 0 |   
+     | 7 | 7 | seven | 5 | -5 | 0 |   
+     | 7 | 7 | seven | 5 | -5 | 0 |   
+     | 7 | 7 | seven | 0 |    | 0 |   
+     | 7 | 7 | seven |   |    | 0 |   
      | 7 | 7 | seven |   |  0 | 0 |   
+     | 8 | 8 | eight | 1 | -1 | 0 |   
+     | 8 | 8 | eight | 2 |  2 | 0 |   
+     | 8 | 8 | eight | 3 | -3 | 0 |   
+     | 8 | 8 | eight | 2 |  4 | 0 |   
+     | 8 | 8 | eight | 5 | -5 | 0 |   
+     | 8 | 8 | eight | 5 | -5 | 0 |   
+     | 8 | 8 | eight | 0 |    | 0 |   
+     | 8 | 8 | eight |   |    | 0 |   
      | 8 | 8 | eight |   |  0 | 0 |   
+     | 0 |   | zero  | 1 | -1 | 0 |   
+     | 0 |   | zero  | 2 |  2 | 0 |   
+     | 0 |   | zero  | 3 | -3 | 0 |   
+     | 0 |   | zero  | 2 |  4 | 0 |   
+     | 0 |   | zero  | 5 | -5 | 0 |   
+     | 0 |   | zero  | 5 | -5 | 0 |   
+     | 0 |   | zero  | 0 |    | 0 |   
+     | 0 |   | zero  |   |    | 0 |   
      | 0 |   | zero  |   |  0 | 0 |   
+     |   |   | null  | 1 | -1 | 0 |   
+     |   |   | null  | 2 |  2 | 0 |   
+     |   |   | null  | 3 | -3 | 0 |   
+     |   |   | null  | 2 |  4 | 0 |   
+     |   |   | null  | 5 | -5 | 0 |   
+     |   |   | null  | 5 | -5 | 0 |   
+     |   |   | null  | 0 |    | 0 |   
+     |   |   | null  |   |    | 0 |   
      |   |   | null  |   |  0 | 0 |   
+     |   | 0 | zero  | 1 | -1 | 0 |   
+     |   | 0 | zero  | 2 |  2 | 0 |   
+     |   | 0 | zero  | 3 | -3 | 0 |   
+     |   | 0 | zero  | 2 |  4 | 0 |   
+     |   | 0 | zero  | 5 | -5 | 0 |   
+     |   | 0 | zero  | 5 | -5 | 0 |   
+     |   | 0 | zero  | 0 |    | 0 |   
+     |   | 0 | zero  |   |    | 0 |   
      |   | 0 | zero  |   |  0 | 0 |   
+     | 1 | 4 | one   | 1 | -1 |   |   
+     | 1 | 4 | one   | 2 |  2 |   |   
+     | 1 | 4 | one   | 3 | -3 |   |   
+     | 1 | 4 | one   | 2 |  4 |   |   
+     | 1 | 4 | one   | 5 | -5 |   |   
+     | 1 | 4 | one   | 5 | -5 |   |   
+     | 1 | 4 | one   | 0 |    |   |   
+     | 1 | 4 | one   |   |    |   |   
      | 1 | 4 | one   |   |  0 |   |   
+     | 2 | 3 | two   | 1 | -1 |   |   
+     | 2 | 3 | two   | 2 |  2 |   |   
+     | 2 | 3 | two   | 3 | -3 |   |   
+     | 2 | 3 | two   | 2 |  4 |   |   
+     | 2 | 3 | two   | 5 | -5 |   |   
+     | 2 | 3 | two   | 5 | -5 |   |   
+     | 2 | 3 | two   | 0 |    |   |   
+     | 2 | 3 | two   |   |    |   |   
      | 2 | 3 | two   |   |  0 |   |   
+     | 3 | 2 | three | 1 | -1 |   |   
+     | 3 | 2 | three | 2 |  2 |   |   
+     | 3 | 2 | three | 3 | -3 |   |   
+     | 3 | 2 | three | 2 |  4 |   |   
+     | 3 | 2 | three | 5 | -5 |   |   
+     | 3 | 2 | three | 5 | -5 |   |   
+     | 3 | 2 | three | 0 |    |   |   
+     | 3 | 2 | three |   |    |   |   
      | 3 | 2 | three |   |  0 |   |   
+     | 4 | 1 | four  | 1 | -1 |   |   
+     | 4 | 1 | four  | 2 |  2 |   |   
+     | 4 | 1 | four  | 3 | -3 |   |   
+     | 4 | 1 | four  | 2 |  4 |   |   
+     | 4 | 1 | four  | 5 | -5 |   |   
+     | 4 | 1 | four  | 5 | -5 |   |   
+     | 4 | 1 | four  | 0 |    |   |   
+     | 4 | 1 | four  |   |    |   |   
      | 4 | 1 | four  |   |  0 |   |   
+     | 5 | 0 | five  | 1 | -1 |   |   
+     | 5 | 0 | five  | 2 |  2 |   |   
+     | 5 | 0 | five  | 3 | -3 |   |   
+     | 5 | 0 | five  | 2 |  4 |   |   
+     | 5 | 0 | five  | 5 | -5 |   |   
+     | 5 | 0 | five  | 5 | -5 |   |   
+     | 5 | 0 | five  | 0 |    |   |   
+     | 5 | 0 | five  |   |    |   |   
      | 5 | 0 | five  |   |  0 |   |   
+     | 6 | 6 | six   | 1 | -1 |   |   
+     | 6 | 6 | six   | 2 |  2 |   |   
+     | 6 | 6 | six   | 3 | -3 |   |   
+     | 6 | 6 | six   | 2 |  4 |   |   
+     | 6 | 6 | six   | 5 | -5 |   |   
+     | 6 | 6 | six   | 5 | -5 |   |   
+     | 6 | 6 | six   | 0 |    |   |   
+     | 6 | 6 | six   |   |    |   |   
      | 6 | 6 | six   |   |  0 |   |   
+     | 7 | 7 | seven | 1 | -1 |   |   
+     | 7 | 7 | seven | 2 |  2 |   |   
+     | 7 | 7 | seven | 3 | -3 |   |   
+     | 7 | 7 | seven | 2 |  4 |   |   
+     | 7 | 7 | seven | 5 | -5 |   |   
+     | 7 | 7 | seven | 5 | -5 |   |   
+     | 7 | 7 | seven | 0 |    |   |   
+     | 7 | 7 | seven |   |    |   |   
      | 7 | 7 | seven |   |  0 |   |   
+     | 8 | 8 | eight | 1 | -1 |   |   
+     | 8 | 8 | eight | 2 |  2 |   |   
+     | 8 | 8 | eight | 3 | -3 |   |   
+     | 8 | 8 | eight | 2 |  4 |   |   
+     | 8 | 8 | eight | 5 | -5 |   |   
+     | 8 | 8 | eight | 5 | -5 |   |   
+     | 8 | 8 | eight | 0 |    |   |   
+     | 8 | 8 | eight |   |    |   |   
      | 8 | 8 | eight |   |  0 |   |   
+     | 0 |   | zero  | 1 | -1 |   |   
+     | 0 |   | zero  | 2 |  2 |   |   
+     | 0 |   | zero  | 3 | -3 |   |   
+     | 0 |   | zero  | 2 |  4 |   |   
+     | 0 |   | zero  | 5 | -5 |   |   
+     | 0 |   | zero  | 5 | -5 |   |   
+     | 0 |   | zero  | 0 |    |   |   
+     | 0 |   | zero  |   |    |   |   
      | 0 |   | zero  |   |  0 |   |   
+     |   |   | null  | 1 | -1 |   |   
+     |   |   | null  | 2 |  2 |   |   
+     |   |   | null  | 3 | -3 |   |   
+     |   |   | null  | 2 |  4 |   |   
+     |   |   | null  | 5 | -5 |   |   
+     |   |   | null  | 5 | -5 |   |   
+     |   |   | null  | 0 |    |   |   
+     |   |   | null  |   |    |   |   
      |   |   | null  |   |  0 |   |   
+     |   | 0 | zero  | 1 | -1 |   |   
+     |   | 0 | zero  | 2 |  2 |   |   
+     |   | 0 | zero  | 3 | -3 |   |   
+     |   | 0 | zero  | 2 |  4 |   |   
+     |   | 0 | zero  | 5 | -5 |   |   
+     |   | 0 | zero  | 5 | -5 |   |   
+     |   | 0 | zero  | 0 |    |   |   
+     |   | 0 | zero  |   |    |   |   
      |   | 0 | zero  |   |  0 |   |   
+     | 1 | 4 | one   | 1 | -1 |   |  0
+     | 1 | 4 | one   | 2 |  2 |   |  0
+     | 1 | 4 | one   | 3 | -3 |   |  0
+     | 1 | 4 | one   | 2 |  4 |   |  0
+     | 1 | 4 | one   | 5 | -5 |   |  0
+     | 1 | 4 | one   | 5 | -5 |   |  0
+     | 1 | 4 | one   | 0 |    |   |  0
+     | 1 | 4 | one   |   |    |   |  0
      | 1 | 4 | one   |   |  0 |   |  0
+     | 2 | 3 | two   | 1 | -1 |   |  0
+     | 2 | 3 | two   | 2 |  2 |   |  0
+     | 2 | 3 | two   | 3 | -3 |   |  0
+     | 2 | 3 | two   | 2 |  4 |   |  0
+     | 2 | 3 | two   | 5 | -5 |   |  0
+     | 2 | 3 | two   | 5 | -5 |   |  0
+     | 2 | 3 | two   | 0 |    |   |  0
+     | 2 | 3 | two   |   |    |   |  0
      | 2 | 3 | two   |   |  0 |   |  0
+     | 3 | 2 | three | 1 | -1 |   |  0
+     | 3 | 2 | three | 2 |  2 |   |  0
+     | 3 | 2 | three | 3 | -3 |   |  0
+     | 3 | 2 | three | 2 |  4 |   |  0
+     | 3 | 2 | three | 5 | -5 |   |  0
+     | 3 | 2 | three | 5 | -5 |   |  0
+     | 3 | 2 | three | 0 |    |   |  0
+     | 3 | 2 | three |   |    |   |  0
      | 3 | 2 | three |   |  0 |   |  0
+     | 4 | 1 | four  | 1 | -1 |   |  0
+     | 4 | 1 | four  | 2 |  2 |   |  0
+     | 4 | 1 | four  | 3 | -3 |   |  0
+     | 4 | 1 | four  | 2 |  4 |   |  0
+     | 4 | 1 | four  | 5 | -5 |   |  0
+     | 4 | 1 | four  | 5 | -5 |   |  0
+     | 4 | 1 | four  | 0 |    |   |  0
+     | 4 | 1 | four  |   |    |   |  0
      | 4 | 1 | four  |   |  0 |   |  0
+     | 5 | 0 | five  | 1 | -1 |   |  0
+     | 5 | 0 | five  | 2 |  2 |   |  0
+     | 5 | 0 | five  | 3 | -3 |   |  0
+     | 5 | 0 | five  | 2 |  4 |   |  0
+     | 5 | 0 | five  | 5 | -5 |   |  0
+     | 5 | 0 | five  | 5 | -5 |   |  0
+     | 5 | 0 | five  | 0 |    |   |  0
+     | 5 | 0 | five  |   |    |   |  0
      | 5 | 0 | five  |   |  0 |   |  0
+     | 6 | 6 | six   | 1 | -1 |   |  0
+     | 6 | 6 | six   | 2 |  2 |   |  0
+     | 6 | 6 | six   | 3 | -3 |   |  0
+     | 6 | 6 | six   | 2 |  4 |   |  0
+     | 6 | 6 | six   | 5 | -5 |   |  0
+     | 6 | 6 | six   | 5 | -5 |   |  0
+     | 6 | 6 | six   | 0 |    |   |  0
+     | 6 | 6 | six   |   |    |   |  0
      | 6 | 6 | six   |   |  0 |   |  0
+     | 7 | 7 | seven | 1 | -1 |   |  0
+     | 7 | 7 | seven | 2 |  2 |   |  0
+     | 7 | 7 | seven | 3 | -3 |   |  0
+     | 7 | 7 | seven | 2 |  4 |   |  0
+     | 7 | 7 | seven | 5 | -5 |   |  0
+     | 7 | 7 | seven | 5 | -5 |   |  0
+     | 7 | 7 | seven | 0 |    |   |  0
+     | 7 | 7 | seven |   |    |   |  0
      | 7 | 7 | seven |   |  0 |   |  0
+     | 8 | 8 | eight | 1 | -1 |   |  0
+     | 8 | 8 | eight | 2 |  2 |   |  0
+     | 8 | 8 | eight | 3 | -3 |   |  0
+     | 8 | 8 | eight | 2 |  4 |   |  0
+     | 8 | 8 | eight | 5 | -5 |   |  0
+     | 8 | 8 | eight | 5 | -5 |   |  0
+     | 8 | 8 | eight | 0 |    |   |  0
+     | 8 | 8 | eight |   |    |   |  0
      | 8 | 8 | eight |   |  0 |   |  0
+     | 0 |   | zero  | 1 | -1 |   |  0
+     | 0 |   | zero  | 2 |  2 |   |  0
+     | 0 |   | zero  | 3 | -3 |   |  0
+     | 0 |   | zero  | 2 |  4 |   |  0
+     | 0 |   | zero  | 5 | -5 |   |  0
+     | 0 |   | zero  | 5 | -5 |   |  0
+     | 0 |   | zero  | 0 |    |   |  0
+     | 0 |   | zero  |   |    |   |  0
      | 0 |   | zero  |   |  0 |   |  0
+     |   |   | null  | 1 | -1 |   |  0
+     |   |   | null  | 2 |  2 |   |  0
+     |   |   | null  | 3 | -3 |   |  0
+     |   |   | null  | 2 |  4 |   |  0
+     |   |   | null  | 5 | -5 |   |  0
+     |   |   | null  | 5 | -5 |   |  0
+     |   |   | null  | 0 |    |   |  0
+     |   |   | null  |   |    |   |  0
      |   |   | null  |   |  0 |   |  0
+     |   | 0 | zero  | 1 | -1 |   |  0
+     |   | 0 | zero  | 2 |  2 |   |  0
+     |   | 0 | zero  | 3 | -3 |   |  0
+     |   | 0 | zero  | 2 |  4 |   |  0
+     |   | 0 | zero  | 5 | -5 |   |  0
+     |   | 0 | zero  | 5 | -5 |   |  0
+     |   | 0 | zero  | 0 |    |   |  0
+     |   | 0 | zero  |   |    |   |  0
      |   | 0 | zero  |   |  0 |   |  0
 (891 rows)
 
-- 
GitLab