diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 714ed83a8e..aa61b93a52 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -115,3 +115,26 @@ jobs:
- name: MLTestsNativeDeactivated
run: mvn -Dtest=MLTestsNativeDeactivated test
+ tests4:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Java 11
+ uses: actions/setup-java@v3
+ with:
+ java-version: 11
+ distribution: adopt
+ - name: Cache Maven packages
+ uses: actions/cache@v3
+ with:
+ path: ~/.m2
+ key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
+ restore-keys: ${{ runner.os }}-m2
+ - name: Install with Maven
+ run: mvn install -DskipTests -Dgpg.skip --quiet
+ - name: Compile with Maven
+ run: mvn clean compile assembly:single
+ - name: DeltaUpdateRuntimeTests
+ run: mvn -Dtest=DeltaUpdateRuntimeTests test
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fb9f08fd3a..e1d54fa72e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -79,8 +79,13 @@ NativeFLWORRuntimeTestsParallelismDeactivated:
script:
- mvn -Dtest=NativeFLWORRuntimeTestsParallelismDeactivated test
-StaticTypingTest:
- stage: tests3
+updatedeltaruntime-test:
+ stage: test
+ script:
+ - mvn -Dtest=DeltaUpdateRuntimeTests test
+
+statictyping-test:
+ stage: test
script:
- mvn -Dtest=StaticTypeTests test
diff --git a/README.md b/README.md
index e1fee9832a..7e4866c151 100644
--- a/README.md
+++ b/README.md
@@ -16,4 +16,4 @@ The documentation also contains an introduction specific to RumbleDB and how you
[The documentation of the current master (for the adventurous and curious) is available here.](http://sparksoniq.readthedocs.io/en/latest/)
-RumbleDB is an effort involving many researchers and ETH Zurich students: code and support by Stefan Irimescu, Ghislain Fourny, Gustavo Alonso, Renato Marroquin, Rodrigo Bruno, Falko Noé, Ioana Stefan, Andrea Rinaldi, Stevan Mihajlovic, Mario Arduini, Can Berker Çıkış, Elwin Stephan, David Dao, Zirun Wang, Ingo Müller, Dan-Ovidiu Graur, Thomas Zhou, Olivier Goerens, Alexandru Meterez, Remo Röthlisberger, Dominik Bruggisser, David Loughlin.
+RumbleDB is an effort involving many researchers and ETH Zurich students: code and support by Stefan Irimescu, Ghislain Fourny, Gustavo Alonso, Renato Marroquin, Rodrigo Bruno, Falko Noé, Ioana Stefan, Andrea Rinaldi, Stevan Mihajlovic, Mario Arduini, Can Berker Çıkış, Elwin Stephan, David Dao, Zirun Wang, Ingo Müller, Dan-Ovidiu Graur, Thomas Zhou, Olivier Goerens, Alexandru Meterez, Remo Röthlisberger, Dominik Bruggisser, David Loughlin, David Buzatu.
diff --git a/docs/Getting started.md b/docs/Getting started.md
index 64e878246f..a06278e1cd 100644
--- a/docs/Getting started.md
+++ b/docs/Getting started.md
@@ -78,11 +78,11 @@ If you use Linux, Florian Kellner also kindly contributed an [installation scrip
RumbleDB requires an Apache Spark installation on Linux, Mac or Windows.
-It is straightforward to directly [download it](https://spark.apache.org/downloads.html), unpack it and put it at a location of your choosing. We recommend to pick Spark 3.2.2. Let us call this location SPARK_HOME (it is a good idea, in fact to also define an environment variable SPARK_HOME pointing to the absolute path of this location).
+It is straightforward to directly [download it](https://spark.apache.org/downloads.html), unpack it and put it at a location of your choosing. We recommend to pick Spark 3.4.3. Let us call this location SPARK_HOME (it is a good idea, in fact to also define an environment variable SPARK_HOME pointing to the absolute path of this location).
What you need to do then is to add the subdirectory "bin" within the unpacked directory to the PATH variable. On macOS this is done by adding
- export SPARK_HOME=/path/to/spark-3.2.2-bin-hadoop3.2
+ export SPARK_HOME=/path/to/spark-3.4.3-bin-hadoop3.2
export PATH=$SPARK_HOME/bin:$PATH
(with SPARK_HOME appropriately set to match your unzipped Spark directory) to the file .zshrc in your home directory, then making sure to force the change with
@@ -111,9 +111,11 @@ Like Spark, RumbleDB is just a download and no installation is required.
In order to run RumbleDB, you simply need to download one of the small .jar files from the [download page](https://github.com/RumbleDB/rumble/releases) and put it in a directory of your choice, for example, right besides your data.
-If you use Spark 3.2+, use rumbledb-1.22.0-for-spark-3.2.jar.
+If you use Spark 3.4+, use rumbledb-1.22.0-for-spark-3.4.jar.
-If you use Spark 3.3+, use rumbledb-1.22.0-for-spark-3.3.jar.
+If you use Spark 3.5+, use rumbledb-1.22.0-for-spark-3.5.jar.
+
+If you use Spark 4.0+ (preview), use rumbledb-1.22.0-for-spark-4.0.jar.
These jars do not embed Spark, since you chose to set it up separately. They will work with your Spark installation with the spark-submit command.
diff --git a/docs/install.md b/docs/install.md
index d3bc0bebd2..98f158a46e 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -7,9 +7,9 @@ We show here how to install RumbleDB from the github repository if you wish to d
The following software is required:
- [Java SE](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 8 (last tested on OpenJDK 8u251). The version of Java is important, as Spark only works with Java 8 or java 11.
-- [Spark](https://spark.apache.org/), version 3.1.2 (for example)
+- [Spark](https://spark.apache.org/), version 3.4.3 (for example)
- [Ant](http://www.ant.org/), version 1.11.1
-- [ANTLR](http://www.ant.org/), version 4.8 (supplied in our repository)
+- [ANTLR](http://www.ant.org/), version 4.9.3 (supplied in our repository)
- [Maven](https://maven.apache.org/) 3.6.0
Important: the ANTLR version varies with the Spark version, because Spark is also shipped with an ANTLR runtime (example: Spark 3.0 and 3.1 is with ANTLR 4.7, Spark 3.2 with ANTLR 4.8). The ANTLR runtime MUST match the ANTLR generator used to generate the RumbleDB jar file.
diff --git a/pom.xml b/pom.xml
index 715784bf3b..a6d197d96c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -206,22 +206,32 @@
+
+ org.openjdk.jmh
+ jmh-core
+ 1.37
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.37
+
org.apache.spark
spark-core_2.13
- 4.0.0-preview1
+ 4.0.0-preview2
provided
org.apache.spark
spark-sql_2.13
- 4.0.0-preview1
+ 4.0.0-preview2
provided
org.apache.spark
spark-mllib_2.13
- 4.0.0-preview1
+ 4.0.0-preview2
provided
@@ -233,7 +243,7 @@
org.apache.spark
spark-avro_2.13
- 4.0.0-preview1
+ 4.0.0-preview2
org.antlr
@@ -266,36 +276,46 @@
commons-lang3
3.14.0
-
+
+ commons-net
+ commons-net
+ 3.1
+
+
commons-io
commons-io
2.11.0
-
- org.apache.httpcomponents
- httpclient
- 4.5.13
-
-
-
- org.jgrapht
- jgrapht-core
- 1.4.0
-
-
- joda-time
- joda-time
- 2.10.6
-
-
- com.fasterxml.jackson.dataformat
- jackson-dataformat-yaml
- 2.17.1
-
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+
+ org.jgrapht
+ jgrapht-core
+ 1.4.0
+
+
+ joda-time
+ joda-time
+ 2.10.6
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-yaml
+ 2.17.1
+
+
+ io.delta
+ delta-spark_2.13
+ 3.2.1
+
diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java
index ae0feeb357..27ef9d70be 100644
--- a/src/main/java/org/rumbledb/api/Item.java
+++ b/src/main/java/org/rumbledb/api/Item.java
@@ -692,17 +692,113 @@ default boolean isNaN() {
* @return an int representing nestedness of the item inside transform expressions.
*/
default int getMutabilityLevel() {
- return 0;
+ return -1;
}
/**
- * Sets the mutability level of the item.
+ * Sets the mutability level of the item to a supplied value.
*
- * @param mutabilityLevel the new mutability level.
+ * @param mutabilityLevel new mutability level.
*/
default void setMutabilityLevel(int mutabilityLevel) {
}
+ /**
+ * Returns the top level ID of the item.
+ *
+ * @return int representing the rowID of the item within a DeltaFile.
+ */
+ default long getTopLevelID() {
+ return -1;
+ }
+
+ /**
+ * Sets the top level ID of the item to a supplied value.
+ *
+ * @param topLevelID new top level ID.
+ */
+ default void setTopLevelID(long topLevelID) {
+ }
+
+ /**
+ * Returns the path from the top level object of a DeltaFile for the item.
+ *
+ * @return String representing the path of the item from the top level within a DeltaFile.
+ */
+ default String getPathIn() {
+ return "null";
+ }
+
+ /**
+ * Sets the path from the top level object of a DeltaFile for the item to a supplied value.
+ *
+ * @param pathIn new path from top level.
+ */
+ default void setPathIn(String pathIn) {
+ }
+
+ /**
+ * Returns the location of the DeltaFile for the item.
+ *
+ * @return String representing the location of the DeltaFile for the item.
+ */
+ default String getTableLocation() {
+ return null;
+ }
+
+
+ /**
+ * Sets the location of the DeltaFile for the item to a supplied value.
+ *
+ * @param location new location of the DeltaFile for the item.
+ */
+ default void setTableLocation(String location) {
+ }
+
+ /**
+ * Returns the SparkSQL value of the item for use in a query.
+ *
+ * @return String representing the SparkSQL value of the item.
+ */
+ default String getSparkSQLValue() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ /**
+ * Returns the SparkSQL value of the item for use in a query.
+ *
+ * @return String representing the SparkSQL value of the item.
+ */
+ default String getSparkSQLValue(ItemType itemType) {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ /**
+ * Returns the SparkSQL type of the item for use in a query.
+ *
+ * @return String representing the SparkSQL type of the item.
+ */
+ default String getSparkSQLType() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ /**
+ * Tests for physical equality. The semantics are that of the eq operator.
+ *
+ * @param other another item.
+ * @return true it is equal to other, false otherwise.
+ */
+ default boolean physicalEquals(Object other) {
+ if (!(other instanceof Item)) {
+ return false;
+ }
+ Item otherItem = (Item) other;
+ if (this.getTopLevelID() == -1 || otherItem.getTopLevelID() == -1) {
+ return System.identityHashCode(this) == System.identityHashCode(otherItem);
+ }
+ return this.getTopLevelID() == otherItem.getTopLevelID() && this.getPathIn().equals(otherItem.getPathIn());
+ }
+
/**
* Tests for logical equality. The semantics are that of the eq operator.
*
diff --git a/src/main/java/org/rumbledb/api/Rumble.java b/src/main/java/org/rumbledb/api/Rumble.java
index d802afd8c2..611df17a69 100644
--- a/src/main/java/org/rumbledb/api/Rumble.java
+++ b/src/main/java/org/rumbledb/api/Rumble.java
@@ -6,6 +6,7 @@
import org.rumbledb.expressions.module.MainModule;
import org.rumbledb.runtime.RuntimeIterator;
import org.rumbledb.runtime.update.PendingUpdateList;
+
import sparksoniq.spark.SparkSessionManager;
import java.io.IOException;
@@ -52,11 +53,6 @@ public SequenceOfItems runQuery(String query) {
this.configuration
);
- if (iterator.isUpdating()) {
- PendingUpdateList pul = iterator.getPendingUpdateList(dynamicContext);
- pul.applyUpdates(iterator.getMetadata());
- }
-
return new SequenceOfItems(iterator, dynamicContext, this.configuration);
}
diff --git a/src/main/java/org/rumbledb/api/SequenceOfItems.java b/src/main/java/org/rumbledb/api/SequenceOfItems.java
index c8cec7beca..7a32fde406 100644
--- a/src/main/java/org/rumbledb/api/SequenceOfItems.java
+++ b/src/main/java/org/rumbledb/api/SequenceOfItems.java
@@ -7,8 +7,10 @@
import org.apache.spark.sql.Row;
import org.rumbledb.config.RumbleRuntimeConfiguration;
import org.rumbledb.context.DynamicContext;
+import org.rumbledb.items.ItemFactory;
import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.update.PendingUpdateList;
import sparksoniq.spark.SparkSessionManager;
/**
@@ -51,7 +53,9 @@ public SequenceOfItems(
* Opens the iterator.
*/
public void open() {
- this.iterator.open(this.dynamicContext);
+ if (this.isMaterialisable()) {
+ this.iterator.open(this.dynamicContext);
+ }
this.isOpen = true;
}
@@ -68,7 +72,9 @@ public boolean isOpen() {
* Closes the iterator.
*/
public void close() {
- this.iterator.close();
+ if (this.isOpen) {
+ this.iterator.close();
+ }
this.isOpen = false;
}
@@ -78,6 +84,9 @@ public void close() {
* @return true if there are more items, false otherwise.
*/
public boolean hasNext() {
+ if (!this.isMaterialisable()) {
+ return false;
+ }
return this.iterator.hasNext();
}
@@ -88,6 +97,9 @@ public boolean hasNext() {
* @return the next item.
*/
public Item next() {
+ if (!this.isMaterialisable()) {
+ return ItemFactory.getInstance().createNullItem();
+ }
return this.iterator.next();
}
@@ -109,6 +121,24 @@ public boolean availableAsDataFrame() {
return this.iterator.isDataFrame();
}
+ /**
+ * Returns whether the iterator is updating
+ *
+ * @return true if updating; otherwise false.
+ */
+ public boolean availableAsPUL() {
+ return this.iterator.isUpdating();
+ }
+
+ /**
+ * Return whether the iterator of the sequence should be evaluated to materialise the sequence of items.
+ *
+ * @return true if materialisable; otherwise false
+ */
+ private boolean isMaterialisable() {
+ return !(this.availableAsPUL() && !this.iterator.isSequential());
+ }
+
/**
* Returns the sequence of items as an RDD of Items rather than iterating over them locally.
* It is not possible to do so if the iterator is open.
@@ -116,6 +146,9 @@ public boolean availableAsDataFrame() {
* @return an RDD of Items.
*/
public JavaRDD- getAsRDD() {
+ if (!this.isMaterialisable()) {
+ return SparkSessionManager.getInstance().getJavaSparkContext().emptyRDD();
+ }
if (this.isOpen) {
throw new RuntimeException("Cannot obtain an RDD if the iterator is open.");
}
@@ -129,12 +162,23 @@ public JavaRDD
- getAsRDD() {
* @return a data frame.
*/
public Dataset
getAsDataFrame() {
+ if (!this.isMaterialisable()) {
+ return SparkSessionManager.getInstance().getOrCreateSession().emptyDataFrame();
+ }
if (this.isOpen) {
throw new RuntimeException("Cannot obtain an RDD if the iterator is open.");
}
return this.iterator.getDataFrame(this.dynamicContext).getDataFrame();
}
+ /**
+ * Applies the PUL available when the iterator is updating.
+ */
+ public void applyPUL() {
+ PendingUpdateList pul = this.iterator.getPendingUpdateList(this.dynamicContext);
+ pul.applyUpdates(this.iterator.getMetadata());
+ }
+
/*
* Populates a list of items with the output.
*
@@ -142,6 +186,9 @@ public Dataset getAsDataFrame() {
*/
public long populateList(List- resultList) {
resultList.clear();
+ if (!this.isMaterialisable()) {
+ return -1;
+ }
this.iterator.open(this.dynamicContext);
Item result = null;
if (this.iterator.hasNext()) {
@@ -176,6 +223,9 @@ public long populateList(List
- resultList) {
public long populateListWithWarningOnlyIfCapReached(List
- resultList) {
if (this.availableAsRDD()) {
+ if (!this.isMaterialisable()) {
+ return -1;
+ }
JavaRDD
- rdd = this.iterator.getRDD(this.dynamicContext);
return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList);
} else {
@@ -183,5 +233,4 @@ public long populateListWithWarningOnlyIfCapReached(List
- resultList) {
}
}
-
}
diff --git a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java
index 9d6cbb99b9..25c350a557 100644
--- a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java
+++ b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java
@@ -118,7 +118,8 @@ public List
- runQuery() throws IOException {
!(this.configuration.getOutputFormat().equals("json")
|| this.configuration.getOutputFormat().equals("tyson")
|| this.configuration.getOutputFormat().equals("xml-json-hybrid")
- || this.configuration.getOutputFormat().equals("yaml"))
+ || this.configuration.getOutputFormat().equals("yaml")
+ || this.configuration.getOutputFormat().equals("delta"))
&&
!sequence.availableAsDataFrame()
) {
@@ -185,6 +186,10 @@ public List
- runQuery() throws IOException {
}
}
+ if (this.configuration.applyUpdates() && sequence.availableAsPUL() && outputPath != null) {
+ sequence.applyPUL();
+ }
+
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
if (logPath != null) {
@@ -225,6 +230,9 @@ public long runInteractive(String query, List
- resultList) throws IOExcepti
if (!sequence.availableAsRDD()) {
return sequence.populateList(resultList);
}
+ if (this.configuration.applyUpdates() && sequence.availableAsPUL()) {
+ sequence.applyPUL();
+ }
resultList.clear();
JavaRDD
- rdd = sequence.getAsRDD();
return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList);
diff --git a/src/main/java/org/rumbledb/cli/Main.java b/src/main/java/org/rumbledb/cli/Main.java
index e1a5cbeac1..bec7ac697f 100644
--- a/src/main/java/org/rumbledb/cli/Main.java
+++ b/src/main/java/org/rumbledb/cli/Main.java
@@ -38,17 +38,15 @@ public class Main {
public static void main(String[] args) throws IOException {
String javaVersion = System.getProperty("java.version");
if (
- !javaVersion.startsWith("17")
- && !javaVersion.startsWith("18")
- && !javaVersion.startsWith("19")
- && !javaVersion.startsWith("20")
+ !javaVersion.startsWith("11")
+ && !javaVersion.startsWith("17")
&& !javaVersion.startsWith("21")
) {
- System.err.println("[Error] RumbleDB requires at least Java 17 (17 being the default Spark 4 version).");
+ System.err.println("[Error] RumbleDB requires Java 11, 17 or 21 (17 being the default Spark 4 version).");
System.err.println("Your Java version: " + System.getProperty("java.version"));
- System.err.println("You can download Java 17 from https://adoptium.net/");
+ System.err.println("You can download Java 11, 17 or 21 from https://adoptium.net/");
System.err.println(
- "If you do have Java 17+, but the wrong version appears above, then it means you need to set your JAVA_HOME environment variable properly to point to Java 17+."
+ "If you do have Java 11, 17 or 21, but the wrong version appears above, then it means you need to set your JAVA_HOME environment variable properly to point to Java 11, 17 or 21."
);
System.exit(43);
}
diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java
index 546af9628d..d308ed9104 100644
--- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java
@@ -448,7 +448,7 @@ public Node visitInlineFunctionExpr(InlineFunctionExpression expression, Node ar
expression.getAnnotations(),
expression.getName(),
expression.getParams(),
- expression.getReturnType(),
+ expression.getActualReturnType(),
(StatementsAndOptionalExpr) visit(expression.getBody(), argument),
expression.getMetadata()
);
diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java
index 5e8a7ccc2c..e96188dbc4 100644
--- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java
@@ -656,7 +656,11 @@ public StaticContext visitProlog(Prolog prolog, StaticContext argument) {
@Override
public StaticContext visitProgram(Program program, StaticContext argument) {
visitDescendants(program, argument);
- ExecutionMode mergedExecutionMode = getHighestExecutionModeFromStatements(exitStatementChildren);
+ ExecutionMode mergedExecutionMode = program.getStatementsAndOptionalExpr().getHighestExecutionMode();
+ for (Statement statement : exitStatementChildren) {
+ ExecutionMode statementExecMode = statement.getHighestExecutionMode(this.visitorConfig);
+ mergedExecutionMode = getHighestExecutionMode(mergedExecutionMode, statementExecMode);
+ }
program.setHighestExecutionMode(mergedExecutionMode);
return argument;
}
diff --git a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java
index 7bcd53bdd1..7614931dc4 100644
--- a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java
@@ -1,5 +1,9 @@
package org.rumbledb.compiler;
+import org.rumbledb.context.BuiltinFunction;
+import org.rumbledb.context.BuiltinFunctionCatalogue;
+import org.rumbledb.context.FunctionIdentifier;
+import org.rumbledb.context.StaticContext;
import org.rumbledb.exceptions.InvalidUpdatingExpressionPositionException;
import org.rumbledb.exceptions.SimpleExpressionMustBeVacuousException;
import org.rumbledb.expressions.AbstractNodeVisitor;
@@ -7,6 +11,8 @@
import org.rumbledb.expressions.Expression;
import org.rumbledb.expressions.ExpressionClassification;
import org.rumbledb.expressions.Node;
+import org.rumbledb.exceptions.UnknownFunctionCallException;
+import org.rumbledb.exceptions.UpdatingFunctionHasReturnTypeException;
import org.rumbledb.expressions.control.ConditionalExpression;
import org.rumbledb.expressions.control.SwitchExpression;
import org.rumbledb.expressions.control.TypeSwitchExpression;
@@ -27,6 +33,7 @@
import org.rumbledb.expressions.scripting.loops.ReturnStatementClause;
import org.rumbledb.expressions.scripting.statement.StatementsAndExpr;
import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr;
+import org.rumbledb.expressions.typing.TreatExpression;
import org.rumbledb.expressions.update.AppendExpression;
import org.rumbledb.expressions.update.CopyDeclaration;
import org.rumbledb.expressions.update.DeleteExpression;
@@ -34,6 +41,7 @@
import org.rumbledb.expressions.update.RenameExpression;
import org.rumbledb.expressions.update.ReplaceExpression;
import org.rumbledb.expressions.update.TransformExpression;
+import org.rumbledb.types.FunctionSignature;
import java.util.ArrayList;
import java.util.List;
@@ -51,14 +59,6 @@ protected ExpressionClassification defaultAction(Node node, ExpressionClassifica
return expressionClassification;
}
- if (node instanceof StatementsAndExpr) {
- ((StatementsAndExpr) node).setExpressionClassification(expressionClassification);
- return expressionClassification;
- }
- if (node instanceof StatementsAndOptionalExpr) {
- ((StatementsAndOptionalExpr) node).setExpressionClassification(expressionClassification);
- return expressionClassification;
- }
if (node instanceof InlineFunctionExpression) {
((InlineFunctionExpression) node).setExpressionClassification(expressionClassification);
return expressionClassification;
@@ -88,6 +88,28 @@ public ExpressionClassification visitDescendants(Node node, ExpressionClassifica
return result;
}
+ @Override
+ public ExpressionClassification visitStatementsAndOptionalExpr(
+ StatementsAndOptionalExpr expression,
+ ExpressionClassification argument
+ ) {
+ this.visitDescendants(expression, argument);
+ Expression e = expression.getExpression();
+ expression.setExpressionClassification(e.getExpressionClassification());
+ return e.getExpressionClassification();
+ }
+
+ @Override
+ public ExpressionClassification visitStatementsAndExpr(
+ StatementsAndExpr expression,
+ ExpressionClassification argument
+ ) {
+ this.visitDescendants(expression, argument);
+ Expression e = expression.getExpression();
+ expression.setExpressionClassification(e.getExpressionClassification());
+ return e.getExpressionClassification();
+ }
+
@Override
public ExpressionClassification visitCommaExpression(
CommaExpression expression,
@@ -118,6 +140,21 @@ public ExpressionClassification visitCommaExpression(
return expression.getExpressionClassification();
}
+ // Region Typing
+
+ @Override
+ public ExpressionClassification visitTreatExpression(
+ TreatExpression expression,
+ ExpressionClassification argument
+ ) {
+ ExpressionClassification result = this.visit(expression.getMainExpression(), argument);
+ expression.setExpressionClassification(result);
+ return result;
+ }
+
+
+ // Endregion
+
// Region FLWOR
@Override
@@ -301,13 +338,88 @@ public ExpressionClassification visitTypeSwitchExpression(
// Region Primary
+ private FunctionSignature getSignature(FunctionIdentifier identifier, StaticContext staticContext) {
+ BuiltinFunction function;
+ FunctionSignature signature;
+ function = BuiltinFunctionCatalogue.getBuiltinFunction(identifier);
+ if (function != null) {
+ signature = function.getSignature();
+ } else {
+ signature = staticContext.getFunctionSignature(identifier);
+ }
+ return signature;
+ }
+
@Override
public ExpressionClassification visitFunctionCall(
FunctionCallExpression expression,
ExpressionClassification argument
) {
- // TODO: Make vacuous if call to fn:error?
- return super.visitFunctionCall(expression, argument);
+ ExpressionClassification currArgResult;
+ for (Expression argExpr : expression.getArguments()) {
+ if (argExpr == null) {
+ continue;
+ }
+ currArgResult = this.visit(argExpr, argument);
+ if (currArgResult.isUpdating()) {
+ throw new InvalidUpdatingExpressionPositionException(
+ "Arguments to function calls cannot be updating",
+ argExpr.getMetadata()
+ );
+ }
+ }
+ FunctionSignature funcSig;
+ try {
+ funcSig = getSignature(expression.getFunctionIdentifier(), expression.getStaticContext());
+ } catch (UnknownFunctionCallException e) {
+ throw new UnknownFunctionCallException(expression.getFunctionIdentifier(), expression.getMetadata());
+ }
+ ExpressionClassification result = funcSig.isUpdating()
+ ? ExpressionClassification.UPDATING
+ : ExpressionClassification.SIMPLE;
+ expression.setExpressionClassification(result);
+ // TODO: Make vacuous if call to fn:error? Not present!
+ return result;
+ }
+
+ @Override
+ public ExpressionClassification visitInlineFunctionExpr(
+ InlineFunctionExpression expression,
+ ExpressionClassification argument
+ ) {
+ ExpressionClassification bodyResult = this.visit(expression.getBody(), argument);
+
+ if (expression.isUpdating()) {
+ if (expression.getActualReturnType() != null) {
+ System.err.println(expression);
+ throw new UpdatingFunctionHasReturnTypeException(
+ "An updating function cannot have a return type. Return type "
+ + expression.getActualReturnType()
+ + " is specified.",
+ expression.getMetadata()
+ );
+ }
+ if (!expression.isExternal() && !(bodyResult.isUpdating() || bodyResult.isVacuous())) {
+ throw new SimpleExpressionMustBeVacuousException(
+ "Top level expression of updating function must be updating or vacuous",
+ expression.getMetadata()
+ );
+ }
+ // TODO CHECK IF EXTERNAL ERROR XUDY0019
+ expression.setExpressionClassification(ExpressionClassification.UPDATING);
+ } else {
+ if (!expression.isExternal() && !bodyResult.isSimple()) {
+ throw new InvalidUpdatingExpressionPositionException(
+ "Body of simple inline function must be simple",
+ expression.getMetadata()
+ );
+ }
+ // TODO CHECK IF EXTERNAL ERROR XUDY0018
+ expression.setExpressionClassification(ExpressionClassification.SIMPLE);
+ }
+
+
+ return expression.getExpressionClassification();
}
// Endregion
diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
index 9a8cb0d434..bb022d9548 100644
--- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
@@ -402,7 +402,7 @@ public StaticContext visitInlineFunctionExpr(InlineFunctionExpression expression
returnType = expression.getBody().getExpression().getStaticSequenceType();
}
List params = new ArrayList<>(expression.getParams().values());
- FunctionSignature signature = new FunctionSignature(params, returnType);
+ FunctionSignature signature = new FunctionSignature(params, returnType, expression.isUpdating());
expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(signature)));
return argument;
}
@@ -474,6 +474,29 @@ private boolean tryAnnotateSpecificFunctions(FunctionCallExpression expression,
}
}
+ // handle 'delta-file' function
+ if (
+ functionName.equals(Name.createVariableInDefaultFunctionNamespace("delta-file"))
+ && args.size() > 0
+ && args.get(0) instanceof StringLiteralExpression
+ ) {
+ String path = ((StringLiteralExpression) args.get(0)).getValue();
+ URI uri = FileSystemUtil.resolveURI(staticContext.getStaticBaseURI(), path, expression.getMetadata());
+ if (!FileSystemUtil.exists(uri, this.rumbleRuntimeConfiguration, expression.getMetadata())) {
+ throw new CannotRetrieveResourceException("File " + uri + " not found.", expression.getMetadata());
+ }
+ StructType s = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .read()
+ .format("delta")
+ .load(uri.toString())
+ .schema();
+ ItemType schemaItemType = ItemTypeFactory.createItemType(s);
+ // TODO : check if arity is correct
+ expression.setStaticSequenceType(new SequenceType(schemaItemType, SequenceType.Arity.ZeroOrMore));
+ return true;
+ }
+
// handle 'round' function
if (functionName.equals(Name.createVariableInDefaultFunctionNamespace("round"))) {
// set output type to the same of the first argument (special handling of numeric)
@@ -538,7 +561,11 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static
}
if (expression.isPartialApplication()) {
- FunctionSignature partialSignature = new FunctionSignature(partialParams, signature.getReturnType());
+ FunctionSignature partialSignature = new FunctionSignature(
+ partialParams,
+ signature.getReturnType(),
+ expression.isUpdating()
+ );
expression.setStaticSequenceType(
new SequenceType(ItemTypeFactory.createFunctionItemType(partialSignature))
);
@@ -766,8 +793,7 @@ public StaticContext visitTransformExpression(TransformExpression expression, St
}
visit(expression.getModifyExpression(), argument);
visit(expression.getReturnExpression(), argument);
-
- expression.setStaticSequenceType(SequenceType.EMPTY_SEQUENCE);
+ expression.setStaticSequenceType(expression.getReturnExpression().getStaticSequenceType());
return argument;
}
@@ -1781,7 +1807,8 @@ public StaticContext visitDynamicFunctionCallExpression(
if (isPartialApplication) {
FunctionSignature newSignature = new FunctionSignature(
partialFormalParameterTypes,
- signature.getReturnType()
+ signature.getReturnType(),
+ expression.isUpdating()
);
expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(newSignature)));
return argument;
diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
index 9d5354e400..0102eb79b7 100644
--- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
@@ -486,9 +486,6 @@ public RuntimeIterator visitTransformExpression(TransformExpression expression,
for (CopyDeclaration copyDecl : expression.getCopyDeclarations()) {
copyDeclMap.put(copyDecl.getVariableName(), this.visit(copyDecl.getSourceExpression(), argument));
}
- for (Expression childExpr : expression.getCopySourceExpressions()) {
- copyDeclIterators.add(this.visit(childExpr, argument));
- }
RuntimeIterator modifyIterator = this.visit(expression.getModifyExpression(), argument);
RuntimeIterator returnIterator = this.visit(expression.getReturnExpression(), argument);
@@ -664,7 +661,8 @@ public RuntimeIterator visitInlineFunctionExpr(InlineFunctionExpression expressi
paramNameToSequenceTypes,
returnType,
bodyIterator,
- expression.getStaticContextForRuntime(this.config, this.visitorConfig)
+ expression.getStaticContextForRuntime(this.config, this.visitorConfig),
+ expression.isUpdating()
);
runtimeIterator.setStaticContext(expression.getStaticContext());
return runtimeIterator;
@@ -703,7 +701,8 @@ public RuntimeIterator visitFunctionCall(FunctionCallExpression expression, Runt
runtimeIterator = new StaticUserDefinedFunctionCallIterator(
identifier,
arguments,
- expression.getStaticContextForRuntime(this.config, this.visitorConfig)
+ expression.getStaticContextForRuntime(this.config, this.visitorConfig),
+ expression.isUpdating()
);
}
runtimeIterator.setStaticContext(expression.getStaticContext());
@@ -1005,6 +1004,7 @@ public RuntimeIterator visitTreatExpression(TreatExpression expression, RuntimeI
RuntimeIterator runtimeIterator = new TreatIterator(
childExpression,
expression.getSequenceType(),
+ expression.isUpdating(),
expression.errorCodeThatShouldBeThrown(),
expression.getStaticContextForRuntime(this.config, this.visitorConfig)
);
diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java
index b192378c3d..b4e19efc8b 100644
--- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java
@@ -188,7 +188,8 @@ public StaticContext visitFunctionDeclaration(FunctionDeclaration declaration, S
expression.getFunctionIdentifier(),
new FunctionSignature(
new ArrayList<>(expression.getParams().values()),
- expression.getReturnType()
+ expression.getReturnType(),
+ expression.isUpdating()
)
);
return argument;
diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
index f758f29134..8f2c77ffa1 100644
--- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
@@ -426,7 +426,7 @@ public Node visitProlog(JsoniqParser.PrologContext ctx) {
return prolog;
}
- public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType) {
+ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType, boolean isAnnotation) {
String localName = null;
String prefix = null;
Name name = null;
@@ -445,6 +445,8 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean
name = Name.createVariableInDefaultFunctionNamespace(localName);
} else if (isType) {
name = Name.createVariableInDefaultTypeNamespace(localName);
+ } else if (isAnnotation) {
+ name = Name.createVariableInDefaultAnnotationsNamespace(localName);
} else {
name = Name.createVariableInNoNamespace(localName);
}
@@ -463,14 +465,14 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean
@Override
public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) {
List annotations = processAnnotations(ctx.annotations());
- Name name = parseName(ctx.qname(), true, false);
+ Name name = parseName(ctx.qname(), true, false, false);
LinkedHashMap fnParams = new LinkedHashMap<>();
SequenceType fnReturnType = null;
Name paramName;
SequenceType paramType;
if (ctx.paramList() != null) {
for (JsoniqParser.ParamContext param : ctx.paramList().param()) {
- paramName = parseName(param.qname(), false, false);
+ paramName = parseName(param.qname(), false, false, false);
paramType = ITEM_STAR;
if (fnParams.containsKey(paramName)) {
throw new DuplicateParamNameException(
@@ -495,12 +497,15 @@ public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) {
StatementsAndOptionalExpr funcBody = (StatementsAndOptionalExpr) this
.visitStatementsAndOptionalExpr(ctx.fn_body);
+ boolean isExternal = ctx.is_external != null;
+
return new InlineFunctionExpression(
annotations,
name,
fnParams,
fnReturnType,
funcBody,
+ isExternal,
createMetadataFromContext(ctx)
);
}
@@ -531,7 +536,7 @@ public Node visitTypeDecl(JsoniqParser.TypeDeclContext ctx) {
pe.initCause(e);
throw pe;
}
- Name name = parseName(ctx.qname(), false, true);
+ Name name = parseName(ctx.qname(), false, true, false);
String schemaLanguage = null;
if (ctx.schema != null) {
schemaLanguage = ctx.schema.getText();
@@ -1132,7 +1137,7 @@ public Node visitArrowExpr(JsoniqParser.ArrowExprContext ctx) {
children.add(mainExpression);
children.addAll(getArgumentsFromArgumentListContext(ctx.arguments.get(i)));
if (functionCallContext.qname() != null) {
- Name name = parseName(functionCallContext.qname(), true, false);
+ Name name = parseName(functionCallContext.qname(), true, false, false);
mainExpression = processFunctionCall(name, children, createMetadataFromContext(functionCallContext));
continue;
} else if (functionCallContext.varRef() != null) {
@@ -1518,7 +1523,7 @@ public Node visitParenthesizedExpr(JsoniqParser.ParenthesizedExprContext ctx) {
@Override
public Node visitVarRef(JsoniqParser.VarRefContext ctx) {
- Name name = parseName(ctx.qname(), false, false);
+ Name name = parseName(ctx.qname(), false, false, false);
return new VariableReferenceExpression(name, createMetadataFromContext(ctx));
}
@@ -1589,7 +1594,7 @@ public ItemType processItemType(JsoniqParser.ItemTypeContext itemTypeContext) {
return BuiltinTypesCatalogue.anyFunctionItem;
}
}
- Name name = parseName(itemTypeContext.qname(), false, true);
+ Name name = parseName(itemTypeContext.qname(), false, true, false);
if (!BuiltinTypesCatalogue.typeExists(name)) {
return new ItemTypeReference(name);
}
@@ -1622,7 +1627,7 @@ private Expression processFunctionCall(Name name, List children, Exc
@Override
public Node visitFunctionCall(JsoniqParser.FunctionCallContext ctx) {
- Name name = parseName(ctx.fn_name, true, false);
+ Name name = parseName(ctx.fn_name, true, false, false);
return processFunctionCall(
name,
getArgumentsFromArgumentListContext(ctx.argumentList()),
@@ -1666,7 +1671,7 @@ public Node visitFunctionItemExpr(JsoniqParser.FunctionItemExprContext ctx) {
@Override
public Node visitNamedFunctionRef(JsoniqParser.NamedFunctionRefContext ctx) {
- Name name = parseName(ctx.fn_name, true, false);
+ Name name = parseName(ctx.fn_name, true, false, false);
int arity = 0;
try {
arity = Integer.parseInt(ctx.arity.getText());
@@ -1691,7 +1696,7 @@ public Node visitInlineFunctionExpr(JsoniqParser.InlineFunctionExprContext ctx)
SequenceType paramType;
if (ctx.paramList() != null) {
for (JsoniqParser.ParamContext param : ctx.paramList().param()) {
- paramName = parseName(param.qname(), false, false);
+ paramName = parseName(param.qname(), false, false, false);
paramType = SequenceType.ITEM_STAR;
if (fnParams.containsKey(paramName)) {
throw new DuplicateParamNameException(
@@ -1873,7 +1878,7 @@ public Node visitTryCatchExpr(JsoniqParser.TryCatchExprContext ctx) {
for (JsoniqParser.CatchClauseContext catchCtx : ctx.catches) {
Expression catchExpression = (Expression) this.visitExpr(catchCtx.catch_expression);
for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) {
- Name name = parseName(qnameCtx, false, false);
+ Name name = parseName(qnameCtx, false, false, false);
if (!catchExpressions.containsKey(name.getLocalName())) {
catchExpressions.put(name.getLocalName(), catchExpression);
}
@@ -2028,7 +2033,7 @@ public Node visitApplyStatement(JsoniqParser.ApplyStatementContext ctx) {
@Override
public Node visitAssignStatement(JsoniqParser.AssignStatementContext ctx) {
- Name paramName = parseName(ctx.qname(), false, false);
+ Name paramName = parseName(ctx.qname(), false, false, false);
Expression exprSingle = (Expression) this.visitExprSingle(ctx.exprSingle());
return new AssignStatement(exprSingle, paramName, createMetadataFromContext(ctx));
}
@@ -2170,7 +2175,7 @@ public Node visitTryCatchStatement(JsoniqParser.TryCatchStatementContext ctx) {
for (JsoniqParser.CatchCaseStatementContext catchCtx : ctx.catches) {
BlockStatement catchBlockStatement = (BlockStatement) this.visitBlockStatement(catchCtx.catch_block);
for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) {
- Name name = parseName(qnameCtx, false, false);
+ Name name = parseName(qnameCtx, false, false, false);
if (!catchBlockStatements.containsKey(name.getLocalName())) {
catchBlockStatements.put(name.getLocalName(), catchBlockStatement);
}
@@ -2380,20 +2385,20 @@ public ExceptionMetadata generateMetadata(Token token) {
private List processAnnotations(JsoniqParser.AnnotationsContext annotations) {
List parsedAnnotations = new ArrayList<>();
- annotations.annotation().forEach(annotationContext -> {
+ for (JsoniqParser.AnnotationContext annotationContext : annotations.annotation()) {
+ // for backwards compatibility, the specification allows for updating without % sign
+ if (annotationContext.updating != null) {
+ Name name = Name.createVariableInDefaultAnnotationsNamespace("updating");
+ parsedAnnotations.add(new Annotation(name, null));
+ continue;
+ }
JsoniqParser.QnameContext qnameContext = annotationContext.qname();
- Name name = parseName(qnameContext, false, false);
+ Name name = parseName(qnameContext, false, false, true);
if (!annotationContext.Literal().isEmpty()) {
throw new OurBadException("Literals are currently not supported in annotations!");
}
parsedAnnotations.add(new Annotation(name, null));
- // List literals = new ArrayList<>();
- // ExceptionMetadata metadata = createMetadataFromContext(annotationContext);
- // annotationContext.Literal().forEach(literal -> {
- // literals.add(getLiteralExpressionFromToken(literal.getText(), metadata));
- // });
- // parsedAnnotations.add(new Annotation(name, literals));
- });
+ }
return parsedAnnotations;
}
diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java
index f63ed59f9f..7c78ec877b 100644
--- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java
+++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java
@@ -154,16 +154,77 @@ public static MainModule parseJSONiqMainModule(
if (main == null) {
throw new ParsingException("A library module is not executable.", ExceptionMetadata.EMPTY_METADATA);
}
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************");
+ System.err.println("Parsing program");
+ System.err.println("***************");
+ }
MainModule mainModule = (MainModule) visitor.visit(main);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************");
+ System.err.println("Pruning modules");
+ System.err.println("***************");
+ }
pruneModules(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("**********************");
+ System.err.println("Resolving dependencies");
+ System.err.println("**********************");
+ }
resolveDependencies(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************************");
+ System.err.println("Populating sequential classifications");
+ System.err.println("*************************************");
+ }
populateSequentialClassifications(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************************************");
+ System.err.println("Applying type independent optimizations");
+ System.err.println("***************************************");
+ }
mainModule = applyTypeIndependentOptimizations(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************");
+ System.err.println("Populating static context");
+ System.err.println("*************************");
+ }
populateStaticContext(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************************");
+ System.err.println("Populating expression classifications");
+ System.err.println("*************************************");
+ }
+ populateExpressionClassifications(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("**************");
+ System.err.println("Infering types");
+ System.err.println("**************");
+ }
inferTypes(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("************************");
+ System.err.println("Applying type dependent optimizations");
+ System.err.println("************************");
+ }
mainModule = applyTypeDependentOptimizations(mainModule);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************************************");
+ System.err.println("Populating execution modes");
+ System.err.println("***************************************");
+ }
populateExecutionModes(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************************");
+ System.err.println("Populating expression classifications");
+ System.err.println("*************************************");
+ }
populateExpressionClassifications(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("********************************");
+ System.err.println("Verify composability constraints");
+ System.err.println("********************************");
+ }
verifyComposabilityConstraints(mainModule, configuration);
return mainModule;
} catch (ParseCancellationException ex) {
diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java
index c82b2df27f..593a5fcbcc 100644
--- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java
+++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java
@@ -73,6 +73,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl
private boolean nativeExecution;
private boolean functionInlining;
private boolean thirdFeature;
+ private boolean applyUpdates;
private Map shortcutMap;
private Set yesNoShortcuts;
@@ -422,6 +423,12 @@ public void init() {
this.functionInlining = true;
}
+ if (this.arguments.containsKey("apply-updates")) {
+ this.applyUpdates = this.arguments.get("apply-updates").equals("yes");
+ } else {
+ this.applyUpdates = false;
+ }
+
if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) {
this.optimizeGeneralComparisonToValueComparison = this.arguments.get(
"optimize-general-comparison-to-value-comparison"
@@ -644,6 +651,14 @@ public void setFunctionInlining(boolean b) {
this.functionInlining = b;
}
+ public boolean applyUpdates() {
+ return this.applyUpdates;
+ }
+
+ public void setApplyUpdates(boolean b) {
+ this.applyUpdates = b;
+ }
+
public boolean optimizeGeneralComparisonToValueComparison() {
return this.optimizeGeneralComparisonToValueComparison;
}
diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
index 8ff2d1970d..afca459f9a 100644
--- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
+++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
@@ -37,6 +37,8 @@
import org.rumbledb.runtime.functions.datetime.components.TimezoneFromTimeFunctionIterator;
import org.rumbledb.runtime.functions.datetime.components.YearFromDateFunctionIterator;
import org.rumbledb.runtime.functions.datetime.components.YearFromDateTimeFunctionIterator;
+import org.rumbledb.runtime.functions.delta_lake.CreateDeltaLakeTableFunctionIterator;
+import org.rumbledb.runtime.functions.delta_lake.DeleteDeltaLakeTableFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.DaysFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.HoursFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.ImplicitTimezoneIterator;
@@ -46,6 +48,7 @@
import org.rumbledb.runtime.functions.durations.components.YearsFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.input.AvroFileFunctionIterator;
import org.rumbledb.runtime.functions.input.CSVFileFunctionIterator;
+import org.rumbledb.runtime.functions.input.DeltaFileFunctionIterator;
import org.rumbledb.runtime.functions.input.JsonFileFunctionIterator;
import org.rumbledb.runtime.functions.input.LibSVMFileFunctionIterator;
import org.rumbledb.runtime.functions.input.ParallelizeFunctionIterator;
@@ -518,6 +521,16 @@ private static BuiltinFunction createBuiltinFunction(
BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME
);
+ /**
+ * function that parses a delta file
+ */
+ static final BuiltinFunction delta_file = createBuiltinFunction(
+ new Name(Name.JN_NS, "jn", "delta-file"),
+ "string",
+ "item*",
+ DeltaFileFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME
+ );
/**
* function that parses a csv file
*/
@@ -2677,6 +2690,28 @@ private static BuiltinFunction createBuiltinFunction(
BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
);
+ /**
+ * function that creates a delta lake table at a given path location
+ */
+ static final BuiltinFunction create_delta_lake_table = createBuiltinFunction(
+ new Name(Name.JN_NS, "jn", "create-delta-lake-table"),
+ "string",
+ "boolean",
+ CreateDeltaLakeTableFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ /**
+ * function that deletes a delta lake table at a given path location
+ */
+ static final BuiltinFunction delete_delta_lake_table = createBuiltinFunction(
+ new Name(Name.JN_NS, "jn", "delete-delta-lake-table"),
+ "string",
+ "boolean",
+ DeleteDeltaLakeTableFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
static {
builtinFunctions = new HashMap<>();
@@ -2698,6 +2733,7 @@ private static BuiltinFunction createBuiltinFunction(
builtinFunctions.put(parallelizeFunction2.getIdentifier(), parallelizeFunction2);
builtinFunctions.put(parquet_file1.getIdentifier(), parquet_file1);
builtinFunctions.put(parquet_file2.getIdentifier(), parquet_file2);
+ builtinFunctions.put(delta_file.getIdentifier(), delta_file);
builtinFunctions.put(csv_file1.getIdentifier(), csv_file1);
builtinFunctions.put(csv_file2.getIdentifier(), csv_file2);
builtinFunctions.put(root_file1.getIdentifier(), root_file1);
@@ -2706,6 +2742,9 @@ private static BuiltinFunction createBuiltinFunction(
builtinFunctions.put(avro_file2.getIdentifier(), avro_file2);
builtinFunctions.put(parse_json.getIdentifier(), parse_json);
+ builtinFunctions.put(create_delta_lake_table.getIdentifier(), create_delta_lake_table);
+ builtinFunctions.put(delete_delta_lake_table.getIdentifier(), delete_delta_lake_table);
+
builtinFunctions.put(count.getIdentifier(), count);
builtinFunctions.put(boolean_function.getIdentifier(), boolean_function);
builtinFunctions.put(not_function.getIdentifier(), not_function);
diff --git a/src/main/java/org/rumbledb/context/GlobalVariables.java b/src/main/java/org/rumbledb/context/GlobalVariables.java
index 7c3f87936f..ce93dec247 100644
--- a/src/main/java/org/rumbledb/context/GlobalVariables.java
+++ b/src/main/java/org/rumbledb/context/GlobalVariables.java
@@ -11,6 +11,7 @@
import java.util.Set;
public class GlobalVariables implements Serializable, KryoSerializable {
+ private static final long serialVersionUID = 1L;
private Set globalVariables;
public GlobalVariables() {
diff --git a/src/main/java/org/rumbledb/context/Name.java b/src/main/java/org/rumbledb/context/Name.java
index 45d377c517..687b3a6105 100644
--- a/src/main/java/org/rumbledb/context/Name.java
+++ b/src/main/java/org/rumbledb/context/Name.java
@@ -59,9 +59,9 @@ public class Name implements Comparable, Serializable, KryoSerializable {
public static final String XS_NS = "http://www.w3.org/2001/XMLSchema";
public static final String JS_NS = "http://jsoniq.org/types";
public static final String LOCAL_NS = "http://www.w3.org/2005/xquery-local-functions";
-
- public static final String AN_NS = "http://www.zorba-xquery.com/annotations";
+ public static final String AN_NS = "http://www.w3.org/2012/xquery";
public static final String DEFAULT_COLLATION_NS = "http://www.w3.org/2005/xpath-functions/collation/codepoint";
+
public static final Name CONTEXT_ITEM = createVariableInNoNamespace("$");
public static final Name CONTEXT_POSITION = createVariableInNoNamespace("$position");
public static final Name CONTEXT_COUNT = createVariableInNoNamespace("$count");
@@ -122,6 +122,18 @@ public static Name createVariableInDefaultFunctionNamespace(String localName) {
return new Name(JSONIQ_DEFAULT_FUNCTION_NS, "", localName);
}
+ /**
+ * Creates an expanded name that has the default annotations namespace. By default, in Rumble, unprefixed
+ * annotations live in this namespace. This namespace includes
+ * all builtin annotations.
+ *
+ * @param localName the name of the variable
+ * @return the expanded name
+ */
+ public static Name createVariableInDefaultAnnotationsNamespace(String localName) {
+ return new Name(AN_NS, "", localName);
+ }
+
public static Name createVariableInDefaultXQueryTypeNamespace(String localName) {
return new Name(FN_NS, "", localName);
}
diff --git a/src/main/java/org/rumbledb/context/StaticContext.java b/src/main/java/org/rumbledb/context/StaticContext.java
index a322077bd0..979fd636e5 100644
--- a/src/main/java/org/rumbledb/context/StaticContext.java
+++ b/src/main/java/org/rumbledb/context/StaticContext.java
@@ -71,7 +71,7 @@ public class StaticContext implements Serializable, KryoSerializable {
defaultBindings.put("xs", Name.XS_NS);
defaultBindings.put("jn", Name.JN_NS);
defaultBindings.put("js", Name.JS_NS);
- defaultBindings.put("an", Name.AN_NS);
+ // defaultBindings.put("an", Name.AN_NS);
}
private RumbleRuntimeConfiguration configuration;
@@ -454,7 +454,7 @@ public InScopeSchemaTypes getInScopeSchemaTypes() {
}
public int getCurrentMutabilityLevel() {
- return currentMutabilityLevel;
+ return this.currentMutabilityLevel;
}
public void setCurrentMutabilityLevel(int currentMutabilityLevel) {
diff --git a/src/main/java/org/rumbledb/context/VariableValues.java b/src/main/java/org/rumbledb/context/VariableValues.java
index 61572b017f..e37bf4526c 100644
--- a/src/main/java/org/rumbledb/context/VariableValues.java
+++ b/src/main/java/org/rumbledb/context/VariableValues.java
@@ -366,6 +366,9 @@ public String toString() {
sb.append(" " + name + " (" + this.localVariableValues.get(name).size() + " items)\n");
if (this.localVariableValues.get(name).size() == 1) {
sb.append(" " + this.localVariableValues.get(name).get(0).serialize() + "\n");
+ sb.append(
+ " Mutability level: " + this.localVariableValues.get(name).get(0).getMutabilityLevel() + "\n"
+ );
}
}
sb.append(" Counts:\n");
diff --git a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
index c2f8621601..261f2c261a 100644
--- a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
+++ b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
@@ -74,6 +74,7 @@ public enum ErrorCode {
OurBadErrorCode("RBST0004"),
ClusterConnectionErrorCode("RBDY0005"),
DatesWithTimezonesNotSupported("RBDY0006"),
+ CannotModifyImmutableValue("RBDY0007"),
UnexpectedStaticType("RBTY0001"),
@@ -131,6 +132,8 @@ public enum ErrorCode {
TransformModifiesNonCopiedValue("XUDY0014"),
UpdateTargetIsEmptySeqErrorCode("XUDY0027"),
+ UpdatingFunctionHasReturnTypeErrorCode("XUST0028"),
+
DuplicateObjectInsertSourceErrorCode("JNUP0005"),
DuplicateKeyOnUpdateApplyErrorCode("JNUP0006"),
CannotCastUpdateSelectorErrorCode("JNUP0007"),
diff --git a/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java
new file mode 100644
index 0000000000..2441383014
--- /dev/null
+++ b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Authors: Stefan Irimescu, Can Berker Cikis
+ *
+ */
+
+package org.rumbledb.exceptions;
+
+import org.rumbledb.errorcodes.ErrorCode;
+
+public class ModifiesImmutableValueException extends RumbleException {
+
+ private static final long serialVersionUID = 1L;
+
+ public ModifiesImmutableValueException(String message, ExceptionMetadata metadata) {
+ super(message, ErrorCode.CannotModifyImmutableValue, metadata);
+ }
+}
diff --git a/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java
new file mode 100644
index 0000000000..2b8ebf47aa
--- /dev/null
+++ b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Authors: Stefan Irimescu, Can Berker Cikis
+ *
+ */
+
+package org.rumbledb.exceptions;
+
+import org.rumbledb.errorcodes.ErrorCode;
+
+public class UpdatingFunctionHasReturnTypeException extends RumbleException {
+
+ private static final long serialVersionUID = 1L;
+
+ public UpdatingFunctionHasReturnTypeException(String message, ExceptionMetadata metadata) {
+ super(message, ErrorCode.UpdatingFunctionHasReturnTypeErrorCode, metadata);
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/Expression.java b/src/main/java/org/rumbledb/expressions/Expression.java
index 5b1bf2f70e..2dc28b4a1e 100644
--- a/src/main/java/org/rumbledb/expressions/Expression.java
+++ b/src/main/java/org/rumbledb/expressions/Expression.java
@@ -126,7 +126,7 @@ public void setStaticSequenceType(SequenceType staticSequenceType) {
* @return Expression Classification of the expression.
*/
public ExpressionClassification getExpressionClassification() {
- return expressionClassification;
+ return this.expressionClassification;
}
/**
diff --git a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java
index f852a1f3de..842478436e 100644
--- a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java
+++ b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java
@@ -3,10 +3,11 @@
/**
* An ExpressionClassification classifies an expression under 4 possible classifications.
*
- * A BASIC_UPDATING expression is classified as 1 of 6 expressions in the update package, that can alter the state of
+ * A BASIC_UPDATING expression is classified as 1 of 5 expressions in the update package, that can alter the state of
* an existing node.
*
- * An UPDATING expression is classified as a BASIC_EXPRESSION or any expression (excluding a TransformExpression) that
+ * An UPDATING expression is classified as a BASIC_UPDATING expression or any expression (excluding a
+ * TransformExpression) that
* directly contains an UPDATING expression and that can alter the state of an existing node.
*
* A SIMPLE expression is classified as an expression that is not an updating expression.
diff --git a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java
index d0a82bdfda..399082c078 100644
--- a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java
+++ b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java
@@ -30,6 +30,7 @@
import org.rumbledb.expressions.Expression;
import org.rumbledb.expressions.Node;
import org.rumbledb.expressions.scripting.annotations.Annotation;
+import org.rumbledb.expressions.scripting.annotations.AnnotationConstants;
import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr;
import org.rumbledb.types.SequenceType;
@@ -51,6 +52,7 @@ public class InlineFunctionExpression extends Expression {
private final List annotations;
private boolean hasSequentialPropertyAnnotation;
private boolean hasExitStatement;
+ private final boolean isExternal;
public InlineFunctionExpression(
List annotations,
@@ -58,6 +60,7 @@ public InlineFunctionExpression(
Map params,
SequenceType returnType,
StatementsAndOptionalExpr body,
+ boolean isExternal,
ExceptionMetadata metadata
) {
super(metadata);
@@ -67,6 +70,7 @@ public InlineFunctionExpression(
this.body = body;
this.annotations = annotations;
this.functionIdentifier = new FunctionIdentifier(name, params.size());
+ this.isExternal = isExternal;
this.hasExitStatement = false;
if (annotations != null) {
this.setSequentialFromAnnotations();
@@ -97,6 +101,17 @@ private void setSequentialFromAnnotations() {
this.setSequential(foundSeqAnnotation);
}
+ public InlineFunctionExpression(
+ List annotations,
+ Name name,
+ Map params,
+ SequenceType returnType,
+ StatementsAndOptionalExpr body,
+ ExceptionMetadata metadata
+ ) {
+ this(annotations, name, params, returnType, body, false, metadata);
+ }
+
public Name getName() {
return this.name;
}
@@ -126,6 +141,20 @@ public List getAnnotations() {
return this.annotations;
}
+ @Override
+ public boolean isUpdating() {
+ for (Annotation a : this.annotations) {
+ if (a.getAnnotationName().equals(AnnotationConstants.UPDATING)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isExternal() {
+ return this.isExternal;
+ }
+
@Override
public List getChildren() {
return Arrays.asList(this.body);
@@ -192,8 +221,9 @@ public void print(StringBuffer buffer, int indent) {
@Override
public void serializeToJSONiq(StringBuffer sb, int indent) {
indentIt(sb, indent);
+ String updating = isUpdating() ? "%an:updating" : "";
if (this.name != null) {
- sb.append("declare function " + this.name.toString() + "(");
+ sb.append("declare " + updating + " function " + this.name.toString() + "(");
} else {
sb.append("function (");
}
diff --git a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java
index f5ec43ca51..0717a299ed 100644
--- a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java
+++ b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java
@@ -5,6 +5,8 @@
public class AnnotationConstants {
public static final Name SEQUENTIAL = new Name(Name.AN_NS, "an", "sequential");
public static final Name NON_SEQUENTIAL = new Name(Name.AN_NS, "an", "nonsequential");
+ public static final Name UPDATING = new Name(Name.AN_NS, "an", "updating");
+ public static final Name SIMPLE = new Name(Name.AN_NS, "an", "simple");
public static final Name ASSIGNABLE = new Name(Name.AN_NS, "an", "assignable");
diff --git a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java
index ae7702206d..78fc42429b 100644
--- a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java
@@ -31,11 +31,11 @@ public AppendExpression(
}
public Expression getArrayExpression() {
- return arrayExpression;
+ return this.arrayExpression;
}
public Expression getToAppendExpression() {
- return toAppendExpression;
+ return this.toAppendExpression;
}
@Override
diff --git a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java
index f443f4ec8d..fe514e3b44 100644
--- a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java
+++ b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java
@@ -21,11 +21,11 @@ public CopyDeclaration(
}
public Name getVariableName() {
- return variableName;
+ return this.variableName;
}
public Expression getSourceExpression() {
- return sourceExpression;
+ return this.sourceExpression;
}
public SequenceType getSourceSequenceType() {
diff --git a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java
index 57e5368496..1f1c5f78c9 100644
--- a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java
@@ -36,11 +36,11 @@ public List getChildren() {
}
public Expression getMainExpression() {
- return mainExpression;
+ return this.mainExpression;
}
public Expression getLocatorExpression() {
- return locatorExpression;
+ return this.locatorExpression;
}
diff --git a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java
index e50fea257b..3d5205eb23 100644
--- a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java
@@ -42,15 +42,15 @@ public List getChildren() {
}
public Expression getMainExpression() {
- return mainExpression;
+ return this.mainExpression;
}
public Expression getLocatorExpression() {
- return locatorExpression;
+ return this.locatorExpression;
}
public Expression getNameExpression() {
- return nameExpression;
+ return this.nameExpression;
}
@Override
diff --git a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java
index f4773ab769..aa06596a25 100644
--- a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java
@@ -32,7 +32,7 @@ public TransformExpression(
}
public List getCopyDeclarations() {
- return copyDeclarations;
+ return this.copyDeclarations;
}
public List getCopySourceExpressions() {
@@ -43,11 +43,11 @@ public List getCopySourceExpressions() {
}
public Expression getModifyExpression() {
- return modifyExpression;
+ return this.modifyExpression;
}
public Expression getReturnExpression() {
- return returnExpression;
+ return this.returnExpression;
}
@Override
diff --git a/src/main/java/org/rumbledb/items/AnnotatedItem.java b/src/main/java/org/rumbledb/items/AnnotatedItem.java
index 5d110a4014..16f790dd9e 100644
--- a/src/main/java/org/rumbledb/items/AnnotatedItem.java
+++ b/src/main/java/org/rumbledb/items/AnnotatedItem.java
@@ -371,4 +371,79 @@ public int castToIntValue() {
public NativeClauseContext generateNativeQuery(NativeClauseContext context) {
return this.itemToAnnotate.generateNativeQuery(context);
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return this.itemToAnnotate.getSparkSQLValue();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return this.itemToAnnotate.getSparkSQLValue(itemType);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ return this.itemToAnnotate.getSparkSQLType();
+ }
+
+ @Override
+ public void putItemAt(Item item, int i) {
+ this.itemToAnnotate.putItemAt(item, i);
+ }
+
+ @Override
+ public void putItemsAt(List
- items, int i) {
+ this.itemToAnnotate.putItemsAt(items, i);
+ }
+
+ @Override
+ public void removeItemAt(int i) {
+ this.itemToAnnotate.removeItemAt(i);
+ }
+
+ @Override
+ public void removeItemByKey(String key) {
+ this.itemToAnnotate.removeItemByKey(key);
+ }
+
+ @Override
+ public int getMutabilityLevel() {
+ return this.itemToAnnotate.getMutabilityLevel();
+ }
+
+ @Override
+ public void setMutabilityLevel(int mutabilityLevel) {
+ this.itemToAnnotate.setMutabilityLevel(mutabilityLevel);
+ }
+
+ @Override
+ public long getTopLevelID() {
+ return this.itemToAnnotate.getTopLevelID();
+ }
+
+ @Override
+ public void setTopLevelID(long topLevelID) {
+ this.itemToAnnotate.setTopLevelID(topLevelID);
+ }
+
+ @Override
+ public String getPathIn() {
+ return this.itemToAnnotate.getPathIn();
+ }
+
+ @Override
+ public void setPathIn(String pathIn) {
+ this.itemToAnnotate.setPathIn(pathIn);
+ }
+
+ @Override
+ public String getTableLocation() {
+ return this.itemToAnnotate.getTableLocation();
+ }
+
+ @Override
+ public void setTableLocation(String location) {
+ this.itemToAnnotate.setTableLocation(location);
+ }
}
diff --git a/src/main/java/org/rumbledb/items/ArrayItem.java b/src/main/java/org/rumbledb/items/ArrayItem.java
index ee8d7815c1..2ffab147b5 100644
--- a/src/main/java/org/rumbledb/items/ArrayItem.java
+++ b/src/main/java/org/rumbledb/items/ArrayItem.java
@@ -34,19 +34,27 @@ public class ArrayItem implements Item {
private static final long serialVersionUID = 1L;
private List
- arrayItems;
-
private int mutabilityLevel;
+ private long topLevelID;
+ private String pathIn;
+ private String location;
public ArrayItem() {
super();
this.arrayItems = new ArrayList<>();
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public ArrayItem(List
- arrayItems) {
super();
this.arrayItems = arrayItems;
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public boolean equals(Object otherItem) {
@@ -115,12 +123,20 @@ public int getSize() {
@Override
public void write(Kryo kryo, Output output) {
kryo.writeObject(output, this.arrayItems);
+ output.writeInt(this.mutabilityLevel);
+ output.writeLong(this.topLevelID);
+ kryo.writeObject(output, this.pathIn);
+ kryo.writeObject(output, this.location);
}
@SuppressWarnings("unchecked")
@Override
public void read(Kryo kryo, Input input) {
this.arrayItems = kryo.readObject(input, ArrayList.class);
+ this.mutabilityLevel = input.readInt();
+ this.topLevelID = input.readLong();
+ this.pathIn = kryo.readObject(input, String.class);
+ this.location = kryo.readObject(input, String.class);
}
public int hashCode() {
@@ -150,8 +166,92 @@ public int getMutabilityLevel() {
@Override
public void setMutabilityLevel(int mutabilityLevel) {
this.mutabilityLevel = mutabilityLevel;
- for (Item item : arrayItems) {
+ for (Item item : this.arrayItems) {
item.setMutabilityLevel(mutabilityLevel);
}
}
+
+ @Override
+ public long getTopLevelID() {
+ return this.topLevelID;
+ }
+
+ @Override
+ public void setTopLevelID(long topLevelID) {
+ this.topLevelID = topLevelID;
+ for (Item item : this.arrayItems) {
+ item.setTopLevelID(topLevelID);
+ }
+ }
+
+ @Override
+ public String getPathIn() {
+ return this.pathIn;
+ }
+
+ @Override
+ public void setPathIn(String pathIn) {
+ this.pathIn = pathIn;
+ for (int i = 0; i < this.arrayItems.size(); i++) {
+ Item item = this.arrayItems.get(i);
+ item.setPathIn(pathIn + "[" + i + "]");
+ }
+ }
+
+ @Override
+ public String getTableLocation() {
+ return this.location;
+ }
+
+ @Override
+ public void setTableLocation(String location) {
+ this.location = location;
+ for (Item item : this.arrayItems) {
+ item.setTableLocation(location);
+ }
+ }
+
+ @Override
+ public String getSparkSQLValue() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("array(");
+ for (int i = 0; i < this.arrayItems.size(); i++) {
+ Item item = this.arrayItems.get(i);
+ sb.append(item.getSparkSQLValue());
+ if (i + 1 < this.arrayItems.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ StringBuilder sb = new StringBuilder();
+ ItemType elementType = itemType.getArrayContentFacet();
+ sb.append("array(");
+ for (int i = 0; i < this.arrayItems.size(); i++) {
+ Item item = this.arrayItems.get(i);
+ sb.append(item.getSparkSQLValue(elementType));
+ if (i + 1 < this.arrayItems.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Is it okay to assume first elem type is same as rest?
+ StringBuilder sb = new StringBuilder();
+ sb.append("ARRAY<");
+ if (this.getSize() <= 0) {
+ // TODO: Throw error? No empty arrays?
+ }
+ sb.append(this.getItemAt(0).getSparkSQLType());
+ sb.append(">");
+ return sb.toString();
+ }
}
diff --git a/src/main/java/org/rumbledb/items/BooleanItem.java b/src/main/java/org/rumbledb/items/BooleanItem.java
index 9348e31013..fa3d108dc6 100644
--- a/src/main/java/org/rumbledb/items/BooleanItem.java
+++ b/src/main/java/org/rumbledb/items/BooleanItem.java
@@ -100,4 +100,21 @@ public ItemType getDynamicType() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "BOOLEAN";
+ }
+
}
diff --git a/src/main/java/org/rumbledb/items/DateItem.java b/src/main/java/org/rumbledb/items/DateItem.java
index 6881e66052..edccd89479 100644
--- a/src/main/java/org/rumbledb/items/DateItem.java
+++ b/src/main/java/org/rumbledb/items/DateItem.java
@@ -116,4 +116,10 @@ public ItemType getDynamicType() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "DATE";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/DecimalItem.java b/src/main/java/org/rumbledb/items/DecimalItem.java
index bc140b4110..8463fc29b6 100644
--- a/src/main/java/org/rumbledb/items/DecimalItem.java
+++ b/src/main/java/org/rumbledb/items/DecimalItem.java
@@ -144,4 +144,20 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return this.value.stripTrailingZeros().toPlainString();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return this.value.stripTrailingZeros().toPlainString();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "DECIMAL";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/DoubleItem.java b/src/main/java/org/rumbledb/items/DoubleItem.java
index a82018813c..dd59e2a1f4 100644
--- a/src/main/java/org/rumbledb/items/DoubleItem.java
+++ b/src/main/java/org/rumbledb/items/DoubleItem.java
@@ -186,4 +186,32 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ if (Double.isInfinite(this.value) && this.value > 0) {
+ return "INF";
+ }
+ if (Double.isInfinite(this.value) && this.value < 0) {
+ return "-INF";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ if (Double.isInfinite(this.value) && this.value > 0) {
+ return "INF";
+ }
+ if (Double.isInfinite(this.value) && this.value < 0) {
+ return "-INF";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "DOUBLE";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/FloatItem.java b/src/main/java/org/rumbledb/items/FloatItem.java
index 62f6a2aaee..43b6da5f3d 100644
--- a/src/main/java/org/rumbledb/items/FloatItem.java
+++ b/src/main/java/org/rumbledb/items/FloatItem.java
@@ -190,4 +190,32 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) {
}
return new NativeClauseContext(context, "CAST (" + this.value + "D AS FLOAT)", SequenceType.FLOAT);
}
+
+ @Override
+ public String getSparkSQLValue() {
+ if (Float.isInfinite(this.value) && this.value > 0) {
+ return "Infinity";
+ }
+ if (Float.isInfinite(this.value) && this.value < 0) {
+ return "-Infinity";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ if (Float.isInfinite(this.value) && this.value > 0) {
+ return "Infinity";
+ }
+ if (Float.isInfinite(this.value) && this.value < 0) {
+ return "-Infinity";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "FLOAT";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/FunctionItem.java b/src/main/java/org/rumbledb/items/FunctionItem.java
index f6cd08add5..c767572114 100644
--- a/src/main/java/org/rumbledb/items/FunctionItem.java
+++ b/src/main/java/org/rumbledb/items/FunctionItem.java
@@ -114,7 +114,8 @@ public FunctionItem(
Map paramNameToSequenceTypes,
SequenceType returnType,
DynamicContext dynamicModuleContext,
- RuntimeIterator bodyIterator
+ RuntimeIterator bodyIterator,
+ boolean isUpdating
) {
List paramNames = new ArrayList<>();
List parameters = new ArrayList<>();
@@ -125,7 +126,7 @@ public FunctionItem(
this.identifier = new FunctionIdentifier(name, paramNames.size());
this.parameterNames = paramNames;
- this.signature = new FunctionSignature(parameters, returnType);
+ this.signature = new FunctionSignature(parameters, returnType, isUpdating);
this.bodyIterator = bodyIterator;
this.dynamicModuleContext = dynamicModuleContext;
this.localVariablesInClosure = new HashMap<>();
diff --git a/src/main/java/org/rumbledb/items/IntItem.java b/src/main/java/org/rumbledb/items/IntItem.java
index 1998a05216..3f496978dc 100644
--- a/src/main/java/org/rumbledb/items/IntItem.java
+++ b/src/main/java/org/rumbledb/items/IntItem.java
@@ -162,4 +162,20 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "INT";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/IntegerItem.java b/src/main/java/org/rumbledb/items/IntegerItem.java
index 0ca1de1822..a38122a040 100644
--- a/src/main/java/org/rumbledb/items/IntegerItem.java
+++ b/src/main/java/org/rumbledb/items/IntegerItem.java
@@ -151,4 +151,20 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "INTEGER";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/ItemFactory.java b/src/main/java/org/rumbledb/items/ItemFactory.java
index c81854cd47..6ce96711b2 100644
--- a/src/main/java/org/rumbledb/items/ItemFactory.java
+++ b/src/main/java/org/rumbledb/items/ItemFactory.java
@@ -209,16 +209,39 @@ public Item createArrayItem() {
return new ArrayItem();
}
- public Item createArrayItem(List
- items) {
- return new ArrayItem(items);
- }
-
- public Item createObjectItem(List keys, List
- values, ExceptionMetadata itemMetadata) {
- return new ObjectItem(keys, values, itemMetadata);
+ public Item createArrayItem(List
- items, boolean mutable) {
+ Item result = new ArrayItem(items);
+ if (mutable) {
+ result.setMutabilityLevel(0);
+ } else {
+ result.setMutabilityLevel(-1);
+ }
+ return result;
+ }
+
+ public Item createObjectItem(
+ List keys,
+ List
- values,
+ ExceptionMetadata itemMetadata,
+ boolean mutable
+ ) {
+ Item result = new ObjectItem(keys, values, itemMetadata);
+ if (mutable) {
+ result.setMutabilityLevel(0);
+ } else {
+ result.setMutabilityLevel(-1);
+ }
+ return result;
}
- public Item createObjectItem(Map> keyValuePairs) {
- return new ObjectItem(keyValuePairs);
+ public Item createObjectItem(Map> keyValuePairs, boolean mutable) {
+ Item result = new ObjectItem(keyValuePairs);
+ if (mutable) {
+ result.setMutabilityLevel(0);
+ } else {
+ result.setMutabilityLevel(-1);
+ }
+ return result;
}
}
diff --git a/src/main/java/org/rumbledb/items/LazyObjectItem.java b/src/main/java/org/rumbledb/items/LazyObjectItem.java
index 7b447fe94c..720f8af8b0 100644
--- a/src/main/java/org/rumbledb/items/LazyObjectItem.java
+++ b/src/main/java/org/rumbledb/items/LazyObjectItem.java
@@ -77,7 +77,7 @@ public Item getItem() {
return ItemFactory.getInstance().createNullItem();
}
}
- return ItemFactory.getInstance().createArrayItem(items);
+ return ItemFactory.getInstance().createArrayItem(items, true);
}
}
diff --git a/src/main/java/org/rumbledb/items/NullItem.java b/src/main/java/org/rumbledb/items/NullItem.java
index 250f2e17a9..f80bce34d6 100644
--- a/src/main/java/org/rumbledb/items/NullItem.java
+++ b/src/main/java/org/rumbledb/items/NullItem.java
@@ -93,4 +93,14 @@ public boolean isAtomic() {
public String getStringValue() {
return "null";
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return "NULL";
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return "NULL";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/ObjectItem.java b/src/main/java/org/rumbledb/items/ObjectItem.java
index c6f535ac53..cb174fb9a4 100644
--- a/src/main/java/org/rumbledb/items/ObjectItem.java
+++ b/src/main/java/org/rumbledb/items/ObjectItem.java
@@ -27,6 +27,7 @@
import org.rumbledb.exceptions.DuplicateObjectKeyException;
import org.rumbledb.exceptions.ExceptionMetadata;
import org.rumbledb.types.BuiltinTypesCatalogue;
+import org.rumbledb.types.FieldDescriptor;
import org.rumbledb.types.ItemType;
import java.util.*;
@@ -37,14 +38,19 @@ public class ObjectItem implements Item {
private static final long serialVersionUID = 1L;
private List
- values;
private List keys;
-
private int mutabilityLevel;
+ private long topLevelID;
+ private String pathIn;
+ private String location;
public ObjectItem() {
super();
this.keys = new ArrayList<>();
this.values = new ArrayList<>();
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public ObjectItem(List keys, List
- values, ExceptionMetadata itemMetadata) {
@@ -52,7 +58,10 @@ public ObjectItem(List keys, List
- values, ExceptionMetadata itemMe
checkForDuplicateKeys(keys, itemMetadata);
this.keys = keys;
this.values = values;
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public boolean equals(Object otherItem) {
@@ -103,7 +112,7 @@ public ObjectItem(Map> keyValuePairs) {
List
- values = keyValuePairs.get(key);
// for each key, convert the lists of values into arrayItems
if (values.size() > 1) {
- Item valuesArray = ItemFactory.getInstance().createArrayItem(values);
+ Item valuesArray = ItemFactory.getInstance().createArrayItem(values, false);
valueList.add(valuesArray);
} else if (values.size() == 1) {
Item value = values.get(0);
@@ -115,7 +124,10 @@ public ObjectItem(Map> keyValuePairs) {
this.keys = keyList;
this.values = valueList;
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
@Override
@@ -173,6 +185,10 @@ public boolean isObject() {
public void write(Kryo kryo, Output output) {
kryo.writeObject(output, this.keys);
kryo.writeObject(output, this.values);
+ output.writeInt(this.mutabilityLevel);
+ output.writeLong(this.topLevelID);
+ kryo.writeObject(output, this.pathIn);
+ kryo.writeObject(output, this.location);
}
@SuppressWarnings("unchecked")
@@ -180,6 +196,10 @@ public void write(Kryo kryo, Output output) {
public void read(Kryo kryo, Input input) {
this.keys = kryo.readObject(input, ArrayList.class);
this.values = kryo.readObject(input, ArrayList.class);
+ this.mutabilityLevel = input.readInt();
+ this.topLevelID = input.readLong();
+ this.pathIn = kryo.readObject(input, String.class);
+ this.location = kryo.readObject(input, String.class);
}
public int hashCode() {
@@ -209,8 +229,119 @@ public int getMutabilityLevel() {
@Override
public void setMutabilityLevel(int mutabilityLevel) {
this.mutabilityLevel = mutabilityLevel;
- for (Item item : values) {
+ for (Item item : this.values) {
item.setMutabilityLevel(mutabilityLevel);
}
}
+
+ @Override
+ public long getTopLevelID() {
+ return this.topLevelID;
+ }
+
+ @Override
+ public void setTopLevelID(long topLevelID) {
+ this.topLevelID = topLevelID;
+ for (Item item : this.values) {
+ item.setTopLevelID(topLevelID);
+ }
+ }
+
+ @Override
+ public String getPathIn() {
+ return this.pathIn;
+ }
+
+ @Override
+ public void setPathIn(String pathIn) {
+ this.pathIn = pathIn;
+ for (int i = 0; i < this.keys.size(); i++) {
+ String key = this.keys.get(i);
+ Item item = this.values.get(i);
+ item.setPathIn(pathIn + "." + key);
+ }
+ }
+
+ @Override
+ public String getTableLocation() {
+ return this.location;
+ }
+
+ @Override
+ public void setTableLocation(String location) {
+ this.location = location;
+ for (Item item : this.values) {
+ item.setTableLocation(location);
+ }
+ }
+
+ @Override
+ public String getSparkSQLValue() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("named_struct(");
+ for (int i = 0; i < this.keys.size(); i++) {
+ sb.append("\"");
+ sb.append(this.keys.get(i));
+ sb.append("\"");
+ sb.append(", ");
+ sb.append(this.values.get(i).getSparkSQLValue());
+ if (i + 1 < this.keys.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ StringBuilder sb = new StringBuilder();
+
+ Map content = itemType.getObjectContentFacet();
+ String[] keys = content.keySet().toArray(new String[0]);
+
+ sb.append("named_struct(");
+
+ for (int i = 0; i < keys.length; i++) {
+ String key = keys[i];
+ FieldDescriptor field = content.get(key);
+ int keyIndex = this.keys.indexOf(key);
+
+ sb.append("\"");
+ sb.append(key);
+ sb.append("\"");
+ sb.append(", ");
+
+ if (keyIndex == -1) {
+ if (!field.isRequired()) {
+ sb.append("NULL");
+ }
+ } else {
+ sb.append(this.values.get(keyIndex).getSparkSQLValue(field.getType()));
+ }
+
+ if (i + 1 < keys.length) {
+ sb.append(", ");
+ }
+ }
+
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("STRUCT<");
+ for (int i = 0; i < this.keys.size(); i++) {
+ sb.append(this.keys.get(i));
+ sb.append(": ");
+ sb.append(this.values.get(i).getSparkSQLType());
+ if (i + 1 < this.keys.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(">");
+ return sb.toString();
+ }
}
diff --git a/src/main/java/org/rumbledb/items/StringItem.java b/src/main/java/org/rumbledb/items/StringItem.java
index 130a929bc0..fc19ea73c5 100644
--- a/src/main/java/org/rumbledb/items/StringItem.java
+++ b/src/main/java/org/rumbledb/items/StringItem.java
@@ -154,4 +154,19 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return "\"" + this.value + "\"";
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return "\"" + this.value + "\"";
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ return "STRING";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java
index 6db73ad96a..eccf8267af 100644
--- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java
+++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java
@@ -116,7 +116,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada
values.add(getItemFromObject(object, metadata));
}
object.endArray();
- return ItemFactory.getInstance().createArrayItem(values);
+ return ItemFactory.getInstance().createArrayItem(values, false);
}
if (object.peek() == JsonToken.BEGIN_OBJECT) {
List keys = new ArrayList<>();
@@ -128,7 +128,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada
}
object.endObject();
return ItemFactory.getInstance()
- .createObjectItem(keys, values, metadata);
+ .createObjectItem(keys, values, metadata, false);
}
if (object.peek() == JsonToken.NULL) {
object.nextNull();
@@ -203,7 +203,7 @@ public static Item getItemFromYAML(
// System.err.println("Next token (reading array): " + nt.toString());
}
// System.err.println("Finished reading array.");
- return ItemFactory.getInstance().createArrayItem(values);
+ return ItemFactory.getInstance().createArrayItem(values, false);
}
if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.START_OBJECT)) {
List keys = new ArrayList<>();
@@ -223,7 +223,7 @@ public static Item getItemFromYAML(
}
// System.err.println("Finished reading object.");
return ItemFactory.getInstance()
- .createObjectItem(keys, values, metadata);
+ .createObjectItem(keys, values, metadata, false);
}
if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.VALUE_NULL)) {
return ItemFactory.getInstance().createNullItem();
@@ -261,6 +261,41 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType
return convertValueToItem(row, 0, null, fields[0].dataType(), metadata, itemType);
}
+ if (
+ fields.length == 5
+ && fieldnames[0].equals(SparkSessionManager.atomicJSONiqItemColumnName)
+ && fieldnames[4].equals("tableLocation")
+ ) {
+ ItemType resType = null;
+ if (itemType != null) {
+ resType = itemType.getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+ }
+ Item res = convertValueToItem(row, 0, null, fields[0].dataType(), metadata, resType);
+ // TODO: refactor to not need to loop and check strings -- Indexes perhaps?
+ for (int i = 0; i < fields.length; ++i) {
+ String fieldName = fields[i].name();
+
+ if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) {
+ res.setMutabilityLevel(row.getInt(i));
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.rowIdColumnName)) {
+ res.setTopLevelID(row.getLong(i));
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.pathInColumnName)) {
+ res.setPathIn(row.getString(i));
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) {
+ res.setTableLocation(row.getString(i));
+ }
+ }
+ return res;
+ }
+
Map content = null;
if (itemType != null && !itemType.equals(BuiltinTypesCatalogue.item)) {
@@ -272,11 +307,34 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType
}
}
+ int mutabilityLevel = -1;
+ long topLevelID = -1;
+ String pathIn = "null";
+ String tableLocation = "null";
+
for (int i = 0; i < fields.length; ++i) {
StructField field = fields[i];
DataType fieldType = field.dataType();
String fieldName = field.name();
ItemType fieldItemType = null;
+
+ if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) {
+ mutabilityLevel = row.getInt(i);
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.rowIdColumnName)) {
+ topLevelID = row.getLong(i);
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.pathInColumnName)) {
+ pathIn = row.getString(i);
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) {
+ tableLocation = row.getString(i);
+ continue;
+ }
+
if (content != null) {
FieldDescriptor descriptor = content.get(fieldName);
if (descriptor != null) {
@@ -304,7 +362,13 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType
}
}
- return ItemFactory.getInstance().createObjectItem(keys, values, metadata);
+ Item res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false);
+ res.setMutabilityLevel(mutabilityLevel);
+ res.setTopLevelID(topLevelID);
+ res.setPathIn(pathIn);
+ res.setTableLocation(tableLocation);
+
+ return res;
}
public static Item convertValueToItem(
@@ -536,7 +600,7 @@ private static Item convertValueToItem(
members.add(convertValueToItem(value, dataType, metadata, memberType));
}
}
- Item item = ItemFactory.getInstance().createArrayItem(members);
+ Item item = ItemFactory.getInstance().createArrayItem(members, false);
if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) {
return item;
} else {
@@ -556,7 +620,7 @@ private static Item convertValueToItem(
for (double value : denseVector.values()) {
members.add(ItemFactory.getInstance().createDoubleItem(value));
}
- Item item = ItemFactory.getInstance().createArrayItem(members);
+ Item item = ItemFactory.getInstance().createArrayItem(members, false);
if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) {
return item;
} else {
@@ -573,7 +637,7 @@ private static Item convertValueToItem(
objectKeyList.add(String.valueOf(vectorIndices[j]));
objectValueList.add(ItemFactory.getInstance().createDoubleItem(vectorValues[j]));
}
- Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata);
+ Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata, false);
if (itemType == null || itemType.equals(BuiltinTypesCatalogue.objectItem)) {
return item;
} else {
diff --git a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java
index 3eebf78e81..24ba7000fa 100644
--- a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java
+++ b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java
@@ -44,7 +44,6 @@ public RowToItemMapper(ExceptionMetadata metadata) {
@Override
public Item call(Row row) throws Exception {
- Item result = ItemParser.getItemFromRow(row, this.metadata, this.itemType);
- return result;
+ return ItemParser.getItemFromRow(row, this.metadata, this.itemType);
}
}
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4
index 34dedea4e8..ea2026fca4 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.g4
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4
@@ -76,7 +76,7 @@ typeSwitchStatement : Ktypeswitch '(' cond=expr ')' cases+=caseStatement
caseStatement : Kcase (var_ref=varRef Kas)? union+=sequenceType ('|' union+=sequenceType)* Kreturn ret=statement ;
-annotation : '%' name=qname ('(' Literal (',' Literal)* ')')? ;
+annotation : ('%' name=qname ('(' Literal (',' Literal)* ')')? | updating=Kupdating);
annotations : annotation* ;
@@ -133,7 +133,7 @@ contextItemDecl : Kdeclare Kcontext Kitem (Kas sequenceType)? ((':=' exp
functionDecl : Kdeclare annotations 'function' fn_name=qname '(' paramList? ')'
(Kas return_type=sequenceType)?
- ('{' (fn_body=statementsAndOptionalExpr) '}' | 'external');
+ ('{' (fn_body=statementsAndOptionalExpr) '}' | is_external='external');
typeDecl : Kdeclare Ktype type_name=qname 'as' (schema=schemaLanguage)? type_definition=exprSingle;
@@ -430,7 +430,6 @@ keyWords : Kjsoniq
| Kappend
| Kcopy
| Kmodify
- | Kjson
| Kinto
| Kvalue
| Kwith
@@ -443,6 +442,8 @@ keyWords : Kjsoniq
| Kexit
| Kreturning
| Kwhile
+ | Kjson
+ | Kupdating
;
///////////////////////// literals
@@ -573,12 +574,14 @@ Kinto : 'into';
Kvalue : 'value';
-Kjson : 'json';
-
Kwith : 'with';
Kposition : 'position';
+Kjson : 'json';
+
+Kupdating : 'updating';
+
///////////////////////// Scripting keywords
Kbreak : 'break' ;
Kloop : 'loop' ;
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp
index fe2a2cadbc..d3e3fd1cac 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.interp
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp
@@ -123,9 +123,10 @@ null
'append'
'into'
'value'
-'json'
'with'
'position'
+'json'
+'updating'
'break'
'loop'
'continue'
@@ -270,9 +271,10 @@ Kmodify
Kappend
Kinto
Kvalue
-Kjson
Kwith
Kposition
+Kjson
+Kupdating
Kbreak
Kloop
Kcontinue
@@ -423,4 +425,4 @@ keyWords
atn:
-[4, 1, 144, 1344, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 263, 8, 1, 1, 1, 1, 1, 3, 1, 267, 8, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 3, 4, 283, 8, 4, 1, 4, 1, 4, 5, 4, 287, 8, 4, 10, 4, 12, 4, 290, 9, 4, 1, 4, 1, 4, 1, 4, 5, 4, 295, 8, 4, 10, 4, 12, 4, 298, 9, 4, 1, 5, 1, 5, 1, 6, 5, 6, 303, 8, 6, 10, 6, 12, 6, 306, 9, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 3, 8, 313, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 328, 8, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 366, 8, 16, 10, 16, 12, 16, 369, 9, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 4, 18, 388, 8, 18, 11, 18, 12, 18, 389, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 4, 19, 398, 8, 19, 11, 19, 12, 19, 399, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 4, 20, 408, 8, 20, 11, 20, 12, 20, 409, 1, 21, 1, 21, 1, 21, 3, 21, 415, 8, 21, 1, 21, 1, 21, 1, 21, 3, 21, 420, 8, 21, 5, 21, 422, 8, 21, 10, 21, 12, 21, 425, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 4, 22, 434, 8, 22, 11, 22, 12, 22, 435, 1, 22, 1, 22, 3, 22, 440, 8, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 449, 8, 23, 1, 23, 1, 23, 1, 23, 5, 23, 454, 8, 23, 10, 23, 12, 23, 457, 9, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 468, 8, 24, 10, 24, 12, 24, 471, 9, 24, 1, 24, 3, 24, 474, 8, 24, 1, 25, 5, 25, 477, 8, 25, 10, 25, 12, 25, 480, 9, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 487, 8, 26, 10, 26, 12, 26, 490, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 497, 8, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 513, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 525, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 547, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 553, 8, 35, 10, 35, 12, 35, 556, 9, 35, 1, 36, 1, 36, 3, 36, 560, 8, 36, 1, 36, 3, 36, 563, 8, 36, 1, 36, 1, 36, 3, 36, 567, 8, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 576, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 583, 8, 38, 10, 38, 12, 38, 586, 9, 38, 3, 38, 588, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 596, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 603, 8, 39, 3, 39, 605, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 612, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 619, 8, 40, 3, 40, 621, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 629, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 634, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 641, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 648, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 658, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 663, 8, 44, 10, 44, 12, 44, 666, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 672, 8, 45, 1, 46, 1, 46, 1, 46, 5, 46, 677, 8, 46, 10, 46, 12, 46, 680, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 688, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 698, 8, 48, 1, 49, 1, 49, 3, 49, 702, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 710, 8, 49, 10, 49, 12, 49, 713, 9, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 722, 8, 50, 10, 50, 12, 50, 725, 9, 50, 1, 51, 1, 51, 1, 51, 3, 51, 730, 8, 51, 1, 51, 1, 51, 3, 51, 734, 8, 51, 1, 51, 1, 51, 3, 51, 738, 8, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 5, 52, 747, 8, 52, 10, 52, 12, 52, 750, 9, 52, 1, 53, 1, 53, 1, 53, 3, 53, 755, 8, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 768, 8, 55, 10, 55, 12, 55, 771, 9, 55, 1, 56, 1, 56, 1, 56, 3, 56, 776, 8, 56, 1, 56, 1, 56, 3, 56, 780, 8, 56, 1, 56, 1, 56, 3, 56, 784, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 791, 8, 57, 1, 57, 1, 57, 1, 57, 5, 57, 796, 8, 57, 10, 57, 12, 57, 799, 9, 57, 1, 58, 1, 58, 1, 58, 3, 58, 804, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 809, 8, 58, 3, 58, 811, 8, 58, 1, 58, 1, 58, 3, 58, 815, 8, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 3, 60, 822, 8, 60, 1, 60, 1, 60, 1, 60, 5, 60, 827, 8, 60, 10, 60, 12, 60, 830, 9, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 3, 61, 838, 8, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 4, 62, 848, 8, 62, 11, 62, 12, 62, 849, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 4, 63, 858, 8, 63, 11, 63, 12, 63, 859, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 4, 64, 870, 8, 64, 11, 64, 12, 64, 871, 1, 64, 1, 64, 3, 64, 876, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 885, 8, 65, 1, 65, 1, 65, 1, 65, 5, 65, 890, 8, 65, 10, 65, 12, 65, 893, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 4, 67, 912, 8, 67, 11, 67, 12, 67, 913, 1, 68, 1, 68, 1, 68, 3, 68, 919, 8, 68, 1, 68, 1, 68, 1, 68, 3, 68, 924, 8, 68, 5, 68, 926, 8, 68, 10, 68, 12, 68, 929, 9, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 938, 8, 69, 10, 69, 12, 69, 941, 9, 69, 1, 70, 1, 70, 1, 70, 5, 70, 946, 8, 70, 10, 70, 12, 70, 949, 9, 70, 1, 71, 3, 71, 952, 8, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 3, 72, 959, 8, 72, 1, 73, 1, 73, 1, 73, 5, 73, 964, 8, 73, 10, 73, 12, 73, 967, 9, 73, 1, 74, 1, 74, 1, 74, 3, 74, 972, 8, 74, 1, 75, 1, 75, 1, 75, 5, 75, 977, 8, 75, 10, 75, 12, 75, 980, 9, 75, 1, 76, 1, 76, 1, 76, 5, 76, 985, 8, 76, 10, 76, 12, 76, 988, 9, 76, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 994, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1000, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1006, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 1012, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1018, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1027, 8, 82, 10, 82, 12, 82, 1030, 9, 82, 1, 83, 1, 83, 1, 83, 3, 83, 1035, 8, 83, 1, 84, 5, 84, 1038, 8, 84, 10, 84, 12, 84, 1041, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 1048, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 5, 88, 1067, 8, 88, 10, 88, 12, 88, 1070, 9, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 1078, 8, 89, 10, 89, 12, 89, 1081, 9, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1103, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1120, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 1131, 8, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 3, 102, 1153, 8, 102, 5, 102, 1155, 8, 102, 10, 102, 12, 102, 1158, 9, 102, 1, 102, 1, 102, 1, 103, 1, 103, 3, 103, 1164, 8, 103, 1, 104, 1, 104, 3, 104, 1168, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1178, 8, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1183, 8, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1197, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1204, 8, 107, 10, 107, 12, 107, 1207, 9, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1212, 8, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1236, 8, 111, 10, 111, 12, 111, 1239, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 4, 113, 1255, 8, 113, 11, 113, 12, 113, 1256, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1269, 8, 115, 3, 115, 1271, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1277, 8, 116, 10, 116, 12, 116, 1280, 9, 116, 3, 116, 1282, 8, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 3, 116, 1289, 8, 116, 1, 117, 1, 117, 1, 117, 3, 117, 1294, 8, 117, 1, 118, 1, 118, 3, 118, 1298, 8, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 5, 120, 1310, 8, 120, 10, 120, 12, 120, 1313, 9, 120, 3, 120, 1315, 8, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 3, 121, 1323, 8, 121, 1, 122, 1, 122, 3, 122, 1327, 8, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 3, 123, 1334, 8, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 0, 0, 127, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 0, 8, 2, 0, 16, 16, 105, 105, 1, 0, 82, 83, 1, 0, 19, 28, 2, 0, 4, 4, 36, 46, 1, 0, 48, 49, 2, 0, 11, 11, 50, 52, 2, 0, 18, 18, 134, 134, 2, 0, 61, 132, 135, 135, 1409, 0, 254, 1, 0, 0, 0, 2, 262, 1, 0, 0, 0, 4, 268, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 10, 299, 1, 0, 0, 0, 12, 304, 1, 0, 0, 0, 14, 307, 1, 0, 0, 0, 16, 310, 1, 0, 0, 0, 18, 327, 1, 0, 0, 0, 20, 329, 1, 0, 0, 0, 22, 332, 1, 0, 0, 0, 24, 338, 1, 0, 0, 0, 26, 342, 1, 0, 0, 0, 28, 346, 1, 0, 0, 0, 30, 350, 1, 0, 0, 0, 32, 357, 1, 0, 0, 0, 34, 373, 1, 0, 0, 0, 36, 382, 1, 0, 0, 0, 38, 397, 1, 0, 0, 0, 40, 404, 1, 0, 0, 0, 42, 411, 1, 0, 0, 0, 44, 428, 1, 0, 0, 0, 46, 444, 1, 0, 0, 0, 48, 461, 1, 0, 0, 0, 50, 478, 1, 0, 0, 0, 52, 481, 1, 0, 0, 0, 54, 493, 1, 0, 0, 0, 56, 502, 1, 0, 0, 0, 58, 512, 1, 0, 0, 0, 60, 514, 1, 0, 0, 0, 62, 524, 1, 0, 0, 0, 64, 526, 1, 0, 0, 0, 66, 531, 1, 0, 0, 0, 68, 535, 1, 0, 0, 0, 70, 541, 1, 0, 0, 0, 72, 562, 1, 0, 0, 0, 74, 568, 1, 0, 0, 0, 76, 570, 1, 0, 0, 0, 78, 589, 1, 0, 0, 0, 80, 606, 1, 0, 0, 0, 82, 622, 1, 0, 0, 0, 84, 642, 1, 0, 0, 0, 86, 657, 1, 0, 0, 0, 88, 659, 1, 0, 0, 0, 90, 667, 1, 0, 0, 0, 92, 673, 1, 0, 0, 0, 94, 687, 1, 0, 0, 0, 96, 697, 1, 0, 0, 0, 98, 701, 1, 0, 0, 0, 100, 717, 1, 0, 0, 0, 102, 726, 1, 0, 0, 0, 104, 742, 1, 0, 0, 0, 106, 751, 1, 0, 0, 0, 108, 759, 1, 0, 0, 0, 110, 762, 1, 0, 0, 0, 112, 772, 1, 0, 0, 0, 114, 790, 1, 0, 0, 0, 116, 800, 1, 0, 0, 0, 118, 816, 1, 0, 0, 0, 120, 821, 1, 0, 0, 0, 122, 834, 1, 0, 0, 0, 124, 842, 1, 0, 0, 0, 126, 857, 1, 0, 0, 0, 128, 864, 1, 0, 0, 0, 130, 880, 1, 0, 0, 0, 132, 897, 1, 0, 0, 0, 134, 906, 1, 0, 0, 0, 136, 915, 1, 0, 0, 0, 138, 934, 1, 0, 0, 0, 140, 942, 1, 0, 0, 0, 142, 951, 1, 0, 0, 0, 144, 955, 1, 0, 0, 0, 146, 960, 1, 0, 0, 0, 148, 968, 1, 0, 0, 0, 150, 973, 1, 0, 0, 0, 152, 981, 1, 0, 0, 0, 154, 989, 1, 0, 0, 0, 156, 995, 1, 0, 0, 0, 158, 1001, 1, 0, 0, 0, 160, 1007, 1, 0, 0, 0, 162, 1013, 1, 0, 0, 0, 164, 1019, 1, 0, 0, 0, 166, 1034, 1, 0, 0, 0, 168, 1039, 1, 0, 0, 0, 170, 1047, 1, 0, 0, 0, 172, 1049, 1, 0, 0, 0, 174, 1056, 1, 0, 0, 0, 176, 1063, 1, 0, 0, 0, 178, 1071, 1, 0, 0, 0, 180, 1082, 1, 0, 0, 0, 182, 1088, 1, 0, 0, 0, 184, 1091, 1, 0, 0, 0, 186, 1095, 1, 0, 0, 0, 188, 1119, 1, 0, 0, 0, 190, 1121, 1, 0, 0, 0, 192, 1125, 1, 0, 0, 0, 194, 1128, 1, 0, 0, 0, 196, 1134, 1, 0, 0, 0, 198, 1136, 1, 0, 0, 0, 200, 1141, 1, 0, 0, 0, 202, 1146, 1, 0, 0, 0, 204, 1149, 1, 0, 0, 0, 206, 1163, 1, 0, 0, 0, 208, 1167, 1, 0, 0, 0, 210, 1169, 1, 0, 0, 0, 212, 1173, 1, 0, 0, 0, 214, 1211, 1, 0, 0, 0, 216, 1213, 1, 0, 0, 0, 218, 1217, 1, 0, 0, 0, 220, 1223, 1, 0, 0, 0, 222, 1231, 1, 0, 0, 0, 224, 1245, 1, 0, 0, 0, 226, 1251, 1, 0, 0, 0, 228, 1258, 1, 0, 0, 0, 230, 1270, 1, 0, 0, 0, 232, 1288, 1, 0, 0, 0, 234, 1293, 1, 0, 0, 0, 236, 1297, 1, 0, 0, 0, 238, 1299, 1, 0, 0, 0, 240, 1304, 1, 0, 0, 0, 242, 1320, 1, 0, 0, 0, 244, 1326, 1, 0, 0, 0, 246, 1331, 1, 0, 0, 0, 248, 1337, 1, 0, 0, 0, 250, 1339, 1, 0, 0, 0, 252, 1341, 1, 0, 0, 0, 254, 255, 3, 2, 1, 0, 255, 256, 5, 0, 0, 1, 256, 1, 1, 0, 0, 0, 257, 258, 5, 104, 0, 0, 258, 259, 5, 103, 0, 0, 259, 260, 3, 250, 125, 0, 260, 261, 5, 1, 0, 0, 261, 263, 1, 0, 0, 0, 262, 257, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 267, 3, 6, 3, 0, 265, 267, 3, 4, 2, 0, 266, 264, 1, 0, 0, 0, 266, 265, 1, 0, 0, 0, 267, 3, 1, 0, 0, 0, 268, 269, 3, 8, 4, 0, 269, 270, 3, 10, 5, 0, 270, 5, 1, 0, 0, 0, 271, 272, 5, 2, 0, 0, 272, 273, 5, 3, 0, 0, 273, 274, 5, 142, 0, 0, 274, 275, 5, 4, 0, 0, 275, 276, 3, 248, 124, 0, 276, 277, 5, 1, 0, 0, 277, 278, 3, 8, 4, 0, 278, 7, 1, 0, 0, 0, 279, 283, 3, 58, 29, 0, 280, 283, 3, 60, 30, 0, 281, 283, 3, 76, 38, 0, 282, 279, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 5, 1, 0, 0, 285, 287, 1, 0, 0, 0, 286, 282, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 296, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 3, 62, 31, 0, 292, 293, 5, 1, 0, 0, 293, 295, 1, 0, 0, 0, 294, 291, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 9, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 300, 3, 16, 8, 0, 300, 11, 1, 0, 0, 0, 301, 303, 3, 18, 9, 0, 302, 301, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 13, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 3, 12, 6, 0, 308, 309, 3, 92, 46, 0, 309, 15, 1, 0, 0, 0, 310, 312, 3, 12, 6, 0, 311, 313, 3, 92, 46, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 17, 1, 0, 0, 0, 314, 328, 3, 20, 10, 0, 315, 328, 3, 22, 11, 0, 316, 328, 3, 24, 12, 0, 317, 328, 3, 26, 13, 0, 318, 328, 3, 28, 14, 0, 319, 328, 3, 30, 15, 0, 320, 328, 3, 32, 16, 0, 321, 328, 3, 34, 17, 0, 322, 328, 3, 36, 18, 0, 323, 328, 3, 40, 20, 0, 324, 328, 3, 44, 22, 0, 325, 328, 3, 52, 26, 0, 326, 328, 3, 56, 28, 0, 327, 314, 1, 0, 0, 0, 327, 315, 1, 0, 0, 0, 327, 316, 1, 0, 0, 0, 327, 317, 1, 0, 0, 0, 327, 318, 1, 0, 0, 0, 327, 319, 1, 0, 0, 0, 327, 320, 1, 0, 0, 0, 327, 321, 1, 0, 0, 0, 327, 322, 1, 0, 0, 0, 327, 323, 1, 0, 0, 0, 327, 324, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 326, 1, 0, 0, 0, 328, 19, 1, 0, 0, 0, 329, 330, 3, 96, 48, 0, 330, 331, 5, 1, 0, 0, 331, 21, 1, 0, 0, 0, 332, 333, 5, 5, 0, 0, 333, 334, 3, 72, 36, 0, 334, 335, 5, 6, 0, 0, 335, 336, 3, 94, 47, 0, 336, 337, 5, 1, 0, 0, 337, 23, 1, 0, 0, 0, 338, 339, 5, 7, 0, 0, 339, 340, 3, 12, 6, 0, 340, 341, 5, 8, 0, 0, 341, 25, 1, 0, 0, 0, 342, 343, 5, 127, 0, 0, 343, 344, 5, 128, 0, 0, 344, 345, 5, 1, 0, 0, 345, 27, 1, 0, 0, 0, 346, 347, 5, 129, 0, 0, 347, 348, 5, 128, 0, 0, 348, 349, 5, 1, 0, 0, 349, 29, 1, 0, 0, 0, 350, 351, 5, 130, 0, 0, 351, 352, 5, 131, 0, 0, 352, 353, 3, 94, 47, 0, 353, 354, 5, 1, 0, 0, 354, 31, 1, 0, 0, 0, 355, 358, 3, 100, 50, 0, 356, 358, 3, 104, 52, 0, 357, 355, 1, 0, 0, 0, 357, 356, 1, 0, 0, 0, 358, 367, 1, 0, 0, 0, 359, 366, 3, 100, 50, 0, 360, 366, 3, 104, 52, 0, 361, 366, 3, 108, 54, 0, 362, 366, 3, 110, 55, 0, 363, 366, 3, 114, 57, 0, 364, 366, 3, 118, 59, 0, 365, 359, 1, 0, 0, 0, 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 365, 362, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 364, 1, 0, 0, 0, 366, 369, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 370, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 370, 371, 5, 67, 0, 0, 371, 372, 3, 18, 9, 0, 372, 33, 1, 0, 0, 0, 373, 374, 5, 68, 0, 0, 374, 375, 5, 9, 0, 0, 375, 376, 3, 92, 46, 0, 376, 377, 5, 10, 0, 0, 377, 378, 5, 89, 0, 0, 378, 379, 3, 18, 9, 0, 379, 380, 5, 90, 0, 0, 380, 381, 3, 18, 9, 0, 381, 35, 1, 0, 0, 0, 382, 383, 5, 84, 0, 0, 383, 384, 5, 9, 0, 0, 384, 385, 3, 92, 46, 0, 385, 387, 5, 10, 0, 0, 386, 388, 3, 38, 19, 0, 387, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 5, 88, 0, 0, 392, 393, 5, 67, 0, 0, 393, 394, 3, 18, 9, 0, 394, 37, 1, 0, 0, 0, 395, 396, 5, 85, 0, 0, 396, 398, 3, 94, 47, 0, 397, 395, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 67, 0, 0, 402, 403, 3, 18, 9, 0, 403, 39, 1, 0, 0, 0, 404, 405, 5, 86, 0, 0, 405, 407, 3, 24, 12, 0, 406, 408, 3, 42, 21, 0, 407, 406, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 41, 1, 0, 0, 0, 411, 414, 5, 87, 0, 0, 412, 415, 5, 11, 0, 0, 413, 415, 3, 72, 36, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 423, 1, 0, 0, 0, 416, 419, 5, 12, 0, 0, 417, 420, 5, 11, 0, 0, 418, 420, 3, 72, 36, 0, 419, 417, 1, 0, 0, 0, 419, 418, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 416, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 3, 24, 12, 0, 427, 43, 1, 0, 0, 0, 428, 429, 5, 91, 0, 0, 429, 430, 5, 9, 0, 0, 430, 431, 3, 92, 46, 0, 431, 433, 5, 10, 0, 0, 432, 434, 3, 46, 23, 0, 433, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 439, 5, 88, 0, 0, 438, 440, 3, 192, 96, 0, 439, 438, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 5, 67, 0, 0, 442, 443, 3, 18, 9, 0, 443, 45, 1, 0, 0, 0, 444, 448, 5, 85, 0, 0, 445, 446, 3, 192, 96, 0, 446, 447, 5, 70, 0, 0, 447, 449, 1, 0, 0, 0, 448, 445, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 455, 3, 230, 115, 0, 451, 452, 5, 12, 0, 0, 452, 454, 3, 230, 115, 0, 453, 451, 1, 0, 0, 0, 454, 457, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 458, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 458, 459, 5, 67, 0, 0, 459, 460, 3, 18, 9, 0, 460, 47, 1, 0, 0, 0, 461, 462, 5, 13, 0, 0, 462, 473, 3, 72, 36, 0, 463, 464, 5, 9, 0, 0, 464, 469, 5, 136, 0, 0, 465, 466, 5, 14, 0, 0, 466, 468, 5, 136, 0, 0, 467, 465, 1, 0, 0, 0, 468, 471, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 472, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 472, 474, 5, 10, 0, 0, 473, 463, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 49, 1, 0, 0, 0, 475, 477, 3, 48, 24, 0, 476, 475, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 51, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 482, 3, 50, 25, 0, 482, 483, 5, 114, 0, 0, 483, 488, 3, 54, 27, 0, 484, 485, 5, 14, 0, 0, 485, 487, 3, 54, 27, 0, 486, 484, 1, 0, 0, 0, 487, 490, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 491, 1, 0, 0, 0, 490, 488, 1, 0, 0, 0, 491, 492, 5, 1, 0, 0, 492, 53, 1, 0, 0, 0, 493, 496, 3, 192, 96, 0, 494, 495, 5, 70, 0, 0, 495, 497, 3, 230, 115, 0, 496, 494, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 500, 1, 0, 0, 0, 498, 499, 5, 6, 0, 0, 499, 501, 3, 94, 47, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 55, 1, 0, 0, 0, 502, 503, 5, 132, 0, 0, 503, 504, 5, 9, 0, 0, 504, 505, 3, 92, 46, 0, 505, 506, 5, 10, 0, 0, 506, 507, 3, 18, 9, 0, 507, 57, 1, 0, 0, 0, 508, 513, 3, 64, 32, 0, 509, 513, 3, 66, 33, 0, 510, 513, 3, 68, 34, 0, 511, 513, 3, 70, 35, 0, 512, 508, 1, 0, 0, 0, 512, 509, 1, 0, 0, 0, 512, 510, 1, 0, 0, 0, 512, 511, 1, 0, 0, 0, 513, 59, 1, 0, 0, 0, 514, 515, 5, 111, 0, 0, 515, 516, 5, 3, 0, 0, 516, 517, 5, 142, 0, 0, 517, 518, 5, 4, 0, 0, 518, 519, 3, 248, 124, 0, 519, 61, 1, 0, 0, 0, 520, 525, 3, 82, 41, 0, 521, 525, 3, 78, 39, 0, 522, 525, 3, 84, 42, 0, 523, 525, 3, 80, 40, 0, 524, 520, 1, 0, 0, 0, 524, 521, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 523, 1, 0, 0, 0, 525, 63, 1, 0, 0, 0, 526, 527, 5, 111, 0, 0, 527, 528, 5, 88, 0, 0, 528, 529, 5, 81, 0, 0, 529, 530, 3, 248, 124, 0, 530, 65, 1, 0, 0, 0, 531, 532, 5, 111, 0, 0, 532, 533, 5, 15, 0, 0, 533, 534, 7, 0, 0, 0, 534, 67, 1, 0, 0, 0, 535, 536, 5, 111, 0, 0, 536, 537, 5, 88, 0, 0, 537, 538, 5, 66, 0, 0, 538, 539, 5, 73, 0, 0, 539, 540, 7, 1, 0, 0, 540, 69, 1, 0, 0, 0, 541, 546, 5, 111, 0, 0, 542, 543, 5, 17, 0, 0, 543, 547, 3, 72, 36, 0, 544, 545, 5, 88, 0, 0, 545, 547, 5, 17, 0, 0, 546, 542, 1, 0, 0, 0, 546, 544, 1, 0, 0, 0, 547, 554, 1, 0, 0, 0, 548, 549, 3, 74, 37, 0, 549, 550, 5, 4, 0, 0, 550, 551, 3, 250, 125, 0, 551, 553, 1, 0, 0, 0, 552, 548, 1, 0, 0, 0, 553, 556, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 554, 555, 1, 0, 0, 0, 555, 71, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 557, 560, 5, 142, 0, 0, 558, 560, 3, 252, 126, 0, 559, 557, 1, 0, 0, 0, 559, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 563, 5, 18, 0, 0, 562, 559, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 566, 1, 0, 0, 0, 564, 567, 5, 142, 0, 0, 565, 567, 3, 252, 126, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 73, 1, 0, 0, 0, 568, 569, 7, 2, 0, 0, 569, 75, 1, 0, 0, 0, 570, 571, 5, 29, 0, 0, 571, 575, 5, 2, 0, 0, 572, 573, 5, 3, 0, 0, 573, 574, 5, 142, 0, 0, 574, 576, 5, 4, 0, 0, 575, 572, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 587, 3, 248, 124, 0, 578, 579, 5, 71, 0, 0, 579, 584, 3, 248, 124, 0, 580, 581, 5, 14, 0, 0, 581, 583, 3, 248, 124, 0, 582, 580, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 588, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 578, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 77, 1, 0, 0, 0, 589, 590, 5, 111, 0, 0, 590, 591, 3, 50, 25, 0, 591, 592, 5, 114, 0, 0, 592, 595, 3, 192, 96, 0, 593, 594, 5, 70, 0, 0, 594, 596, 3, 230, 115, 0, 595, 593, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 604, 1, 0, 0, 0, 597, 598, 5, 6, 0, 0, 598, 605, 3, 94, 47, 0, 599, 602, 5, 30, 0, 0, 600, 601, 5, 6, 0, 0, 601, 603, 3, 94, 47, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 597, 1, 0, 0, 0, 604, 599, 1, 0, 0, 0, 605, 79, 1, 0, 0, 0, 606, 607, 5, 111, 0, 0, 607, 608, 5, 112, 0, 0, 608, 611, 5, 113, 0, 0, 609, 610, 5, 70, 0, 0, 610, 612, 3, 230, 115, 0, 611, 609, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 620, 1, 0, 0, 0, 613, 614, 5, 6, 0, 0, 614, 621, 3, 94, 47, 0, 615, 618, 5, 30, 0, 0, 616, 617, 5, 6, 0, 0, 617, 619, 3, 94, 47, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 621, 1, 0, 0, 0, 620, 613, 1, 0, 0, 0, 620, 615, 1, 0, 0, 0, 621, 81, 1, 0, 0, 0, 622, 623, 5, 111, 0, 0, 623, 624, 3, 50, 25, 0, 624, 625, 5, 31, 0, 0, 625, 626, 3, 72, 36, 0, 626, 628, 5, 9, 0, 0, 627, 629, 3, 88, 44, 0, 628, 627, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 633, 5, 10, 0, 0, 631, 632, 5, 70, 0, 0, 632, 634, 3, 230, 115, 0, 633, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 640, 1, 0, 0, 0, 635, 636, 5, 7, 0, 0, 636, 637, 3, 16, 8, 0, 637, 638, 5, 8, 0, 0, 638, 641, 1, 0, 0, 0, 639, 641, 5, 30, 0, 0, 640, 635, 1, 0, 0, 0, 640, 639, 1, 0, 0, 0, 641, 83, 1, 0, 0, 0, 642, 643, 5, 111, 0, 0, 643, 644, 5, 108, 0, 0, 644, 645, 3, 72, 36, 0, 645, 647, 5, 70, 0, 0, 646, 648, 3, 86, 43, 0, 647, 646, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 650, 3, 94, 47, 0, 650, 85, 1, 0, 0, 0, 651, 652, 5, 32, 0, 0, 652, 658, 5, 33, 0, 0, 653, 654, 5, 32, 0, 0, 654, 658, 5, 34, 0, 0, 655, 656, 5, 124, 0, 0, 656, 658, 5, 35, 0, 0, 657, 651, 1, 0, 0, 0, 657, 653, 1, 0, 0, 0, 657, 655, 1, 0, 0, 0, 658, 87, 1, 0, 0, 0, 659, 664, 3, 90, 45, 0, 660, 661, 5, 14, 0, 0, 661, 663, 3, 90, 45, 0, 662, 660, 1, 0, 0, 0, 663, 666, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 89, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 667, 668, 5, 5, 0, 0, 668, 671, 3, 72, 36, 0, 669, 670, 5, 70, 0, 0, 670, 672, 3, 230, 115, 0, 671, 669, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 91, 1, 0, 0, 0, 673, 678, 3, 94, 47, 0, 674, 675, 5, 14, 0, 0, 675, 677, 3, 94, 47, 0, 676, 674, 1, 0, 0, 0, 677, 680, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 93, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 688, 3, 96, 48, 0, 682, 688, 3, 98, 49, 0, 683, 688, 3, 124, 62, 0, 684, 688, 3, 128, 64, 0, 685, 688, 3, 132, 66, 0, 686, 688, 3, 134, 67, 0, 687, 681, 1, 0, 0, 0, 687, 682, 1, 0, 0, 0, 687, 683, 1, 0, 0, 0, 687, 684, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 687, 686, 1, 0, 0, 0, 688, 95, 1, 0, 0, 0, 689, 698, 3, 120, 60, 0, 690, 698, 3, 138, 69, 0, 691, 698, 3, 214, 107, 0, 692, 698, 3, 216, 108, 0, 693, 698, 3, 218, 109, 0, 694, 698, 3, 220, 110, 0, 695, 698, 3, 222, 111, 0, 696, 698, 3, 224, 112, 0, 697, 689, 1, 0, 0, 0, 697, 690, 1, 0, 0, 0, 697, 691, 1, 0, 0, 0, 697, 692, 1, 0, 0, 0, 697, 693, 1, 0, 0, 0, 697, 694, 1, 0, 0, 0, 697, 695, 1, 0, 0, 0, 697, 696, 1, 0, 0, 0, 698, 97, 1, 0, 0, 0, 699, 702, 3, 100, 50, 0, 700, 702, 3, 104, 52, 0, 701, 699, 1, 0, 0, 0, 701, 700, 1, 0, 0, 0, 702, 711, 1, 0, 0, 0, 703, 710, 3, 100, 50, 0, 704, 710, 3, 104, 52, 0, 705, 710, 3, 108, 54, 0, 706, 710, 3, 110, 55, 0, 707, 710, 3, 114, 57, 0, 708, 710, 3, 118, 59, 0, 709, 703, 1, 0, 0, 0, 709, 704, 1, 0, 0, 0, 709, 705, 1, 0, 0, 0, 709, 706, 1, 0, 0, 0, 709, 707, 1, 0, 0, 0, 709, 708, 1, 0, 0, 0, 710, 713, 1, 0, 0, 0, 711, 709, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 714, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 714, 715, 5, 67, 0, 0, 715, 716, 3, 94, 47, 0, 716, 99, 1, 0, 0, 0, 717, 718, 5, 61, 0, 0, 718, 723, 3, 102, 51, 0, 719, 720, 5, 14, 0, 0, 720, 722, 3, 102, 51, 0, 721, 719, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 101, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 726, 729, 3, 192, 96, 0, 727, 728, 5, 70, 0, 0, 728, 730, 3, 230, 115, 0, 729, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 733, 1, 0, 0, 0, 731, 732, 5, 72, 0, 0, 732, 734, 5, 73, 0, 0, 733, 731, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 737, 1, 0, 0, 0, 735, 736, 5, 71, 0, 0, 736, 738, 3, 192, 96, 0, 737, 735, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 5, 69, 0, 0, 740, 741, 3, 94, 47, 0, 741, 103, 1, 0, 0, 0, 742, 743, 5, 62, 0, 0, 743, 748, 3, 106, 53, 0, 744, 745, 5, 14, 0, 0, 745, 747, 3, 106, 53, 0, 746, 744, 1, 0, 0, 0, 747, 750, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 105, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 751, 754, 3, 192, 96, 0, 752, 753, 5, 70, 0, 0, 753, 755, 3, 230, 115, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 5, 6, 0, 0, 757, 758, 3, 94, 47, 0, 758, 107, 1, 0, 0, 0, 759, 760, 5, 63, 0, 0, 760, 761, 3, 94, 47, 0, 761, 109, 1, 0, 0, 0, 762, 763, 5, 64, 0, 0, 763, 764, 5, 65, 0, 0, 764, 769, 3, 112, 56, 0, 765, 766, 5, 14, 0, 0, 766, 768, 3, 112, 56, 0, 767, 765, 1, 0, 0, 0, 768, 771, 1, 0, 0, 0, 769, 767, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 111, 1, 0, 0, 0, 771, 769, 1, 0, 0, 0, 772, 779, 3, 192, 96, 0, 773, 774, 5, 70, 0, 0, 774, 776, 3, 230, 115, 0, 775, 773, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 778, 5, 6, 0, 0, 778, 780, 3, 94, 47, 0, 779, 775, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 783, 1, 0, 0, 0, 781, 782, 5, 81, 0, 0, 782, 784, 3, 248, 124, 0, 783, 781, 1, 0, 0, 0, 783, 784, 1, 0, 0, 0, 784, 113, 1, 0, 0, 0, 785, 786, 5, 66, 0, 0, 786, 791, 5, 65, 0, 0, 787, 788, 5, 75, 0, 0, 788, 789, 5, 66, 0, 0, 789, 791, 5, 65, 0, 0, 790, 785, 1, 0, 0, 0, 790, 787, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 797, 3, 116, 58, 0, 793, 794, 5, 14, 0, 0, 794, 796, 3, 116, 58, 0, 795, 793, 1, 0, 0, 0, 796, 799, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 797, 798, 1, 0, 0, 0, 798, 115, 1, 0, 0, 0, 799, 797, 1, 0, 0, 0, 800, 803, 3, 94, 47, 0, 801, 804, 5, 76, 0, 0, 802, 804, 5, 77, 0, 0, 803, 801, 1, 0, 0, 0, 803, 802, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 810, 1, 0, 0, 0, 805, 808, 5, 73, 0, 0, 806, 809, 5, 82, 0, 0, 807, 809, 5, 83, 0, 0, 808, 806, 1, 0, 0, 0, 808, 807, 1, 0, 0, 0, 809, 811, 1, 0, 0, 0, 810, 805, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 813, 5, 81, 0, 0, 813, 815, 3, 248, 124, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 117, 1, 0, 0, 0, 816, 817, 5, 74, 0, 0, 817, 818, 3, 192, 96, 0, 818, 119, 1, 0, 0, 0, 819, 822, 5, 78, 0, 0, 820, 822, 5, 79, 0, 0, 821, 819, 1, 0, 0, 0, 821, 820, 1, 0, 0, 0, 822, 823, 1, 0, 0, 0, 823, 828, 3, 122, 61, 0, 824, 825, 5, 14, 0, 0, 825, 827, 3, 122, 61, 0, 826, 824, 1, 0, 0, 0, 827, 830, 1, 0, 0, 0, 828, 826, 1, 0, 0, 0, 828, 829, 1, 0, 0, 0, 829, 831, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 831, 832, 5, 80, 0, 0, 832, 833, 3, 94, 47, 0, 833, 121, 1, 0, 0, 0, 834, 837, 3, 192, 96, 0, 835, 836, 5, 70, 0, 0, 836, 838, 3, 230, 115, 0, 837, 835, 1, 0, 0, 0, 837, 838, 1, 0, 0, 0, 838, 839, 1, 0, 0, 0, 839, 840, 5, 69, 0, 0, 840, 841, 3, 94, 47, 0, 841, 123, 1, 0, 0, 0, 842, 843, 5, 84, 0, 0, 843, 844, 5, 9, 0, 0, 844, 845, 3, 92, 46, 0, 845, 847, 5, 10, 0, 0, 846, 848, 3, 126, 63, 0, 847, 846, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 851, 1, 0, 0, 0, 851, 852, 5, 88, 0, 0, 852, 853, 5, 67, 0, 0, 853, 854, 3, 94, 47, 0, 854, 125, 1, 0, 0, 0, 855, 856, 5, 85, 0, 0, 856, 858, 3, 94, 47, 0, 857, 855, 1, 0, 0, 0, 858, 859, 1, 0, 0, 0, 859, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 67, 0, 0, 862, 863, 3, 94, 47, 0, 863, 127, 1, 0, 0, 0, 864, 865, 5, 91, 0, 0, 865, 866, 5, 9, 0, 0, 866, 867, 3, 92, 46, 0, 867, 869, 5, 10, 0, 0, 868, 870, 3, 130, 65, 0, 869, 868, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 869, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 875, 5, 88, 0, 0, 874, 876, 3, 192, 96, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 878, 5, 67, 0, 0, 878, 879, 3, 94, 47, 0, 879, 129, 1, 0, 0, 0, 880, 884, 5, 85, 0, 0, 881, 882, 3, 192, 96, 0, 882, 883, 5, 70, 0, 0, 883, 885, 1, 0, 0, 0, 884, 881, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 891, 3, 230, 115, 0, 887, 888, 5, 12, 0, 0, 888, 890, 3, 230, 115, 0, 889, 887, 1, 0, 0, 0, 890, 893, 1, 0, 0, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 894, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 894, 895, 5, 67, 0, 0, 895, 896, 3, 94, 47, 0, 896, 131, 1, 0, 0, 0, 897, 898, 5, 68, 0, 0, 898, 899, 5, 9, 0, 0, 899, 900, 3, 92, 46, 0, 900, 901, 5, 10, 0, 0, 901, 902, 5, 89, 0, 0, 902, 903, 3, 94, 47, 0, 903, 904, 5, 90, 0, 0, 904, 905, 3, 94, 47, 0, 905, 133, 1, 0, 0, 0, 906, 907, 5, 86, 0, 0, 907, 908, 5, 7, 0, 0, 908, 909, 3, 92, 46, 0, 909, 911, 5, 8, 0, 0, 910, 912, 3, 136, 68, 0, 911, 910, 1, 0, 0, 0, 912, 913, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 135, 1, 0, 0, 0, 915, 918, 5, 87, 0, 0, 916, 919, 5, 11, 0, 0, 917, 919, 3, 72, 36, 0, 918, 916, 1, 0, 0, 0, 918, 917, 1, 0, 0, 0, 919, 927, 1, 0, 0, 0, 920, 923, 5, 12, 0, 0, 921, 924, 5, 11, 0, 0, 922, 924, 3, 72, 36, 0, 923, 921, 1, 0, 0, 0, 923, 922, 1, 0, 0, 0, 924, 926, 1, 0, 0, 0, 925, 920, 1, 0, 0, 0, 926, 929, 1, 0, 0, 0, 927, 925, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 930, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 930, 931, 5, 7, 0, 0, 931, 932, 3, 92, 46, 0, 932, 933, 5, 8, 0, 0, 933, 137, 1, 0, 0, 0, 934, 939, 3, 140, 70, 0, 935, 936, 5, 92, 0, 0, 936, 938, 3, 140, 70, 0, 937, 935, 1, 0, 0, 0, 938, 941, 1, 0, 0, 0, 939, 937, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 139, 1, 0, 0, 0, 941, 939, 1, 0, 0, 0, 942, 947, 3, 142, 71, 0, 943, 944, 5, 93, 0, 0, 944, 946, 3, 142, 71, 0, 945, 943, 1, 0, 0, 0, 946, 949, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 141, 1, 0, 0, 0, 949, 947, 1, 0, 0, 0, 950, 952, 5, 94, 0, 0, 951, 950, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 3, 144, 72, 0, 954, 143, 1, 0, 0, 0, 955, 958, 3, 146, 73, 0, 956, 957, 7, 3, 0, 0, 957, 959, 3, 146, 73, 0, 958, 956, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 145, 1, 0, 0, 0, 960, 965, 3, 148, 74, 0, 961, 962, 5, 47, 0, 0, 962, 964, 3, 148, 74, 0, 963, 961, 1, 0, 0, 0, 964, 967, 1, 0, 0, 0, 965, 963, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 147, 1, 0, 0, 0, 967, 965, 1, 0, 0, 0, 968, 971, 3, 150, 75, 0, 969, 970, 5, 95, 0, 0, 970, 972, 3, 150, 75, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 149, 1, 0, 0, 0, 973, 978, 3, 152, 76, 0, 974, 975, 7, 4, 0, 0, 975, 977, 3, 152, 76, 0, 976, 974, 1, 0, 0, 0, 977, 980, 1, 0, 0, 0, 978, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 151, 1, 0, 0, 0, 980, 978, 1, 0, 0, 0, 981, 986, 3, 154, 77, 0, 982, 983, 7, 5, 0, 0, 983, 985, 3, 154, 77, 0, 984, 982, 1, 0, 0, 0, 985, 988, 1, 0, 0, 0, 986, 984, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 153, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 989, 993, 3, 156, 78, 0, 990, 991, 5, 96, 0, 0, 991, 992, 5, 97, 0, 0, 992, 994, 3, 230, 115, 0, 993, 990, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 155, 1, 0, 0, 0, 995, 999, 3, 158, 79, 0, 996, 997, 5, 99, 0, 0, 997, 998, 5, 98, 0, 0, 998, 1000, 3, 230, 115, 0, 999, 996, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 157, 1, 0, 0, 0, 1001, 1005, 3, 160, 80, 0, 1002, 1003, 5, 100, 0, 0, 1003, 1004, 5, 70, 0, 0, 1004, 1006, 3, 230, 115, 0, 1005, 1002, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 159, 1, 0, 0, 0, 1007, 1011, 3, 162, 81, 0, 1008, 1009, 5, 102, 0, 0, 1009, 1010, 5, 70, 0, 0, 1010, 1012, 3, 242, 121, 0, 1011, 1008, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 161, 1, 0, 0, 0, 1013, 1017, 3, 164, 82, 0, 1014, 1015, 5, 101, 0, 0, 1015, 1016, 5, 70, 0, 0, 1016, 1018, 3, 242, 121, 0, 1017, 1014, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 163, 1, 0, 0, 0, 1019, 1028, 3, 168, 84, 0, 1020, 1021, 5, 4, 0, 0, 1021, 1022, 5, 45, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 3, 166, 83, 0, 1024, 1025, 3, 204, 102, 0, 1025, 1027, 1, 0, 0, 0, 1026, 1020, 1, 0, 0, 0, 1027, 1030, 1, 0, 0, 0, 1028, 1026, 1, 0, 0, 0, 1028, 1029, 1, 0, 0, 0, 1029, 165, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1031, 1035, 3, 72, 36, 0, 1032, 1035, 3, 192, 96, 0, 1033, 1035, 3, 194, 97, 0, 1034, 1031, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1034, 1033, 1, 0, 0, 0, 1035, 167, 1, 0, 0, 0, 1036, 1038, 7, 4, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 1041, 1, 0, 0, 0, 1039, 1037, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1042, 1043, 3, 170, 85, 0, 1043, 169, 1, 0, 0, 0, 1044, 1048, 3, 176, 88, 0, 1045, 1048, 3, 172, 86, 0, 1046, 1048, 3, 174, 87, 0, 1047, 1044, 1, 0, 0, 0, 1047, 1045, 1, 0, 0, 0, 1047, 1046, 1, 0, 0, 0, 1048, 171, 1, 0, 0, 0, 1049, 1050, 5, 109, 0, 0, 1050, 1051, 5, 108, 0, 0, 1051, 1052, 3, 230, 115, 0, 1052, 1053, 5, 7, 0, 0, 1053, 1054, 3, 92, 46, 0, 1054, 1055, 5, 8, 0, 0, 1055, 173, 1, 0, 0, 0, 1056, 1057, 5, 110, 0, 0, 1057, 1058, 5, 108, 0, 0, 1058, 1059, 3, 230, 115, 0, 1059, 1060, 5, 7, 0, 0, 1060, 1061, 3, 92, 46, 0, 1061, 1062, 5, 8, 0, 0, 1062, 175, 1, 0, 0, 0, 1063, 1068, 3, 178, 89, 0, 1064, 1065, 5, 53, 0, 0, 1065, 1067, 3, 178, 89, 0, 1066, 1064, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 177, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1079, 3, 188, 94, 0, 1072, 1078, 3, 180, 90, 0, 1073, 1078, 3, 184, 92, 0, 1074, 1078, 3, 186, 93, 0, 1075, 1078, 3, 182, 91, 0, 1076, 1078, 3, 204, 102, 0, 1077, 1072, 1, 0, 0, 0, 1077, 1073, 1, 0, 0, 0, 1077, 1074, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1077, 1076, 1, 0, 0, 0, 1078, 1081, 1, 0, 0, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 179, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1082, 1083, 5, 54, 0, 0, 1083, 1084, 5, 54, 0, 0, 1084, 1085, 3, 92, 46, 0, 1085, 1086, 5, 55, 0, 0, 1086, 1087, 5, 55, 0, 0, 1087, 181, 1, 0, 0, 0, 1088, 1089, 5, 54, 0, 0, 1089, 1090, 5, 55, 0, 0, 1090, 183, 1, 0, 0, 0, 1091, 1092, 5, 54, 0, 0, 1092, 1093, 3, 92, 46, 0, 1093, 1094, 5, 55, 0, 0, 1094, 185, 1, 0, 0, 0, 1095, 1102, 5, 56, 0, 0, 1096, 1103, 3, 252, 126, 0, 1097, 1103, 3, 250, 125, 0, 1098, 1103, 5, 142, 0, 0, 1099, 1103, 3, 194, 97, 0, 1100, 1103, 3, 192, 96, 0, 1101, 1103, 3, 196, 98, 0, 1102, 1096, 1, 0, 0, 0, 1102, 1097, 1, 0, 0, 0, 1102, 1098, 1, 0, 0, 0, 1102, 1099, 1, 0, 0, 0, 1102, 1100, 1, 0, 0, 0, 1102, 1101, 1, 0, 0, 0, 1103, 187, 1, 0, 0, 0, 1104, 1120, 5, 135, 0, 0, 1105, 1120, 5, 106, 0, 0, 1106, 1120, 5, 107, 0, 0, 1107, 1120, 5, 136, 0, 0, 1108, 1120, 3, 250, 125, 0, 1109, 1120, 3, 192, 96, 0, 1110, 1120, 3, 194, 97, 0, 1111, 1120, 3, 196, 98, 0, 1112, 1120, 3, 232, 116, 0, 1113, 1120, 3, 202, 101, 0, 1114, 1120, 3, 198, 99, 0, 1115, 1120, 3, 200, 100, 0, 1116, 1120, 3, 246, 123, 0, 1117, 1120, 3, 208, 104, 0, 1118, 1120, 3, 190, 95, 0, 1119, 1104, 1, 0, 0, 0, 1119, 1105, 1, 0, 0, 0, 1119, 1106, 1, 0, 0, 0, 1119, 1107, 1, 0, 0, 0, 1119, 1108, 1, 0, 0, 0, 1119, 1109, 1, 0, 0, 0, 1119, 1110, 1, 0, 0, 0, 1119, 1111, 1, 0, 0, 0, 1119, 1112, 1, 0, 0, 0, 1119, 1113, 1, 0, 0, 0, 1119, 1114, 1, 0, 0, 0, 1119, 1115, 1, 0, 0, 0, 1119, 1116, 1, 0, 0, 0, 1119, 1117, 1, 0, 0, 0, 1119, 1118, 1, 0, 0, 0, 1120, 189, 1, 0, 0, 0, 1121, 1122, 5, 7, 0, 0, 1122, 1123, 3, 14, 7, 0, 1123, 1124, 5, 8, 0, 0, 1124, 191, 1, 0, 0, 0, 1125, 1126, 5, 5, 0, 0, 1126, 1127, 3, 72, 36, 0, 1127, 193, 1, 0, 0, 0, 1128, 1130, 5, 9, 0, 0, 1129, 1131, 3, 92, 46, 0, 1130, 1129, 1, 0, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 5, 10, 0, 0, 1133, 195, 1, 0, 0, 0, 1134, 1135, 5, 57, 0, 0, 1135, 197, 1, 0, 0, 0, 1136, 1137, 5, 16, 0, 0, 1137, 1138, 5, 7, 0, 0, 1138, 1139, 3, 92, 46, 0, 1139, 1140, 5, 8, 0, 0, 1140, 199, 1, 0, 0, 0, 1141, 1142, 5, 105, 0, 0, 1142, 1143, 5, 7, 0, 0, 1143, 1144, 3, 92, 46, 0, 1144, 1145, 5, 8, 0, 0, 1145, 201, 1, 0, 0, 0, 1146, 1147, 3, 72, 36, 0, 1147, 1148, 3, 204, 102, 0, 1148, 203, 1, 0, 0, 0, 1149, 1156, 5, 9, 0, 0, 1150, 1152, 3, 206, 103, 0, 1151, 1153, 5, 14, 0, 0, 1152, 1151, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1155, 1, 0, 0, 0, 1154, 1150, 1, 0, 0, 0, 1155, 1158, 1, 0, 0, 0, 1156, 1154, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1156, 1, 0, 0, 0, 1159, 1160, 5, 10, 0, 0, 1160, 205, 1, 0, 0, 0, 1161, 1164, 3, 94, 47, 0, 1162, 1164, 5, 134, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1162, 1, 0, 0, 0, 1164, 207, 1, 0, 0, 0, 1165, 1168, 3, 210, 105, 0, 1166, 1168, 3, 212, 106, 0, 1167, 1165, 1, 0, 0, 0, 1167, 1166, 1, 0, 0, 0, 1168, 209, 1, 0, 0, 0, 1169, 1170, 3, 72, 36, 0, 1170, 1171, 5, 58, 0, 0, 1171, 1172, 5, 136, 0, 0, 1172, 211, 1, 0, 0, 0, 1173, 1174, 3, 50, 25, 0, 1174, 1175, 5, 31, 0, 0, 1175, 1177, 5, 9, 0, 0, 1176, 1178, 3, 88, 44, 0, 1177, 1176, 1, 0, 0, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1182, 5, 10, 0, 0, 1180, 1181, 5, 70, 0, 0, 1181, 1183, 3, 230, 115, 0, 1182, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1185, 5, 7, 0, 0, 1185, 1186, 3, 16, 8, 0, 1186, 1187, 5, 8, 0, 0, 1187, 213, 1, 0, 0, 0, 1188, 1189, 5, 115, 0, 0, 1189, 1190, 5, 124, 0, 0, 1190, 1191, 3, 94, 47, 0, 1191, 1192, 5, 122, 0, 0, 1192, 1196, 3, 94, 47, 0, 1193, 1194, 5, 71, 0, 0, 1194, 1195, 5, 126, 0, 0, 1195, 1197, 3, 94, 47, 0, 1196, 1193, 1, 0, 0, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1212, 1, 0, 0, 0, 1198, 1199, 5, 115, 0, 0, 1199, 1200, 5, 124, 0, 0, 1200, 1205, 3, 244, 122, 0, 1201, 1202, 5, 14, 0, 0, 1202, 1204, 3, 244, 122, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1207, 1, 0, 0, 0, 1205, 1203, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1208, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1209, 5, 122, 0, 0, 1209, 1210, 3, 94, 47, 0, 1210, 1212, 1, 0, 0, 0, 1211, 1188, 1, 0, 0, 0, 1211, 1198, 1, 0, 0, 0, 1212, 215, 1, 0, 0, 0, 1213, 1214, 5, 116, 0, 0, 1214, 1215, 5, 124, 0, 0, 1215, 1216, 3, 226, 113, 0, 1216, 217, 1, 0, 0, 0, 1217, 1218, 5, 117, 0, 0, 1218, 1219, 5, 124, 0, 0, 1219, 1220, 3, 226, 113, 0, 1220, 1221, 5, 70, 0, 0, 1221, 1222, 3, 94, 47, 0, 1222, 219, 1, 0, 0, 0, 1223, 1224, 5, 118, 0, 0, 1224, 1225, 5, 123, 0, 0, 1225, 1226, 5, 97, 0, 0, 1226, 1227, 5, 124, 0, 0, 1227, 1228, 3, 226, 113, 0, 1228, 1229, 5, 125, 0, 0, 1229, 1230, 3, 94, 47, 0, 1230, 221, 1, 0, 0, 0, 1231, 1232, 5, 119, 0, 0, 1232, 1237, 3, 228, 114, 0, 1233, 1234, 5, 14, 0, 0, 1234, 1236, 3, 228, 114, 0, 1235, 1233, 1, 0, 0, 0, 1236, 1239, 1, 0, 0, 0, 1237, 1235, 1, 0, 0, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1240, 1, 0, 0, 0, 1239, 1237, 1, 0, 0, 0, 1240, 1241, 5, 120, 0, 0, 1241, 1242, 3, 94, 47, 0, 1242, 1243, 5, 67, 0, 0, 1243, 1244, 3, 94, 47, 0, 1244, 223, 1, 0, 0, 0, 1245, 1246, 5, 121, 0, 0, 1246, 1247, 5, 124, 0, 0, 1247, 1248, 3, 94, 47, 0, 1248, 1249, 5, 122, 0, 0, 1249, 1250, 3, 94, 47, 0, 1250, 225, 1, 0, 0, 0, 1251, 1254, 3, 188, 94, 0, 1252, 1255, 3, 180, 90, 0, 1253, 1255, 3, 186, 93, 0, 1254, 1252, 1, 0, 0, 0, 1254, 1253, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1257, 1, 0, 0, 0, 1257, 227, 1, 0, 0, 0, 1258, 1259, 3, 192, 96, 0, 1259, 1260, 5, 6, 0, 0, 1260, 1261, 3, 94, 47, 0, 1261, 229, 1, 0, 0, 0, 1262, 1263, 5, 9, 0, 0, 1263, 1271, 5, 10, 0, 0, 1264, 1268, 3, 234, 117, 0, 1265, 1269, 5, 134, 0, 0, 1266, 1269, 5, 11, 0, 0, 1267, 1269, 5, 48, 0, 0, 1268, 1265, 1, 0, 0, 0, 1268, 1266, 1, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1271, 1, 0, 0, 0, 1270, 1262, 1, 0, 0, 0, 1270, 1264, 1, 0, 0, 0, 1271, 231, 1, 0, 0, 0, 1272, 1281, 5, 7, 0, 0, 1273, 1278, 3, 244, 122, 0, 1274, 1275, 5, 14, 0, 0, 1275, 1277, 3, 244, 122, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1280, 1, 0, 0, 0, 1278, 1276, 1, 0, 0, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1282, 1, 0, 0, 0, 1280, 1278, 1, 0, 0, 0, 1281, 1273, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1289, 5, 8, 0, 0, 1284, 1285, 5, 59, 0, 0, 1285, 1286, 3, 92, 46, 0, 1286, 1287, 5, 60, 0, 0, 1287, 1289, 1, 0, 0, 0, 1288, 1272, 1, 0, 0, 0, 1288, 1284, 1, 0, 0, 0, 1289, 233, 1, 0, 0, 0, 1290, 1294, 3, 72, 36, 0, 1291, 1294, 5, 135, 0, 0, 1292, 1294, 3, 236, 118, 0, 1293, 1290, 1, 0, 0, 0, 1293, 1291, 1, 0, 0, 0, 1293, 1292, 1, 0, 0, 0, 1294, 235, 1, 0, 0, 0, 1295, 1298, 3, 238, 119, 0, 1296, 1298, 3, 240, 120, 0, 1297, 1295, 1, 0, 0, 0, 1297, 1296, 1, 0, 0, 0, 1298, 237, 1, 0, 0, 0, 1299, 1300, 5, 31, 0, 0, 1300, 1301, 5, 9, 0, 0, 1301, 1302, 5, 11, 0, 0, 1302, 1303, 5, 10, 0, 0, 1303, 239, 1, 0, 0, 0, 1304, 1305, 5, 31, 0, 0, 1305, 1314, 5, 9, 0, 0, 1306, 1311, 3, 230, 115, 0, 1307, 1308, 5, 14, 0, 0, 1308, 1310, 3, 230, 115, 0, 1309, 1307, 1, 0, 0, 0, 1310, 1313, 1, 0, 0, 0, 1311, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1315, 1, 0, 0, 0, 1313, 1311, 1, 0, 0, 0, 1314, 1306, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 5, 10, 0, 0, 1317, 1318, 5, 70, 0, 0, 1318, 1319, 3, 230, 115, 0, 1319, 241, 1, 0, 0, 0, 1320, 1322, 3, 234, 117, 0, 1321, 1323, 5, 134, 0, 0, 1322, 1321, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 243, 1, 0, 0, 0, 1324, 1327, 3, 94, 47, 0, 1325, 1327, 5, 142, 0, 0, 1326, 1324, 1, 0, 0, 0, 1326, 1325, 1, 0, 0, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 7, 6, 0, 0, 1329, 1330, 3, 94, 47, 0, 1330, 245, 1, 0, 0, 0, 1331, 1333, 5, 54, 0, 0, 1332, 1334, 3, 92, 46, 0, 1333, 1332, 1, 0, 0, 0, 1333, 1334, 1, 0, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 5, 55, 0, 0, 1336, 247, 1, 0, 0, 0, 1337, 1338, 3, 250, 125, 0, 1338, 249, 1, 0, 0, 0, 1339, 1340, 5, 133, 0, 0, 1340, 251, 1, 0, 0, 0, 1341, 1342, 7, 7, 0, 0, 1342, 253, 1, 0, 0, 0, 132, 262, 266, 282, 288, 296, 304, 312, 327, 357, 365, 367, 389, 399, 409, 414, 419, 423, 435, 439, 448, 455, 469, 473, 478, 488, 496, 500, 512, 524, 546, 554, 559, 562, 566, 575, 584, 587, 595, 602, 604, 611, 618, 620, 628, 633, 640, 647, 657, 664, 671, 678, 687, 697, 701, 709, 711, 723, 729, 733, 737, 748, 754, 769, 775, 779, 783, 790, 797, 803, 808, 810, 814, 821, 828, 837, 849, 859, 871, 875, 884, 891, 913, 918, 923, 927, 939, 947, 951, 958, 965, 971, 978, 986, 993, 999, 1005, 1011, 1017, 1028, 1034, 1039, 1047, 1068, 1077, 1079, 1102, 1119, 1130, 1152, 1156, 1163, 1167, 1177, 1182, 1196, 1205, 1211, 1237, 1254, 1256, 1268, 1270, 1278, 1281, 1288, 1293, 1297, 1311, 1314, 1322, 1326, 1333]
\ No newline at end of file
+[4, 1, 145, 1347, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 263, 8, 1, 1, 1, 1, 1, 3, 1, 267, 8, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 3, 4, 283, 8, 4, 1, 4, 1, 4, 5, 4, 287, 8, 4, 10, 4, 12, 4, 290, 9, 4, 1, 4, 1, 4, 1, 4, 5, 4, 295, 8, 4, 10, 4, 12, 4, 298, 9, 4, 1, 5, 1, 5, 1, 6, 5, 6, 303, 8, 6, 10, 6, 12, 6, 306, 9, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 3, 8, 313, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 328, 8, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 366, 8, 16, 10, 16, 12, 16, 369, 9, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 4, 18, 388, 8, 18, 11, 18, 12, 18, 389, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 4, 19, 398, 8, 19, 11, 19, 12, 19, 399, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 4, 20, 408, 8, 20, 11, 20, 12, 20, 409, 1, 21, 1, 21, 1, 21, 3, 21, 415, 8, 21, 1, 21, 1, 21, 1, 21, 3, 21, 420, 8, 21, 5, 21, 422, 8, 21, 10, 21, 12, 21, 425, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 4, 22, 434, 8, 22, 11, 22, 12, 22, 435, 1, 22, 1, 22, 3, 22, 440, 8, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 449, 8, 23, 1, 23, 1, 23, 1, 23, 5, 23, 454, 8, 23, 10, 23, 12, 23, 457, 9, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 468, 8, 24, 10, 24, 12, 24, 471, 9, 24, 1, 24, 3, 24, 474, 8, 24, 1, 24, 3, 24, 477, 8, 24, 1, 25, 5, 25, 480, 8, 25, 10, 25, 12, 25, 483, 9, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 490, 8, 26, 10, 26, 12, 26, 493, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 500, 8, 27, 1, 27, 1, 27, 3, 27, 504, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 516, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 528, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 550, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 556, 8, 35, 10, 35, 12, 35, 559, 9, 35, 1, 36, 1, 36, 3, 36, 563, 8, 36, 1, 36, 3, 36, 566, 8, 36, 1, 36, 1, 36, 3, 36, 570, 8, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 579, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 586, 8, 38, 10, 38, 12, 38, 589, 9, 38, 3, 38, 591, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 599, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 606, 8, 39, 3, 39, 608, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 615, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 622, 8, 40, 3, 40, 624, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 632, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 637, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 644, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 651, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 661, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 666, 8, 44, 10, 44, 12, 44, 669, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 675, 8, 45, 1, 46, 1, 46, 1, 46, 5, 46, 680, 8, 46, 10, 46, 12, 46, 683, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 691, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 701, 8, 48, 1, 49, 1, 49, 3, 49, 705, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 713, 8, 49, 10, 49, 12, 49, 716, 9, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 725, 8, 50, 10, 50, 12, 50, 728, 9, 50, 1, 51, 1, 51, 1, 51, 3, 51, 733, 8, 51, 1, 51, 1, 51, 3, 51, 737, 8, 51, 1, 51, 1, 51, 3, 51, 741, 8, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 5, 52, 750, 8, 52, 10, 52, 12, 52, 753, 9, 52, 1, 53, 1, 53, 1, 53, 3, 53, 758, 8, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 771, 8, 55, 10, 55, 12, 55, 774, 9, 55, 1, 56, 1, 56, 1, 56, 3, 56, 779, 8, 56, 1, 56, 1, 56, 3, 56, 783, 8, 56, 1, 56, 1, 56, 3, 56, 787, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 794, 8, 57, 1, 57, 1, 57, 1, 57, 5, 57, 799, 8, 57, 10, 57, 12, 57, 802, 9, 57, 1, 58, 1, 58, 1, 58, 3, 58, 807, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 812, 8, 58, 3, 58, 814, 8, 58, 1, 58, 1, 58, 3, 58, 818, 8, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 3, 60, 825, 8, 60, 1, 60, 1, 60, 1, 60, 5, 60, 830, 8, 60, 10, 60, 12, 60, 833, 9, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 3, 61, 841, 8, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 4, 62, 851, 8, 62, 11, 62, 12, 62, 852, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 4, 63, 861, 8, 63, 11, 63, 12, 63, 862, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 4, 64, 873, 8, 64, 11, 64, 12, 64, 874, 1, 64, 1, 64, 3, 64, 879, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 888, 8, 65, 1, 65, 1, 65, 1, 65, 5, 65, 893, 8, 65, 10, 65, 12, 65, 896, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 4, 67, 915, 8, 67, 11, 67, 12, 67, 916, 1, 68, 1, 68, 1, 68, 3, 68, 922, 8, 68, 1, 68, 1, 68, 1, 68, 3, 68, 927, 8, 68, 5, 68, 929, 8, 68, 10, 68, 12, 68, 932, 9, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 941, 8, 69, 10, 69, 12, 69, 944, 9, 69, 1, 70, 1, 70, 1, 70, 5, 70, 949, 8, 70, 10, 70, 12, 70, 952, 9, 70, 1, 71, 3, 71, 955, 8, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 3, 72, 962, 8, 72, 1, 73, 1, 73, 1, 73, 5, 73, 967, 8, 73, 10, 73, 12, 73, 970, 9, 73, 1, 74, 1, 74, 1, 74, 3, 74, 975, 8, 74, 1, 75, 1, 75, 1, 75, 5, 75, 980, 8, 75, 10, 75, 12, 75, 983, 9, 75, 1, 76, 1, 76, 1, 76, 5, 76, 988, 8, 76, 10, 76, 12, 76, 991, 9, 76, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 997, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1003, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1009, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 1015, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1021, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1030, 8, 82, 10, 82, 12, 82, 1033, 9, 82, 1, 83, 1, 83, 1, 83, 3, 83, 1038, 8, 83, 1, 84, 5, 84, 1041, 8, 84, 10, 84, 12, 84, 1044, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 1051, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 5, 88, 1070, 8, 88, 10, 88, 12, 88, 1073, 9, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 1081, 8, 89, 10, 89, 12, 89, 1084, 9, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1106, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1123, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 1134, 8, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 3, 102, 1156, 8, 102, 5, 102, 1158, 8, 102, 10, 102, 12, 102, 1161, 9, 102, 1, 102, 1, 102, 1, 103, 1, 103, 3, 103, 1167, 8, 103, 1, 104, 1, 104, 3, 104, 1171, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1181, 8, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1186, 8, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1200, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1207, 8, 107, 10, 107, 12, 107, 1210, 9, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1215, 8, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1239, 8, 111, 10, 111, 12, 111, 1242, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 4, 113, 1258, 8, 113, 11, 113, 12, 113, 1259, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1272, 8, 115, 3, 115, 1274, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1280, 8, 116, 10, 116, 12, 116, 1283, 9, 116, 3, 116, 1285, 8, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 3, 116, 1292, 8, 116, 1, 117, 1, 117, 1, 117, 3, 117, 1297, 8, 117, 1, 118, 1, 118, 3, 118, 1301, 8, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 5, 120, 1313, 8, 120, 10, 120, 12, 120, 1316, 9, 120, 3, 120, 1318, 8, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 3, 121, 1326, 8, 121, 1, 122, 1, 122, 3, 122, 1330, 8, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 3, 123, 1337, 8, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 0, 0, 127, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 0, 8, 2, 0, 16, 16, 105, 105, 1, 0, 82, 83, 1, 0, 19, 28, 2, 0, 4, 4, 36, 46, 1, 0, 48, 49, 2, 0, 11, 11, 50, 52, 2, 0, 18, 18, 135, 135, 2, 0, 61, 133, 136, 136, 1413, 0, 254, 1, 0, 0, 0, 2, 262, 1, 0, 0, 0, 4, 268, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 10, 299, 1, 0, 0, 0, 12, 304, 1, 0, 0, 0, 14, 307, 1, 0, 0, 0, 16, 310, 1, 0, 0, 0, 18, 327, 1, 0, 0, 0, 20, 329, 1, 0, 0, 0, 22, 332, 1, 0, 0, 0, 24, 338, 1, 0, 0, 0, 26, 342, 1, 0, 0, 0, 28, 346, 1, 0, 0, 0, 30, 350, 1, 0, 0, 0, 32, 357, 1, 0, 0, 0, 34, 373, 1, 0, 0, 0, 36, 382, 1, 0, 0, 0, 38, 397, 1, 0, 0, 0, 40, 404, 1, 0, 0, 0, 42, 411, 1, 0, 0, 0, 44, 428, 1, 0, 0, 0, 46, 444, 1, 0, 0, 0, 48, 476, 1, 0, 0, 0, 50, 481, 1, 0, 0, 0, 52, 484, 1, 0, 0, 0, 54, 496, 1, 0, 0, 0, 56, 505, 1, 0, 0, 0, 58, 515, 1, 0, 0, 0, 60, 517, 1, 0, 0, 0, 62, 527, 1, 0, 0, 0, 64, 529, 1, 0, 0, 0, 66, 534, 1, 0, 0, 0, 68, 538, 1, 0, 0, 0, 70, 544, 1, 0, 0, 0, 72, 565, 1, 0, 0, 0, 74, 571, 1, 0, 0, 0, 76, 573, 1, 0, 0, 0, 78, 592, 1, 0, 0, 0, 80, 609, 1, 0, 0, 0, 82, 625, 1, 0, 0, 0, 84, 645, 1, 0, 0, 0, 86, 660, 1, 0, 0, 0, 88, 662, 1, 0, 0, 0, 90, 670, 1, 0, 0, 0, 92, 676, 1, 0, 0, 0, 94, 690, 1, 0, 0, 0, 96, 700, 1, 0, 0, 0, 98, 704, 1, 0, 0, 0, 100, 720, 1, 0, 0, 0, 102, 729, 1, 0, 0, 0, 104, 745, 1, 0, 0, 0, 106, 754, 1, 0, 0, 0, 108, 762, 1, 0, 0, 0, 110, 765, 1, 0, 0, 0, 112, 775, 1, 0, 0, 0, 114, 793, 1, 0, 0, 0, 116, 803, 1, 0, 0, 0, 118, 819, 1, 0, 0, 0, 120, 824, 1, 0, 0, 0, 122, 837, 1, 0, 0, 0, 124, 845, 1, 0, 0, 0, 126, 860, 1, 0, 0, 0, 128, 867, 1, 0, 0, 0, 130, 883, 1, 0, 0, 0, 132, 900, 1, 0, 0, 0, 134, 909, 1, 0, 0, 0, 136, 918, 1, 0, 0, 0, 138, 937, 1, 0, 0, 0, 140, 945, 1, 0, 0, 0, 142, 954, 1, 0, 0, 0, 144, 958, 1, 0, 0, 0, 146, 963, 1, 0, 0, 0, 148, 971, 1, 0, 0, 0, 150, 976, 1, 0, 0, 0, 152, 984, 1, 0, 0, 0, 154, 992, 1, 0, 0, 0, 156, 998, 1, 0, 0, 0, 158, 1004, 1, 0, 0, 0, 160, 1010, 1, 0, 0, 0, 162, 1016, 1, 0, 0, 0, 164, 1022, 1, 0, 0, 0, 166, 1037, 1, 0, 0, 0, 168, 1042, 1, 0, 0, 0, 170, 1050, 1, 0, 0, 0, 172, 1052, 1, 0, 0, 0, 174, 1059, 1, 0, 0, 0, 176, 1066, 1, 0, 0, 0, 178, 1074, 1, 0, 0, 0, 180, 1085, 1, 0, 0, 0, 182, 1091, 1, 0, 0, 0, 184, 1094, 1, 0, 0, 0, 186, 1098, 1, 0, 0, 0, 188, 1122, 1, 0, 0, 0, 190, 1124, 1, 0, 0, 0, 192, 1128, 1, 0, 0, 0, 194, 1131, 1, 0, 0, 0, 196, 1137, 1, 0, 0, 0, 198, 1139, 1, 0, 0, 0, 200, 1144, 1, 0, 0, 0, 202, 1149, 1, 0, 0, 0, 204, 1152, 1, 0, 0, 0, 206, 1166, 1, 0, 0, 0, 208, 1170, 1, 0, 0, 0, 210, 1172, 1, 0, 0, 0, 212, 1176, 1, 0, 0, 0, 214, 1214, 1, 0, 0, 0, 216, 1216, 1, 0, 0, 0, 218, 1220, 1, 0, 0, 0, 220, 1226, 1, 0, 0, 0, 222, 1234, 1, 0, 0, 0, 224, 1248, 1, 0, 0, 0, 226, 1254, 1, 0, 0, 0, 228, 1261, 1, 0, 0, 0, 230, 1273, 1, 0, 0, 0, 232, 1291, 1, 0, 0, 0, 234, 1296, 1, 0, 0, 0, 236, 1300, 1, 0, 0, 0, 238, 1302, 1, 0, 0, 0, 240, 1307, 1, 0, 0, 0, 242, 1323, 1, 0, 0, 0, 244, 1329, 1, 0, 0, 0, 246, 1334, 1, 0, 0, 0, 248, 1340, 1, 0, 0, 0, 250, 1342, 1, 0, 0, 0, 252, 1344, 1, 0, 0, 0, 254, 255, 3, 2, 1, 0, 255, 256, 5, 0, 0, 1, 256, 1, 1, 0, 0, 0, 257, 258, 5, 104, 0, 0, 258, 259, 5, 103, 0, 0, 259, 260, 3, 250, 125, 0, 260, 261, 5, 1, 0, 0, 261, 263, 1, 0, 0, 0, 262, 257, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 267, 3, 6, 3, 0, 265, 267, 3, 4, 2, 0, 266, 264, 1, 0, 0, 0, 266, 265, 1, 0, 0, 0, 267, 3, 1, 0, 0, 0, 268, 269, 3, 8, 4, 0, 269, 270, 3, 10, 5, 0, 270, 5, 1, 0, 0, 0, 271, 272, 5, 2, 0, 0, 272, 273, 5, 3, 0, 0, 273, 274, 5, 143, 0, 0, 274, 275, 5, 4, 0, 0, 275, 276, 3, 248, 124, 0, 276, 277, 5, 1, 0, 0, 277, 278, 3, 8, 4, 0, 278, 7, 1, 0, 0, 0, 279, 283, 3, 58, 29, 0, 280, 283, 3, 60, 30, 0, 281, 283, 3, 76, 38, 0, 282, 279, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 5, 1, 0, 0, 285, 287, 1, 0, 0, 0, 286, 282, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 296, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 3, 62, 31, 0, 292, 293, 5, 1, 0, 0, 293, 295, 1, 0, 0, 0, 294, 291, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 9, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 300, 3, 16, 8, 0, 300, 11, 1, 0, 0, 0, 301, 303, 3, 18, 9, 0, 302, 301, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 13, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 3, 12, 6, 0, 308, 309, 3, 92, 46, 0, 309, 15, 1, 0, 0, 0, 310, 312, 3, 12, 6, 0, 311, 313, 3, 92, 46, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 17, 1, 0, 0, 0, 314, 328, 3, 20, 10, 0, 315, 328, 3, 22, 11, 0, 316, 328, 3, 24, 12, 0, 317, 328, 3, 26, 13, 0, 318, 328, 3, 28, 14, 0, 319, 328, 3, 30, 15, 0, 320, 328, 3, 32, 16, 0, 321, 328, 3, 34, 17, 0, 322, 328, 3, 36, 18, 0, 323, 328, 3, 40, 20, 0, 324, 328, 3, 44, 22, 0, 325, 328, 3, 52, 26, 0, 326, 328, 3, 56, 28, 0, 327, 314, 1, 0, 0, 0, 327, 315, 1, 0, 0, 0, 327, 316, 1, 0, 0, 0, 327, 317, 1, 0, 0, 0, 327, 318, 1, 0, 0, 0, 327, 319, 1, 0, 0, 0, 327, 320, 1, 0, 0, 0, 327, 321, 1, 0, 0, 0, 327, 322, 1, 0, 0, 0, 327, 323, 1, 0, 0, 0, 327, 324, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 326, 1, 0, 0, 0, 328, 19, 1, 0, 0, 0, 329, 330, 3, 96, 48, 0, 330, 331, 5, 1, 0, 0, 331, 21, 1, 0, 0, 0, 332, 333, 5, 5, 0, 0, 333, 334, 3, 72, 36, 0, 334, 335, 5, 6, 0, 0, 335, 336, 3, 94, 47, 0, 336, 337, 5, 1, 0, 0, 337, 23, 1, 0, 0, 0, 338, 339, 5, 7, 0, 0, 339, 340, 3, 12, 6, 0, 340, 341, 5, 8, 0, 0, 341, 25, 1, 0, 0, 0, 342, 343, 5, 128, 0, 0, 343, 344, 5, 129, 0, 0, 344, 345, 5, 1, 0, 0, 345, 27, 1, 0, 0, 0, 346, 347, 5, 130, 0, 0, 347, 348, 5, 129, 0, 0, 348, 349, 5, 1, 0, 0, 349, 29, 1, 0, 0, 0, 350, 351, 5, 131, 0, 0, 351, 352, 5, 132, 0, 0, 352, 353, 3, 94, 47, 0, 353, 354, 5, 1, 0, 0, 354, 31, 1, 0, 0, 0, 355, 358, 3, 100, 50, 0, 356, 358, 3, 104, 52, 0, 357, 355, 1, 0, 0, 0, 357, 356, 1, 0, 0, 0, 358, 367, 1, 0, 0, 0, 359, 366, 3, 100, 50, 0, 360, 366, 3, 104, 52, 0, 361, 366, 3, 108, 54, 0, 362, 366, 3, 110, 55, 0, 363, 366, 3, 114, 57, 0, 364, 366, 3, 118, 59, 0, 365, 359, 1, 0, 0, 0, 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 365, 362, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 364, 1, 0, 0, 0, 366, 369, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 370, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 370, 371, 5, 67, 0, 0, 371, 372, 3, 18, 9, 0, 372, 33, 1, 0, 0, 0, 373, 374, 5, 68, 0, 0, 374, 375, 5, 9, 0, 0, 375, 376, 3, 92, 46, 0, 376, 377, 5, 10, 0, 0, 377, 378, 5, 89, 0, 0, 378, 379, 3, 18, 9, 0, 379, 380, 5, 90, 0, 0, 380, 381, 3, 18, 9, 0, 381, 35, 1, 0, 0, 0, 382, 383, 5, 84, 0, 0, 383, 384, 5, 9, 0, 0, 384, 385, 3, 92, 46, 0, 385, 387, 5, 10, 0, 0, 386, 388, 3, 38, 19, 0, 387, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 5, 88, 0, 0, 392, 393, 5, 67, 0, 0, 393, 394, 3, 18, 9, 0, 394, 37, 1, 0, 0, 0, 395, 396, 5, 85, 0, 0, 396, 398, 3, 94, 47, 0, 397, 395, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 67, 0, 0, 402, 403, 3, 18, 9, 0, 403, 39, 1, 0, 0, 0, 404, 405, 5, 86, 0, 0, 405, 407, 3, 24, 12, 0, 406, 408, 3, 42, 21, 0, 407, 406, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 41, 1, 0, 0, 0, 411, 414, 5, 87, 0, 0, 412, 415, 5, 11, 0, 0, 413, 415, 3, 72, 36, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 423, 1, 0, 0, 0, 416, 419, 5, 12, 0, 0, 417, 420, 5, 11, 0, 0, 418, 420, 3, 72, 36, 0, 419, 417, 1, 0, 0, 0, 419, 418, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 416, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 3, 24, 12, 0, 427, 43, 1, 0, 0, 0, 428, 429, 5, 91, 0, 0, 429, 430, 5, 9, 0, 0, 430, 431, 3, 92, 46, 0, 431, 433, 5, 10, 0, 0, 432, 434, 3, 46, 23, 0, 433, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 439, 5, 88, 0, 0, 438, 440, 3, 192, 96, 0, 439, 438, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 5, 67, 0, 0, 442, 443, 3, 18, 9, 0, 443, 45, 1, 0, 0, 0, 444, 448, 5, 85, 0, 0, 445, 446, 3, 192, 96, 0, 446, 447, 5, 70, 0, 0, 447, 449, 1, 0, 0, 0, 448, 445, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 455, 3, 230, 115, 0, 451, 452, 5, 12, 0, 0, 452, 454, 3, 230, 115, 0, 453, 451, 1, 0, 0, 0, 454, 457, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 458, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 458, 459, 5, 67, 0, 0, 459, 460, 3, 18, 9, 0, 460, 47, 1, 0, 0, 0, 461, 462, 5, 13, 0, 0, 462, 473, 3, 72, 36, 0, 463, 464, 5, 9, 0, 0, 464, 469, 5, 137, 0, 0, 465, 466, 5, 14, 0, 0, 466, 468, 5, 137, 0, 0, 467, 465, 1, 0, 0, 0, 468, 471, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 472, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 472, 474, 5, 10, 0, 0, 473, 463, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 477, 1, 0, 0, 0, 475, 477, 5, 127, 0, 0, 476, 461, 1, 0, 0, 0, 476, 475, 1, 0, 0, 0, 477, 49, 1, 0, 0, 0, 478, 480, 3, 48, 24, 0, 479, 478, 1, 0, 0, 0, 480, 483, 1, 0, 0, 0, 481, 479, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 51, 1, 0, 0, 0, 483, 481, 1, 0, 0, 0, 484, 485, 3, 50, 25, 0, 485, 486, 5, 114, 0, 0, 486, 491, 3, 54, 27, 0, 487, 488, 5, 14, 0, 0, 488, 490, 3, 54, 27, 0, 489, 487, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 494, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 495, 5, 1, 0, 0, 495, 53, 1, 0, 0, 0, 496, 499, 3, 192, 96, 0, 497, 498, 5, 70, 0, 0, 498, 500, 3, 230, 115, 0, 499, 497, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 503, 1, 0, 0, 0, 501, 502, 5, 6, 0, 0, 502, 504, 3, 94, 47, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 55, 1, 0, 0, 0, 505, 506, 5, 133, 0, 0, 506, 507, 5, 9, 0, 0, 507, 508, 3, 92, 46, 0, 508, 509, 5, 10, 0, 0, 509, 510, 3, 18, 9, 0, 510, 57, 1, 0, 0, 0, 511, 516, 3, 64, 32, 0, 512, 516, 3, 66, 33, 0, 513, 516, 3, 68, 34, 0, 514, 516, 3, 70, 35, 0, 515, 511, 1, 0, 0, 0, 515, 512, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 515, 514, 1, 0, 0, 0, 516, 59, 1, 0, 0, 0, 517, 518, 5, 111, 0, 0, 518, 519, 5, 3, 0, 0, 519, 520, 5, 143, 0, 0, 520, 521, 5, 4, 0, 0, 521, 522, 3, 248, 124, 0, 522, 61, 1, 0, 0, 0, 523, 528, 3, 82, 41, 0, 524, 528, 3, 78, 39, 0, 525, 528, 3, 84, 42, 0, 526, 528, 3, 80, 40, 0, 527, 523, 1, 0, 0, 0, 527, 524, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 526, 1, 0, 0, 0, 528, 63, 1, 0, 0, 0, 529, 530, 5, 111, 0, 0, 530, 531, 5, 88, 0, 0, 531, 532, 5, 81, 0, 0, 532, 533, 3, 248, 124, 0, 533, 65, 1, 0, 0, 0, 534, 535, 5, 111, 0, 0, 535, 536, 5, 15, 0, 0, 536, 537, 7, 0, 0, 0, 537, 67, 1, 0, 0, 0, 538, 539, 5, 111, 0, 0, 539, 540, 5, 88, 0, 0, 540, 541, 5, 66, 0, 0, 541, 542, 5, 73, 0, 0, 542, 543, 7, 1, 0, 0, 543, 69, 1, 0, 0, 0, 544, 549, 5, 111, 0, 0, 545, 546, 5, 17, 0, 0, 546, 550, 3, 72, 36, 0, 547, 548, 5, 88, 0, 0, 548, 550, 5, 17, 0, 0, 549, 545, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 557, 1, 0, 0, 0, 551, 552, 3, 74, 37, 0, 552, 553, 5, 4, 0, 0, 553, 554, 3, 250, 125, 0, 554, 556, 1, 0, 0, 0, 555, 551, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 71, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 563, 5, 143, 0, 0, 561, 563, 3, 252, 126, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 566, 5, 18, 0, 0, 565, 562, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 569, 1, 0, 0, 0, 567, 570, 5, 143, 0, 0, 568, 570, 3, 252, 126, 0, 569, 567, 1, 0, 0, 0, 569, 568, 1, 0, 0, 0, 570, 73, 1, 0, 0, 0, 571, 572, 7, 2, 0, 0, 572, 75, 1, 0, 0, 0, 573, 574, 5, 29, 0, 0, 574, 578, 5, 2, 0, 0, 575, 576, 5, 3, 0, 0, 576, 577, 5, 143, 0, 0, 577, 579, 5, 4, 0, 0, 578, 575, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 590, 3, 248, 124, 0, 581, 582, 5, 71, 0, 0, 582, 587, 3, 248, 124, 0, 583, 584, 5, 14, 0, 0, 584, 586, 3, 248, 124, 0, 585, 583, 1, 0, 0, 0, 586, 589, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 590, 581, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 77, 1, 0, 0, 0, 592, 593, 5, 111, 0, 0, 593, 594, 3, 50, 25, 0, 594, 595, 5, 114, 0, 0, 595, 598, 3, 192, 96, 0, 596, 597, 5, 70, 0, 0, 597, 599, 3, 230, 115, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 607, 1, 0, 0, 0, 600, 601, 5, 6, 0, 0, 601, 608, 3, 94, 47, 0, 602, 605, 5, 30, 0, 0, 603, 604, 5, 6, 0, 0, 604, 606, 3, 94, 47, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 608, 1, 0, 0, 0, 607, 600, 1, 0, 0, 0, 607, 602, 1, 0, 0, 0, 608, 79, 1, 0, 0, 0, 609, 610, 5, 111, 0, 0, 610, 611, 5, 112, 0, 0, 611, 614, 5, 113, 0, 0, 612, 613, 5, 70, 0, 0, 613, 615, 3, 230, 115, 0, 614, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 623, 1, 0, 0, 0, 616, 617, 5, 6, 0, 0, 617, 624, 3, 94, 47, 0, 618, 621, 5, 30, 0, 0, 619, 620, 5, 6, 0, 0, 620, 622, 3, 94, 47, 0, 621, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 624, 1, 0, 0, 0, 623, 616, 1, 0, 0, 0, 623, 618, 1, 0, 0, 0, 624, 81, 1, 0, 0, 0, 625, 626, 5, 111, 0, 0, 626, 627, 3, 50, 25, 0, 627, 628, 5, 31, 0, 0, 628, 629, 3, 72, 36, 0, 629, 631, 5, 9, 0, 0, 630, 632, 3, 88, 44, 0, 631, 630, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 636, 5, 10, 0, 0, 634, 635, 5, 70, 0, 0, 635, 637, 3, 230, 115, 0, 636, 634, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 643, 1, 0, 0, 0, 638, 639, 5, 7, 0, 0, 639, 640, 3, 16, 8, 0, 640, 641, 5, 8, 0, 0, 641, 644, 1, 0, 0, 0, 642, 644, 5, 30, 0, 0, 643, 638, 1, 0, 0, 0, 643, 642, 1, 0, 0, 0, 644, 83, 1, 0, 0, 0, 645, 646, 5, 111, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, 3, 72, 36, 0, 648, 650, 5, 70, 0, 0, 649, 651, 3, 86, 43, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 3, 94, 47, 0, 653, 85, 1, 0, 0, 0, 654, 655, 5, 32, 0, 0, 655, 661, 5, 33, 0, 0, 656, 657, 5, 32, 0, 0, 657, 661, 5, 34, 0, 0, 658, 659, 5, 126, 0, 0, 659, 661, 5, 35, 0, 0, 660, 654, 1, 0, 0, 0, 660, 656, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 87, 1, 0, 0, 0, 662, 667, 3, 90, 45, 0, 663, 664, 5, 14, 0, 0, 664, 666, 3, 90, 45, 0, 665, 663, 1, 0, 0, 0, 666, 669, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 89, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 670, 671, 5, 5, 0, 0, 671, 674, 3, 72, 36, 0, 672, 673, 5, 70, 0, 0, 673, 675, 3, 230, 115, 0, 674, 672, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 91, 1, 0, 0, 0, 676, 681, 3, 94, 47, 0, 677, 678, 5, 14, 0, 0, 678, 680, 3, 94, 47, 0, 679, 677, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 93, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 691, 3, 96, 48, 0, 685, 691, 3, 98, 49, 0, 686, 691, 3, 124, 62, 0, 687, 691, 3, 128, 64, 0, 688, 691, 3, 132, 66, 0, 689, 691, 3, 134, 67, 0, 690, 684, 1, 0, 0, 0, 690, 685, 1, 0, 0, 0, 690, 686, 1, 0, 0, 0, 690, 687, 1, 0, 0, 0, 690, 688, 1, 0, 0, 0, 690, 689, 1, 0, 0, 0, 691, 95, 1, 0, 0, 0, 692, 701, 3, 120, 60, 0, 693, 701, 3, 138, 69, 0, 694, 701, 3, 214, 107, 0, 695, 701, 3, 216, 108, 0, 696, 701, 3, 218, 109, 0, 697, 701, 3, 220, 110, 0, 698, 701, 3, 222, 111, 0, 699, 701, 3, 224, 112, 0, 700, 692, 1, 0, 0, 0, 700, 693, 1, 0, 0, 0, 700, 694, 1, 0, 0, 0, 700, 695, 1, 0, 0, 0, 700, 696, 1, 0, 0, 0, 700, 697, 1, 0, 0, 0, 700, 698, 1, 0, 0, 0, 700, 699, 1, 0, 0, 0, 701, 97, 1, 0, 0, 0, 702, 705, 3, 100, 50, 0, 703, 705, 3, 104, 52, 0, 704, 702, 1, 0, 0, 0, 704, 703, 1, 0, 0, 0, 705, 714, 1, 0, 0, 0, 706, 713, 3, 100, 50, 0, 707, 713, 3, 104, 52, 0, 708, 713, 3, 108, 54, 0, 709, 713, 3, 110, 55, 0, 710, 713, 3, 114, 57, 0, 711, 713, 3, 118, 59, 0, 712, 706, 1, 0, 0, 0, 712, 707, 1, 0, 0, 0, 712, 708, 1, 0, 0, 0, 712, 709, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 711, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 718, 5, 67, 0, 0, 718, 719, 3, 94, 47, 0, 719, 99, 1, 0, 0, 0, 720, 721, 5, 61, 0, 0, 721, 726, 3, 102, 51, 0, 722, 723, 5, 14, 0, 0, 723, 725, 3, 102, 51, 0, 724, 722, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 101, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 729, 732, 3, 192, 96, 0, 730, 731, 5, 70, 0, 0, 731, 733, 3, 230, 115, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 735, 5, 72, 0, 0, 735, 737, 5, 73, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 739, 5, 71, 0, 0, 739, 741, 3, 192, 96, 0, 740, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 743, 5, 69, 0, 0, 743, 744, 3, 94, 47, 0, 744, 103, 1, 0, 0, 0, 745, 746, 5, 62, 0, 0, 746, 751, 3, 106, 53, 0, 747, 748, 5, 14, 0, 0, 748, 750, 3, 106, 53, 0, 749, 747, 1, 0, 0, 0, 750, 753, 1, 0, 0, 0, 751, 749, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 105, 1, 0, 0, 0, 753, 751, 1, 0, 0, 0, 754, 757, 3, 192, 96, 0, 755, 756, 5, 70, 0, 0, 756, 758, 3, 230, 115, 0, 757, 755, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 5, 6, 0, 0, 760, 761, 3, 94, 47, 0, 761, 107, 1, 0, 0, 0, 762, 763, 5, 63, 0, 0, 763, 764, 3, 94, 47, 0, 764, 109, 1, 0, 0, 0, 765, 766, 5, 64, 0, 0, 766, 767, 5, 65, 0, 0, 767, 772, 3, 112, 56, 0, 768, 769, 5, 14, 0, 0, 769, 771, 3, 112, 56, 0, 770, 768, 1, 0, 0, 0, 771, 774, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 111, 1, 0, 0, 0, 774, 772, 1, 0, 0, 0, 775, 782, 3, 192, 96, 0, 776, 777, 5, 70, 0, 0, 777, 779, 3, 230, 115, 0, 778, 776, 1, 0, 0, 0, 778, 779, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 781, 5, 6, 0, 0, 781, 783, 3, 94, 47, 0, 782, 778, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 785, 5, 81, 0, 0, 785, 787, 3, 248, 124, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 113, 1, 0, 0, 0, 788, 789, 5, 66, 0, 0, 789, 794, 5, 65, 0, 0, 790, 791, 5, 75, 0, 0, 791, 792, 5, 66, 0, 0, 792, 794, 5, 65, 0, 0, 793, 788, 1, 0, 0, 0, 793, 790, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 800, 3, 116, 58, 0, 796, 797, 5, 14, 0, 0, 797, 799, 3, 116, 58, 0, 798, 796, 1, 0, 0, 0, 799, 802, 1, 0, 0, 0, 800, 798, 1, 0, 0, 0, 800, 801, 1, 0, 0, 0, 801, 115, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 803, 806, 3, 94, 47, 0, 804, 807, 5, 76, 0, 0, 805, 807, 5, 77, 0, 0, 806, 804, 1, 0, 0, 0, 806, 805, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 813, 1, 0, 0, 0, 808, 811, 5, 73, 0, 0, 809, 812, 5, 82, 0, 0, 810, 812, 5, 83, 0, 0, 811, 809, 1, 0, 0, 0, 811, 810, 1, 0, 0, 0, 812, 814, 1, 0, 0, 0, 813, 808, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 817, 1, 0, 0, 0, 815, 816, 5, 81, 0, 0, 816, 818, 3, 248, 124, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 117, 1, 0, 0, 0, 819, 820, 5, 74, 0, 0, 820, 821, 3, 192, 96, 0, 821, 119, 1, 0, 0, 0, 822, 825, 5, 78, 0, 0, 823, 825, 5, 79, 0, 0, 824, 822, 1, 0, 0, 0, 824, 823, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 831, 3, 122, 61, 0, 827, 828, 5, 14, 0, 0, 828, 830, 3, 122, 61, 0, 829, 827, 1, 0, 0, 0, 830, 833, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 834, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 834, 835, 5, 80, 0, 0, 835, 836, 3, 94, 47, 0, 836, 121, 1, 0, 0, 0, 837, 840, 3, 192, 96, 0, 838, 839, 5, 70, 0, 0, 839, 841, 3, 230, 115, 0, 840, 838, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 843, 5, 69, 0, 0, 843, 844, 3, 94, 47, 0, 844, 123, 1, 0, 0, 0, 845, 846, 5, 84, 0, 0, 846, 847, 5, 9, 0, 0, 847, 848, 3, 92, 46, 0, 848, 850, 5, 10, 0, 0, 849, 851, 3, 126, 63, 0, 850, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 850, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 5, 88, 0, 0, 855, 856, 5, 67, 0, 0, 856, 857, 3, 94, 47, 0, 857, 125, 1, 0, 0, 0, 858, 859, 5, 85, 0, 0, 859, 861, 3, 94, 47, 0, 860, 858, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 860, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 864, 1, 0, 0, 0, 864, 865, 5, 67, 0, 0, 865, 866, 3, 94, 47, 0, 866, 127, 1, 0, 0, 0, 867, 868, 5, 91, 0, 0, 868, 869, 5, 9, 0, 0, 869, 870, 3, 92, 46, 0, 870, 872, 5, 10, 0, 0, 871, 873, 3, 130, 65, 0, 872, 871, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 872, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 5, 88, 0, 0, 877, 879, 3, 192, 96, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 881, 5, 67, 0, 0, 881, 882, 3, 94, 47, 0, 882, 129, 1, 0, 0, 0, 883, 887, 5, 85, 0, 0, 884, 885, 3, 192, 96, 0, 885, 886, 5, 70, 0, 0, 886, 888, 1, 0, 0, 0, 887, 884, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 894, 3, 230, 115, 0, 890, 891, 5, 12, 0, 0, 891, 893, 3, 230, 115, 0, 892, 890, 1, 0, 0, 0, 893, 896, 1, 0, 0, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 897, 1, 0, 0, 0, 896, 894, 1, 0, 0, 0, 897, 898, 5, 67, 0, 0, 898, 899, 3, 94, 47, 0, 899, 131, 1, 0, 0, 0, 900, 901, 5, 68, 0, 0, 901, 902, 5, 9, 0, 0, 902, 903, 3, 92, 46, 0, 903, 904, 5, 10, 0, 0, 904, 905, 5, 89, 0, 0, 905, 906, 3, 94, 47, 0, 906, 907, 5, 90, 0, 0, 907, 908, 3, 94, 47, 0, 908, 133, 1, 0, 0, 0, 909, 910, 5, 86, 0, 0, 910, 911, 5, 7, 0, 0, 911, 912, 3, 92, 46, 0, 912, 914, 5, 8, 0, 0, 913, 915, 3, 136, 68, 0, 914, 913, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 135, 1, 0, 0, 0, 918, 921, 5, 87, 0, 0, 919, 922, 5, 11, 0, 0, 920, 922, 3, 72, 36, 0, 921, 919, 1, 0, 0, 0, 921, 920, 1, 0, 0, 0, 922, 930, 1, 0, 0, 0, 923, 926, 5, 12, 0, 0, 924, 927, 5, 11, 0, 0, 925, 927, 3, 72, 36, 0, 926, 924, 1, 0, 0, 0, 926, 925, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 923, 1, 0, 0, 0, 929, 932, 1, 0, 0, 0, 930, 928, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 933, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 933, 934, 5, 7, 0, 0, 934, 935, 3, 92, 46, 0, 935, 936, 5, 8, 0, 0, 936, 137, 1, 0, 0, 0, 937, 942, 3, 140, 70, 0, 938, 939, 5, 92, 0, 0, 939, 941, 3, 140, 70, 0, 940, 938, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 139, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 950, 3, 142, 71, 0, 946, 947, 5, 93, 0, 0, 947, 949, 3, 142, 71, 0, 948, 946, 1, 0, 0, 0, 949, 952, 1, 0, 0, 0, 950, 948, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 141, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 953, 955, 5, 94, 0, 0, 954, 953, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 956, 957, 3, 144, 72, 0, 957, 143, 1, 0, 0, 0, 958, 961, 3, 146, 73, 0, 959, 960, 7, 3, 0, 0, 960, 962, 3, 146, 73, 0, 961, 959, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 145, 1, 0, 0, 0, 963, 968, 3, 148, 74, 0, 964, 965, 5, 47, 0, 0, 965, 967, 3, 148, 74, 0, 966, 964, 1, 0, 0, 0, 967, 970, 1, 0, 0, 0, 968, 966, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 969, 147, 1, 0, 0, 0, 970, 968, 1, 0, 0, 0, 971, 974, 3, 150, 75, 0, 972, 973, 5, 95, 0, 0, 973, 975, 3, 150, 75, 0, 974, 972, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 149, 1, 0, 0, 0, 976, 981, 3, 152, 76, 0, 977, 978, 7, 4, 0, 0, 978, 980, 3, 152, 76, 0, 979, 977, 1, 0, 0, 0, 980, 983, 1, 0, 0, 0, 981, 979, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 151, 1, 0, 0, 0, 983, 981, 1, 0, 0, 0, 984, 989, 3, 154, 77, 0, 985, 986, 7, 5, 0, 0, 986, 988, 3, 154, 77, 0, 987, 985, 1, 0, 0, 0, 988, 991, 1, 0, 0, 0, 989, 987, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 153, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 992, 996, 3, 156, 78, 0, 993, 994, 5, 96, 0, 0, 994, 995, 5, 97, 0, 0, 995, 997, 3, 230, 115, 0, 996, 993, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 155, 1, 0, 0, 0, 998, 1002, 3, 158, 79, 0, 999, 1000, 5, 99, 0, 0, 1000, 1001, 5, 98, 0, 0, 1001, 1003, 3, 230, 115, 0, 1002, 999, 1, 0, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 157, 1, 0, 0, 0, 1004, 1008, 3, 160, 80, 0, 1005, 1006, 5, 100, 0, 0, 1006, 1007, 5, 70, 0, 0, 1007, 1009, 3, 230, 115, 0, 1008, 1005, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 159, 1, 0, 0, 0, 1010, 1014, 3, 162, 81, 0, 1011, 1012, 5, 102, 0, 0, 1012, 1013, 5, 70, 0, 0, 1013, 1015, 3, 242, 121, 0, 1014, 1011, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 161, 1, 0, 0, 0, 1016, 1020, 3, 164, 82, 0, 1017, 1018, 5, 101, 0, 0, 1018, 1019, 5, 70, 0, 0, 1019, 1021, 3, 242, 121, 0, 1020, 1017, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 163, 1, 0, 0, 0, 1022, 1031, 3, 168, 84, 0, 1023, 1024, 5, 4, 0, 0, 1024, 1025, 5, 45, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 3, 166, 83, 0, 1027, 1028, 3, 204, 102, 0, 1028, 1030, 1, 0, 0, 0, 1029, 1023, 1, 0, 0, 0, 1030, 1033, 1, 0, 0, 0, 1031, 1029, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 165, 1, 0, 0, 0, 1033, 1031, 1, 0, 0, 0, 1034, 1038, 3, 72, 36, 0, 1035, 1038, 3, 192, 96, 0, 1036, 1038, 3, 194, 97, 0, 1037, 1034, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 167, 1, 0, 0, 0, 1039, 1041, 7, 4, 0, 0, 1040, 1039, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1045, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1045, 1046, 3, 170, 85, 0, 1046, 169, 1, 0, 0, 0, 1047, 1051, 3, 176, 88, 0, 1048, 1051, 3, 172, 86, 0, 1049, 1051, 3, 174, 87, 0, 1050, 1047, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1049, 1, 0, 0, 0, 1051, 171, 1, 0, 0, 0, 1052, 1053, 5, 109, 0, 0, 1053, 1054, 5, 108, 0, 0, 1054, 1055, 3, 230, 115, 0, 1055, 1056, 5, 7, 0, 0, 1056, 1057, 3, 92, 46, 0, 1057, 1058, 5, 8, 0, 0, 1058, 173, 1, 0, 0, 0, 1059, 1060, 5, 110, 0, 0, 1060, 1061, 5, 108, 0, 0, 1061, 1062, 3, 230, 115, 0, 1062, 1063, 5, 7, 0, 0, 1063, 1064, 3, 92, 46, 0, 1064, 1065, 5, 8, 0, 0, 1065, 175, 1, 0, 0, 0, 1066, 1071, 3, 178, 89, 0, 1067, 1068, 5, 53, 0, 0, 1068, 1070, 3, 178, 89, 0, 1069, 1067, 1, 0, 0, 0, 1070, 1073, 1, 0, 0, 0, 1071, 1069, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 177, 1, 0, 0, 0, 1073, 1071, 1, 0, 0, 0, 1074, 1082, 3, 188, 94, 0, 1075, 1081, 3, 180, 90, 0, 1076, 1081, 3, 184, 92, 0, 1077, 1081, 3, 186, 93, 0, 1078, 1081, 3, 182, 91, 0, 1079, 1081, 3, 204, 102, 0, 1080, 1075, 1, 0, 0, 0, 1080, 1076, 1, 0, 0, 0, 1080, 1077, 1, 0, 0, 0, 1080, 1078, 1, 0, 0, 0, 1080, 1079, 1, 0, 0, 0, 1081, 1084, 1, 0, 0, 0, 1082, 1080, 1, 0, 0, 0, 1082, 1083, 1, 0, 0, 0, 1083, 179, 1, 0, 0, 0, 1084, 1082, 1, 0, 0, 0, 1085, 1086, 5, 54, 0, 0, 1086, 1087, 5, 54, 0, 0, 1087, 1088, 3, 92, 46, 0, 1088, 1089, 5, 55, 0, 0, 1089, 1090, 5, 55, 0, 0, 1090, 181, 1, 0, 0, 0, 1091, 1092, 5, 54, 0, 0, 1092, 1093, 5, 55, 0, 0, 1093, 183, 1, 0, 0, 0, 1094, 1095, 5, 54, 0, 0, 1095, 1096, 3, 92, 46, 0, 1096, 1097, 5, 55, 0, 0, 1097, 185, 1, 0, 0, 0, 1098, 1105, 5, 56, 0, 0, 1099, 1106, 3, 252, 126, 0, 1100, 1106, 3, 250, 125, 0, 1101, 1106, 5, 143, 0, 0, 1102, 1106, 3, 194, 97, 0, 1103, 1106, 3, 192, 96, 0, 1104, 1106, 3, 196, 98, 0, 1105, 1099, 1, 0, 0, 0, 1105, 1100, 1, 0, 0, 0, 1105, 1101, 1, 0, 0, 0, 1105, 1102, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1105, 1104, 1, 0, 0, 0, 1106, 187, 1, 0, 0, 0, 1107, 1123, 5, 136, 0, 0, 1108, 1123, 5, 106, 0, 0, 1109, 1123, 5, 107, 0, 0, 1110, 1123, 5, 137, 0, 0, 1111, 1123, 3, 250, 125, 0, 1112, 1123, 3, 192, 96, 0, 1113, 1123, 3, 194, 97, 0, 1114, 1123, 3, 196, 98, 0, 1115, 1123, 3, 232, 116, 0, 1116, 1123, 3, 202, 101, 0, 1117, 1123, 3, 198, 99, 0, 1118, 1123, 3, 200, 100, 0, 1119, 1123, 3, 246, 123, 0, 1120, 1123, 3, 208, 104, 0, 1121, 1123, 3, 190, 95, 0, 1122, 1107, 1, 0, 0, 0, 1122, 1108, 1, 0, 0, 0, 1122, 1109, 1, 0, 0, 0, 1122, 1110, 1, 0, 0, 0, 1122, 1111, 1, 0, 0, 0, 1122, 1112, 1, 0, 0, 0, 1122, 1113, 1, 0, 0, 0, 1122, 1114, 1, 0, 0, 0, 1122, 1115, 1, 0, 0, 0, 1122, 1116, 1, 0, 0, 0, 1122, 1117, 1, 0, 0, 0, 1122, 1118, 1, 0, 0, 0, 1122, 1119, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1122, 1121, 1, 0, 0, 0, 1123, 189, 1, 0, 0, 0, 1124, 1125, 5, 7, 0, 0, 1125, 1126, 3, 14, 7, 0, 1126, 1127, 5, 8, 0, 0, 1127, 191, 1, 0, 0, 0, 1128, 1129, 5, 5, 0, 0, 1129, 1130, 3, 72, 36, 0, 1130, 193, 1, 0, 0, 0, 1131, 1133, 5, 9, 0, 0, 1132, 1134, 3, 92, 46, 0, 1133, 1132, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 10, 0, 0, 1136, 195, 1, 0, 0, 0, 1137, 1138, 5, 57, 0, 0, 1138, 197, 1, 0, 0, 0, 1139, 1140, 5, 16, 0, 0, 1140, 1141, 5, 7, 0, 0, 1141, 1142, 3, 92, 46, 0, 1142, 1143, 5, 8, 0, 0, 1143, 199, 1, 0, 0, 0, 1144, 1145, 5, 105, 0, 0, 1145, 1146, 5, 7, 0, 0, 1146, 1147, 3, 92, 46, 0, 1147, 1148, 5, 8, 0, 0, 1148, 201, 1, 0, 0, 0, 1149, 1150, 3, 72, 36, 0, 1150, 1151, 3, 204, 102, 0, 1151, 203, 1, 0, 0, 0, 1152, 1159, 5, 9, 0, 0, 1153, 1155, 3, 206, 103, 0, 1154, 1156, 5, 14, 0, 0, 1155, 1154, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1153, 1, 0, 0, 0, 1158, 1161, 1, 0, 0, 0, 1159, 1157, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1162, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1162, 1163, 5, 10, 0, 0, 1163, 205, 1, 0, 0, 0, 1164, 1167, 3, 94, 47, 0, 1165, 1167, 5, 135, 0, 0, 1166, 1164, 1, 0, 0, 0, 1166, 1165, 1, 0, 0, 0, 1167, 207, 1, 0, 0, 0, 1168, 1171, 3, 210, 105, 0, 1169, 1171, 3, 212, 106, 0, 1170, 1168, 1, 0, 0, 0, 1170, 1169, 1, 0, 0, 0, 1171, 209, 1, 0, 0, 0, 1172, 1173, 3, 72, 36, 0, 1173, 1174, 5, 58, 0, 0, 1174, 1175, 5, 137, 0, 0, 1175, 211, 1, 0, 0, 0, 1176, 1177, 3, 50, 25, 0, 1177, 1178, 5, 31, 0, 0, 1178, 1180, 5, 9, 0, 0, 1179, 1181, 3, 88, 44, 0, 1180, 1179, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1185, 5, 10, 0, 0, 1183, 1184, 5, 70, 0, 0, 1184, 1186, 3, 230, 115, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 1188, 5, 7, 0, 0, 1188, 1189, 3, 16, 8, 0, 1189, 1190, 5, 8, 0, 0, 1190, 213, 1, 0, 0, 0, 1191, 1192, 5, 115, 0, 0, 1192, 1193, 5, 126, 0, 0, 1193, 1194, 3, 94, 47, 0, 1194, 1195, 5, 122, 0, 0, 1195, 1199, 3, 94, 47, 0, 1196, 1197, 5, 71, 0, 0, 1197, 1198, 5, 125, 0, 0, 1198, 1200, 3, 94, 47, 0, 1199, 1196, 1, 0, 0, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1215, 1, 0, 0, 0, 1201, 1202, 5, 115, 0, 0, 1202, 1203, 5, 126, 0, 0, 1203, 1208, 3, 244, 122, 0, 1204, 1205, 5, 14, 0, 0, 1205, 1207, 3, 244, 122, 0, 1206, 1204, 1, 0, 0, 0, 1207, 1210, 1, 0, 0, 0, 1208, 1206, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1211, 1, 0, 0, 0, 1210, 1208, 1, 0, 0, 0, 1211, 1212, 5, 122, 0, 0, 1212, 1213, 3, 94, 47, 0, 1213, 1215, 1, 0, 0, 0, 1214, 1191, 1, 0, 0, 0, 1214, 1201, 1, 0, 0, 0, 1215, 215, 1, 0, 0, 0, 1216, 1217, 5, 116, 0, 0, 1217, 1218, 5, 126, 0, 0, 1218, 1219, 3, 226, 113, 0, 1219, 217, 1, 0, 0, 0, 1220, 1221, 5, 117, 0, 0, 1221, 1222, 5, 126, 0, 0, 1222, 1223, 3, 226, 113, 0, 1223, 1224, 5, 70, 0, 0, 1224, 1225, 3, 94, 47, 0, 1225, 219, 1, 0, 0, 0, 1226, 1227, 5, 118, 0, 0, 1227, 1228, 5, 123, 0, 0, 1228, 1229, 5, 97, 0, 0, 1229, 1230, 5, 126, 0, 0, 1230, 1231, 3, 226, 113, 0, 1231, 1232, 5, 124, 0, 0, 1232, 1233, 3, 94, 47, 0, 1233, 221, 1, 0, 0, 0, 1234, 1235, 5, 119, 0, 0, 1235, 1240, 3, 228, 114, 0, 1236, 1237, 5, 14, 0, 0, 1237, 1239, 3, 228, 114, 0, 1238, 1236, 1, 0, 0, 0, 1239, 1242, 1, 0, 0, 0, 1240, 1238, 1, 0, 0, 0, 1240, 1241, 1, 0, 0, 0, 1241, 1243, 1, 0, 0, 0, 1242, 1240, 1, 0, 0, 0, 1243, 1244, 5, 120, 0, 0, 1244, 1245, 3, 94, 47, 0, 1245, 1246, 5, 67, 0, 0, 1246, 1247, 3, 94, 47, 0, 1247, 223, 1, 0, 0, 0, 1248, 1249, 5, 121, 0, 0, 1249, 1250, 5, 126, 0, 0, 1250, 1251, 3, 94, 47, 0, 1251, 1252, 5, 122, 0, 0, 1252, 1253, 3, 94, 47, 0, 1253, 225, 1, 0, 0, 0, 1254, 1257, 3, 188, 94, 0, 1255, 1258, 3, 180, 90, 0, 1256, 1258, 3, 186, 93, 0, 1257, 1255, 1, 0, 0, 0, 1257, 1256, 1, 0, 0, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 227, 1, 0, 0, 0, 1261, 1262, 3, 192, 96, 0, 1262, 1263, 5, 6, 0, 0, 1263, 1264, 3, 94, 47, 0, 1264, 229, 1, 0, 0, 0, 1265, 1266, 5, 9, 0, 0, 1266, 1274, 5, 10, 0, 0, 1267, 1271, 3, 234, 117, 0, 1268, 1272, 5, 135, 0, 0, 1269, 1272, 5, 11, 0, 0, 1270, 1272, 5, 48, 0, 0, 1271, 1268, 1, 0, 0, 0, 1271, 1269, 1, 0, 0, 0, 1271, 1270, 1, 0, 0, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1274, 1, 0, 0, 0, 1273, 1265, 1, 0, 0, 0, 1273, 1267, 1, 0, 0, 0, 1274, 231, 1, 0, 0, 0, 1275, 1284, 5, 7, 0, 0, 1276, 1281, 3, 244, 122, 0, 1277, 1278, 5, 14, 0, 0, 1278, 1280, 3, 244, 122, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1283, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1284, 1276, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1292, 5, 8, 0, 0, 1287, 1288, 5, 59, 0, 0, 1288, 1289, 3, 92, 46, 0, 1289, 1290, 5, 60, 0, 0, 1290, 1292, 1, 0, 0, 0, 1291, 1275, 1, 0, 0, 0, 1291, 1287, 1, 0, 0, 0, 1292, 233, 1, 0, 0, 0, 1293, 1297, 3, 72, 36, 0, 1294, 1297, 5, 136, 0, 0, 1295, 1297, 3, 236, 118, 0, 1296, 1293, 1, 0, 0, 0, 1296, 1294, 1, 0, 0, 0, 1296, 1295, 1, 0, 0, 0, 1297, 235, 1, 0, 0, 0, 1298, 1301, 3, 238, 119, 0, 1299, 1301, 3, 240, 120, 0, 1300, 1298, 1, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 237, 1, 0, 0, 0, 1302, 1303, 5, 31, 0, 0, 1303, 1304, 5, 9, 0, 0, 1304, 1305, 5, 11, 0, 0, 1305, 1306, 5, 10, 0, 0, 1306, 239, 1, 0, 0, 0, 1307, 1308, 5, 31, 0, 0, 1308, 1317, 5, 9, 0, 0, 1309, 1314, 3, 230, 115, 0, 1310, 1311, 5, 14, 0, 0, 1311, 1313, 3, 230, 115, 0, 1312, 1310, 1, 0, 0, 0, 1313, 1316, 1, 0, 0, 0, 1314, 1312, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1318, 1, 0, 0, 0, 1316, 1314, 1, 0, 0, 0, 1317, 1309, 1, 0, 0, 0, 1317, 1318, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 5, 10, 0, 0, 1320, 1321, 5, 70, 0, 0, 1321, 1322, 3, 230, 115, 0, 1322, 241, 1, 0, 0, 0, 1323, 1325, 3, 234, 117, 0, 1324, 1326, 5, 135, 0, 0, 1325, 1324, 1, 0, 0, 0, 1325, 1326, 1, 0, 0, 0, 1326, 243, 1, 0, 0, 0, 1327, 1330, 3, 94, 47, 0, 1328, 1330, 5, 143, 0, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 7, 6, 0, 0, 1332, 1333, 3, 94, 47, 0, 1333, 245, 1, 0, 0, 0, 1334, 1336, 5, 54, 0, 0, 1335, 1337, 3, 92, 46, 0, 1336, 1335, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 1, 0, 0, 0, 1338, 1339, 5, 55, 0, 0, 1339, 247, 1, 0, 0, 0, 1340, 1341, 3, 250, 125, 0, 1341, 249, 1, 0, 0, 0, 1342, 1343, 5, 134, 0, 0, 1343, 251, 1, 0, 0, 0, 1344, 1345, 7, 7, 0, 0, 1345, 253, 1, 0, 0, 0, 133, 262, 266, 282, 288, 296, 304, 312, 327, 357, 365, 367, 389, 399, 409, 414, 419, 423, 435, 439, 448, 455, 469, 473, 476, 481, 491, 499, 503, 515, 527, 549, 557, 562, 565, 569, 578, 587, 590, 598, 605, 607, 614, 621, 623, 631, 636, 643, 650, 660, 667, 674, 681, 690, 700, 704, 712, 714, 726, 732, 736, 740, 751, 757, 772, 778, 782, 786, 793, 800, 806, 811, 813, 817, 824, 831, 840, 852, 862, 874, 878, 887, 894, 916, 921, 926, 930, 942, 950, 954, 961, 968, 974, 981, 989, 996, 1002, 1008, 1014, 1020, 1031, 1037, 1042, 1050, 1071, 1080, 1082, 1105, 1122, 1133, 1155, 1159, 1166, 1170, 1180, 1185, 1199, 1208, 1214, 1240, 1257, 1259, 1271, 1273, 1281, 1284, 1291, 1296, 1300, 1314, 1317, 1325, 1329, 1336]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.tokens b/src/main/java/org/rumbledb/parser/Jsoniq.tokens
index 74d3a280cf..90fc814284 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens
@@ -121,27 +121,28 @@ Kmodify=120
Kappend=121
Kinto=122
Kvalue=123
-Kjson=124
-Kwith=125
-Kposition=126
-Kbreak=127
-Kloop=128
-Kcontinue=129
-Kexit=130
-Kreturning=131
-Kwhile=132
-STRING=133
-ArgumentPlaceholder=134
-NullLiteral=135
-Literal=136
-NumericLiteral=137
-IntegerLiteral=138
-DecimalLiteral=139
-DoubleLiteral=140
-WS=141
-NCName=142
-XQComment=143
-ContentChar=144
+Kwith=124
+Kposition=125
+Kjson=126
+Kupdating=127
+Kbreak=128
+Kloop=129
+Kcontinue=130
+Kexit=131
+Kreturning=132
+Kwhile=133
+STRING=134
+ArgumentPlaceholder=135
+NullLiteral=136
+Literal=137
+NumericLiteral=138
+IntegerLiteral=139
+DecimalLiteral=140
+DoubleLiteral=141
+WS=142
+NCName=143
+XQComment=144
+ContentChar=145
';'=1
'module'=2
'namespace'=3
@@ -265,14 +266,15 @@ ContentChar=144
'append'=121
'into'=122
'value'=123
-'json'=124
-'with'=125
-'position'=126
-'break'=127
-'loop'=128
-'continue'=129
-'exit'=130
-'returning'=131
-'while'=132
-'?'=134
-'null'=135
+'with'=124
+'position'=125
+'json'=126
+'updating'=127
+'break'=128
+'loop'=129
+'continue'=130
+'exit'=131
+'returning'=132
+'while'=133
+'?'=135
+'null'=136
diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
index 6582d2c9ec..6be24f3536 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
@@ -123,9 +123,10 @@ null
'append'
'into'
'value'
-'json'
'with'
'position'
+'json'
+'updating'
'break'
'loop'
'continue'
@@ -270,9 +271,10 @@ Kmodify
Kappend
Kinto
Kvalue
-Kjson
Kwith
Kposition
+Kjson
+Kupdating
Kbreak
Kloop
Kcontinue
@@ -416,9 +418,10 @@ Kmodify
Kappend
Kinto
Kvalue
-Kjson
Kwith
Kposition
+Kjson
+Kupdating
Kbreak
Kloop
Kcontinue
@@ -452,4 +455,4 @@ mode names:
DEFAULT_MODE
atn:
-[4, 0, 144, 1196, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 5, 132, 1082, 8, 132, 10, 132, 12, 132, 1085, 9, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 3, 133, 1092, 8, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 3, 139, 1114, 8, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1123, 8, 141, 10, 141, 12, 141, 1126, 9, 141, 3, 141, 1128, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1135, 8, 142, 10, 142, 12, 142, 1138, 9, 142, 3, 142, 1140, 8, 142, 3, 142, 1142, 8, 142, 1, 142, 1, 142, 3, 142, 1146, 8, 142, 1, 142, 1, 142, 1, 143, 4, 143, 1151, 8, 143, 11, 143, 12, 143, 1152, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 5, 145, 1161, 8, 145, 10, 145, 12, 145, 1164, 9, 145, 1, 146, 3, 146, 1167, 8, 146, 1, 147, 1, 147, 3, 147, 1171, 8, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 5, 148, 1181, 8, 148, 10, 148, 12, 148, 1184, 9, 148, 1, 148, 4, 148, 1187, 8, 148, 11, 148, 12, 148, 1188, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 0, 0, 150, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 0, 269, 0, 271, 0, 273, 134, 275, 135, 277, 136, 279, 137, 281, 138, 283, 139, 285, 140, 287, 0, 289, 141, 291, 142, 293, 0, 295, 0, 297, 143, 299, 144, 1, 0, 13, 2, 0, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 9, 10, 13, 13, 32, 32, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 45, 48, 57, 183, 183, 768, 879, 8255, 8256, 1, 0, 58, 58, 1, 0, 41, 41, 2, 0, 40, 40, 58, 58, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 1208, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 1, 301, 1, 0, 0, 0, 3, 303, 1, 0, 0, 0, 5, 310, 1, 0, 0, 0, 7, 320, 1, 0, 0, 0, 9, 322, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 13, 327, 1, 0, 0, 0, 15, 329, 1, 0, 0, 0, 17, 331, 1, 0, 0, 0, 19, 333, 1, 0, 0, 0, 21, 335, 1, 0, 0, 0, 23, 337, 1, 0, 0, 0, 25, 339, 1, 0, 0, 0, 27, 341, 1, 0, 0, 0, 29, 343, 1, 0, 0, 0, 31, 352, 1, 0, 0, 0, 33, 360, 1, 0, 0, 0, 35, 375, 1, 0, 0, 0, 37, 377, 1, 0, 0, 0, 39, 395, 1, 0, 0, 0, 41, 414, 1, 0, 0, 0, 43, 423, 1, 0, 0, 0, 45, 434, 1, 0, 0, 0, 47, 438, 1, 0, 0, 0, 49, 446, 1, 0, 0, 0, 51, 456, 1, 0, 0, 0, 53, 467, 1, 0, 0, 0, 55, 473, 1, 0, 0, 0, 57, 491, 1, 0, 0, 0, 59, 498, 1, 0, 0, 0, 61, 507, 1, 0, 0, 0, 63, 516, 1, 0, 0, 0, 65, 523, 1, 0, 0, 0, 67, 531, 1, 0, 0, 0, 69, 539, 1, 0, 0, 0, 71, 546, 1, 0, 0, 0, 73, 549, 1, 0, 0, 0, 75, 552, 1, 0, 0, 0, 77, 555, 1, 0, 0, 0, 79, 558, 1, 0, 0, 0, 81, 561, 1, 0, 0, 0, 83, 564, 1, 0, 0, 0, 85, 567, 1, 0, 0, 0, 87, 569, 1, 0, 0, 0, 89, 572, 1, 0, 0, 0, 91, 574, 1, 0, 0, 0, 93, 577, 1, 0, 0, 0, 95, 580, 1, 0, 0, 0, 97, 582, 1, 0, 0, 0, 99, 584, 1, 0, 0, 0, 101, 588, 1, 0, 0, 0, 103, 593, 1, 0, 0, 0, 105, 597, 1, 0, 0, 0, 107, 599, 1, 0, 0, 0, 109, 601, 1, 0, 0, 0, 111, 603, 1, 0, 0, 0, 113, 605, 1, 0, 0, 0, 115, 608, 1, 0, 0, 0, 117, 610, 1, 0, 0, 0, 119, 613, 1, 0, 0, 0, 121, 616, 1, 0, 0, 0, 123, 620, 1, 0, 0, 0, 125, 624, 1, 0, 0, 0, 127, 630, 1, 0, 0, 0, 129, 636, 1, 0, 0, 0, 131, 639, 1, 0, 0, 0, 133, 645, 1, 0, 0, 0, 135, 652, 1, 0, 0, 0, 137, 655, 1, 0, 0, 0, 139, 658, 1, 0, 0, 0, 141, 661, 1, 0, 0, 0, 143, 664, 1, 0, 0, 0, 145, 673, 1, 0, 0, 0, 147, 679, 1, 0, 0, 0, 149, 685, 1, 0, 0, 0, 151, 692, 1, 0, 0, 0, 153, 702, 1, 0, 0, 0, 155, 713, 1, 0, 0, 0, 157, 718, 1, 0, 0, 0, 159, 724, 1, 0, 0, 0, 161, 734, 1, 0, 0, 0, 163, 744, 1, 0, 0, 0, 165, 753, 1, 0, 0, 0, 167, 759, 1, 0, 0, 0, 169, 766, 1, 0, 0, 0, 171, 771, 1, 0, 0, 0, 173, 775, 1, 0, 0, 0, 175, 781, 1, 0, 0, 0, 177, 789, 1, 0, 0, 0, 179, 794, 1, 0, 0, 0, 181, 799, 1, 0, 0, 0, 183, 810, 1, 0, 0, 0, 185, 813, 1, 0, 0, 0, 187, 817, 1, 0, 0, 0, 189, 821, 1, 0, 0, 0, 191, 824, 1, 0, 0, 0, 193, 833, 1, 0, 0, 0, 195, 836, 1, 0, 0, 0, 197, 847, 1, 0, 0, 0, 199, 850, 1, 0, 0, 0, 201, 856, 1, 0, 0, 0, 203, 861, 1, 0, 0, 0, 205, 870, 1, 0, 0, 0, 207, 878, 1, 0, 0, 0, 209, 885, 1, 0, 0, 0, 211, 895, 1, 0, 0, 0, 213, 900, 1, 0, 0, 0, 215, 906, 1, 0, 0, 0, 217, 911, 1, 0, 0, 0, 219, 920, 1, 0, 0, 0, 221, 929, 1, 0, 0, 0, 223, 937, 1, 0, 0, 0, 225, 945, 1, 0, 0, 0, 227, 950, 1, 0, 0, 0, 229, 959, 1, 0, 0, 0, 231, 966, 1, 0, 0, 0, 233, 973, 1, 0, 0, 0, 235, 980, 1, 0, 0, 0, 237, 988, 1, 0, 0, 0, 239, 993, 1, 0, 0, 0, 241, 1000, 1, 0, 0, 0, 243, 1007, 1, 0, 0, 0, 245, 1012, 1, 0, 0, 0, 247, 1018, 1, 0, 0, 0, 249, 1023, 1, 0, 0, 0, 251, 1028, 1, 0, 0, 0, 253, 1037, 1, 0, 0, 0, 255, 1043, 1, 0, 0, 0, 257, 1048, 1, 0, 0, 0, 259, 1057, 1, 0, 0, 0, 261, 1062, 1, 0, 0, 0, 263, 1072, 1, 0, 0, 0, 265, 1078, 1, 0, 0, 0, 267, 1088, 1, 0, 0, 0, 269, 1093, 1, 0, 0, 0, 271, 1099, 1, 0, 0, 0, 273, 1101, 1, 0, 0, 0, 275, 1103, 1, 0, 0, 0, 277, 1108, 1, 0, 0, 0, 279, 1113, 1, 0, 0, 0, 281, 1115, 1, 0, 0, 0, 283, 1127, 1, 0, 0, 0, 285, 1141, 1, 0, 0, 0, 287, 1150, 1, 0, 0, 0, 289, 1154, 1, 0, 0, 0, 291, 1158, 1, 0, 0, 0, 293, 1166, 1, 0, 0, 0, 295, 1170, 1, 0, 0, 0, 297, 1172, 1, 0, 0, 0, 299, 1194, 1, 0, 0, 0, 301, 302, 5, 59, 0, 0, 302, 2, 1, 0, 0, 0, 303, 304, 5, 109, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 100, 0, 0, 306, 307, 5, 117, 0, 0, 307, 308, 5, 108, 0, 0, 308, 309, 5, 101, 0, 0, 309, 4, 1, 0, 0, 0, 310, 311, 5, 110, 0, 0, 311, 312, 5, 97, 0, 0, 312, 313, 5, 109, 0, 0, 313, 314, 5, 101, 0, 0, 314, 315, 5, 115, 0, 0, 315, 316, 5, 112, 0, 0, 316, 317, 5, 97, 0, 0, 317, 318, 5, 99, 0, 0, 318, 319, 5, 101, 0, 0, 319, 6, 1, 0, 0, 0, 320, 321, 5, 61, 0, 0, 321, 8, 1, 0, 0, 0, 322, 323, 5, 36, 0, 0, 323, 10, 1, 0, 0, 0, 324, 325, 5, 58, 0, 0, 325, 326, 5, 61, 0, 0, 326, 12, 1, 0, 0, 0, 327, 328, 5, 123, 0, 0, 328, 14, 1, 0, 0, 0, 329, 330, 5, 125, 0, 0, 330, 16, 1, 0, 0, 0, 331, 332, 5, 40, 0, 0, 332, 18, 1, 0, 0, 0, 333, 334, 5, 41, 0, 0, 334, 20, 1, 0, 0, 0, 335, 336, 5, 42, 0, 0, 336, 22, 1, 0, 0, 0, 337, 338, 5, 124, 0, 0, 338, 24, 1, 0, 0, 0, 339, 340, 5, 37, 0, 0, 340, 26, 1, 0, 0, 0, 341, 342, 5, 44, 0, 0, 342, 28, 1, 0, 0, 0, 343, 344, 5, 111, 0, 0, 344, 345, 5, 114, 0, 0, 345, 346, 5, 100, 0, 0, 346, 347, 5, 101, 0, 0, 347, 348, 5, 114, 0, 0, 348, 349, 5, 105, 0, 0, 349, 350, 5, 110, 0, 0, 350, 351, 5, 103, 0, 0, 351, 30, 1, 0, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 114, 0, 0, 354, 355, 5, 100, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 100, 0, 0, 359, 32, 1, 0, 0, 0, 360, 361, 5, 100, 0, 0, 361, 362, 5, 101, 0, 0, 362, 363, 5, 99, 0, 0, 363, 364, 5, 105, 0, 0, 364, 365, 5, 109, 0, 0, 365, 366, 5, 97, 0, 0, 366, 367, 5, 108, 0, 0, 367, 368, 5, 45, 0, 0, 368, 369, 5, 102, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 114, 0, 0, 371, 372, 5, 109, 0, 0, 372, 373, 5, 97, 0, 0, 373, 374, 5, 116, 0, 0, 374, 34, 1, 0, 0, 0, 375, 376, 5, 58, 0, 0, 376, 36, 1, 0, 0, 0, 377, 378, 5, 100, 0, 0, 378, 379, 5, 101, 0, 0, 379, 380, 5, 99, 0, 0, 380, 381, 5, 105, 0, 0, 381, 382, 5, 109, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 108, 0, 0, 384, 385, 5, 45, 0, 0, 385, 386, 5, 115, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 112, 0, 0, 388, 389, 5, 97, 0, 0, 389, 390, 5, 114, 0, 0, 390, 391, 5, 97, 0, 0, 391, 392, 5, 116, 0, 0, 392, 393, 5, 111, 0, 0, 393, 394, 5, 114, 0, 0, 394, 38, 1, 0, 0, 0, 395, 396, 5, 103, 0, 0, 396, 397, 5, 114, 0, 0, 397, 398, 5, 111, 0, 0, 398, 399, 5, 117, 0, 0, 399, 400, 5, 112, 0, 0, 400, 401, 5, 105, 0, 0, 401, 402, 5, 110, 0, 0, 402, 403, 5, 103, 0, 0, 403, 404, 5, 45, 0, 0, 404, 405, 5, 115, 0, 0, 405, 406, 5, 101, 0, 0, 406, 407, 5, 112, 0, 0, 407, 408, 5, 97, 0, 0, 408, 409, 5, 114, 0, 0, 409, 410, 5, 97, 0, 0, 410, 411, 5, 116, 0, 0, 411, 412, 5, 111, 0, 0, 412, 413, 5, 114, 0, 0, 413, 40, 1, 0, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 110, 0, 0, 416, 417, 5, 102, 0, 0, 417, 418, 5, 105, 0, 0, 418, 419, 5, 110, 0, 0, 419, 420, 5, 105, 0, 0, 420, 421, 5, 116, 0, 0, 421, 422, 5, 121, 0, 0, 422, 42, 1, 0, 0, 0, 423, 424, 5, 109, 0, 0, 424, 425, 5, 105, 0, 0, 425, 426, 5, 110, 0, 0, 426, 427, 5, 117, 0, 0, 427, 428, 5, 115, 0, 0, 428, 429, 5, 45, 0, 0, 429, 430, 5, 115, 0, 0, 430, 431, 5, 105, 0, 0, 431, 432, 5, 103, 0, 0, 432, 433, 5, 110, 0, 0, 433, 44, 1, 0, 0, 0, 434, 435, 5, 78, 0, 0, 435, 436, 5, 97, 0, 0, 436, 437, 5, 78, 0, 0, 437, 46, 1, 0, 0, 0, 438, 439, 5, 112, 0, 0, 439, 440, 5, 101, 0, 0, 440, 441, 5, 114, 0, 0, 441, 442, 5, 99, 0, 0, 442, 443, 5, 101, 0, 0, 443, 444, 5, 110, 0, 0, 444, 445, 5, 116, 0, 0, 445, 48, 1, 0, 0, 0, 446, 447, 5, 112, 0, 0, 447, 448, 5, 101, 0, 0, 448, 449, 5, 114, 0, 0, 449, 450, 5, 45, 0, 0, 450, 451, 5, 109, 0, 0, 451, 452, 5, 105, 0, 0, 452, 453, 5, 108, 0, 0, 453, 454, 5, 108, 0, 0, 454, 455, 5, 101, 0, 0, 455, 50, 1, 0, 0, 0, 456, 457, 5, 122, 0, 0, 457, 458, 5, 101, 0, 0, 458, 459, 5, 114, 0, 0, 459, 460, 5, 111, 0, 0, 460, 461, 5, 45, 0, 0, 461, 462, 5, 100, 0, 0, 462, 463, 5, 105, 0, 0, 463, 464, 5, 103, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 116, 0, 0, 466, 52, 1, 0, 0, 0, 467, 468, 5, 100, 0, 0, 468, 469, 5, 105, 0, 0, 469, 470, 5, 103, 0, 0, 470, 471, 5, 105, 0, 0, 471, 472, 5, 116, 0, 0, 472, 54, 1, 0, 0, 0, 473, 474, 5, 112, 0, 0, 474, 475, 5, 97, 0, 0, 475, 476, 5, 116, 0, 0, 476, 477, 5, 116, 0, 0, 477, 478, 5, 101, 0, 0, 478, 479, 5, 114, 0, 0, 479, 480, 5, 110, 0, 0, 480, 481, 5, 45, 0, 0, 481, 482, 5, 115, 0, 0, 482, 483, 5, 101, 0, 0, 483, 484, 5, 112, 0, 0, 484, 485, 5, 97, 0, 0, 485, 486, 5, 114, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 116, 0, 0, 488, 489, 5, 111, 0, 0, 489, 490, 5, 114, 0, 0, 490, 56, 1, 0, 0, 0, 491, 492, 5, 105, 0, 0, 492, 493, 5, 109, 0, 0, 493, 494, 5, 112, 0, 0, 494, 495, 5, 111, 0, 0, 495, 496, 5, 114, 0, 0, 496, 497, 5, 116, 0, 0, 497, 58, 1, 0, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 120, 0, 0, 500, 501, 5, 116, 0, 0, 501, 502, 5, 101, 0, 0, 502, 503, 5, 114, 0, 0, 503, 504, 5, 110, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 108, 0, 0, 506, 60, 1, 0, 0, 0, 507, 508, 5, 102, 0, 0, 508, 509, 5, 117, 0, 0, 509, 510, 5, 110, 0, 0, 510, 511, 5, 99, 0, 0, 511, 512, 5, 116, 0, 0, 512, 513, 5, 105, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 110, 0, 0, 515, 62, 1, 0, 0, 0, 516, 517, 5, 106, 0, 0, 517, 518, 5, 115, 0, 0, 518, 519, 5, 111, 0, 0, 519, 520, 5, 117, 0, 0, 520, 521, 5, 110, 0, 0, 521, 522, 5, 100, 0, 0, 522, 64, 1, 0, 0, 0, 523, 524, 5, 99, 0, 0, 524, 525, 5, 111, 0, 0, 525, 526, 5, 109, 0, 0, 526, 527, 5, 112, 0, 0, 527, 528, 5, 97, 0, 0, 528, 529, 5, 99, 0, 0, 529, 530, 5, 116, 0, 0, 530, 66, 1, 0, 0, 0, 531, 532, 5, 118, 0, 0, 532, 533, 5, 101, 0, 0, 533, 534, 5, 114, 0, 0, 534, 535, 5, 98, 0, 0, 535, 536, 5, 111, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 101, 0, 0, 538, 68, 1, 0, 0, 0, 539, 540, 5, 115, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 104, 0, 0, 542, 543, 5, 101, 0, 0, 543, 544, 5, 109, 0, 0, 544, 545, 5, 97, 0, 0, 545, 70, 1, 0, 0, 0, 546, 547, 5, 101, 0, 0, 547, 548, 5, 113, 0, 0, 548, 72, 1, 0, 0, 0, 549, 550, 5, 110, 0, 0, 550, 551, 5, 101, 0, 0, 551, 74, 1, 0, 0, 0, 552, 553, 5, 108, 0, 0, 553, 554, 5, 116, 0, 0, 554, 76, 1, 0, 0, 0, 555, 556, 5, 108, 0, 0, 556, 557, 5, 101, 0, 0, 557, 78, 1, 0, 0, 0, 558, 559, 5, 103, 0, 0, 559, 560, 5, 116, 0, 0, 560, 80, 1, 0, 0, 0, 561, 562, 5, 103, 0, 0, 562, 563, 5, 101, 0, 0, 563, 82, 1, 0, 0, 0, 564, 565, 5, 33, 0, 0, 565, 566, 5, 61, 0, 0, 566, 84, 1, 0, 0, 0, 567, 568, 5, 60, 0, 0, 568, 86, 1, 0, 0, 0, 569, 570, 5, 60, 0, 0, 570, 571, 5, 61, 0, 0, 571, 88, 1, 0, 0, 0, 572, 573, 5, 62, 0, 0, 573, 90, 1, 0, 0, 0, 574, 575, 5, 62, 0, 0, 575, 576, 5, 61, 0, 0, 576, 92, 1, 0, 0, 0, 577, 578, 5, 124, 0, 0, 578, 579, 5, 124, 0, 0, 579, 94, 1, 0, 0, 0, 580, 581, 5, 43, 0, 0, 581, 96, 1, 0, 0, 0, 582, 583, 5, 45, 0, 0, 583, 98, 1, 0, 0, 0, 584, 585, 5, 100, 0, 0, 585, 586, 5, 105, 0, 0, 586, 587, 5, 118, 0, 0, 587, 100, 1, 0, 0, 0, 588, 589, 5, 105, 0, 0, 589, 590, 5, 100, 0, 0, 590, 591, 5, 105, 0, 0, 591, 592, 5, 118, 0, 0, 592, 102, 1, 0, 0, 0, 593, 594, 5, 109, 0, 0, 594, 595, 5, 111, 0, 0, 595, 596, 5, 100, 0, 0, 596, 104, 1, 0, 0, 0, 597, 598, 5, 33, 0, 0, 598, 106, 1, 0, 0, 0, 599, 600, 5, 91, 0, 0, 600, 108, 1, 0, 0, 0, 601, 602, 5, 93, 0, 0, 602, 110, 1, 0, 0, 0, 603, 604, 5, 46, 0, 0, 604, 112, 1, 0, 0, 0, 605, 606, 5, 36, 0, 0, 606, 607, 5, 36, 0, 0, 607, 114, 1, 0, 0, 0, 608, 609, 5, 35, 0, 0, 609, 116, 1, 0, 0, 0, 610, 611, 5, 123, 0, 0, 611, 612, 5, 124, 0, 0, 612, 118, 1, 0, 0, 0, 613, 614, 5, 124, 0, 0, 614, 615, 5, 125, 0, 0, 615, 120, 1, 0, 0, 0, 616, 617, 5, 102, 0, 0, 617, 618, 5, 111, 0, 0, 618, 619, 5, 114, 0, 0, 619, 122, 1, 0, 0, 0, 620, 621, 5, 108, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 116, 0, 0, 623, 124, 1, 0, 0, 0, 624, 625, 5, 119, 0, 0, 625, 626, 5, 104, 0, 0, 626, 627, 5, 101, 0, 0, 627, 628, 5, 114, 0, 0, 628, 629, 5, 101, 0, 0, 629, 126, 1, 0, 0, 0, 630, 631, 5, 103, 0, 0, 631, 632, 5, 114, 0, 0, 632, 633, 5, 111, 0, 0, 633, 634, 5, 117, 0, 0, 634, 635, 5, 112, 0, 0, 635, 128, 1, 0, 0, 0, 636, 637, 5, 98, 0, 0, 637, 638, 5, 121, 0, 0, 638, 130, 1, 0, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 114, 0, 0, 641, 642, 5, 100, 0, 0, 642, 643, 5, 101, 0, 0, 643, 644, 5, 114, 0, 0, 644, 132, 1, 0, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 116, 0, 0, 648, 649, 5, 117, 0, 0, 649, 650, 5, 114, 0, 0, 650, 651, 5, 110, 0, 0, 651, 134, 1, 0, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 102, 0, 0, 654, 136, 1, 0, 0, 0, 655, 656, 5, 105, 0, 0, 656, 657, 5, 110, 0, 0, 657, 138, 1, 0, 0, 0, 658, 659, 5, 97, 0, 0, 659, 660, 5, 115, 0, 0, 660, 140, 1, 0, 0, 0, 661, 662, 5, 97, 0, 0, 662, 663, 5, 116, 0, 0, 663, 142, 1, 0, 0, 0, 664, 665, 5, 97, 0, 0, 665, 666, 5, 108, 0, 0, 666, 667, 5, 108, 0, 0, 667, 668, 5, 111, 0, 0, 668, 669, 5, 119, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 110, 0, 0, 671, 672, 5, 103, 0, 0, 672, 144, 1, 0, 0, 0, 673, 674, 5, 101, 0, 0, 674, 675, 5, 109, 0, 0, 675, 676, 5, 112, 0, 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 121, 0, 0, 678, 146, 1, 0, 0, 0, 679, 680, 5, 99, 0, 0, 680, 681, 5, 111, 0, 0, 681, 682, 5, 117, 0, 0, 682, 683, 5, 110, 0, 0, 683, 684, 5, 116, 0, 0, 684, 148, 1, 0, 0, 0, 685, 686, 5, 115, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 97, 0, 0, 688, 689, 5, 98, 0, 0, 689, 690, 5, 108, 0, 0, 690, 691, 5, 101, 0, 0, 691, 150, 1, 0, 0, 0, 692, 693, 5, 97, 0, 0, 693, 694, 5, 115, 0, 0, 694, 695, 5, 99, 0, 0, 695, 696, 5, 101, 0, 0, 696, 697, 5, 110, 0, 0, 697, 698, 5, 100, 0, 0, 698, 699, 5, 105, 0, 0, 699, 700, 5, 110, 0, 0, 700, 701, 5, 103, 0, 0, 701, 152, 1, 0, 0, 0, 702, 703, 5, 100, 0, 0, 703, 704, 5, 101, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 99, 0, 0, 706, 707, 5, 101, 0, 0, 707, 708, 5, 110, 0, 0, 708, 709, 5, 100, 0, 0, 709, 710, 5, 105, 0, 0, 710, 711, 5, 110, 0, 0, 711, 712, 5, 103, 0, 0, 712, 154, 1, 0, 0, 0, 713, 714, 5, 115, 0, 0, 714, 715, 5, 111, 0, 0, 715, 716, 5, 109, 0, 0, 716, 717, 5, 101, 0, 0, 717, 156, 1, 0, 0, 0, 718, 719, 5, 101, 0, 0, 719, 720, 5, 118, 0, 0, 720, 721, 5, 101, 0, 0, 721, 722, 5, 114, 0, 0, 722, 723, 5, 121, 0, 0, 723, 158, 1, 0, 0, 0, 724, 725, 5, 115, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, 116, 0, 0, 727, 728, 5, 105, 0, 0, 728, 729, 5, 115, 0, 0, 729, 730, 5, 102, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 101, 0, 0, 732, 733, 5, 115, 0, 0, 733, 160, 1, 0, 0, 0, 734, 735, 5, 99, 0, 0, 735, 736, 5, 111, 0, 0, 736, 737, 5, 108, 0, 0, 737, 738, 5, 108, 0, 0, 738, 739, 5, 97, 0, 0, 739, 740, 5, 116, 0, 0, 740, 741, 5, 105, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 110, 0, 0, 743, 162, 1, 0, 0, 0, 744, 745, 5, 103, 0, 0, 745, 746, 5, 114, 0, 0, 746, 747, 5, 101, 0, 0, 747, 748, 5, 97, 0, 0, 748, 749, 5, 116, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 115, 0, 0, 751, 752, 5, 116, 0, 0, 752, 164, 1, 0, 0, 0, 753, 754, 5, 108, 0, 0, 754, 755, 5, 101, 0, 0, 755, 756, 5, 97, 0, 0, 756, 757, 5, 115, 0, 0, 757, 758, 5, 116, 0, 0, 758, 166, 1, 0, 0, 0, 759, 760, 5, 115, 0, 0, 760, 761, 5, 119, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 116, 0, 0, 763, 764, 5, 99, 0, 0, 764, 765, 5, 104, 0, 0, 765, 168, 1, 0, 0, 0, 766, 767, 5, 99, 0, 0, 767, 768, 5, 97, 0, 0, 768, 769, 5, 115, 0, 0, 769, 770, 5, 101, 0, 0, 770, 170, 1, 0, 0, 0, 771, 772, 5, 116, 0, 0, 772, 773, 5, 114, 0, 0, 773, 774, 5, 121, 0, 0, 774, 172, 1, 0, 0, 0, 775, 776, 5, 99, 0, 0, 776, 777, 5, 97, 0, 0, 777, 778, 5, 116, 0, 0, 778, 779, 5, 99, 0, 0, 779, 780, 5, 104, 0, 0, 780, 174, 1, 0, 0, 0, 781, 782, 5, 100, 0, 0, 782, 783, 5, 101, 0, 0, 783, 784, 5, 102, 0, 0, 784, 785, 5, 97, 0, 0, 785, 786, 5, 117, 0, 0, 786, 787, 5, 108, 0, 0, 787, 788, 5, 116, 0, 0, 788, 176, 1, 0, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 104, 0, 0, 791, 792, 5, 101, 0, 0, 792, 793, 5, 110, 0, 0, 793, 178, 1, 0, 0, 0, 794, 795, 5, 101, 0, 0, 795, 796, 5, 108, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 101, 0, 0, 798, 180, 1, 0, 0, 0, 799, 800, 5, 116, 0, 0, 800, 801, 5, 121, 0, 0, 801, 802, 5, 112, 0, 0, 802, 803, 5, 101, 0, 0, 803, 804, 5, 115, 0, 0, 804, 805, 5, 119, 0, 0, 805, 806, 5, 105, 0, 0, 806, 807, 5, 116, 0, 0, 807, 808, 5, 99, 0, 0, 808, 809, 5, 104, 0, 0, 809, 182, 1, 0, 0, 0, 810, 811, 5, 111, 0, 0, 811, 812, 5, 114, 0, 0, 812, 184, 1, 0, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 110, 0, 0, 815, 816, 5, 100, 0, 0, 816, 186, 1, 0, 0, 0, 817, 818, 5, 110, 0, 0, 818, 819, 5, 111, 0, 0, 819, 820, 5, 116, 0, 0, 820, 188, 1, 0, 0, 0, 821, 822, 5, 116, 0, 0, 822, 823, 5, 111, 0, 0, 823, 190, 1, 0, 0, 0, 824, 825, 5, 105, 0, 0, 825, 826, 5, 110, 0, 0, 826, 827, 5, 115, 0, 0, 827, 828, 5, 116, 0, 0, 828, 829, 5, 97, 0, 0, 829, 830, 5, 110, 0, 0, 830, 831, 5, 99, 0, 0, 831, 832, 5, 101, 0, 0, 832, 192, 1, 0, 0, 0, 833, 834, 5, 111, 0, 0, 834, 835, 5, 102, 0, 0, 835, 194, 1, 0, 0, 0, 836, 837, 5, 115, 0, 0, 837, 838, 5, 116, 0, 0, 838, 839, 5, 97, 0, 0, 839, 840, 5, 116, 0, 0, 840, 841, 5, 105, 0, 0, 841, 842, 5, 99, 0, 0, 842, 843, 5, 97, 0, 0, 843, 844, 5, 108, 0, 0, 844, 845, 5, 108, 0, 0, 845, 846, 5, 121, 0, 0, 846, 196, 1, 0, 0, 0, 847, 848, 5, 105, 0, 0, 848, 849, 5, 115, 0, 0, 849, 198, 1, 0, 0, 0, 850, 851, 5, 116, 0, 0, 851, 852, 5, 114, 0, 0, 852, 853, 5, 101, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 116, 0, 0, 855, 200, 1, 0, 0, 0, 856, 857, 5, 99, 0, 0, 857, 858, 5, 97, 0, 0, 858, 859, 5, 115, 0, 0, 859, 860, 5, 116, 0, 0, 860, 202, 1, 0, 0, 0, 861, 862, 5, 99, 0, 0, 862, 863, 5, 97, 0, 0, 863, 864, 5, 115, 0, 0, 864, 865, 5, 116, 0, 0, 865, 866, 5, 97, 0, 0, 866, 867, 5, 98, 0, 0, 867, 868, 5, 108, 0, 0, 868, 869, 5, 101, 0, 0, 869, 204, 1, 0, 0, 0, 870, 871, 5, 118, 0, 0, 871, 872, 5, 101, 0, 0, 872, 873, 5, 114, 0, 0, 873, 874, 5, 115, 0, 0, 874, 875, 5, 105, 0, 0, 875, 876, 5, 111, 0, 0, 876, 877, 5, 110, 0, 0, 877, 206, 1, 0, 0, 0, 878, 879, 5, 106, 0, 0, 879, 880, 5, 115, 0, 0, 880, 881, 5, 111, 0, 0, 881, 882, 5, 110, 0, 0, 882, 883, 5, 105, 0, 0, 883, 884, 5, 113, 0, 0, 884, 208, 1, 0, 0, 0, 885, 886, 5, 117, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 111, 0, 0, 888, 889, 5, 114, 0, 0, 889, 890, 5, 100, 0, 0, 890, 891, 5, 101, 0, 0, 891, 892, 5, 114, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 100, 0, 0, 894, 210, 1, 0, 0, 0, 895, 896, 5, 116, 0, 0, 896, 897, 5, 114, 0, 0, 897, 898, 5, 117, 0, 0, 898, 899, 5, 101, 0, 0, 899, 212, 1, 0, 0, 0, 900, 901, 5, 102, 0, 0, 901, 902, 5, 97, 0, 0, 902, 903, 5, 108, 0, 0, 903, 904, 5, 115, 0, 0, 904, 905, 5, 101, 0, 0, 905, 214, 1, 0, 0, 0, 906, 907, 5, 116, 0, 0, 907, 908, 5, 121, 0, 0, 908, 909, 5, 112, 0, 0, 909, 910, 5, 101, 0, 0, 910, 216, 1, 0, 0, 0, 911, 912, 5, 118, 0, 0, 912, 913, 5, 97, 0, 0, 913, 914, 5, 108, 0, 0, 914, 915, 5, 105, 0, 0, 915, 916, 5, 100, 0, 0, 916, 917, 5, 97, 0, 0, 917, 918, 5, 116, 0, 0, 918, 919, 5, 101, 0, 0, 919, 218, 1, 0, 0, 0, 920, 921, 5, 97, 0, 0, 921, 922, 5, 110, 0, 0, 922, 923, 5, 110, 0, 0, 923, 924, 5, 111, 0, 0, 924, 925, 5, 116, 0, 0, 925, 926, 5, 97, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 101, 0, 0, 928, 220, 1, 0, 0, 0, 929, 930, 5, 100, 0, 0, 930, 931, 5, 101, 0, 0, 931, 932, 5, 99, 0, 0, 932, 933, 5, 108, 0, 0, 933, 934, 5, 97, 0, 0, 934, 935, 5, 114, 0, 0, 935, 936, 5, 101, 0, 0, 936, 222, 1, 0, 0, 0, 937, 938, 5, 99, 0, 0, 938, 939, 5, 111, 0, 0, 939, 940, 5, 110, 0, 0, 940, 941, 5, 116, 0, 0, 941, 942, 5, 101, 0, 0, 942, 943, 5, 120, 0, 0, 943, 944, 5, 116, 0, 0, 944, 224, 1, 0, 0, 0, 945, 946, 5, 105, 0, 0, 946, 947, 5, 116, 0, 0, 947, 948, 5, 101, 0, 0, 948, 949, 5, 109, 0, 0, 949, 226, 1, 0, 0, 0, 950, 951, 5, 118, 0, 0, 951, 952, 5, 97, 0, 0, 952, 953, 5, 114, 0, 0, 953, 954, 5, 105, 0, 0, 954, 955, 5, 97, 0, 0, 955, 956, 5, 98, 0, 0, 956, 957, 5, 108, 0, 0, 957, 958, 5, 101, 0, 0, 958, 228, 1, 0, 0, 0, 959, 960, 5, 105, 0, 0, 960, 961, 5, 110, 0, 0, 961, 962, 5, 115, 0, 0, 962, 963, 5, 101, 0, 0, 963, 964, 5, 114, 0, 0, 964, 965, 5, 116, 0, 0, 965, 230, 1, 0, 0, 0, 966, 967, 5, 100, 0, 0, 967, 968, 5, 101, 0, 0, 968, 969, 5, 108, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 116, 0, 0, 971, 972, 5, 101, 0, 0, 972, 232, 1, 0, 0, 0, 973, 974, 5, 114, 0, 0, 974, 975, 5, 101, 0, 0, 975, 976, 5, 110, 0, 0, 976, 977, 5, 97, 0, 0, 977, 978, 5, 109, 0, 0, 978, 979, 5, 101, 0, 0, 979, 234, 1, 0, 0, 0, 980, 981, 5, 114, 0, 0, 981, 982, 5, 101, 0, 0, 982, 983, 5, 112, 0, 0, 983, 984, 5, 108, 0, 0, 984, 985, 5, 97, 0, 0, 985, 986, 5, 99, 0, 0, 986, 987, 5, 101, 0, 0, 987, 236, 1, 0, 0, 0, 988, 989, 5, 99, 0, 0, 989, 990, 5, 111, 0, 0, 990, 991, 5, 112, 0, 0, 991, 992, 5, 121, 0, 0, 992, 238, 1, 0, 0, 0, 993, 994, 5, 109, 0, 0, 994, 995, 5, 111, 0, 0, 995, 996, 5, 100, 0, 0, 996, 997, 5, 105, 0, 0, 997, 998, 5, 102, 0, 0, 998, 999, 5, 121, 0, 0, 999, 240, 1, 0, 0, 0, 1000, 1001, 5, 97, 0, 0, 1001, 1002, 5, 112, 0, 0, 1002, 1003, 5, 112, 0, 0, 1003, 1004, 5, 101, 0, 0, 1004, 1005, 5, 110, 0, 0, 1005, 1006, 5, 100, 0, 0, 1006, 242, 1, 0, 0, 0, 1007, 1008, 5, 105, 0, 0, 1008, 1009, 5, 110, 0, 0, 1009, 1010, 5, 116, 0, 0, 1010, 1011, 5, 111, 0, 0, 1011, 244, 1, 0, 0, 0, 1012, 1013, 5, 118, 0, 0, 1013, 1014, 5, 97, 0, 0, 1014, 1015, 5, 108, 0, 0, 1015, 1016, 5, 117, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 246, 1, 0, 0, 0, 1018, 1019, 5, 106, 0, 0, 1019, 1020, 5, 115, 0, 0, 1020, 1021, 5, 111, 0, 0, 1021, 1022, 5, 110, 0, 0, 1022, 248, 1, 0, 0, 0, 1023, 1024, 5, 119, 0, 0, 1024, 1025, 5, 105, 0, 0, 1025, 1026, 5, 116, 0, 0, 1026, 1027, 5, 104, 0, 0, 1027, 250, 1, 0, 0, 0, 1028, 1029, 5, 112, 0, 0, 1029, 1030, 5, 111, 0, 0, 1030, 1031, 5, 115, 0, 0, 1031, 1032, 5, 105, 0, 0, 1032, 1033, 5, 116, 0, 0, 1033, 1034, 5, 105, 0, 0, 1034, 1035, 5, 111, 0, 0, 1035, 1036, 5, 110, 0, 0, 1036, 252, 1, 0, 0, 0, 1037, 1038, 5, 98, 0, 0, 1038, 1039, 5, 114, 0, 0, 1039, 1040, 5, 101, 0, 0, 1040, 1041, 5, 97, 0, 0, 1041, 1042, 5, 107, 0, 0, 1042, 254, 1, 0, 0, 0, 1043, 1044, 5, 108, 0, 0, 1044, 1045, 5, 111, 0, 0, 1045, 1046, 5, 111, 0, 0, 1046, 1047, 5, 112, 0, 0, 1047, 256, 1, 0, 0, 0, 1048, 1049, 5, 99, 0, 0, 1049, 1050, 5, 111, 0, 0, 1050, 1051, 5, 110, 0, 0, 1051, 1052, 5, 116, 0, 0, 1052, 1053, 5, 105, 0, 0, 1053, 1054, 5, 110, 0, 0, 1054, 1055, 5, 117, 0, 0, 1055, 1056, 5, 101, 0, 0, 1056, 258, 1, 0, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 1059, 5, 120, 0, 0, 1059, 1060, 5, 105, 0, 0, 1060, 1061, 5, 116, 0, 0, 1061, 260, 1, 0, 0, 0, 1062, 1063, 5, 114, 0, 0, 1063, 1064, 5, 101, 0, 0, 1064, 1065, 5, 116, 0, 0, 1065, 1066, 5, 117, 0, 0, 1066, 1067, 5, 114, 0, 0, 1067, 1068, 5, 110, 0, 0, 1068, 1069, 5, 105, 0, 0, 1069, 1070, 5, 110, 0, 0, 1070, 1071, 5, 103, 0, 0, 1071, 262, 1, 0, 0, 0, 1072, 1073, 5, 119, 0, 0, 1073, 1074, 5, 104, 0, 0, 1074, 1075, 5, 105, 0, 0, 1075, 1076, 5, 108, 0, 0, 1076, 1077, 5, 101, 0, 0, 1077, 264, 1, 0, 0, 0, 1078, 1083, 5, 34, 0, 0, 1079, 1082, 3, 267, 133, 0, 1080, 1082, 8, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 1085, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1086, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1086, 1087, 5, 34, 0, 0, 1087, 266, 1, 0, 0, 0, 1088, 1091, 5, 92, 0, 0, 1089, 1092, 7, 1, 0, 0, 1090, 1092, 3, 269, 134, 0, 1091, 1089, 1, 0, 0, 0, 1091, 1090, 1, 0, 0, 0, 1092, 268, 1, 0, 0, 0, 1093, 1094, 5, 117, 0, 0, 1094, 1095, 3, 271, 135, 0, 1095, 1096, 3, 271, 135, 0, 1096, 1097, 3, 271, 135, 0, 1097, 1098, 3, 271, 135, 0, 1098, 270, 1, 0, 0, 0, 1099, 1100, 7, 2, 0, 0, 1100, 272, 1, 0, 0, 0, 1101, 1102, 5, 63, 0, 0, 1102, 274, 1, 0, 0, 0, 1103, 1104, 5, 110, 0, 0, 1104, 1105, 5, 117, 0, 0, 1105, 1106, 5, 108, 0, 0, 1106, 1107, 5, 108, 0, 0, 1107, 276, 1, 0, 0, 0, 1108, 1109, 3, 279, 139, 0, 1109, 278, 1, 0, 0, 0, 1110, 1114, 3, 281, 140, 0, 1111, 1114, 3, 283, 141, 0, 1112, 1114, 3, 285, 142, 0, 1113, 1110, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1112, 1, 0, 0, 0, 1114, 280, 1, 0, 0, 0, 1115, 1116, 3, 287, 143, 0, 1116, 282, 1, 0, 0, 0, 1117, 1118, 5, 46, 0, 0, 1118, 1128, 3, 287, 143, 0, 1119, 1120, 3, 287, 143, 0, 1120, 1124, 5, 46, 0, 0, 1121, 1123, 7, 3, 0, 0, 1122, 1121, 1, 0, 0, 0, 1123, 1126, 1, 0, 0, 0, 1124, 1122, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1128, 1, 0, 0, 0, 1126, 1124, 1, 0, 0, 0, 1127, 1117, 1, 0, 0, 0, 1127, 1119, 1, 0, 0, 0, 1128, 284, 1, 0, 0, 0, 1129, 1130, 5, 46, 0, 0, 1130, 1142, 3, 287, 143, 0, 1131, 1139, 3, 287, 143, 0, 1132, 1136, 5, 46, 0, 0, 1133, 1135, 7, 3, 0, 0, 1134, 1133, 1, 0, 0, 0, 1135, 1138, 1, 0, 0, 0, 1136, 1134, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1140, 1, 0, 0, 0, 1138, 1136, 1, 0, 0, 0, 1139, 1132, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1129, 1, 0, 0, 0, 1141, 1131, 1, 0, 0, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1145, 7, 4, 0, 0, 1144, 1146, 7, 5, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 3, 287, 143, 0, 1148, 286, 1, 0, 0, 0, 1149, 1151, 7, 3, 0, 0, 1150, 1149, 1, 0, 0, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1150, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 288, 1, 0, 0, 0, 1154, 1155, 7, 6, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 144, 0, 0, 1157, 290, 1, 0, 0, 0, 1158, 1162, 3, 293, 146, 0, 1159, 1161, 3, 295, 147, 0, 1160, 1159, 1, 0, 0, 0, 1161, 1164, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 292, 1, 0, 0, 0, 1164, 1162, 1, 0, 0, 0, 1165, 1167, 7, 7, 0, 0, 1166, 1165, 1, 0, 0, 0, 1167, 294, 1, 0, 0, 0, 1168, 1171, 3, 293, 146, 0, 1169, 1171, 7, 8, 0, 0, 1170, 1168, 1, 0, 0, 0, 1170, 1169, 1, 0, 0, 0, 1171, 296, 1, 0, 0, 0, 1172, 1173, 5, 40, 0, 0, 1173, 1182, 5, 58, 0, 0, 1174, 1181, 3, 297, 148, 0, 1175, 1176, 5, 40, 0, 0, 1176, 1181, 8, 9, 0, 0, 1177, 1178, 5, 58, 0, 0, 1178, 1181, 8, 10, 0, 0, 1179, 1181, 8, 11, 0, 0, 1180, 1174, 1, 0, 0, 0, 1180, 1175, 1, 0, 0, 0, 1180, 1177, 1, 0, 0, 0, 1180, 1179, 1, 0, 0, 0, 1181, 1184, 1, 0, 0, 0, 1182, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1186, 1, 0, 0, 0, 1184, 1182, 1, 0, 0, 0, 1185, 1187, 5, 58, 0, 0, 1186, 1185, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1186, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 5, 41, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 6, 148, 0, 0, 1193, 298, 1, 0, 0, 0, 1194, 1195, 8, 12, 0, 0, 1195, 300, 1, 0, 0, 0, 18, 0, 1081, 1083, 1091, 1113, 1124, 1127, 1136, 1139, 1141, 1145, 1152, 1162, 1166, 1170, 1180, 1182, 1188, 1, 0, 1, 0]
\ No newline at end of file
+[4, 0, 145, 1207, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 5, 133, 1093, 8, 133, 10, 133, 12, 133, 1096, 9, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 3, 134, 1103, 8, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 3, 140, 1125, 8, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1134, 8, 142, 10, 142, 12, 142, 1137, 9, 142, 3, 142, 1139, 8, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1146, 8, 143, 10, 143, 12, 143, 1149, 9, 143, 3, 143, 1151, 8, 143, 3, 143, 1153, 8, 143, 1, 143, 1, 143, 3, 143, 1157, 8, 143, 1, 143, 1, 143, 1, 144, 4, 144, 1162, 8, 144, 11, 144, 12, 144, 1163, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 5, 146, 1172, 8, 146, 10, 146, 12, 146, 1175, 9, 146, 1, 147, 3, 147, 1178, 8, 147, 1, 148, 1, 148, 3, 148, 1182, 8, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 5, 149, 1192, 8, 149, 10, 149, 12, 149, 1195, 9, 149, 1, 149, 4, 149, 1198, 8, 149, 11, 149, 12, 149, 1199, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 0, 0, 151, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 0, 271, 0, 273, 0, 275, 135, 277, 136, 279, 137, 281, 138, 283, 139, 285, 140, 287, 141, 289, 0, 291, 142, 293, 143, 295, 0, 297, 0, 299, 144, 301, 145, 1, 0, 13, 2, 0, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 9, 10, 13, 13, 32, 32, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 45, 48, 57, 183, 183, 768, 879, 8255, 8256, 1, 0, 58, 58, 1, 0, 41, 41, 2, 0, 40, 40, 58, 58, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 1219, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 1, 303, 1, 0, 0, 0, 3, 305, 1, 0, 0, 0, 5, 312, 1, 0, 0, 0, 7, 322, 1, 0, 0, 0, 9, 324, 1, 0, 0, 0, 11, 326, 1, 0, 0, 0, 13, 329, 1, 0, 0, 0, 15, 331, 1, 0, 0, 0, 17, 333, 1, 0, 0, 0, 19, 335, 1, 0, 0, 0, 21, 337, 1, 0, 0, 0, 23, 339, 1, 0, 0, 0, 25, 341, 1, 0, 0, 0, 27, 343, 1, 0, 0, 0, 29, 345, 1, 0, 0, 0, 31, 354, 1, 0, 0, 0, 33, 362, 1, 0, 0, 0, 35, 377, 1, 0, 0, 0, 37, 379, 1, 0, 0, 0, 39, 397, 1, 0, 0, 0, 41, 416, 1, 0, 0, 0, 43, 425, 1, 0, 0, 0, 45, 436, 1, 0, 0, 0, 47, 440, 1, 0, 0, 0, 49, 448, 1, 0, 0, 0, 51, 458, 1, 0, 0, 0, 53, 469, 1, 0, 0, 0, 55, 475, 1, 0, 0, 0, 57, 493, 1, 0, 0, 0, 59, 500, 1, 0, 0, 0, 61, 509, 1, 0, 0, 0, 63, 518, 1, 0, 0, 0, 65, 525, 1, 0, 0, 0, 67, 533, 1, 0, 0, 0, 69, 541, 1, 0, 0, 0, 71, 548, 1, 0, 0, 0, 73, 551, 1, 0, 0, 0, 75, 554, 1, 0, 0, 0, 77, 557, 1, 0, 0, 0, 79, 560, 1, 0, 0, 0, 81, 563, 1, 0, 0, 0, 83, 566, 1, 0, 0, 0, 85, 569, 1, 0, 0, 0, 87, 571, 1, 0, 0, 0, 89, 574, 1, 0, 0, 0, 91, 576, 1, 0, 0, 0, 93, 579, 1, 0, 0, 0, 95, 582, 1, 0, 0, 0, 97, 584, 1, 0, 0, 0, 99, 586, 1, 0, 0, 0, 101, 590, 1, 0, 0, 0, 103, 595, 1, 0, 0, 0, 105, 599, 1, 0, 0, 0, 107, 601, 1, 0, 0, 0, 109, 603, 1, 0, 0, 0, 111, 605, 1, 0, 0, 0, 113, 607, 1, 0, 0, 0, 115, 610, 1, 0, 0, 0, 117, 612, 1, 0, 0, 0, 119, 615, 1, 0, 0, 0, 121, 618, 1, 0, 0, 0, 123, 622, 1, 0, 0, 0, 125, 626, 1, 0, 0, 0, 127, 632, 1, 0, 0, 0, 129, 638, 1, 0, 0, 0, 131, 641, 1, 0, 0, 0, 133, 647, 1, 0, 0, 0, 135, 654, 1, 0, 0, 0, 137, 657, 1, 0, 0, 0, 139, 660, 1, 0, 0, 0, 141, 663, 1, 0, 0, 0, 143, 666, 1, 0, 0, 0, 145, 675, 1, 0, 0, 0, 147, 681, 1, 0, 0, 0, 149, 687, 1, 0, 0, 0, 151, 694, 1, 0, 0, 0, 153, 704, 1, 0, 0, 0, 155, 715, 1, 0, 0, 0, 157, 720, 1, 0, 0, 0, 159, 726, 1, 0, 0, 0, 161, 736, 1, 0, 0, 0, 163, 746, 1, 0, 0, 0, 165, 755, 1, 0, 0, 0, 167, 761, 1, 0, 0, 0, 169, 768, 1, 0, 0, 0, 171, 773, 1, 0, 0, 0, 173, 777, 1, 0, 0, 0, 175, 783, 1, 0, 0, 0, 177, 791, 1, 0, 0, 0, 179, 796, 1, 0, 0, 0, 181, 801, 1, 0, 0, 0, 183, 812, 1, 0, 0, 0, 185, 815, 1, 0, 0, 0, 187, 819, 1, 0, 0, 0, 189, 823, 1, 0, 0, 0, 191, 826, 1, 0, 0, 0, 193, 835, 1, 0, 0, 0, 195, 838, 1, 0, 0, 0, 197, 849, 1, 0, 0, 0, 199, 852, 1, 0, 0, 0, 201, 858, 1, 0, 0, 0, 203, 863, 1, 0, 0, 0, 205, 872, 1, 0, 0, 0, 207, 880, 1, 0, 0, 0, 209, 887, 1, 0, 0, 0, 211, 897, 1, 0, 0, 0, 213, 902, 1, 0, 0, 0, 215, 908, 1, 0, 0, 0, 217, 913, 1, 0, 0, 0, 219, 922, 1, 0, 0, 0, 221, 931, 1, 0, 0, 0, 223, 939, 1, 0, 0, 0, 225, 947, 1, 0, 0, 0, 227, 952, 1, 0, 0, 0, 229, 961, 1, 0, 0, 0, 231, 968, 1, 0, 0, 0, 233, 975, 1, 0, 0, 0, 235, 982, 1, 0, 0, 0, 237, 990, 1, 0, 0, 0, 239, 995, 1, 0, 0, 0, 241, 1002, 1, 0, 0, 0, 243, 1009, 1, 0, 0, 0, 245, 1014, 1, 0, 0, 0, 247, 1020, 1, 0, 0, 0, 249, 1025, 1, 0, 0, 0, 251, 1034, 1, 0, 0, 0, 253, 1039, 1, 0, 0, 0, 255, 1048, 1, 0, 0, 0, 257, 1054, 1, 0, 0, 0, 259, 1059, 1, 0, 0, 0, 261, 1068, 1, 0, 0, 0, 263, 1073, 1, 0, 0, 0, 265, 1083, 1, 0, 0, 0, 267, 1089, 1, 0, 0, 0, 269, 1099, 1, 0, 0, 0, 271, 1104, 1, 0, 0, 0, 273, 1110, 1, 0, 0, 0, 275, 1112, 1, 0, 0, 0, 277, 1114, 1, 0, 0, 0, 279, 1119, 1, 0, 0, 0, 281, 1124, 1, 0, 0, 0, 283, 1126, 1, 0, 0, 0, 285, 1138, 1, 0, 0, 0, 287, 1152, 1, 0, 0, 0, 289, 1161, 1, 0, 0, 0, 291, 1165, 1, 0, 0, 0, 293, 1169, 1, 0, 0, 0, 295, 1177, 1, 0, 0, 0, 297, 1181, 1, 0, 0, 0, 299, 1183, 1, 0, 0, 0, 301, 1205, 1, 0, 0, 0, 303, 304, 5, 59, 0, 0, 304, 2, 1, 0, 0, 0, 305, 306, 5, 109, 0, 0, 306, 307, 5, 111, 0, 0, 307, 308, 5, 100, 0, 0, 308, 309, 5, 117, 0, 0, 309, 310, 5, 108, 0, 0, 310, 311, 5, 101, 0, 0, 311, 4, 1, 0, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 97, 0, 0, 314, 315, 5, 109, 0, 0, 315, 316, 5, 101, 0, 0, 316, 317, 5, 115, 0, 0, 317, 318, 5, 112, 0, 0, 318, 319, 5, 97, 0, 0, 319, 320, 5, 99, 0, 0, 320, 321, 5, 101, 0, 0, 321, 6, 1, 0, 0, 0, 322, 323, 5, 61, 0, 0, 323, 8, 1, 0, 0, 0, 324, 325, 5, 36, 0, 0, 325, 10, 1, 0, 0, 0, 326, 327, 5, 58, 0, 0, 327, 328, 5, 61, 0, 0, 328, 12, 1, 0, 0, 0, 329, 330, 5, 123, 0, 0, 330, 14, 1, 0, 0, 0, 331, 332, 5, 125, 0, 0, 332, 16, 1, 0, 0, 0, 333, 334, 5, 40, 0, 0, 334, 18, 1, 0, 0, 0, 335, 336, 5, 41, 0, 0, 336, 20, 1, 0, 0, 0, 337, 338, 5, 42, 0, 0, 338, 22, 1, 0, 0, 0, 339, 340, 5, 124, 0, 0, 340, 24, 1, 0, 0, 0, 341, 342, 5, 37, 0, 0, 342, 26, 1, 0, 0, 0, 343, 344, 5, 44, 0, 0, 344, 28, 1, 0, 0, 0, 345, 346, 5, 111, 0, 0, 346, 347, 5, 114, 0, 0, 347, 348, 5, 100, 0, 0, 348, 349, 5, 101, 0, 0, 349, 350, 5, 114, 0, 0, 350, 351, 5, 105, 0, 0, 351, 352, 5, 110, 0, 0, 352, 353, 5, 103, 0, 0, 353, 30, 1, 0, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 357, 5, 100, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 114, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 100, 0, 0, 361, 32, 1, 0, 0, 0, 362, 363, 5, 100, 0, 0, 363, 364, 5, 101, 0, 0, 364, 365, 5, 99, 0, 0, 365, 366, 5, 105, 0, 0, 366, 367, 5, 109, 0, 0, 367, 368, 5, 97, 0, 0, 368, 369, 5, 108, 0, 0, 369, 370, 5, 45, 0, 0, 370, 371, 5, 102, 0, 0, 371, 372, 5, 111, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 109, 0, 0, 374, 375, 5, 97, 0, 0, 375, 376, 5, 116, 0, 0, 376, 34, 1, 0, 0, 0, 377, 378, 5, 58, 0, 0, 378, 36, 1, 0, 0, 0, 379, 380, 5, 100, 0, 0, 380, 381, 5, 101, 0, 0, 381, 382, 5, 99, 0, 0, 382, 383, 5, 105, 0, 0, 383, 384, 5, 109, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 108, 0, 0, 386, 387, 5, 45, 0, 0, 387, 388, 5, 115, 0, 0, 388, 389, 5, 101, 0, 0, 389, 390, 5, 112, 0, 0, 390, 391, 5, 97, 0, 0, 391, 392, 5, 114, 0, 0, 392, 393, 5, 97, 0, 0, 393, 394, 5, 116, 0, 0, 394, 395, 5, 111, 0, 0, 395, 396, 5, 114, 0, 0, 396, 38, 1, 0, 0, 0, 397, 398, 5, 103, 0, 0, 398, 399, 5, 114, 0, 0, 399, 400, 5, 111, 0, 0, 400, 401, 5, 117, 0, 0, 401, 402, 5, 112, 0, 0, 402, 403, 5, 105, 0, 0, 403, 404, 5, 110, 0, 0, 404, 405, 5, 103, 0, 0, 405, 406, 5, 45, 0, 0, 406, 407, 5, 115, 0, 0, 407, 408, 5, 101, 0, 0, 408, 409, 5, 112, 0, 0, 409, 410, 5, 97, 0, 0, 410, 411, 5, 114, 0, 0, 411, 412, 5, 97, 0, 0, 412, 413, 5, 116, 0, 0, 413, 414, 5, 111, 0, 0, 414, 415, 5, 114, 0, 0, 415, 40, 1, 0, 0, 0, 416, 417, 5, 105, 0, 0, 417, 418, 5, 110, 0, 0, 418, 419, 5, 102, 0, 0, 419, 420, 5, 105, 0, 0, 420, 421, 5, 110, 0, 0, 421, 422, 5, 105, 0, 0, 422, 423, 5, 116, 0, 0, 423, 424, 5, 121, 0, 0, 424, 42, 1, 0, 0, 0, 425, 426, 5, 109, 0, 0, 426, 427, 5, 105, 0, 0, 427, 428, 5, 110, 0, 0, 428, 429, 5, 117, 0, 0, 429, 430, 5, 115, 0, 0, 430, 431, 5, 45, 0, 0, 431, 432, 5, 115, 0, 0, 432, 433, 5, 105, 0, 0, 433, 434, 5, 103, 0, 0, 434, 435, 5, 110, 0, 0, 435, 44, 1, 0, 0, 0, 436, 437, 5, 78, 0, 0, 437, 438, 5, 97, 0, 0, 438, 439, 5, 78, 0, 0, 439, 46, 1, 0, 0, 0, 440, 441, 5, 112, 0, 0, 441, 442, 5, 101, 0, 0, 442, 443, 5, 114, 0, 0, 443, 444, 5, 99, 0, 0, 444, 445, 5, 101, 0, 0, 445, 446, 5, 110, 0, 0, 446, 447, 5, 116, 0, 0, 447, 48, 1, 0, 0, 0, 448, 449, 5, 112, 0, 0, 449, 450, 5, 101, 0, 0, 450, 451, 5, 114, 0, 0, 451, 452, 5, 45, 0, 0, 452, 453, 5, 109, 0, 0, 453, 454, 5, 105, 0, 0, 454, 455, 5, 108, 0, 0, 455, 456, 5, 108, 0, 0, 456, 457, 5, 101, 0, 0, 457, 50, 1, 0, 0, 0, 458, 459, 5, 122, 0, 0, 459, 460, 5, 101, 0, 0, 460, 461, 5, 114, 0, 0, 461, 462, 5, 111, 0, 0, 462, 463, 5, 45, 0, 0, 463, 464, 5, 100, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 103, 0, 0, 466, 467, 5, 105, 0, 0, 467, 468, 5, 116, 0, 0, 468, 52, 1, 0, 0, 0, 469, 470, 5, 100, 0, 0, 470, 471, 5, 105, 0, 0, 471, 472, 5, 103, 0, 0, 472, 473, 5, 105, 0, 0, 473, 474, 5, 116, 0, 0, 474, 54, 1, 0, 0, 0, 475, 476, 5, 112, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 116, 0, 0, 478, 479, 5, 116, 0, 0, 479, 480, 5, 101, 0, 0, 480, 481, 5, 114, 0, 0, 481, 482, 5, 110, 0, 0, 482, 483, 5, 45, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 101, 0, 0, 485, 486, 5, 112, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 114, 0, 0, 488, 489, 5, 97, 0, 0, 489, 490, 5, 116, 0, 0, 490, 491, 5, 111, 0, 0, 491, 492, 5, 114, 0, 0, 492, 56, 1, 0, 0, 0, 493, 494, 5, 105, 0, 0, 494, 495, 5, 109, 0, 0, 495, 496, 5, 112, 0, 0, 496, 497, 5, 111, 0, 0, 497, 498, 5, 114, 0, 0, 498, 499, 5, 116, 0, 0, 499, 58, 1, 0, 0, 0, 500, 501, 5, 101, 0, 0, 501, 502, 5, 120, 0, 0, 502, 503, 5, 116, 0, 0, 503, 504, 5, 101, 0, 0, 504, 505, 5, 114, 0, 0, 505, 506, 5, 110, 0, 0, 506, 507, 5, 97, 0, 0, 507, 508, 5, 108, 0, 0, 508, 60, 1, 0, 0, 0, 509, 510, 5, 102, 0, 0, 510, 511, 5, 117, 0, 0, 511, 512, 5, 110, 0, 0, 512, 513, 5, 99, 0, 0, 513, 514, 5, 116, 0, 0, 514, 515, 5, 105, 0, 0, 515, 516, 5, 111, 0, 0, 516, 517, 5, 110, 0, 0, 517, 62, 1, 0, 0, 0, 518, 519, 5, 106, 0, 0, 519, 520, 5, 115, 0, 0, 520, 521, 5, 111, 0, 0, 521, 522, 5, 117, 0, 0, 522, 523, 5, 110, 0, 0, 523, 524, 5, 100, 0, 0, 524, 64, 1, 0, 0, 0, 525, 526, 5, 99, 0, 0, 526, 527, 5, 111, 0, 0, 527, 528, 5, 109, 0, 0, 528, 529, 5, 112, 0, 0, 529, 530, 5, 97, 0, 0, 530, 531, 5, 99, 0, 0, 531, 532, 5, 116, 0, 0, 532, 66, 1, 0, 0, 0, 533, 534, 5, 118, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 114, 0, 0, 536, 537, 5, 98, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 115, 0, 0, 539, 540, 5, 101, 0, 0, 540, 68, 1, 0, 0, 0, 541, 542, 5, 115, 0, 0, 542, 543, 5, 99, 0, 0, 543, 544, 5, 104, 0, 0, 544, 545, 5, 101, 0, 0, 545, 546, 5, 109, 0, 0, 546, 547, 5, 97, 0, 0, 547, 70, 1, 0, 0, 0, 548, 549, 5, 101, 0, 0, 549, 550, 5, 113, 0, 0, 550, 72, 1, 0, 0, 0, 551, 552, 5, 110, 0, 0, 552, 553, 5, 101, 0, 0, 553, 74, 1, 0, 0, 0, 554, 555, 5, 108, 0, 0, 555, 556, 5, 116, 0, 0, 556, 76, 1, 0, 0, 0, 557, 558, 5, 108, 0, 0, 558, 559, 5, 101, 0, 0, 559, 78, 1, 0, 0, 0, 560, 561, 5, 103, 0, 0, 561, 562, 5, 116, 0, 0, 562, 80, 1, 0, 0, 0, 563, 564, 5, 103, 0, 0, 564, 565, 5, 101, 0, 0, 565, 82, 1, 0, 0, 0, 566, 567, 5, 33, 0, 0, 567, 568, 5, 61, 0, 0, 568, 84, 1, 0, 0, 0, 569, 570, 5, 60, 0, 0, 570, 86, 1, 0, 0, 0, 571, 572, 5, 60, 0, 0, 572, 573, 5, 61, 0, 0, 573, 88, 1, 0, 0, 0, 574, 575, 5, 62, 0, 0, 575, 90, 1, 0, 0, 0, 576, 577, 5, 62, 0, 0, 577, 578, 5, 61, 0, 0, 578, 92, 1, 0, 0, 0, 579, 580, 5, 124, 0, 0, 580, 581, 5, 124, 0, 0, 581, 94, 1, 0, 0, 0, 582, 583, 5, 43, 0, 0, 583, 96, 1, 0, 0, 0, 584, 585, 5, 45, 0, 0, 585, 98, 1, 0, 0, 0, 586, 587, 5, 100, 0, 0, 587, 588, 5, 105, 0, 0, 588, 589, 5, 118, 0, 0, 589, 100, 1, 0, 0, 0, 590, 591, 5, 105, 0, 0, 591, 592, 5, 100, 0, 0, 592, 593, 5, 105, 0, 0, 593, 594, 5, 118, 0, 0, 594, 102, 1, 0, 0, 0, 595, 596, 5, 109, 0, 0, 596, 597, 5, 111, 0, 0, 597, 598, 5, 100, 0, 0, 598, 104, 1, 0, 0, 0, 599, 600, 5, 33, 0, 0, 600, 106, 1, 0, 0, 0, 601, 602, 5, 91, 0, 0, 602, 108, 1, 0, 0, 0, 603, 604, 5, 93, 0, 0, 604, 110, 1, 0, 0, 0, 605, 606, 5, 46, 0, 0, 606, 112, 1, 0, 0, 0, 607, 608, 5, 36, 0, 0, 608, 609, 5, 36, 0, 0, 609, 114, 1, 0, 0, 0, 610, 611, 5, 35, 0, 0, 611, 116, 1, 0, 0, 0, 612, 613, 5, 123, 0, 0, 613, 614, 5, 124, 0, 0, 614, 118, 1, 0, 0, 0, 615, 616, 5, 124, 0, 0, 616, 617, 5, 125, 0, 0, 617, 120, 1, 0, 0, 0, 618, 619, 5, 102, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 114, 0, 0, 621, 122, 1, 0, 0, 0, 622, 623, 5, 108, 0, 0, 623, 624, 5, 101, 0, 0, 624, 625, 5, 116, 0, 0, 625, 124, 1, 0, 0, 0, 626, 627, 5, 119, 0, 0, 627, 628, 5, 104, 0, 0, 628, 629, 5, 101, 0, 0, 629, 630, 5, 114, 0, 0, 630, 631, 5, 101, 0, 0, 631, 126, 1, 0, 0, 0, 632, 633, 5, 103, 0, 0, 633, 634, 5, 114, 0, 0, 634, 635, 5, 111, 0, 0, 635, 636, 5, 117, 0, 0, 636, 637, 5, 112, 0, 0, 637, 128, 1, 0, 0, 0, 638, 639, 5, 98, 0, 0, 639, 640, 5, 121, 0, 0, 640, 130, 1, 0, 0, 0, 641, 642, 5, 111, 0, 0, 642, 643, 5, 114, 0, 0, 643, 644, 5, 100, 0, 0, 644, 645, 5, 101, 0, 0, 645, 646, 5, 114, 0, 0, 646, 132, 1, 0, 0, 0, 647, 648, 5, 114, 0, 0, 648, 649, 5, 101, 0, 0, 649, 650, 5, 116, 0, 0, 650, 651, 5, 117, 0, 0, 651, 652, 5, 114, 0, 0, 652, 653, 5, 110, 0, 0, 653, 134, 1, 0, 0, 0, 654, 655, 5, 105, 0, 0, 655, 656, 5, 102, 0, 0, 656, 136, 1, 0, 0, 0, 657, 658, 5, 105, 0, 0, 658, 659, 5, 110, 0, 0, 659, 138, 1, 0, 0, 0, 660, 661, 5, 97, 0, 0, 661, 662, 5, 115, 0, 0, 662, 140, 1, 0, 0, 0, 663, 664, 5, 97, 0, 0, 664, 665, 5, 116, 0, 0, 665, 142, 1, 0, 0, 0, 666, 667, 5, 97, 0, 0, 667, 668, 5, 108, 0, 0, 668, 669, 5, 108, 0, 0, 669, 670, 5, 111, 0, 0, 670, 671, 5, 119, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 103, 0, 0, 674, 144, 1, 0, 0, 0, 675, 676, 5, 101, 0, 0, 676, 677, 5, 109, 0, 0, 677, 678, 5, 112, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 121, 0, 0, 680, 146, 1, 0, 0, 0, 681, 682, 5, 99, 0, 0, 682, 683, 5, 111, 0, 0, 683, 684, 5, 117, 0, 0, 684, 685, 5, 110, 0, 0, 685, 686, 5, 116, 0, 0, 686, 148, 1, 0, 0, 0, 687, 688, 5, 115, 0, 0, 688, 689, 5, 116, 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 98, 0, 0, 691, 692, 5, 108, 0, 0, 692, 693, 5, 101, 0, 0, 693, 150, 1, 0, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 115, 0, 0, 696, 697, 5, 99, 0, 0, 697, 698, 5, 101, 0, 0, 698, 699, 5, 110, 0, 0, 699, 700, 5, 100, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 110, 0, 0, 702, 703, 5, 103, 0, 0, 703, 152, 1, 0, 0, 0, 704, 705, 5, 100, 0, 0, 705, 706, 5, 101, 0, 0, 706, 707, 5, 115, 0, 0, 707, 708, 5, 99, 0, 0, 708, 709, 5, 101, 0, 0, 709, 710, 5, 110, 0, 0, 710, 711, 5, 100, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 110, 0, 0, 713, 714, 5, 103, 0, 0, 714, 154, 1, 0, 0, 0, 715, 716, 5, 115, 0, 0, 716, 717, 5, 111, 0, 0, 717, 718, 5, 109, 0, 0, 718, 719, 5, 101, 0, 0, 719, 156, 1, 0, 0, 0, 720, 721, 5, 101, 0, 0, 721, 722, 5, 118, 0, 0, 722, 723, 5, 101, 0, 0, 723, 724, 5, 114, 0, 0, 724, 725, 5, 121, 0, 0, 725, 158, 1, 0, 0, 0, 726, 727, 5, 115, 0, 0, 727, 728, 5, 97, 0, 0, 728, 729, 5, 116, 0, 0, 729, 730, 5, 105, 0, 0, 730, 731, 5, 115, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 101, 0, 0, 734, 735, 5, 115, 0, 0, 735, 160, 1, 0, 0, 0, 736, 737, 5, 99, 0, 0, 737, 738, 5, 111, 0, 0, 738, 739, 5, 108, 0, 0, 739, 740, 5, 108, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 116, 0, 0, 742, 743, 5, 105, 0, 0, 743, 744, 5, 111, 0, 0, 744, 745, 5, 110, 0, 0, 745, 162, 1, 0, 0, 0, 746, 747, 5, 103, 0, 0, 747, 748, 5, 114, 0, 0, 748, 749, 5, 101, 0, 0, 749, 750, 5, 97, 0, 0, 750, 751, 5, 116, 0, 0, 751, 752, 5, 101, 0, 0, 752, 753, 5, 115, 0, 0, 753, 754, 5, 116, 0, 0, 754, 164, 1, 0, 0, 0, 755, 756, 5, 108, 0, 0, 756, 757, 5, 101, 0, 0, 757, 758, 5, 97, 0, 0, 758, 759, 5, 115, 0, 0, 759, 760, 5, 116, 0, 0, 760, 166, 1, 0, 0, 0, 761, 762, 5, 115, 0, 0, 762, 763, 5, 119, 0, 0, 763, 764, 5, 105, 0, 0, 764, 765, 5, 116, 0, 0, 765, 766, 5, 99, 0, 0, 766, 767, 5, 104, 0, 0, 767, 168, 1, 0, 0, 0, 768, 769, 5, 99, 0, 0, 769, 770, 5, 97, 0, 0, 770, 771, 5, 115, 0, 0, 771, 772, 5, 101, 0, 0, 772, 170, 1, 0, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 114, 0, 0, 775, 776, 5, 121, 0, 0, 776, 172, 1, 0, 0, 0, 777, 778, 5, 99, 0, 0, 778, 779, 5, 97, 0, 0, 779, 780, 5, 116, 0, 0, 780, 781, 5, 99, 0, 0, 781, 782, 5, 104, 0, 0, 782, 174, 1, 0, 0, 0, 783, 784, 5, 100, 0, 0, 784, 785, 5, 101, 0, 0, 785, 786, 5, 102, 0, 0, 786, 787, 5, 97, 0, 0, 787, 788, 5, 117, 0, 0, 788, 789, 5, 108, 0, 0, 789, 790, 5, 116, 0, 0, 790, 176, 1, 0, 0, 0, 791, 792, 5, 116, 0, 0, 792, 793, 5, 104, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 110, 0, 0, 795, 178, 1, 0, 0, 0, 796, 797, 5, 101, 0, 0, 797, 798, 5, 108, 0, 0, 798, 799, 5, 115, 0, 0, 799, 800, 5, 101, 0, 0, 800, 180, 1, 0, 0, 0, 801, 802, 5, 116, 0, 0, 802, 803, 5, 121, 0, 0, 803, 804, 5, 112, 0, 0, 804, 805, 5, 101, 0, 0, 805, 806, 5, 115, 0, 0, 806, 807, 5, 119, 0, 0, 807, 808, 5, 105, 0, 0, 808, 809, 5, 116, 0, 0, 809, 810, 5, 99, 0, 0, 810, 811, 5, 104, 0, 0, 811, 182, 1, 0, 0, 0, 812, 813, 5, 111, 0, 0, 813, 814, 5, 114, 0, 0, 814, 184, 1, 0, 0, 0, 815, 816, 5, 97, 0, 0, 816, 817, 5, 110, 0, 0, 817, 818, 5, 100, 0, 0, 818, 186, 1, 0, 0, 0, 819, 820, 5, 110, 0, 0, 820, 821, 5, 111, 0, 0, 821, 822, 5, 116, 0, 0, 822, 188, 1, 0, 0, 0, 823, 824, 5, 116, 0, 0, 824, 825, 5, 111, 0, 0, 825, 190, 1, 0, 0, 0, 826, 827, 5, 105, 0, 0, 827, 828, 5, 110, 0, 0, 828, 829, 5, 115, 0, 0, 829, 830, 5, 116, 0, 0, 830, 831, 5, 97, 0, 0, 831, 832, 5, 110, 0, 0, 832, 833, 5, 99, 0, 0, 833, 834, 5, 101, 0, 0, 834, 192, 1, 0, 0, 0, 835, 836, 5, 111, 0, 0, 836, 837, 5, 102, 0, 0, 837, 194, 1, 0, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 116, 0, 0, 840, 841, 5, 97, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 105, 0, 0, 843, 844, 5, 99, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 108, 0, 0, 846, 847, 5, 108, 0, 0, 847, 848, 5, 121, 0, 0, 848, 196, 1, 0, 0, 0, 849, 850, 5, 105, 0, 0, 850, 851, 5, 115, 0, 0, 851, 198, 1, 0, 0, 0, 852, 853, 5, 116, 0, 0, 853, 854, 5, 114, 0, 0, 854, 855, 5, 101, 0, 0, 855, 856, 5, 97, 0, 0, 856, 857, 5, 116, 0, 0, 857, 200, 1, 0, 0, 0, 858, 859, 5, 99, 0, 0, 859, 860, 5, 97, 0, 0, 860, 861, 5, 115, 0, 0, 861, 862, 5, 116, 0, 0, 862, 202, 1, 0, 0, 0, 863, 864, 5, 99, 0, 0, 864, 865, 5, 97, 0, 0, 865, 866, 5, 115, 0, 0, 866, 867, 5, 116, 0, 0, 867, 868, 5, 97, 0, 0, 868, 869, 5, 98, 0, 0, 869, 870, 5, 108, 0, 0, 870, 871, 5, 101, 0, 0, 871, 204, 1, 0, 0, 0, 872, 873, 5, 118, 0, 0, 873, 874, 5, 101, 0, 0, 874, 875, 5, 114, 0, 0, 875, 876, 5, 115, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 111, 0, 0, 878, 879, 5, 110, 0, 0, 879, 206, 1, 0, 0, 0, 880, 881, 5, 106, 0, 0, 881, 882, 5, 115, 0, 0, 882, 883, 5, 111, 0, 0, 883, 884, 5, 110, 0, 0, 884, 885, 5, 105, 0, 0, 885, 886, 5, 113, 0, 0, 886, 208, 1, 0, 0, 0, 887, 888, 5, 117, 0, 0, 888, 889, 5, 110, 0, 0, 889, 890, 5, 111, 0, 0, 890, 891, 5, 114, 0, 0, 891, 892, 5, 100, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 114, 0, 0, 894, 895, 5, 101, 0, 0, 895, 896, 5, 100, 0, 0, 896, 210, 1, 0, 0, 0, 897, 898, 5, 116, 0, 0, 898, 899, 5, 114, 0, 0, 899, 900, 5, 117, 0, 0, 900, 901, 5, 101, 0, 0, 901, 212, 1, 0, 0, 0, 902, 903, 5, 102, 0, 0, 903, 904, 5, 97, 0, 0, 904, 905, 5, 108, 0, 0, 905, 906, 5, 115, 0, 0, 906, 907, 5, 101, 0, 0, 907, 214, 1, 0, 0, 0, 908, 909, 5, 116, 0, 0, 909, 910, 5, 121, 0, 0, 910, 911, 5, 112, 0, 0, 911, 912, 5, 101, 0, 0, 912, 216, 1, 0, 0, 0, 913, 914, 5, 118, 0, 0, 914, 915, 5, 97, 0, 0, 915, 916, 5, 108, 0, 0, 916, 917, 5, 105, 0, 0, 917, 918, 5, 100, 0, 0, 918, 919, 5, 97, 0, 0, 919, 920, 5, 116, 0, 0, 920, 921, 5, 101, 0, 0, 921, 218, 1, 0, 0, 0, 922, 923, 5, 97, 0, 0, 923, 924, 5, 110, 0, 0, 924, 925, 5, 110, 0, 0, 925, 926, 5, 111, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 97, 0, 0, 928, 929, 5, 116, 0, 0, 929, 930, 5, 101, 0, 0, 930, 220, 1, 0, 0, 0, 931, 932, 5, 100, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 99, 0, 0, 934, 935, 5, 108, 0, 0, 935, 936, 5, 97, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 101, 0, 0, 938, 222, 1, 0, 0, 0, 939, 940, 5, 99, 0, 0, 940, 941, 5, 111, 0, 0, 941, 942, 5, 110, 0, 0, 942, 943, 5, 116, 0, 0, 943, 944, 5, 101, 0, 0, 944, 945, 5, 120, 0, 0, 945, 946, 5, 116, 0, 0, 946, 224, 1, 0, 0, 0, 947, 948, 5, 105, 0, 0, 948, 949, 5, 116, 0, 0, 949, 950, 5, 101, 0, 0, 950, 951, 5, 109, 0, 0, 951, 226, 1, 0, 0, 0, 952, 953, 5, 118, 0, 0, 953, 954, 5, 97, 0, 0, 954, 955, 5, 114, 0, 0, 955, 956, 5, 105, 0, 0, 956, 957, 5, 97, 0, 0, 957, 958, 5, 98, 0, 0, 958, 959, 5, 108, 0, 0, 959, 960, 5, 101, 0, 0, 960, 228, 1, 0, 0, 0, 961, 962, 5, 105, 0, 0, 962, 963, 5, 110, 0, 0, 963, 964, 5, 115, 0, 0, 964, 965, 5, 101, 0, 0, 965, 966, 5, 114, 0, 0, 966, 967, 5, 116, 0, 0, 967, 230, 1, 0, 0, 0, 968, 969, 5, 100, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 108, 0, 0, 971, 972, 5, 101, 0, 0, 972, 973, 5, 116, 0, 0, 973, 974, 5, 101, 0, 0, 974, 232, 1, 0, 0, 0, 975, 976, 5, 114, 0, 0, 976, 977, 5, 101, 0, 0, 977, 978, 5, 110, 0, 0, 978, 979, 5, 97, 0, 0, 979, 980, 5, 109, 0, 0, 980, 981, 5, 101, 0, 0, 981, 234, 1, 0, 0, 0, 982, 983, 5, 114, 0, 0, 983, 984, 5, 101, 0, 0, 984, 985, 5, 112, 0, 0, 985, 986, 5, 108, 0, 0, 986, 987, 5, 97, 0, 0, 987, 988, 5, 99, 0, 0, 988, 989, 5, 101, 0, 0, 989, 236, 1, 0, 0, 0, 990, 991, 5, 99, 0, 0, 991, 992, 5, 111, 0, 0, 992, 993, 5, 112, 0, 0, 993, 994, 5, 121, 0, 0, 994, 238, 1, 0, 0, 0, 995, 996, 5, 109, 0, 0, 996, 997, 5, 111, 0, 0, 997, 998, 5, 100, 0, 0, 998, 999, 5, 105, 0, 0, 999, 1000, 5, 102, 0, 0, 1000, 1001, 5, 121, 0, 0, 1001, 240, 1, 0, 0, 0, 1002, 1003, 5, 97, 0, 0, 1003, 1004, 5, 112, 0, 0, 1004, 1005, 5, 112, 0, 0, 1005, 1006, 5, 101, 0, 0, 1006, 1007, 5, 110, 0, 0, 1007, 1008, 5, 100, 0, 0, 1008, 242, 1, 0, 0, 0, 1009, 1010, 5, 105, 0, 0, 1010, 1011, 5, 110, 0, 0, 1011, 1012, 5, 116, 0, 0, 1012, 1013, 5, 111, 0, 0, 1013, 244, 1, 0, 0, 0, 1014, 1015, 5, 118, 0, 0, 1015, 1016, 5, 97, 0, 0, 1016, 1017, 5, 108, 0, 0, 1017, 1018, 5, 117, 0, 0, 1018, 1019, 5, 101, 0, 0, 1019, 246, 1, 0, 0, 0, 1020, 1021, 5, 119, 0, 0, 1021, 1022, 5, 105, 0, 0, 1022, 1023, 5, 116, 0, 0, 1023, 1024, 5, 104, 0, 0, 1024, 248, 1, 0, 0, 0, 1025, 1026, 5, 112, 0, 0, 1026, 1027, 5, 111, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1029, 5, 105, 0, 0, 1029, 1030, 5, 116, 0, 0, 1030, 1031, 5, 105, 0, 0, 1031, 1032, 5, 111, 0, 0, 1032, 1033, 5, 110, 0, 0, 1033, 250, 1, 0, 0, 0, 1034, 1035, 5, 106, 0, 0, 1035, 1036, 5, 115, 0, 0, 1036, 1037, 5, 111, 0, 0, 1037, 1038, 5, 110, 0, 0, 1038, 252, 1, 0, 0, 0, 1039, 1040, 5, 117, 0, 0, 1040, 1041, 5, 112, 0, 0, 1041, 1042, 5, 100, 0, 0, 1042, 1043, 5, 97, 0, 0, 1043, 1044, 5, 116, 0, 0, 1044, 1045, 5, 105, 0, 0, 1045, 1046, 5, 110, 0, 0, 1046, 1047, 5, 103, 0, 0, 1047, 254, 1, 0, 0, 0, 1048, 1049, 5, 98, 0, 0, 1049, 1050, 5, 114, 0, 0, 1050, 1051, 5, 101, 0, 0, 1051, 1052, 5, 97, 0, 0, 1052, 1053, 5, 107, 0, 0, 1053, 256, 1, 0, 0, 0, 1054, 1055, 5, 108, 0, 0, 1055, 1056, 5, 111, 0, 0, 1056, 1057, 5, 111, 0, 0, 1057, 1058, 5, 112, 0, 0, 1058, 258, 1, 0, 0, 0, 1059, 1060, 5, 99, 0, 0, 1060, 1061, 5, 111, 0, 0, 1061, 1062, 5, 110, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 1064, 5, 105, 0, 0, 1064, 1065, 5, 110, 0, 0, 1065, 1066, 5, 117, 0, 0, 1066, 1067, 5, 101, 0, 0, 1067, 260, 1, 0, 0, 0, 1068, 1069, 5, 101, 0, 0, 1069, 1070, 5, 120, 0, 0, 1070, 1071, 5, 105, 0, 0, 1071, 1072, 5, 116, 0, 0, 1072, 262, 1, 0, 0, 0, 1073, 1074, 5, 114, 0, 0, 1074, 1075, 5, 101, 0, 0, 1075, 1076, 5, 116, 0, 0, 1076, 1077, 5, 117, 0, 0, 1077, 1078, 5, 114, 0, 0, 1078, 1079, 5, 110, 0, 0, 1079, 1080, 5, 105, 0, 0, 1080, 1081, 5, 110, 0, 0, 1081, 1082, 5, 103, 0, 0, 1082, 264, 1, 0, 0, 0, 1083, 1084, 5, 119, 0, 0, 1084, 1085, 5, 104, 0, 0, 1085, 1086, 5, 105, 0, 0, 1086, 1087, 5, 108, 0, 0, 1087, 1088, 5, 101, 0, 0, 1088, 266, 1, 0, 0, 0, 1089, 1094, 5, 34, 0, 0, 1090, 1093, 3, 269, 134, 0, 1091, 1093, 8, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1091, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1098, 5, 34, 0, 0, 1098, 268, 1, 0, 0, 0, 1099, 1102, 5, 92, 0, 0, 1100, 1103, 7, 1, 0, 0, 1101, 1103, 3, 271, 135, 0, 1102, 1100, 1, 0, 0, 0, 1102, 1101, 1, 0, 0, 0, 1103, 270, 1, 0, 0, 0, 1104, 1105, 5, 117, 0, 0, 1105, 1106, 3, 273, 136, 0, 1106, 1107, 3, 273, 136, 0, 1107, 1108, 3, 273, 136, 0, 1108, 1109, 3, 273, 136, 0, 1109, 272, 1, 0, 0, 0, 1110, 1111, 7, 2, 0, 0, 1111, 274, 1, 0, 0, 0, 1112, 1113, 5, 63, 0, 0, 1113, 276, 1, 0, 0, 0, 1114, 1115, 5, 110, 0, 0, 1115, 1116, 5, 117, 0, 0, 1116, 1117, 5, 108, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 278, 1, 0, 0, 0, 1119, 1120, 3, 281, 140, 0, 1120, 280, 1, 0, 0, 0, 1121, 1125, 3, 283, 141, 0, 1122, 1125, 3, 285, 142, 0, 1123, 1125, 3, 287, 143, 0, 1124, 1121, 1, 0, 0, 0, 1124, 1122, 1, 0, 0, 0, 1124, 1123, 1, 0, 0, 0, 1125, 282, 1, 0, 0, 0, 1126, 1127, 3, 289, 144, 0, 1127, 284, 1, 0, 0, 0, 1128, 1129, 5, 46, 0, 0, 1129, 1139, 3, 289, 144, 0, 1130, 1131, 3, 289, 144, 0, 1131, 1135, 5, 46, 0, 0, 1132, 1134, 7, 3, 0, 0, 1133, 1132, 1, 0, 0, 0, 1134, 1137, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1139, 1, 0, 0, 0, 1137, 1135, 1, 0, 0, 0, 1138, 1128, 1, 0, 0, 0, 1138, 1130, 1, 0, 0, 0, 1139, 286, 1, 0, 0, 0, 1140, 1141, 5, 46, 0, 0, 1141, 1153, 3, 289, 144, 0, 1142, 1150, 3, 289, 144, 0, 1143, 1147, 5, 46, 0, 0, 1144, 1146, 7, 3, 0, 0, 1145, 1144, 1, 0, 0, 0, 1146, 1149, 1, 0, 0, 0, 1147, 1145, 1, 0, 0, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1151, 1, 0, 0, 0, 1149, 1147, 1, 0, 0, 0, 1150, 1143, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1153, 1, 0, 0, 0, 1152, 1140, 1, 0, 0, 0, 1152, 1142, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1156, 7, 4, 0, 0, 1155, 1157, 7, 5, 0, 0, 1156, 1155, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 3, 289, 144, 0, 1159, 288, 1, 0, 0, 0, 1160, 1162, 7, 3, 0, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 290, 1, 0, 0, 0, 1165, 1166, 7, 6, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 6, 145, 0, 0, 1168, 292, 1, 0, 0, 0, 1169, 1173, 3, 295, 147, 0, 1170, 1172, 3, 297, 148, 0, 1171, 1170, 1, 0, 0, 0, 1172, 1175, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 294, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1176, 1178, 7, 7, 0, 0, 1177, 1176, 1, 0, 0, 0, 1178, 296, 1, 0, 0, 0, 1179, 1182, 3, 295, 147, 0, 1180, 1182, 7, 8, 0, 0, 1181, 1179, 1, 0, 0, 0, 1181, 1180, 1, 0, 0, 0, 1182, 298, 1, 0, 0, 0, 1183, 1184, 5, 40, 0, 0, 1184, 1193, 5, 58, 0, 0, 1185, 1192, 3, 299, 149, 0, 1186, 1187, 5, 40, 0, 0, 1187, 1192, 8, 9, 0, 0, 1188, 1189, 5, 58, 0, 0, 1189, 1192, 8, 10, 0, 0, 1190, 1192, 8, 11, 0, 0, 1191, 1185, 1, 0, 0, 0, 1191, 1186, 1, 0, 0, 0, 1191, 1188, 1, 0, 0, 0, 1191, 1190, 1, 0, 0, 0, 1192, 1195, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1197, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1196, 1198, 5, 58, 0, 0, 1197, 1196, 1, 0, 0, 0, 1198, 1199, 1, 0, 0, 0, 1199, 1197, 1, 0, 0, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 5, 41, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 6, 149, 0, 0, 1204, 300, 1, 0, 0, 0, 1205, 1206, 8, 12, 0, 0, 1206, 302, 1, 0, 0, 0, 18, 0, 1092, 1094, 1102, 1124, 1135, 1138, 1147, 1150, 1152, 1156, 1163, 1173, 1177, 1181, 1191, 1193, 1199, 1, 0, 1, 0]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.java b/src/main/java/org/rumbledb/parser/JsoniqLexer.java
index 6f65df92b2..1f97d2225d 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java
@@ -39,11 +39,11 @@ public class JsoniqLexer extends Lexer {
Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108,
Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114,
Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120,
- Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126,
- Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132,
- STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137,
- IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142,
- XQComment=143, ContentChar=144;
+ Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126,
+ Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132,
+ Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137,
+ NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141,
+ WS=142, NCName=143, XQComment=144, ContentChar=145;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -70,9 +70,9 @@ private static String[] makeRuleNames() {
"Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse",
"Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable",
"Kinsert", "Kdelete", "Krename", "Kreplace", "Kcopy", "Kmodify", "Kappend",
- "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", "Kbreak", "Kloop",
- "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC", "UNICODE",
- "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral",
+ "Kinto", "Kvalue", "Kwith", "Kposition", "Kjson", "Kupdating", "Kbreak",
+ "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC",
+ "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral",
"IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS",
"NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar"
};
@@ -98,9 +98,9 @@ private static String[] makeLiteralNames() {
"'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'",
"'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'",
"'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'",
- "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'",
- "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'",
- "'returning'", "'while'", null, "'?'", "'null'"
+ "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'",
+ "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'",
+ "'exit'", "'returning'", "'while'", null, "'?'", "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -119,10 +119,10 @@ private static String[] makeSymbolicNames() {
"Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion",
"Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate",
"Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename",
- "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson",
- "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning",
- "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal",
- "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
+ "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith",
+ "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit",
+ "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral",
+ "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
"WS", "NCName", "XQComment", "ContentChar"
};
}
@@ -185,7 +185,7 @@ public JsoniqLexer(CharStream input) {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
- "\u0004\u0000\u0090\u04ac\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+
+ "\u0004\u0000\u0091\u04b7\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+
"\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002"+
"\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002"+
"\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002"+
@@ -222,146 +222,148 @@ public JsoniqLexer(CharStream input) {
"\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e"+
"\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091"+
"\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094"+
- "\u0002\u0095\u0007\u0095\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+
- "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+
- "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
- "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0004"+
- "\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+
- "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001"+
- "\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0001\u000e"+
- "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+
- "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+
- "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010"+
+ "\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0001\u0000\u0001\u0000"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+ "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
+ "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003"+
+ "\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+
+ "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001"+
+ "\t\u0001\t\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001"+
+ "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+
+ "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+
+ "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+
"\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+
"\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+
- "\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+
+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012"+
"\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+
"\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+
- "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+
+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+
+ "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+
"\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+
"\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+
- "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014"+
"\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+
- "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+
+ "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015"+
"\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+
- "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+
+ "\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+
"\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+
+ "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+
"\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+
- "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+
"\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
- "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a"+
- "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b"+
+ "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+
+ "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b"+
"\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+
"\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+
- "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c"+
- "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d"+
+ "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+
+ "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+
"\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+
- "\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+
- "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+
- "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001"+
- " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+
- "!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\""+
- "\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001"+
- "%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+
- "(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001,\u0001"+
- ",\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u0001"+
- "0\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u0001"+
- "3\u00013\u00013\u00013\u00014\u00014\u00015\u00015\u00016\u00016\u0001"+
- "7\u00017\u00018\u00018\u00018\u00019\u00019\u0001:\u0001:\u0001:\u0001"+
- ";\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001"+
- "=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+
- "?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+
- "A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001"+
- "C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+
- "F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+
- "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001"+
- "I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+
- "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001"+
- "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+
- "M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001"+
- "N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+
- "O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+
- "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+
- "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+
- "S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001"+
- "U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001"+
- "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+
- "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
- "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001"+
- "\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+
- "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+
- "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+
- "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001"+
- "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001"+
- "e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+
- "f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+
- "g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+
- "h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001"+
- "j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001"+
- "l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+
- "m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001"+
- "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001"+
- "o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001"+
- "q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+
- "r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001"+
- "t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001"+
- "u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001"+
- "w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001"+
- "x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001"+
- "z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001"+
- "|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001}\u0001"+
- "}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+
- "\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001"+
- "\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001"+
- "\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001"+
- "\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+
- "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001"+
- "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+
- "\u0084\u0001\u0084\u0005\u0084\u043a\b\u0084\n\u0084\f\u0084\u043d\t\u0084"+
- "\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085"+
- "\u0444\b\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+
- "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089"+
- "\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a"+
- "\u0001\u008b\u0001\u008b\u0001\u008b\u0003\u008b\u045a\b\u008b\u0001\u008c"+
- "\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+
- "\u0005\u008d\u0463\b\u008d\n\u008d\f\u008d\u0466\t\u008d\u0003\u008d\u0468"+
- "\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0005"+
- "\u008e\u046f\b\u008e\n\u008e\f\u008e\u0472\t\u008e\u0003\u008e\u0474\b"+
- "\u008e\u0003\u008e\u0476\b\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u047a"+
- "\b\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0004\u008f\u047f\b\u008f"+
- "\u000b\u008f\f\u008f\u0480\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090"+
- "\u0001\u0091\u0001\u0091\u0005\u0091\u0489\b\u0091\n\u0091\f\u0091\u048c"+
- "\t\u0091\u0001\u0092\u0003\u0092\u048f\b\u0092\u0001\u0093\u0001\u0093"+
- "\u0003\u0093\u0493\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094"+
- "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0005\u0094\u049d\b\u0094"+
- "\n\u0094\f\u0094\u04a0\t\u0094\u0001\u0094\u0004\u0094\u04a3\b\u0094\u000b"+
- "\u0094\f\u0094\u04a4\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+
- "\u0095\u0001\u0095\u0000\u0000\u0096\u0001\u0001\u0003\u0002\u0005\u0003"+
- "\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015"+
- "\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012"+
- "%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a5\u001b7\u001c"+
- "9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6"+
- "m7o8q9s:u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089E\u008bF\u008d"+
- "G\u008fH\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009dO\u009fP\u00a1"+
- "Q\u00a3R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1Y\u00b3Z\u00b5"+
- "[\u00b7\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5c\u00c7d\u00c9"+
- "e\u00cbf\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9m\u00dbn\u00dd"+
- "o\u00dfp\u00e1q\u00e3r\u00e5s\u00e7t\u00e9u\u00ebv\u00edw\u00efx\u00f1"+
- "y\u00f3z\u00f5{\u00f7|\u00f9}\u00fb~\u00fd\u007f\u00ff\u0080\u0101\u0081"+
- "\u0103\u0082\u0105\u0083\u0107\u0084\u0109\u0085\u010b\u0000\u010d\u0000"+
- "\u010f\u0000\u0111\u0086\u0113\u0087\u0115\u0088\u0117\u0089\u0119\u008a"+
- "\u011b\u008b\u011d\u008c\u011f\u0000\u0121\u008d\u0123\u008e\u0125\u0000"+
- "\u0127\u0000\u0129\u008f\u012b\u0090\u0001\u0000\r\u0002\u0000\"\"\\\\"+
- "\b\u0000\"\"//\\\\bbffnnrrtt\u0003\u000009AFaf\u0001\u000009\u0002\u0000"+
- "EEee\u0002\u0000++--\u0003\u0000\t\n\r\r \u000e\u0000AZ__az\u00c0\u00d6"+
- "\u00d8\u00f6\u00f8\u02ff\u0370\u037d\u037f\u1fff\u200c\u200d\u2070\u218f"+
- "\u2c00\u2fef\u3001\u8000\ud7ff\u8000\uf900\u8000\ufdcf\u8000\ufdf0\u8000"+
- "\ufffd\u0005\u0000--09\u00b7\u00b7\u0300\u036f\u203f\u2040\u0001\u0000"+
- "::\u0001\u0000))\u0002\u0000((::\u0005\u0000\"\"&\'<<{{}}\u04b8\u0000"+
- "\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000"+
- "\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000"+
- "\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r"+
- "\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011"+
+ "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e"+
+ "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+
+ "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+
+ "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+
+ "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001"+
+ "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001$\u0001$"+
+ "\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+
+ "\'\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001+\u0001"+
+ "+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+
+ "/\u0001/\u00010\u00010\u00011\u00011\u00011\u00011\u00012\u00012\u0001"+
+ "2\u00012\u00012\u00013\u00013\u00013\u00013\u00014\u00014\u00015\u0001"+
+ "5\u00016\u00016\u00017\u00017\u00018\u00018\u00018\u00019\u00019\u0001"+
+ ":\u0001:\u0001:\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001"+
+ "=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+
+ "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001"+
+ "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+
+ "B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001"+
+ "E\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+
+ "G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001"+
+ "I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+
+ "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+
+ "K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+
+ "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+
+ "N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+
+ "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+
+ "P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+
+ "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001"+
+ "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001"+
+ "T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+
+ "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+
+ "X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001"+
+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+
+ "]\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+
+ "_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+
+ "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001"+
+ "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+
+ "d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+
+ "f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001"+
+ "g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+
+ "h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001"+
+ "j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001"+
+ "k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001"+
+ "m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+
+ "n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001"+
+ "o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001"+
+ "q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001"+
+ "r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001"+
+ "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001"+
+ "u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001"+
+ "v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001"+
+ "x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+
+ "y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001"+
+ "{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+
+ "|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001"+
+ "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+
+ "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+
+ "\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081"+
+ "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082"+
+ "\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083"+
+ "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083"+
+ "\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084"+
+ "\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0005\u0085"+
+ "\u0445\b\u0085\n\u0085\f\u0085\u0448\t\u0085\u0001\u0085\u0001\u0085\u0001"+
+ "\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u044f\b\u0086\u0001\u0087\u0001"+
+ "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+
+ "\u0088\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+
+ "\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001"+
+ "\u008c\u0003\u008c\u0465\b\u008c\u0001\u008d\u0001\u008d\u0001\u008e\u0001"+
+ "\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0005\u008e\u046e\b\u008e\n"+
+ "\u008e\f\u008e\u0471\t\u008e\u0003\u008e\u0473\b\u008e\u0001\u008f\u0001"+
+ "\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0005\u008f\u047a\b\u008f\n"+
+ "\u008f\f\u008f\u047d\t\u008f\u0003\u008f\u047f\b\u008f\u0003\u008f\u0481"+
+ "\b\u008f\u0001\u008f\u0001\u008f\u0003\u008f\u0485\b\u008f\u0001\u008f"+
+ "\u0001\u008f\u0001\u0090\u0004\u0090\u048a\b\u0090\u000b\u0090\f\u0090"+
+ "\u048b\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001"+
+ "\u0092\u0005\u0092\u0494\b\u0092\n\u0092\f\u0092\u0497\t\u0092\u0001\u0093"+
+ "\u0003\u0093\u049a\b\u0093\u0001\u0094\u0001\u0094\u0003\u0094\u049e\b"+
+ "\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001"+
+ "\u0095\u0001\u0095\u0001\u0095\u0005\u0095\u04a8\b\u0095\n\u0095\f\u0095"+
+ "\u04ab\t\u0095\u0001\u0095\u0004\u0095\u04ae\b\u0095\u000b\u0095\f\u0095"+
+ "\u04af\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001"+
+ "\u0096\u0000\u0000\u0097\u0001\u0001\u0003\u0002\u0005\u0003\u0007\u0004"+
+ "\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015\u000b\u0017"+
+ "\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012%\u0013\'"+
+ "\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a5\u001b7\u001c9\u001d"+
+ ";\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s"+
+ ":u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089E\u008bF\u008dG\u008f"+
+ "H\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009dO\u009fP\u00a1Q\u00a3"+
+ "R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1Y\u00b3Z\u00b5[\u00b7"+
+ "\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5c\u00c7d\u00c9e\u00cb"+
+ "f\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9m\u00dbn\u00ddo\u00df"+
+ "p\u00e1q\u00e3r\u00e5s\u00e7t\u00e9u\u00ebv\u00edw\u00efx\u00f1y\u00f3"+
+ "z\u00f5{\u00f7|\u00f9}\u00fb~\u00fd\u007f\u00ff\u0080\u0101\u0081\u0103"+
+ "\u0082\u0105\u0083\u0107\u0084\u0109\u0085\u010b\u0086\u010d\u0000\u010f"+
+ "\u0000\u0111\u0000\u0113\u0087\u0115\u0088\u0117\u0089\u0119\u008a\u011b"+
+ "\u008b\u011d\u008c\u011f\u008d\u0121\u0000\u0123\u008e\u0125\u008f\u0127"+
+ "\u0000\u0129\u0000\u012b\u0090\u012d\u0091\u0001\u0000\r\u0002\u0000\""+
+ "\"\\\\\b\u0000\"\"//\\\\bbffnnrrtt\u0003\u000009AFaf\u0001\u000009\u0002"+
+ "\u0000EEee\u0002\u0000++--\u0003\u0000\t\n\r\r \u000e\u0000AZ__az\u00c0"+
+ "\u00d6\u00d8\u00f6\u00f8\u02ff\u0370\u037d\u037f\u1fff\u200c\u200d\u2070"+
+ "\u218f\u2c00\u2fef\u3001\u8000\ud7ff\u8000\uf900\u8000\ufdcf\u8000\ufdf0"+
+ "\u8000\ufffd\u0005\u0000--09\u00b7\u00b7\u0300\u036f\u203f\u2040\u0001"+
+ "\u0000::\u0001\u0000))\u0002\u0000((::\u0005\u0000\"\"&\'<<{{}}\u04c3"+
+ "\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000"+
+ "\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000"+
+ "\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000"+
+ "\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011"+
"\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015"+
"\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019"+
"\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d"+
@@ -421,489 +423,495 @@ public JsoniqLexer(CharStream input) {
"\u0000\u00ff\u0001\u0000\u0000\u0000\u0000\u0101\u0001\u0000\u0000\u0000"+
"\u0000\u0103\u0001\u0000\u0000\u0000\u0000\u0105\u0001\u0000\u0000\u0000"+
"\u0000\u0107\u0001\u0000\u0000\u0000\u0000\u0109\u0001\u0000\u0000\u0000"+
- "\u0000\u0111\u0001\u0000\u0000\u0000\u0000\u0113\u0001\u0000\u0000\u0000"+
+ "\u0000\u010b\u0001\u0000\u0000\u0000\u0000\u0113\u0001\u0000\u0000\u0000"+
"\u0000\u0115\u0001\u0000\u0000\u0000\u0000\u0117\u0001\u0000\u0000\u0000"+
"\u0000\u0119\u0001\u0000\u0000\u0000\u0000\u011b\u0001\u0000\u0000\u0000"+
- "\u0000\u011d\u0001\u0000\u0000\u0000\u0000\u0121\u0001\u0000\u0000\u0000"+
- "\u0000\u0123\u0001\u0000\u0000\u0000\u0000\u0129\u0001\u0000\u0000\u0000"+
- "\u0000\u012b\u0001\u0000\u0000\u0000\u0001\u012d\u0001\u0000\u0000\u0000"+
- "\u0003\u012f\u0001\u0000\u0000\u0000\u0005\u0136\u0001\u0000\u0000\u0000"+
- "\u0007\u0140\u0001\u0000\u0000\u0000\t\u0142\u0001\u0000\u0000\u0000\u000b"+
- "\u0144\u0001\u0000\u0000\u0000\r\u0147\u0001\u0000\u0000\u0000\u000f\u0149"+
- "\u0001\u0000\u0000\u0000\u0011\u014b\u0001\u0000\u0000\u0000\u0013\u014d"+
- "\u0001\u0000\u0000\u0000\u0015\u014f\u0001\u0000\u0000\u0000\u0017\u0151"+
- "\u0001\u0000\u0000\u0000\u0019\u0153\u0001\u0000\u0000\u0000\u001b\u0155"+
- "\u0001\u0000\u0000\u0000\u001d\u0157\u0001\u0000\u0000\u0000\u001f\u0160"+
- "\u0001\u0000\u0000\u0000!\u0168\u0001\u0000\u0000\u0000#\u0177\u0001\u0000"+
- "\u0000\u0000%\u0179\u0001\u0000\u0000\u0000\'\u018b\u0001\u0000\u0000"+
- "\u0000)\u019e\u0001\u0000\u0000\u0000+\u01a7\u0001\u0000\u0000\u0000-"+
- "\u01b2\u0001\u0000\u0000\u0000/\u01b6\u0001\u0000\u0000\u00001\u01be\u0001"+
- "\u0000\u0000\u00003\u01c8\u0001\u0000\u0000\u00005\u01d3\u0001\u0000\u0000"+
- "\u00007\u01d9\u0001\u0000\u0000\u00009\u01eb\u0001\u0000\u0000\u0000;"+
- "\u01f2\u0001\u0000\u0000\u0000=\u01fb\u0001\u0000\u0000\u0000?\u0204\u0001"+
- "\u0000\u0000\u0000A\u020b\u0001\u0000\u0000\u0000C\u0213\u0001\u0000\u0000"+
- "\u0000E\u021b\u0001\u0000\u0000\u0000G\u0222\u0001\u0000\u0000\u0000I"+
- "\u0225\u0001\u0000\u0000\u0000K\u0228\u0001\u0000\u0000\u0000M\u022b\u0001"+
- "\u0000\u0000\u0000O\u022e\u0001\u0000\u0000\u0000Q\u0231\u0001\u0000\u0000"+
- "\u0000S\u0234\u0001\u0000\u0000\u0000U\u0237\u0001\u0000\u0000\u0000W"+
- "\u0239\u0001\u0000\u0000\u0000Y\u023c\u0001\u0000\u0000\u0000[\u023e\u0001"+
- "\u0000\u0000\u0000]\u0241\u0001\u0000\u0000\u0000_\u0244\u0001\u0000\u0000"+
- "\u0000a\u0246\u0001\u0000\u0000\u0000c\u0248\u0001\u0000\u0000\u0000e"+
- "\u024c\u0001\u0000\u0000\u0000g\u0251\u0001\u0000\u0000\u0000i\u0255\u0001"+
- "\u0000\u0000\u0000k\u0257\u0001\u0000\u0000\u0000m\u0259\u0001\u0000\u0000"+
- "\u0000o\u025b\u0001\u0000\u0000\u0000q\u025d\u0001\u0000\u0000\u0000s"+
- "\u0260\u0001\u0000\u0000\u0000u\u0262\u0001\u0000\u0000\u0000w\u0265\u0001"+
- "\u0000\u0000\u0000y\u0268\u0001\u0000\u0000\u0000{\u026c\u0001\u0000\u0000"+
- "\u0000}\u0270\u0001\u0000\u0000\u0000\u007f\u0276\u0001\u0000\u0000\u0000"+
- "\u0081\u027c\u0001\u0000\u0000\u0000\u0083\u027f\u0001\u0000\u0000\u0000"+
- "\u0085\u0285\u0001\u0000\u0000\u0000\u0087\u028c\u0001\u0000\u0000\u0000"+
- "\u0089\u028f\u0001\u0000\u0000\u0000\u008b\u0292\u0001\u0000\u0000\u0000"+
- "\u008d\u0295\u0001\u0000\u0000\u0000\u008f\u0298\u0001\u0000\u0000\u0000"+
- "\u0091\u02a1\u0001\u0000\u0000\u0000\u0093\u02a7\u0001\u0000\u0000\u0000"+
- "\u0095\u02ad\u0001\u0000\u0000\u0000\u0097\u02b4\u0001\u0000\u0000\u0000"+
- "\u0099\u02be\u0001\u0000\u0000\u0000\u009b\u02c9\u0001\u0000\u0000\u0000"+
- "\u009d\u02ce\u0001\u0000\u0000\u0000\u009f\u02d4\u0001\u0000\u0000\u0000"+
- "\u00a1\u02de\u0001\u0000\u0000\u0000\u00a3\u02e8\u0001\u0000\u0000\u0000"+
- "\u00a5\u02f1\u0001\u0000\u0000\u0000\u00a7\u02f7\u0001\u0000\u0000\u0000"+
- "\u00a9\u02fe\u0001\u0000\u0000\u0000\u00ab\u0303\u0001\u0000\u0000\u0000"+
- "\u00ad\u0307\u0001\u0000\u0000\u0000\u00af\u030d\u0001\u0000\u0000\u0000"+
- "\u00b1\u0315\u0001\u0000\u0000\u0000\u00b3\u031a\u0001\u0000\u0000\u0000"+
- "\u00b5\u031f\u0001\u0000\u0000\u0000\u00b7\u032a\u0001\u0000\u0000\u0000"+
- "\u00b9\u032d\u0001\u0000\u0000\u0000\u00bb\u0331\u0001\u0000\u0000\u0000"+
- "\u00bd\u0335\u0001\u0000\u0000\u0000\u00bf\u0338\u0001\u0000\u0000\u0000"+
- "\u00c1\u0341\u0001\u0000\u0000\u0000\u00c3\u0344\u0001\u0000\u0000\u0000"+
- "\u00c5\u034f\u0001\u0000\u0000\u0000\u00c7\u0352\u0001\u0000\u0000\u0000"+
- "\u00c9\u0358\u0001\u0000\u0000\u0000\u00cb\u035d\u0001\u0000\u0000\u0000"+
- "\u00cd\u0366\u0001\u0000\u0000\u0000\u00cf\u036e\u0001\u0000\u0000\u0000"+
- "\u00d1\u0375\u0001\u0000\u0000\u0000\u00d3\u037f\u0001\u0000\u0000\u0000"+
- "\u00d5\u0384\u0001\u0000\u0000\u0000\u00d7\u038a\u0001\u0000\u0000\u0000"+
- "\u00d9\u038f\u0001\u0000\u0000\u0000\u00db\u0398\u0001\u0000\u0000\u0000"+
- "\u00dd\u03a1\u0001\u0000\u0000\u0000\u00df\u03a9\u0001\u0000\u0000\u0000"+
- "\u00e1\u03b1\u0001\u0000\u0000\u0000\u00e3\u03b6\u0001\u0000\u0000\u0000"+
- "\u00e5\u03bf\u0001\u0000\u0000\u0000\u00e7\u03c6\u0001\u0000\u0000\u0000"+
- "\u00e9\u03cd\u0001\u0000\u0000\u0000\u00eb\u03d4\u0001\u0000\u0000\u0000"+
- "\u00ed\u03dc\u0001\u0000\u0000\u0000\u00ef\u03e1\u0001\u0000\u0000\u0000"+
- "\u00f1\u03e8\u0001\u0000\u0000\u0000\u00f3\u03ef\u0001\u0000\u0000\u0000"+
- "\u00f5\u03f4\u0001\u0000\u0000\u0000\u00f7\u03fa\u0001\u0000\u0000\u0000"+
- "\u00f9\u03ff\u0001\u0000\u0000\u0000\u00fb\u0404\u0001\u0000\u0000\u0000"+
- "\u00fd\u040d\u0001\u0000\u0000\u0000\u00ff\u0413\u0001\u0000\u0000\u0000"+
- "\u0101\u0418\u0001\u0000\u0000\u0000\u0103\u0421\u0001\u0000\u0000\u0000"+
- "\u0105\u0426\u0001\u0000\u0000\u0000\u0107\u0430\u0001\u0000\u0000\u0000"+
- "\u0109\u0436\u0001\u0000\u0000\u0000\u010b\u0440\u0001\u0000\u0000\u0000"+
- "\u010d\u0445\u0001\u0000\u0000\u0000\u010f\u044b\u0001\u0000\u0000\u0000"+
- "\u0111\u044d\u0001\u0000\u0000\u0000\u0113\u044f\u0001\u0000\u0000\u0000"+
- "\u0115\u0454\u0001\u0000\u0000\u0000\u0117\u0459\u0001\u0000\u0000\u0000"+
- "\u0119\u045b\u0001\u0000\u0000\u0000\u011b\u0467\u0001\u0000\u0000\u0000"+
- "\u011d\u0475\u0001\u0000\u0000\u0000\u011f\u047e\u0001\u0000\u0000\u0000"+
- "\u0121\u0482\u0001\u0000\u0000\u0000\u0123\u0486\u0001\u0000\u0000\u0000"+
- "\u0125\u048e\u0001\u0000\u0000\u0000\u0127\u0492\u0001\u0000\u0000\u0000"+
- "\u0129\u0494\u0001\u0000\u0000\u0000\u012b\u04aa\u0001\u0000\u0000\u0000"+
- "\u012d\u012e\u0005;\u0000\u0000\u012e\u0002\u0001\u0000\u0000\u0000\u012f"+
- "\u0130\u0005m\u0000\u0000\u0130\u0131\u0005o\u0000\u0000\u0131\u0132\u0005"+
- "d\u0000\u0000\u0132\u0133\u0005u\u0000\u0000\u0133\u0134\u0005l\u0000"+
- "\u0000\u0134\u0135\u0005e\u0000\u0000\u0135\u0004\u0001\u0000\u0000\u0000"+
- "\u0136\u0137\u0005n\u0000\u0000\u0137\u0138\u0005a\u0000\u0000\u0138\u0139"+
- "\u0005m\u0000\u0000\u0139\u013a\u0005e\u0000\u0000\u013a\u013b\u0005s"+
- "\u0000\u0000\u013b\u013c\u0005p\u0000\u0000\u013c\u013d\u0005a\u0000\u0000"+
- "\u013d\u013e\u0005c\u0000\u0000\u013e\u013f\u0005e\u0000\u0000\u013f\u0006"+
- "\u0001\u0000\u0000\u0000\u0140\u0141\u0005=\u0000\u0000\u0141\b\u0001"+
- "\u0000\u0000\u0000\u0142\u0143\u0005$\u0000\u0000\u0143\n\u0001\u0000"+
- "\u0000\u0000\u0144\u0145\u0005:\u0000\u0000\u0145\u0146\u0005=\u0000\u0000"+
- "\u0146\f\u0001\u0000\u0000\u0000\u0147\u0148\u0005{\u0000\u0000\u0148"+
- "\u000e\u0001\u0000\u0000\u0000\u0149\u014a\u0005}\u0000\u0000\u014a\u0010"+
- "\u0001\u0000\u0000\u0000\u014b\u014c\u0005(\u0000\u0000\u014c\u0012\u0001"+
- "\u0000\u0000\u0000\u014d\u014e\u0005)\u0000\u0000\u014e\u0014\u0001\u0000"+
- "\u0000\u0000\u014f\u0150\u0005*\u0000\u0000\u0150\u0016\u0001\u0000\u0000"+
- "\u0000\u0151\u0152\u0005|\u0000\u0000\u0152\u0018\u0001\u0000\u0000\u0000"+
- "\u0153\u0154\u0005%\u0000\u0000\u0154\u001a\u0001\u0000\u0000\u0000\u0155"+
- "\u0156\u0005,\u0000\u0000\u0156\u001c\u0001\u0000\u0000\u0000\u0157\u0158"+
- "\u0005o\u0000\u0000\u0158\u0159\u0005r\u0000\u0000\u0159\u015a\u0005d"+
- "\u0000\u0000\u015a\u015b\u0005e\u0000\u0000\u015b\u015c\u0005r\u0000\u0000"+
- "\u015c\u015d\u0005i\u0000\u0000\u015d\u015e\u0005n\u0000\u0000\u015e\u015f"+
- "\u0005g\u0000\u0000\u015f\u001e\u0001\u0000\u0000\u0000\u0160\u0161\u0005"+
- "o\u0000\u0000\u0161\u0162\u0005r\u0000\u0000\u0162\u0163\u0005d\u0000"+
- "\u0000\u0163\u0164\u0005e\u0000\u0000\u0164\u0165\u0005r\u0000\u0000\u0165"+
- "\u0166\u0005e\u0000\u0000\u0166\u0167\u0005d\u0000\u0000\u0167 \u0001"+
- "\u0000\u0000\u0000\u0168\u0169\u0005d\u0000\u0000\u0169\u016a\u0005e\u0000"+
- "\u0000\u016a\u016b\u0005c\u0000\u0000\u016b\u016c\u0005i\u0000\u0000\u016c"+
- "\u016d\u0005m\u0000\u0000\u016d\u016e\u0005a\u0000\u0000\u016e\u016f\u0005"+
- "l\u0000\u0000\u016f\u0170\u0005-\u0000\u0000\u0170\u0171\u0005f\u0000"+
- "\u0000\u0171\u0172\u0005o\u0000\u0000\u0172\u0173\u0005r\u0000\u0000\u0173"+
- "\u0174\u0005m\u0000\u0000\u0174\u0175\u0005a\u0000\u0000\u0175\u0176\u0005"+
- "t\u0000\u0000\u0176\"\u0001\u0000\u0000\u0000\u0177\u0178\u0005:\u0000"+
- "\u0000\u0178$\u0001\u0000\u0000\u0000\u0179\u017a\u0005d\u0000\u0000\u017a"+
- "\u017b\u0005e\u0000\u0000\u017b\u017c\u0005c\u0000\u0000\u017c\u017d\u0005"+
- "i\u0000\u0000\u017d\u017e\u0005m\u0000\u0000\u017e\u017f\u0005a\u0000"+
- "\u0000\u017f\u0180\u0005l\u0000\u0000\u0180\u0181\u0005-\u0000\u0000\u0181"+
- "\u0182\u0005s\u0000\u0000\u0182\u0183\u0005e\u0000\u0000\u0183\u0184\u0005"+
- "p\u0000\u0000\u0184\u0185\u0005a\u0000\u0000\u0185\u0186\u0005r\u0000"+
- "\u0000\u0186\u0187\u0005a\u0000\u0000\u0187\u0188\u0005t\u0000\u0000\u0188"+
- "\u0189\u0005o\u0000\u0000\u0189\u018a\u0005r\u0000\u0000\u018a&\u0001"+
- "\u0000\u0000\u0000\u018b\u018c\u0005g\u0000\u0000\u018c\u018d\u0005r\u0000"+
- "\u0000\u018d\u018e\u0005o\u0000\u0000\u018e\u018f\u0005u\u0000\u0000\u018f"+
- "\u0190\u0005p\u0000\u0000\u0190\u0191\u0005i\u0000\u0000\u0191\u0192\u0005"+
- "n\u0000\u0000\u0192\u0193\u0005g\u0000\u0000\u0193\u0194\u0005-\u0000"+
- "\u0000\u0194\u0195\u0005s\u0000\u0000\u0195\u0196\u0005e\u0000\u0000\u0196"+
- "\u0197\u0005p\u0000\u0000\u0197\u0198\u0005a\u0000\u0000\u0198\u0199\u0005"+
- "r\u0000\u0000\u0199\u019a\u0005a\u0000\u0000\u019a\u019b\u0005t\u0000"+
- "\u0000\u019b\u019c\u0005o\u0000\u0000\u019c\u019d\u0005r\u0000\u0000\u019d"+
- "(\u0001\u0000\u0000\u0000\u019e\u019f\u0005i\u0000\u0000\u019f\u01a0\u0005"+
- "n\u0000\u0000\u01a0\u01a1\u0005f\u0000\u0000\u01a1\u01a2\u0005i\u0000"+
- "\u0000\u01a2\u01a3\u0005n\u0000\u0000\u01a3\u01a4\u0005i\u0000\u0000\u01a4"+
- "\u01a5\u0005t\u0000\u0000\u01a5\u01a6\u0005y\u0000\u0000\u01a6*\u0001"+
- "\u0000\u0000\u0000\u01a7\u01a8\u0005m\u0000\u0000\u01a8\u01a9\u0005i\u0000"+
- "\u0000\u01a9\u01aa\u0005n\u0000\u0000\u01aa\u01ab\u0005u\u0000\u0000\u01ab"+
- "\u01ac\u0005s\u0000\u0000\u01ac\u01ad\u0005-\u0000\u0000\u01ad\u01ae\u0005"+
- "s\u0000\u0000\u01ae\u01af\u0005i\u0000\u0000\u01af\u01b0\u0005g\u0000"+
- "\u0000\u01b0\u01b1\u0005n\u0000\u0000\u01b1,\u0001\u0000\u0000\u0000\u01b2"+
- "\u01b3\u0005N\u0000\u0000\u01b3\u01b4\u0005a\u0000\u0000\u01b4\u01b5\u0005"+
- "N\u0000\u0000\u01b5.\u0001\u0000\u0000\u0000\u01b6\u01b7\u0005p\u0000"+
- "\u0000\u01b7\u01b8\u0005e\u0000\u0000\u01b8\u01b9\u0005r\u0000\u0000\u01b9"+
- "\u01ba\u0005c\u0000\u0000\u01ba\u01bb\u0005e\u0000\u0000\u01bb\u01bc\u0005"+
- "n\u0000\u0000\u01bc\u01bd\u0005t\u0000\u0000\u01bd0\u0001\u0000\u0000"+
- "\u0000\u01be\u01bf\u0005p\u0000\u0000\u01bf\u01c0\u0005e\u0000\u0000\u01c0"+
- "\u01c1\u0005r\u0000\u0000\u01c1\u01c2\u0005-\u0000\u0000\u01c2\u01c3\u0005"+
- "m\u0000\u0000\u01c3\u01c4\u0005i\u0000\u0000\u01c4\u01c5\u0005l\u0000"+
- "\u0000\u01c5\u01c6\u0005l\u0000\u0000\u01c6\u01c7\u0005e\u0000\u0000\u01c7"+
- "2\u0001\u0000\u0000\u0000\u01c8\u01c9\u0005z\u0000\u0000\u01c9\u01ca\u0005"+
- "e\u0000\u0000\u01ca\u01cb\u0005r\u0000\u0000\u01cb\u01cc\u0005o\u0000"+
- "\u0000\u01cc\u01cd\u0005-\u0000\u0000\u01cd\u01ce\u0005d\u0000\u0000\u01ce"+
- "\u01cf\u0005i\u0000\u0000\u01cf\u01d0\u0005g\u0000\u0000\u01d0\u01d1\u0005"+
- "i\u0000\u0000\u01d1\u01d2\u0005t\u0000\u0000\u01d24\u0001\u0000\u0000"+
- "\u0000\u01d3\u01d4\u0005d\u0000\u0000\u01d4\u01d5\u0005i\u0000\u0000\u01d5"+
- "\u01d6\u0005g\u0000\u0000\u01d6\u01d7\u0005i\u0000\u0000\u01d7\u01d8\u0005"+
- "t\u0000\u0000\u01d86\u0001\u0000\u0000\u0000\u01d9\u01da\u0005p\u0000"+
- "\u0000\u01da\u01db\u0005a\u0000\u0000\u01db\u01dc\u0005t\u0000\u0000\u01dc"+
- "\u01dd\u0005t\u0000\u0000\u01dd\u01de\u0005e\u0000\u0000\u01de\u01df\u0005"+
- "r\u0000\u0000\u01df\u01e0\u0005n\u0000\u0000\u01e0\u01e1\u0005-\u0000"+
- "\u0000\u01e1\u01e2\u0005s\u0000\u0000\u01e2\u01e3\u0005e\u0000\u0000\u01e3"+
- "\u01e4\u0005p\u0000\u0000\u01e4\u01e5\u0005a\u0000\u0000\u01e5\u01e6\u0005"+
- "r\u0000\u0000\u01e6\u01e7\u0005a\u0000\u0000\u01e7\u01e8\u0005t\u0000"+
- "\u0000\u01e8\u01e9\u0005o\u0000\u0000\u01e9\u01ea\u0005r\u0000\u0000\u01ea"+
- "8\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005i\u0000\u0000\u01ec\u01ed\u0005"+
- "m\u0000\u0000\u01ed\u01ee\u0005p\u0000\u0000\u01ee\u01ef\u0005o\u0000"+
- "\u0000\u01ef\u01f0\u0005r\u0000\u0000\u01f0\u01f1\u0005t\u0000\u0000\u01f1"+
- ":\u0001\u0000\u0000\u0000\u01f2\u01f3\u0005e\u0000\u0000\u01f3\u01f4\u0005"+
- "x\u0000\u0000\u01f4\u01f5\u0005t\u0000\u0000\u01f5\u01f6\u0005e\u0000"+
- "\u0000\u01f6\u01f7\u0005r\u0000\u0000\u01f7\u01f8\u0005n\u0000\u0000\u01f8"+
- "\u01f9\u0005a\u0000\u0000\u01f9\u01fa\u0005l\u0000\u0000\u01fa<\u0001"+
- "\u0000\u0000\u0000\u01fb\u01fc\u0005f\u0000\u0000\u01fc\u01fd\u0005u\u0000"+
- "\u0000\u01fd\u01fe\u0005n\u0000\u0000\u01fe\u01ff\u0005c\u0000\u0000\u01ff"+
- "\u0200\u0005t\u0000\u0000\u0200\u0201\u0005i\u0000\u0000\u0201\u0202\u0005"+
- "o\u0000\u0000\u0202\u0203\u0005n\u0000\u0000\u0203>\u0001\u0000\u0000"+
- "\u0000\u0204\u0205\u0005j\u0000\u0000\u0205\u0206\u0005s\u0000\u0000\u0206"+
- "\u0207\u0005o\u0000\u0000\u0207\u0208\u0005u\u0000\u0000\u0208\u0209\u0005"+
- "n\u0000\u0000\u0209\u020a\u0005d\u0000\u0000\u020a@\u0001\u0000\u0000"+
- "\u0000\u020b\u020c\u0005c\u0000\u0000\u020c\u020d\u0005o\u0000\u0000\u020d"+
- "\u020e\u0005m\u0000\u0000\u020e\u020f\u0005p\u0000\u0000\u020f\u0210\u0005"+
- "a\u0000\u0000\u0210\u0211\u0005c\u0000\u0000\u0211\u0212\u0005t\u0000"+
- "\u0000\u0212B\u0001\u0000\u0000\u0000\u0213\u0214\u0005v\u0000\u0000\u0214"+
- "\u0215\u0005e\u0000\u0000\u0215\u0216\u0005r\u0000\u0000\u0216\u0217\u0005"+
- "b\u0000\u0000\u0217\u0218\u0005o\u0000\u0000\u0218\u0219\u0005s\u0000"+
- "\u0000\u0219\u021a\u0005e\u0000\u0000\u021aD\u0001\u0000\u0000\u0000\u021b"+
- "\u021c\u0005s\u0000\u0000\u021c\u021d\u0005c\u0000\u0000\u021d\u021e\u0005"+
- "h\u0000\u0000\u021e\u021f\u0005e\u0000\u0000\u021f\u0220\u0005m\u0000"+
- "\u0000\u0220\u0221\u0005a\u0000\u0000\u0221F\u0001\u0000\u0000\u0000\u0222"+
- "\u0223\u0005e\u0000\u0000\u0223\u0224\u0005q\u0000\u0000\u0224H\u0001"+
- "\u0000\u0000\u0000\u0225\u0226\u0005n\u0000\u0000\u0226\u0227\u0005e\u0000"+
- "\u0000\u0227J\u0001\u0000\u0000\u0000\u0228\u0229\u0005l\u0000\u0000\u0229"+
- "\u022a\u0005t\u0000\u0000\u022aL\u0001\u0000\u0000\u0000\u022b\u022c\u0005"+
- "l\u0000\u0000\u022c\u022d\u0005e\u0000\u0000\u022dN\u0001\u0000\u0000"+
- "\u0000\u022e\u022f\u0005g\u0000\u0000\u022f\u0230\u0005t\u0000\u0000\u0230"+
- "P\u0001\u0000\u0000\u0000\u0231\u0232\u0005g\u0000\u0000\u0232\u0233\u0005"+
- "e\u0000\u0000\u0233R\u0001\u0000\u0000\u0000\u0234\u0235\u0005!\u0000"+
- "\u0000\u0235\u0236\u0005=\u0000\u0000\u0236T\u0001\u0000\u0000\u0000\u0237"+
- "\u0238\u0005<\u0000\u0000\u0238V\u0001\u0000\u0000\u0000\u0239\u023a\u0005"+
- "<\u0000\u0000\u023a\u023b\u0005=\u0000\u0000\u023bX\u0001\u0000\u0000"+
- "\u0000\u023c\u023d\u0005>\u0000\u0000\u023dZ\u0001\u0000\u0000\u0000\u023e"+
- "\u023f\u0005>\u0000\u0000\u023f\u0240\u0005=\u0000\u0000\u0240\\\u0001"+
- "\u0000\u0000\u0000\u0241\u0242\u0005|\u0000\u0000\u0242\u0243\u0005|\u0000"+
- "\u0000\u0243^\u0001\u0000\u0000\u0000\u0244\u0245\u0005+\u0000\u0000\u0245"+
- "`\u0001\u0000\u0000\u0000\u0246\u0247\u0005-\u0000\u0000\u0247b\u0001"+
- "\u0000\u0000\u0000\u0248\u0249\u0005d\u0000\u0000\u0249\u024a\u0005i\u0000"+
- "\u0000\u024a\u024b\u0005v\u0000\u0000\u024bd\u0001\u0000\u0000\u0000\u024c"+
- "\u024d\u0005i\u0000\u0000\u024d\u024e\u0005d\u0000\u0000\u024e\u024f\u0005"+
- "i\u0000\u0000\u024f\u0250\u0005v\u0000\u0000\u0250f\u0001\u0000\u0000"+
- "\u0000\u0251\u0252\u0005m\u0000\u0000\u0252\u0253\u0005o\u0000\u0000\u0253"+
- "\u0254\u0005d\u0000\u0000\u0254h\u0001\u0000\u0000\u0000\u0255\u0256\u0005"+
- "!\u0000\u0000\u0256j\u0001\u0000\u0000\u0000\u0257\u0258\u0005[\u0000"+
- "\u0000\u0258l\u0001\u0000\u0000\u0000\u0259\u025a\u0005]\u0000\u0000\u025a"+
- "n\u0001\u0000\u0000\u0000\u025b\u025c\u0005.\u0000\u0000\u025cp\u0001"+
- "\u0000\u0000\u0000\u025d\u025e\u0005$\u0000\u0000\u025e\u025f\u0005$\u0000"+
- "\u0000\u025fr\u0001\u0000\u0000\u0000\u0260\u0261\u0005#\u0000\u0000\u0261"+
- "t\u0001\u0000\u0000\u0000\u0262\u0263\u0005{\u0000\u0000\u0263\u0264\u0005"+
- "|\u0000\u0000\u0264v\u0001\u0000\u0000\u0000\u0265\u0266\u0005|\u0000"+
- "\u0000\u0266\u0267\u0005}\u0000\u0000\u0267x\u0001\u0000\u0000\u0000\u0268"+
- "\u0269\u0005f\u0000\u0000\u0269\u026a\u0005o\u0000\u0000\u026a\u026b\u0005"+
- "r\u0000\u0000\u026bz\u0001\u0000\u0000\u0000\u026c\u026d\u0005l\u0000"+
- "\u0000\u026d\u026e\u0005e\u0000\u0000\u026e\u026f\u0005t\u0000\u0000\u026f"+
- "|\u0001\u0000\u0000\u0000\u0270\u0271\u0005w\u0000\u0000\u0271\u0272\u0005"+
- "h\u0000\u0000\u0272\u0273\u0005e\u0000\u0000\u0273\u0274\u0005r\u0000"+
- "\u0000\u0274\u0275\u0005e\u0000\u0000\u0275~\u0001\u0000\u0000\u0000\u0276"+
- "\u0277\u0005g\u0000\u0000\u0277\u0278\u0005r\u0000\u0000\u0278\u0279\u0005"+
- "o\u0000\u0000\u0279\u027a\u0005u\u0000\u0000\u027a\u027b\u0005p\u0000"+
- "\u0000\u027b\u0080\u0001\u0000\u0000\u0000\u027c\u027d\u0005b\u0000\u0000"+
- "\u027d\u027e\u0005y\u0000\u0000\u027e\u0082\u0001\u0000\u0000\u0000\u027f"+
- "\u0280\u0005o\u0000\u0000\u0280\u0281\u0005r\u0000\u0000\u0281\u0282\u0005"+
- "d\u0000\u0000\u0282\u0283\u0005e\u0000\u0000\u0283\u0284\u0005r\u0000"+
- "\u0000\u0284\u0084\u0001\u0000\u0000\u0000\u0285\u0286\u0005r\u0000\u0000"+
- "\u0286\u0287\u0005e\u0000\u0000\u0287\u0288\u0005t\u0000\u0000\u0288\u0289"+
- "\u0005u\u0000\u0000\u0289\u028a\u0005r\u0000\u0000\u028a\u028b\u0005n"+
- "\u0000\u0000\u028b\u0086\u0001\u0000\u0000\u0000\u028c\u028d\u0005i\u0000"+
- "\u0000\u028d\u028e\u0005f\u0000\u0000\u028e\u0088\u0001\u0000\u0000\u0000"+
- "\u028f\u0290\u0005i\u0000\u0000\u0290\u0291\u0005n\u0000\u0000\u0291\u008a"+
- "\u0001\u0000\u0000\u0000\u0292\u0293\u0005a\u0000\u0000\u0293\u0294\u0005"+
- "s\u0000\u0000\u0294\u008c\u0001\u0000\u0000\u0000\u0295\u0296\u0005a\u0000"+
- "\u0000\u0296\u0297\u0005t\u0000\u0000\u0297\u008e\u0001\u0000\u0000\u0000"+
- "\u0298\u0299\u0005a\u0000\u0000\u0299\u029a\u0005l\u0000\u0000\u029a\u029b"+
- "\u0005l\u0000\u0000\u029b\u029c\u0005o\u0000\u0000\u029c\u029d\u0005w"+
- "\u0000\u0000\u029d\u029e\u0005i\u0000\u0000\u029e\u029f\u0005n\u0000\u0000"+
- "\u029f\u02a0\u0005g\u0000\u0000\u02a0\u0090\u0001\u0000\u0000\u0000\u02a1"+
- "\u02a2\u0005e\u0000\u0000\u02a2\u02a3\u0005m\u0000\u0000\u02a3\u02a4\u0005"+
- "p\u0000\u0000\u02a4\u02a5\u0005t\u0000\u0000\u02a5\u02a6\u0005y\u0000"+
- "\u0000\u02a6\u0092\u0001\u0000\u0000\u0000\u02a7\u02a8\u0005c\u0000\u0000"+
- "\u02a8\u02a9\u0005o\u0000\u0000\u02a9\u02aa\u0005u\u0000\u0000\u02aa\u02ab"+
- "\u0005n\u0000\u0000\u02ab\u02ac\u0005t\u0000\u0000\u02ac\u0094\u0001\u0000"+
- "\u0000\u0000\u02ad\u02ae\u0005s\u0000\u0000\u02ae\u02af\u0005t\u0000\u0000"+
- "\u02af\u02b0\u0005a\u0000\u0000\u02b0\u02b1\u0005b\u0000\u0000\u02b1\u02b2"+
- "\u0005l\u0000\u0000\u02b2\u02b3\u0005e\u0000\u0000\u02b3\u0096\u0001\u0000"+
- "\u0000\u0000\u02b4\u02b5\u0005a\u0000\u0000\u02b5\u02b6\u0005s\u0000\u0000"+
- "\u02b6\u02b7\u0005c\u0000\u0000\u02b7\u02b8\u0005e\u0000\u0000\u02b8\u02b9"+
- "\u0005n\u0000\u0000\u02b9\u02ba\u0005d\u0000\u0000\u02ba\u02bb\u0005i"+
- "\u0000\u0000\u02bb\u02bc\u0005n\u0000\u0000\u02bc\u02bd\u0005g\u0000\u0000"+
- "\u02bd\u0098\u0001\u0000\u0000\u0000\u02be\u02bf\u0005d\u0000\u0000\u02bf"+
- "\u02c0\u0005e\u0000\u0000\u02c0\u02c1\u0005s\u0000\u0000\u02c1\u02c2\u0005"+
- "c\u0000\u0000\u02c2\u02c3\u0005e\u0000\u0000\u02c3\u02c4\u0005n\u0000"+
- "\u0000\u02c4\u02c5\u0005d\u0000\u0000\u02c5\u02c6\u0005i\u0000\u0000\u02c6"+
- "\u02c7\u0005n\u0000\u0000\u02c7\u02c8\u0005g\u0000\u0000\u02c8\u009a\u0001"+
- "\u0000\u0000\u0000\u02c9\u02ca\u0005s\u0000\u0000\u02ca\u02cb\u0005o\u0000"+
- "\u0000\u02cb\u02cc\u0005m\u0000\u0000\u02cc\u02cd\u0005e\u0000\u0000\u02cd"+
- "\u009c\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005e\u0000\u0000\u02cf\u02d0"+
- "\u0005v\u0000\u0000\u02d0\u02d1\u0005e\u0000\u0000\u02d1\u02d2\u0005r"+
- "\u0000\u0000\u02d2\u02d3\u0005y\u0000\u0000\u02d3\u009e\u0001\u0000\u0000"+
- "\u0000\u02d4\u02d5\u0005s\u0000\u0000\u02d5\u02d6\u0005a\u0000\u0000\u02d6"+
- "\u02d7\u0005t\u0000\u0000\u02d7\u02d8\u0005i\u0000\u0000\u02d8\u02d9\u0005"+
- "s\u0000\u0000\u02d9\u02da\u0005f\u0000\u0000\u02da\u02db\u0005i\u0000"+
- "\u0000\u02db\u02dc\u0005e\u0000\u0000\u02dc\u02dd\u0005s\u0000\u0000\u02dd"+
- "\u00a0\u0001\u0000\u0000\u0000\u02de\u02df\u0005c\u0000\u0000\u02df\u02e0"+
- "\u0005o\u0000\u0000\u02e0\u02e1\u0005l\u0000\u0000\u02e1\u02e2\u0005l"+
- "\u0000\u0000\u02e2\u02e3\u0005a\u0000\u0000\u02e3\u02e4\u0005t\u0000\u0000"+
- "\u02e4\u02e5\u0005i\u0000\u0000\u02e5\u02e6\u0005o\u0000\u0000\u02e6\u02e7"+
- "\u0005n\u0000\u0000\u02e7\u00a2\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005"+
- "g\u0000\u0000\u02e9\u02ea\u0005r\u0000\u0000\u02ea\u02eb\u0005e\u0000"+
- "\u0000\u02eb\u02ec\u0005a\u0000\u0000\u02ec\u02ed\u0005t\u0000\u0000\u02ed"+
- "\u02ee\u0005e\u0000\u0000\u02ee\u02ef\u0005s\u0000\u0000\u02ef\u02f0\u0005"+
- "t\u0000\u0000\u02f0\u00a4\u0001\u0000\u0000\u0000\u02f1\u02f2\u0005l\u0000"+
- "\u0000\u02f2\u02f3\u0005e\u0000\u0000\u02f3\u02f4\u0005a\u0000\u0000\u02f4"+
- "\u02f5\u0005s\u0000\u0000\u02f5\u02f6\u0005t\u0000\u0000\u02f6\u00a6\u0001"+
- "\u0000\u0000\u0000\u02f7\u02f8\u0005s\u0000\u0000\u02f8\u02f9\u0005w\u0000"+
- "\u0000\u02f9\u02fa\u0005i\u0000\u0000\u02fa\u02fb\u0005t\u0000\u0000\u02fb"+
- "\u02fc\u0005c\u0000\u0000\u02fc\u02fd\u0005h\u0000\u0000\u02fd\u00a8\u0001"+
- "\u0000\u0000\u0000\u02fe\u02ff\u0005c\u0000\u0000\u02ff\u0300\u0005a\u0000"+
- "\u0000\u0300\u0301\u0005s\u0000\u0000\u0301\u0302\u0005e\u0000\u0000\u0302"+
- "\u00aa\u0001\u0000\u0000\u0000\u0303\u0304\u0005t\u0000\u0000\u0304\u0305"+
- "\u0005r\u0000\u0000\u0305\u0306\u0005y\u0000\u0000\u0306\u00ac\u0001\u0000"+
- "\u0000\u0000\u0307\u0308\u0005c\u0000\u0000\u0308\u0309\u0005a\u0000\u0000"+
- "\u0309\u030a\u0005t\u0000\u0000\u030a\u030b\u0005c\u0000\u0000\u030b\u030c"+
- "\u0005h\u0000\u0000\u030c\u00ae\u0001\u0000\u0000\u0000\u030d\u030e\u0005"+
- "d\u0000\u0000\u030e\u030f\u0005e\u0000\u0000\u030f\u0310\u0005f\u0000"+
- "\u0000\u0310\u0311\u0005a\u0000\u0000\u0311\u0312\u0005u\u0000\u0000\u0312"+
- "\u0313\u0005l\u0000\u0000\u0313\u0314\u0005t\u0000\u0000\u0314\u00b0\u0001"+
- "\u0000\u0000\u0000\u0315\u0316\u0005t\u0000\u0000\u0316\u0317\u0005h\u0000"+
- "\u0000\u0317\u0318\u0005e\u0000\u0000\u0318\u0319\u0005n\u0000\u0000\u0319"+
- "\u00b2\u0001\u0000\u0000\u0000\u031a\u031b\u0005e\u0000\u0000\u031b\u031c"+
- "\u0005l\u0000\u0000\u031c\u031d\u0005s\u0000\u0000\u031d\u031e\u0005e"+
- "\u0000\u0000\u031e\u00b4\u0001\u0000\u0000\u0000\u031f\u0320\u0005t\u0000"+
- "\u0000\u0320\u0321\u0005y\u0000\u0000\u0321\u0322\u0005p\u0000\u0000\u0322"+
- "\u0323\u0005e\u0000\u0000\u0323\u0324\u0005s\u0000\u0000\u0324\u0325\u0005"+
- "w\u0000\u0000\u0325\u0326\u0005i\u0000\u0000\u0326\u0327\u0005t\u0000"+
- "\u0000\u0327\u0328\u0005c\u0000\u0000\u0328\u0329\u0005h\u0000\u0000\u0329"+
- "\u00b6\u0001\u0000\u0000\u0000\u032a\u032b\u0005o\u0000\u0000\u032b\u032c"+
- "\u0005r\u0000\u0000\u032c\u00b8\u0001\u0000\u0000\u0000\u032d\u032e\u0005"+
- "a\u0000\u0000\u032e\u032f\u0005n\u0000\u0000\u032f\u0330\u0005d\u0000"+
- "\u0000\u0330\u00ba\u0001\u0000\u0000\u0000\u0331\u0332\u0005n\u0000\u0000"+
- "\u0332\u0333\u0005o\u0000\u0000\u0333\u0334\u0005t\u0000\u0000\u0334\u00bc"+
- "\u0001\u0000\u0000\u0000\u0335\u0336\u0005t\u0000\u0000\u0336\u0337\u0005"+
- "o\u0000\u0000\u0337\u00be\u0001\u0000\u0000\u0000\u0338\u0339\u0005i\u0000"+
- "\u0000\u0339\u033a\u0005n\u0000\u0000\u033a\u033b\u0005s\u0000\u0000\u033b"+
- "\u033c\u0005t\u0000\u0000\u033c\u033d\u0005a\u0000\u0000\u033d\u033e\u0005"+
- "n\u0000\u0000\u033e\u033f\u0005c\u0000\u0000\u033f\u0340\u0005e\u0000"+
- "\u0000\u0340\u00c0\u0001\u0000\u0000\u0000\u0341\u0342\u0005o\u0000\u0000"+
- "\u0342\u0343\u0005f\u0000\u0000\u0343\u00c2\u0001\u0000\u0000\u0000\u0344"+
- "\u0345\u0005s\u0000\u0000\u0345\u0346\u0005t\u0000\u0000\u0346\u0347\u0005"+
- "a\u0000\u0000\u0347\u0348\u0005t\u0000\u0000\u0348\u0349\u0005i\u0000"+
- "\u0000\u0349\u034a\u0005c\u0000\u0000\u034a\u034b\u0005a\u0000\u0000\u034b"+
- "\u034c\u0005l\u0000\u0000\u034c\u034d\u0005l\u0000\u0000\u034d\u034e\u0005"+
- "y\u0000\u0000\u034e\u00c4\u0001\u0000\u0000\u0000\u034f\u0350\u0005i\u0000"+
- "\u0000\u0350\u0351\u0005s\u0000\u0000\u0351\u00c6\u0001\u0000\u0000\u0000"+
- "\u0352\u0353\u0005t\u0000\u0000\u0353\u0354\u0005r\u0000\u0000\u0354\u0355"+
- "\u0005e\u0000\u0000\u0355\u0356\u0005a\u0000\u0000\u0356\u0357\u0005t"+
- "\u0000\u0000\u0357\u00c8\u0001\u0000\u0000\u0000\u0358\u0359\u0005c\u0000"+
- "\u0000\u0359\u035a\u0005a\u0000\u0000\u035a\u035b\u0005s\u0000\u0000\u035b"+
- "\u035c\u0005t\u0000\u0000\u035c\u00ca\u0001\u0000\u0000\u0000\u035d\u035e"+
- "\u0005c\u0000\u0000\u035e\u035f\u0005a\u0000\u0000\u035f\u0360\u0005s"+
- "\u0000\u0000\u0360\u0361\u0005t\u0000\u0000\u0361\u0362\u0005a\u0000\u0000"+
- "\u0362\u0363\u0005b\u0000\u0000\u0363\u0364\u0005l\u0000\u0000\u0364\u0365"+
- "\u0005e\u0000\u0000\u0365\u00cc\u0001\u0000\u0000\u0000\u0366\u0367\u0005"+
- "v\u0000\u0000\u0367\u0368\u0005e\u0000\u0000\u0368\u0369\u0005r\u0000"+
- "\u0000\u0369\u036a\u0005s\u0000\u0000\u036a\u036b\u0005i\u0000\u0000\u036b"+
- "\u036c\u0005o\u0000\u0000\u036c\u036d\u0005n\u0000\u0000\u036d\u00ce\u0001"+
- "\u0000\u0000\u0000\u036e\u036f\u0005j\u0000\u0000\u036f\u0370\u0005s\u0000"+
- "\u0000\u0370\u0371\u0005o\u0000\u0000\u0371\u0372\u0005n\u0000\u0000\u0372"+
- "\u0373\u0005i\u0000\u0000\u0373\u0374\u0005q\u0000\u0000\u0374\u00d0\u0001"+
- "\u0000\u0000\u0000\u0375\u0376\u0005u\u0000\u0000\u0376\u0377\u0005n\u0000"+
- "\u0000\u0377\u0378\u0005o\u0000\u0000\u0378\u0379\u0005r\u0000\u0000\u0379"+
- "\u037a\u0005d\u0000\u0000\u037a\u037b\u0005e\u0000\u0000\u037b\u037c\u0005"+
- "r\u0000\u0000\u037c\u037d\u0005e\u0000\u0000\u037d\u037e\u0005d\u0000"+
- "\u0000\u037e\u00d2\u0001\u0000\u0000\u0000\u037f\u0380\u0005t\u0000\u0000"+
- "\u0380\u0381\u0005r\u0000\u0000\u0381\u0382\u0005u\u0000\u0000\u0382\u0383"+
- "\u0005e\u0000\u0000\u0383\u00d4\u0001\u0000\u0000\u0000\u0384\u0385\u0005"+
- "f\u0000\u0000\u0385\u0386\u0005a\u0000\u0000\u0386\u0387\u0005l\u0000"+
- "\u0000\u0387\u0388\u0005s\u0000\u0000\u0388\u0389\u0005e\u0000\u0000\u0389"+
- "\u00d6\u0001\u0000\u0000\u0000\u038a\u038b\u0005t\u0000\u0000\u038b\u038c"+
- "\u0005y\u0000\u0000\u038c\u038d\u0005p\u0000\u0000\u038d\u038e\u0005e"+
- "\u0000\u0000\u038e\u00d8\u0001\u0000\u0000\u0000\u038f\u0390\u0005v\u0000"+
- "\u0000\u0390\u0391\u0005a\u0000\u0000\u0391\u0392\u0005l\u0000\u0000\u0392"+
- "\u0393\u0005i\u0000\u0000\u0393\u0394\u0005d\u0000\u0000\u0394\u0395\u0005"+
- "a\u0000\u0000\u0395\u0396\u0005t\u0000\u0000\u0396\u0397\u0005e\u0000"+
- "\u0000\u0397\u00da\u0001\u0000\u0000\u0000\u0398\u0399\u0005a\u0000\u0000"+
- "\u0399\u039a\u0005n\u0000\u0000\u039a\u039b\u0005n\u0000\u0000\u039b\u039c"+
- "\u0005o\u0000\u0000\u039c\u039d\u0005t\u0000\u0000\u039d\u039e\u0005a"+
- "\u0000\u0000\u039e\u039f\u0005t\u0000\u0000\u039f\u03a0\u0005e\u0000\u0000"+
- "\u03a0\u00dc\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005d\u0000\u0000\u03a2"+
- "\u03a3\u0005e\u0000\u0000\u03a3\u03a4\u0005c\u0000\u0000\u03a4\u03a5\u0005"+
- "l\u0000\u0000\u03a5\u03a6\u0005a\u0000\u0000\u03a6\u03a7\u0005r\u0000"+
- "\u0000\u03a7\u03a8\u0005e\u0000\u0000\u03a8\u00de\u0001\u0000\u0000\u0000"+
- "\u03a9\u03aa\u0005c\u0000\u0000\u03aa\u03ab\u0005o\u0000\u0000\u03ab\u03ac"+
- "\u0005n\u0000\u0000\u03ac\u03ad\u0005t\u0000\u0000\u03ad\u03ae\u0005e"+
- "\u0000\u0000\u03ae\u03af\u0005x\u0000\u0000\u03af\u03b0\u0005t\u0000\u0000"+
- "\u03b0\u00e0\u0001\u0000\u0000\u0000\u03b1\u03b2\u0005i\u0000\u0000\u03b2"+
- "\u03b3\u0005t\u0000\u0000\u03b3\u03b4\u0005e\u0000\u0000\u03b4\u03b5\u0005"+
- "m\u0000\u0000\u03b5\u00e2\u0001\u0000\u0000\u0000\u03b6\u03b7\u0005v\u0000"+
- "\u0000\u03b7\u03b8\u0005a\u0000\u0000\u03b8\u03b9\u0005r\u0000\u0000\u03b9"+
- "\u03ba\u0005i\u0000\u0000\u03ba\u03bb\u0005a\u0000\u0000\u03bb\u03bc\u0005"+
- "b\u0000\u0000\u03bc\u03bd\u0005l\u0000\u0000\u03bd\u03be\u0005e\u0000"+
- "\u0000\u03be\u00e4\u0001\u0000\u0000\u0000\u03bf\u03c0\u0005i\u0000\u0000"+
- "\u03c0\u03c1\u0005n\u0000\u0000\u03c1\u03c2\u0005s\u0000\u0000\u03c2\u03c3"+
- "\u0005e\u0000\u0000\u03c3\u03c4\u0005r\u0000\u0000\u03c4\u03c5\u0005t"+
- "\u0000\u0000\u03c5\u00e6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0005d\u0000"+
- "\u0000\u03c7\u03c8\u0005e\u0000\u0000\u03c8\u03c9\u0005l\u0000\u0000\u03c9"+
- "\u03ca\u0005e\u0000\u0000\u03ca\u03cb\u0005t\u0000\u0000\u03cb\u03cc\u0005"+
- "e\u0000\u0000\u03cc\u00e8\u0001\u0000\u0000\u0000\u03cd\u03ce\u0005r\u0000"+
- "\u0000\u03ce\u03cf\u0005e\u0000\u0000\u03cf\u03d0\u0005n\u0000\u0000\u03d0"+
- "\u03d1\u0005a\u0000\u0000\u03d1\u03d2\u0005m\u0000\u0000\u03d2\u03d3\u0005"+
- "e\u0000\u0000\u03d3\u00ea\u0001\u0000\u0000\u0000\u03d4\u03d5\u0005r\u0000"+
- "\u0000\u03d5\u03d6\u0005e\u0000\u0000\u03d6\u03d7\u0005p\u0000\u0000\u03d7"+
- "\u03d8\u0005l\u0000\u0000\u03d8\u03d9\u0005a\u0000\u0000\u03d9\u03da\u0005"+
- "c\u0000\u0000\u03da\u03db\u0005e\u0000\u0000\u03db\u00ec\u0001\u0000\u0000"+
- "\u0000\u03dc\u03dd\u0005c\u0000\u0000\u03dd\u03de\u0005o\u0000\u0000\u03de"+
- "\u03df\u0005p\u0000\u0000\u03df\u03e0\u0005y\u0000\u0000\u03e0\u00ee\u0001"+
- "\u0000\u0000\u0000\u03e1\u03e2\u0005m\u0000\u0000\u03e2\u03e3\u0005o\u0000"+
- "\u0000\u03e3\u03e4\u0005d\u0000\u0000\u03e4\u03e5\u0005i\u0000\u0000\u03e5"+
- "\u03e6\u0005f\u0000\u0000\u03e6\u03e7\u0005y\u0000\u0000\u03e7\u00f0\u0001"+
- "\u0000\u0000\u0000\u03e8\u03e9\u0005a\u0000\u0000\u03e9\u03ea\u0005p\u0000"+
- "\u0000\u03ea\u03eb\u0005p\u0000\u0000\u03eb\u03ec\u0005e\u0000\u0000\u03ec"+
- "\u03ed\u0005n\u0000\u0000\u03ed\u03ee\u0005d\u0000\u0000\u03ee\u00f2\u0001"+
- "\u0000\u0000\u0000\u03ef\u03f0\u0005i\u0000\u0000\u03f0\u03f1\u0005n\u0000"+
- "\u0000\u03f1\u03f2\u0005t\u0000\u0000\u03f2\u03f3\u0005o\u0000\u0000\u03f3"+
- "\u00f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005v\u0000\u0000\u03f5\u03f6"+
- "\u0005a\u0000\u0000\u03f6\u03f7\u0005l\u0000\u0000\u03f7\u03f8\u0005u"+
- "\u0000\u0000\u03f8\u03f9\u0005e\u0000\u0000\u03f9\u00f6\u0001\u0000\u0000"+
- "\u0000\u03fa\u03fb\u0005j\u0000\u0000\u03fb\u03fc\u0005s\u0000\u0000\u03fc"+
- "\u03fd\u0005o\u0000\u0000\u03fd\u03fe\u0005n\u0000\u0000\u03fe\u00f8\u0001"+
- "\u0000\u0000\u0000\u03ff\u0400\u0005w\u0000\u0000\u0400\u0401\u0005i\u0000"+
- "\u0000\u0401\u0402\u0005t\u0000\u0000\u0402\u0403\u0005h\u0000\u0000\u0403"+
- "\u00fa\u0001\u0000\u0000\u0000\u0404\u0405\u0005p\u0000\u0000\u0405\u0406"+
- "\u0005o\u0000\u0000\u0406\u0407\u0005s\u0000\u0000\u0407\u0408\u0005i"+
- "\u0000\u0000\u0408\u0409\u0005t\u0000\u0000\u0409\u040a\u0005i\u0000\u0000"+
- "\u040a\u040b\u0005o\u0000\u0000\u040b\u040c\u0005n\u0000\u0000\u040c\u00fc"+
- "\u0001\u0000\u0000\u0000\u040d\u040e\u0005b\u0000\u0000\u040e\u040f\u0005"+
- "r\u0000\u0000\u040f\u0410\u0005e\u0000\u0000\u0410\u0411\u0005a\u0000"+
- "\u0000\u0411\u0412\u0005k\u0000\u0000\u0412\u00fe\u0001\u0000\u0000\u0000"+
- "\u0413\u0414\u0005l\u0000\u0000\u0414\u0415\u0005o\u0000\u0000\u0415\u0416"+
- "\u0005o\u0000\u0000\u0416\u0417\u0005p\u0000\u0000\u0417\u0100\u0001\u0000"+
- "\u0000\u0000\u0418\u0419\u0005c\u0000\u0000\u0419\u041a\u0005o\u0000\u0000"+
- "\u041a\u041b\u0005n\u0000\u0000\u041b\u041c\u0005t\u0000\u0000\u041c\u041d"+
- "\u0005i\u0000\u0000\u041d\u041e\u0005n\u0000\u0000\u041e\u041f\u0005u"+
- "\u0000\u0000\u041f\u0420\u0005e\u0000\u0000\u0420\u0102\u0001\u0000\u0000"+
- "\u0000\u0421\u0422\u0005e\u0000\u0000\u0422\u0423\u0005x\u0000\u0000\u0423"+
- "\u0424\u0005i\u0000\u0000\u0424\u0425\u0005t\u0000\u0000\u0425\u0104\u0001"+
- "\u0000\u0000\u0000\u0426\u0427\u0005r\u0000\u0000\u0427\u0428\u0005e\u0000"+
- "\u0000\u0428\u0429\u0005t\u0000\u0000\u0429\u042a\u0005u\u0000\u0000\u042a"+
- "\u042b\u0005r\u0000\u0000\u042b\u042c\u0005n\u0000\u0000\u042c\u042d\u0005"+
- "i\u0000\u0000\u042d\u042e\u0005n\u0000\u0000\u042e\u042f\u0005g\u0000"+
- "\u0000\u042f\u0106\u0001\u0000\u0000\u0000\u0430\u0431\u0005w\u0000\u0000"+
- "\u0431\u0432\u0005h\u0000\u0000\u0432\u0433\u0005i\u0000\u0000\u0433\u0434"+
- "\u0005l\u0000\u0000\u0434\u0435\u0005e\u0000\u0000\u0435\u0108\u0001\u0000"+
- "\u0000\u0000\u0436\u043b\u0005\"\u0000\u0000\u0437\u043a\u0003\u010b\u0085"+
- "\u0000\u0438\u043a\b\u0000\u0000\u0000\u0439\u0437\u0001\u0000\u0000\u0000"+
- "\u0439\u0438\u0001\u0000\u0000\u0000\u043a\u043d\u0001\u0000\u0000\u0000"+
- "\u043b\u0439\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000"+
- "\u043c\u043e\u0001\u0000\u0000\u0000\u043d\u043b\u0001\u0000\u0000\u0000"+
- "\u043e\u043f\u0005\"\u0000\u0000\u043f\u010a\u0001\u0000\u0000\u0000\u0440"+
- "\u0443\u0005\\\u0000\u0000\u0441\u0444\u0007\u0001\u0000\u0000\u0442\u0444"+
- "\u0003\u010d\u0086\u0000\u0443\u0441\u0001\u0000\u0000\u0000\u0443\u0442"+
- "\u0001\u0000\u0000\u0000\u0444\u010c\u0001\u0000\u0000\u0000\u0445\u0446"+
- "\u0005u\u0000\u0000\u0446\u0447\u0003\u010f\u0087\u0000\u0447\u0448\u0003"+
- "\u010f\u0087\u0000\u0448\u0449\u0003\u010f\u0087\u0000\u0449\u044a\u0003"+
- "\u010f\u0087\u0000\u044a\u010e\u0001\u0000\u0000\u0000\u044b\u044c\u0007"+
- "\u0002\u0000\u0000\u044c\u0110\u0001\u0000\u0000\u0000\u044d\u044e\u0005"+
- "?\u0000\u0000\u044e\u0112\u0001\u0000\u0000\u0000\u044f\u0450\u0005n\u0000"+
- "\u0000\u0450\u0451\u0005u\u0000\u0000\u0451\u0452\u0005l\u0000\u0000\u0452"+
- "\u0453\u0005l\u0000\u0000\u0453\u0114\u0001\u0000\u0000\u0000\u0454\u0455"+
- "\u0003\u0117\u008b\u0000\u0455\u0116\u0001\u0000\u0000\u0000\u0456\u045a"+
- "\u0003\u0119\u008c\u0000\u0457\u045a\u0003\u011b\u008d\u0000\u0458\u045a"+
- "\u0003\u011d\u008e\u0000\u0459\u0456\u0001\u0000\u0000\u0000\u0459\u0457"+
- "\u0001\u0000\u0000\u0000\u0459\u0458\u0001\u0000\u0000\u0000\u045a\u0118"+
- "\u0001\u0000\u0000\u0000\u045b\u045c\u0003\u011f\u008f\u0000\u045c\u011a"+
- "\u0001\u0000\u0000\u0000\u045d\u045e\u0005.\u0000\u0000\u045e\u0468\u0003"+
- "\u011f\u008f\u0000\u045f\u0460\u0003\u011f\u008f\u0000\u0460\u0464\u0005"+
- ".\u0000\u0000\u0461\u0463\u0007\u0003\u0000\u0000\u0462\u0461\u0001\u0000"+
- "\u0000\u0000\u0463\u0466\u0001\u0000\u0000\u0000\u0464\u0462\u0001\u0000"+
- "\u0000\u0000\u0464\u0465\u0001\u0000\u0000\u0000\u0465\u0468\u0001\u0000"+
- "\u0000\u0000\u0466\u0464\u0001\u0000\u0000\u0000\u0467\u045d\u0001\u0000"+
- "\u0000\u0000\u0467\u045f\u0001\u0000\u0000\u0000\u0468\u011c\u0001\u0000"+
- "\u0000\u0000\u0469\u046a\u0005.\u0000\u0000\u046a\u0476\u0003\u011f\u008f"+
- "\u0000\u046b\u0473\u0003\u011f\u008f\u0000\u046c\u0470\u0005.\u0000\u0000"+
- "\u046d\u046f\u0007\u0003\u0000\u0000\u046e\u046d\u0001\u0000\u0000\u0000"+
- "\u046f\u0472\u0001\u0000\u0000\u0000\u0470\u046e\u0001\u0000\u0000\u0000"+
- "\u0470\u0471\u0001\u0000\u0000\u0000\u0471\u0474\u0001\u0000\u0000\u0000"+
- "\u0472\u0470\u0001\u0000\u0000\u0000\u0473\u046c\u0001\u0000\u0000\u0000"+
- "\u0473\u0474\u0001\u0000\u0000\u0000\u0474\u0476\u0001\u0000\u0000\u0000"+
- "\u0475\u0469\u0001\u0000\u0000\u0000\u0475\u046b\u0001\u0000\u0000\u0000"+
- "\u0476\u0477\u0001\u0000\u0000\u0000\u0477\u0479\u0007\u0004\u0000\u0000"+
- "\u0478\u047a\u0007\u0005\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000"+
- "\u0479\u047a\u0001\u0000\u0000\u0000\u047a\u047b\u0001\u0000\u0000\u0000"+
- "\u047b\u047c\u0003\u011f\u008f\u0000\u047c\u011e\u0001\u0000\u0000\u0000"+
- "\u047d\u047f\u0007\u0003\u0000\u0000\u047e\u047d\u0001\u0000\u0000\u0000"+
- "\u047f\u0480\u0001\u0000\u0000\u0000\u0480\u047e\u0001\u0000\u0000\u0000"+
- "\u0480\u0481\u0001\u0000\u0000\u0000\u0481\u0120\u0001\u0000\u0000\u0000"+
- "\u0482\u0483\u0007\u0006\u0000\u0000\u0483\u0484\u0001\u0000\u0000\u0000"+
- "\u0484\u0485\u0006\u0090\u0000\u0000\u0485\u0122\u0001\u0000\u0000\u0000"+
- "\u0486\u048a\u0003\u0125\u0092\u0000\u0487\u0489\u0003\u0127\u0093\u0000"+
- "\u0488\u0487\u0001\u0000\u0000\u0000\u0489\u048c\u0001\u0000\u0000\u0000"+
- "\u048a\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001\u0000\u0000\u0000"+
- "\u048b\u0124\u0001\u0000\u0000\u0000\u048c\u048a\u0001\u0000\u0000\u0000"+
- "\u048d\u048f\u0007\u0007\u0000\u0000\u048e\u048d\u0001\u0000\u0000\u0000"+
- "\u048f\u0126\u0001\u0000\u0000\u0000\u0490\u0493\u0003\u0125\u0092\u0000"+
- "\u0491\u0493\u0007\b\u0000\u0000\u0492\u0490\u0001\u0000\u0000\u0000\u0492"+
- "\u0491\u0001\u0000\u0000\u0000\u0493\u0128\u0001\u0000\u0000\u0000\u0494"+
- "\u0495\u0005(\u0000\u0000\u0495\u049e\u0005:\u0000\u0000\u0496\u049d\u0003"+
- "\u0129\u0094\u0000\u0497\u0498\u0005(\u0000\u0000\u0498\u049d\b\t\u0000"+
- "\u0000\u0499\u049a\u0005:\u0000\u0000\u049a\u049d\b\n\u0000\u0000\u049b"+
- "\u049d\b\u000b\u0000\u0000\u049c\u0496\u0001\u0000\u0000\u0000\u049c\u0497"+
- "\u0001\u0000\u0000\u0000\u049c\u0499\u0001\u0000\u0000\u0000\u049c\u049b"+
- "\u0001\u0000\u0000\u0000\u049d\u04a0\u0001\u0000\u0000\u0000\u049e\u049c"+
- "\u0001\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u04a2"+
- "\u0001\u0000\u0000\u0000\u04a0\u049e\u0001\u0000\u0000\u0000\u04a1\u04a3"+
- "\u0005:\u0000\u0000\u04a2\u04a1\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001"+
- "\u0000\u0000\u0000\u04a4\u04a2\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001"+
- "\u0000\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005"+
- ")\u0000\u0000\u04a7\u04a8\u0001\u0000\u0000\u0000\u04a8\u04a9\u0006\u0094"+
- "\u0000\u0000\u04a9\u012a\u0001\u0000\u0000\u0000\u04aa\u04ab\b\f\u0000"+
- "\u0000\u04ab\u012c\u0001\u0000\u0000\u0000\u0012\u0000\u0439\u043b\u0443"+
- "\u0459\u0464\u0467\u0470\u0473\u0475\u0479\u0480\u048a\u048e\u0492\u049c"+
- "\u049e\u04a4\u0001\u0000\u0001\u0000";
+ "\u0000\u011d\u0001\u0000\u0000\u0000\u0000\u011f\u0001\u0000\u0000\u0000"+
+ "\u0000\u0123\u0001\u0000\u0000\u0000\u0000\u0125\u0001\u0000\u0000\u0000"+
+ "\u0000\u012b\u0001\u0000\u0000\u0000\u0000\u012d\u0001\u0000\u0000\u0000"+
+ "\u0001\u012f\u0001\u0000\u0000\u0000\u0003\u0131\u0001\u0000\u0000\u0000"+
+ "\u0005\u0138\u0001\u0000\u0000\u0000\u0007\u0142\u0001\u0000\u0000\u0000"+
+ "\t\u0144\u0001\u0000\u0000\u0000\u000b\u0146\u0001\u0000\u0000\u0000\r"+
+ "\u0149\u0001\u0000\u0000\u0000\u000f\u014b\u0001\u0000\u0000\u0000\u0011"+
+ "\u014d\u0001\u0000\u0000\u0000\u0013\u014f\u0001\u0000\u0000\u0000\u0015"+
+ "\u0151\u0001\u0000\u0000\u0000\u0017\u0153\u0001\u0000\u0000\u0000\u0019"+
+ "\u0155\u0001\u0000\u0000\u0000\u001b\u0157\u0001\u0000\u0000\u0000\u001d"+
+ "\u0159\u0001\u0000\u0000\u0000\u001f\u0162\u0001\u0000\u0000\u0000!\u016a"+
+ "\u0001\u0000\u0000\u0000#\u0179\u0001\u0000\u0000\u0000%\u017b\u0001\u0000"+
+ "\u0000\u0000\'\u018d\u0001\u0000\u0000\u0000)\u01a0\u0001\u0000\u0000"+
+ "\u0000+\u01a9\u0001\u0000\u0000\u0000-\u01b4\u0001\u0000\u0000\u0000/"+
+ "\u01b8\u0001\u0000\u0000\u00001\u01c0\u0001\u0000\u0000\u00003\u01ca\u0001"+
+ "\u0000\u0000\u00005\u01d5\u0001\u0000\u0000\u00007\u01db\u0001\u0000\u0000"+
+ "\u00009\u01ed\u0001\u0000\u0000\u0000;\u01f4\u0001\u0000\u0000\u0000="+
+ "\u01fd\u0001\u0000\u0000\u0000?\u0206\u0001\u0000\u0000\u0000A\u020d\u0001"+
+ "\u0000\u0000\u0000C\u0215\u0001\u0000\u0000\u0000E\u021d\u0001\u0000\u0000"+
+ "\u0000G\u0224\u0001\u0000\u0000\u0000I\u0227\u0001\u0000\u0000\u0000K"+
+ "\u022a\u0001\u0000\u0000\u0000M\u022d\u0001\u0000\u0000\u0000O\u0230\u0001"+
+ "\u0000\u0000\u0000Q\u0233\u0001\u0000\u0000\u0000S\u0236\u0001\u0000\u0000"+
+ "\u0000U\u0239\u0001\u0000\u0000\u0000W\u023b\u0001\u0000\u0000\u0000Y"+
+ "\u023e\u0001\u0000\u0000\u0000[\u0240\u0001\u0000\u0000\u0000]\u0243\u0001"+
+ "\u0000\u0000\u0000_\u0246\u0001\u0000\u0000\u0000a\u0248\u0001\u0000\u0000"+
+ "\u0000c\u024a\u0001\u0000\u0000\u0000e\u024e\u0001\u0000\u0000\u0000g"+
+ "\u0253\u0001\u0000\u0000\u0000i\u0257\u0001\u0000\u0000\u0000k\u0259\u0001"+
+ "\u0000\u0000\u0000m\u025b\u0001\u0000\u0000\u0000o\u025d\u0001\u0000\u0000"+
+ "\u0000q\u025f\u0001\u0000\u0000\u0000s\u0262\u0001\u0000\u0000\u0000u"+
+ "\u0264\u0001\u0000\u0000\u0000w\u0267\u0001\u0000\u0000\u0000y\u026a\u0001"+
+ "\u0000\u0000\u0000{\u026e\u0001\u0000\u0000\u0000}\u0272\u0001\u0000\u0000"+
+ "\u0000\u007f\u0278\u0001\u0000\u0000\u0000\u0081\u027e\u0001\u0000\u0000"+
+ "\u0000\u0083\u0281\u0001\u0000\u0000\u0000\u0085\u0287\u0001\u0000\u0000"+
+ "\u0000\u0087\u028e\u0001\u0000\u0000\u0000\u0089\u0291\u0001\u0000\u0000"+
+ "\u0000\u008b\u0294\u0001\u0000\u0000\u0000\u008d\u0297\u0001\u0000\u0000"+
+ "\u0000\u008f\u029a\u0001\u0000\u0000\u0000\u0091\u02a3\u0001\u0000\u0000"+
+ "\u0000\u0093\u02a9\u0001\u0000\u0000\u0000\u0095\u02af\u0001\u0000\u0000"+
+ "\u0000\u0097\u02b6\u0001\u0000\u0000\u0000\u0099\u02c0\u0001\u0000\u0000"+
+ "\u0000\u009b\u02cb\u0001\u0000\u0000\u0000\u009d\u02d0\u0001\u0000\u0000"+
+ "\u0000\u009f\u02d6\u0001\u0000\u0000\u0000\u00a1\u02e0\u0001\u0000\u0000"+
+ "\u0000\u00a3\u02ea\u0001\u0000\u0000\u0000\u00a5\u02f3\u0001\u0000\u0000"+
+ "\u0000\u00a7\u02f9\u0001\u0000\u0000\u0000\u00a9\u0300\u0001\u0000\u0000"+
+ "\u0000\u00ab\u0305\u0001\u0000\u0000\u0000\u00ad\u0309\u0001\u0000\u0000"+
+ "\u0000\u00af\u030f\u0001\u0000\u0000\u0000\u00b1\u0317\u0001\u0000\u0000"+
+ "\u0000\u00b3\u031c\u0001\u0000\u0000\u0000\u00b5\u0321\u0001\u0000\u0000"+
+ "\u0000\u00b7\u032c\u0001\u0000\u0000\u0000\u00b9\u032f\u0001\u0000\u0000"+
+ "\u0000\u00bb\u0333\u0001\u0000\u0000\u0000\u00bd\u0337\u0001\u0000\u0000"+
+ "\u0000\u00bf\u033a\u0001\u0000\u0000\u0000\u00c1\u0343\u0001\u0000\u0000"+
+ "\u0000\u00c3\u0346\u0001\u0000\u0000\u0000\u00c5\u0351\u0001\u0000\u0000"+
+ "\u0000\u00c7\u0354\u0001\u0000\u0000\u0000\u00c9\u035a\u0001\u0000\u0000"+
+ "\u0000\u00cb\u035f\u0001\u0000\u0000\u0000\u00cd\u0368\u0001\u0000\u0000"+
+ "\u0000\u00cf\u0370\u0001\u0000\u0000\u0000\u00d1\u0377\u0001\u0000\u0000"+
+ "\u0000\u00d3\u0381\u0001\u0000\u0000\u0000\u00d5\u0386\u0001\u0000\u0000"+
+ "\u0000\u00d7\u038c\u0001\u0000\u0000\u0000\u00d9\u0391\u0001\u0000\u0000"+
+ "\u0000\u00db\u039a\u0001\u0000\u0000\u0000\u00dd\u03a3\u0001\u0000\u0000"+
+ "\u0000\u00df\u03ab\u0001\u0000\u0000\u0000\u00e1\u03b3\u0001\u0000\u0000"+
+ "\u0000\u00e3\u03b8\u0001\u0000\u0000\u0000\u00e5\u03c1\u0001\u0000\u0000"+
+ "\u0000\u00e7\u03c8\u0001\u0000\u0000\u0000\u00e9\u03cf\u0001\u0000\u0000"+
+ "\u0000\u00eb\u03d6\u0001\u0000\u0000\u0000\u00ed\u03de\u0001\u0000\u0000"+
+ "\u0000\u00ef\u03e3\u0001\u0000\u0000\u0000\u00f1\u03ea\u0001\u0000\u0000"+
+ "\u0000\u00f3\u03f1\u0001\u0000\u0000\u0000\u00f5\u03f6\u0001\u0000\u0000"+
+ "\u0000\u00f7\u03fc\u0001\u0000\u0000\u0000\u00f9\u0401\u0001\u0000\u0000"+
+ "\u0000\u00fb\u040a\u0001\u0000\u0000\u0000\u00fd\u040f\u0001\u0000\u0000"+
+ "\u0000\u00ff\u0418\u0001\u0000\u0000\u0000\u0101\u041e\u0001\u0000\u0000"+
+ "\u0000\u0103\u0423\u0001\u0000\u0000\u0000\u0105\u042c\u0001\u0000\u0000"+
+ "\u0000\u0107\u0431\u0001\u0000\u0000\u0000\u0109\u043b\u0001\u0000\u0000"+
+ "\u0000\u010b\u0441\u0001\u0000\u0000\u0000\u010d\u044b\u0001\u0000\u0000"+
+ "\u0000\u010f\u0450\u0001\u0000\u0000\u0000\u0111\u0456\u0001\u0000\u0000"+
+ "\u0000\u0113\u0458\u0001\u0000\u0000\u0000\u0115\u045a\u0001\u0000\u0000"+
+ "\u0000\u0117\u045f\u0001\u0000\u0000\u0000\u0119\u0464\u0001\u0000\u0000"+
+ "\u0000\u011b\u0466\u0001\u0000\u0000\u0000\u011d\u0472\u0001\u0000\u0000"+
+ "\u0000\u011f\u0480\u0001\u0000\u0000\u0000\u0121\u0489\u0001\u0000\u0000"+
+ "\u0000\u0123\u048d\u0001\u0000\u0000\u0000\u0125\u0491\u0001\u0000\u0000"+
+ "\u0000\u0127\u0499\u0001\u0000\u0000\u0000\u0129\u049d\u0001\u0000\u0000"+
+ "\u0000\u012b\u049f\u0001\u0000\u0000\u0000\u012d\u04b5\u0001\u0000\u0000"+
+ "\u0000\u012f\u0130\u0005;\u0000\u0000\u0130\u0002\u0001\u0000\u0000\u0000"+
+ "\u0131\u0132\u0005m\u0000\u0000\u0132\u0133\u0005o\u0000\u0000\u0133\u0134"+
+ "\u0005d\u0000\u0000\u0134\u0135\u0005u\u0000\u0000\u0135\u0136\u0005l"+
+ "\u0000\u0000\u0136\u0137\u0005e\u0000\u0000\u0137\u0004\u0001\u0000\u0000"+
+ "\u0000\u0138\u0139\u0005n\u0000\u0000\u0139\u013a\u0005a\u0000\u0000\u013a"+
+ "\u013b\u0005m\u0000\u0000\u013b\u013c\u0005e\u0000\u0000\u013c\u013d\u0005"+
+ "s\u0000\u0000\u013d\u013e\u0005p\u0000\u0000\u013e\u013f\u0005a\u0000"+
+ "\u0000\u013f\u0140\u0005c\u0000\u0000\u0140\u0141\u0005e\u0000\u0000\u0141"+
+ "\u0006\u0001\u0000\u0000\u0000\u0142\u0143\u0005=\u0000\u0000\u0143\b"+
+ "\u0001\u0000\u0000\u0000\u0144\u0145\u0005$\u0000\u0000\u0145\n\u0001"+
+ "\u0000\u0000\u0000\u0146\u0147\u0005:\u0000\u0000\u0147\u0148\u0005=\u0000"+
+ "\u0000\u0148\f\u0001\u0000\u0000\u0000\u0149\u014a\u0005{\u0000\u0000"+
+ "\u014a\u000e\u0001\u0000\u0000\u0000\u014b\u014c\u0005}\u0000\u0000\u014c"+
+ "\u0010\u0001\u0000\u0000\u0000\u014d\u014e\u0005(\u0000\u0000\u014e\u0012"+
+ "\u0001\u0000\u0000\u0000\u014f\u0150\u0005)\u0000\u0000\u0150\u0014\u0001"+
+ "\u0000\u0000\u0000\u0151\u0152\u0005*\u0000\u0000\u0152\u0016\u0001\u0000"+
+ "\u0000\u0000\u0153\u0154\u0005|\u0000\u0000\u0154\u0018\u0001\u0000\u0000"+
+ "\u0000\u0155\u0156\u0005%\u0000\u0000\u0156\u001a\u0001\u0000\u0000\u0000"+
+ "\u0157\u0158\u0005,\u0000\u0000\u0158\u001c\u0001\u0000\u0000\u0000\u0159"+
+ "\u015a\u0005o\u0000\u0000\u015a\u015b\u0005r\u0000\u0000\u015b\u015c\u0005"+
+ "d\u0000\u0000\u015c\u015d\u0005e\u0000\u0000\u015d\u015e\u0005r\u0000"+
+ "\u0000\u015e\u015f\u0005i\u0000\u0000\u015f\u0160\u0005n\u0000\u0000\u0160"+
+ "\u0161\u0005g\u0000\u0000\u0161\u001e\u0001\u0000\u0000\u0000\u0162\u0163"+
+ "\u0005o\u0000\u0000\u0163\u0164\u0005r\u0000\u0000\u0164\u0165\u0005d"+
+ "\u0000\u0000\u0165\u0166\u0005e\u0000\u0000\u0166\u0167\u0005r\u0000\u0000"+
+ "\u0167\u0168\u0005e\u0000\u0000\u0168\u0169\u0005d\u0000\u0000\u0169 "+
+ "\u0001\u0000\u0000\u0000\u016a\u016b\u0005d\u0000\u0000\u016b\u016c\u0005"+
+ "e\u0000\u0000\u016c\u016d\u0005c\u0000\u0000\u016d\u016e\u0005i\u0000"+
+ "\u0000\u016e\u016f\u0005m\u0000\u0000\u016f\u0170\u0005a\u0000\u0000\u0170"+
+ "\u0171\u0005l\u0000\u0000\u0171\u0172\u0005-\u0000\u0000\u0172\u0173\u0005"+
+ "f\u0000\u0000\u0173\u0174\u0005o\u0000\u0000\u0174\u0175\u0005r\u0000"+
+ "\u0000\u0175\u0176\u0005m\u0000\u0000\u0176\u0177\u0005a\u0000\u0000\u0177"+
+ "\u0178\u0005t\u0000\u0000\u0178\"\u0001\u0000\u0000\u0000\u0179\u017a"+
+ "\u0005:\u0000\u0000\u017a$\u0001\u0000\u0000\u0000\u017b\u017c\u0005d"+
+ "\u0000\u0000\u017c\u017d\u0005e\u0000\u0000\u017d\u017e\u0005c\u0000\u0000"+
+ "\u017e\u017f\u0005i\u0000\u0000\u017f\u0180\u0005m\u0000\u0000\u0180\u0181"+
+ "\u0005a\u0000\u0000\u0181\u0182\u0005l\u0000\u0000\u0182\u0183\u0005-"+
+ "\u0000\u0000\u0183\u0184\u0005s\u0000\u0000\u0184\u0185\u0005e\u0000\u0000"+
+ "\u0185\u0186\u0005p\u0000\u0000\u0186\u0187\u0005a\u0000\u0000\u0187\u0188"+
+ "\u0005r\u0000\u0000\u0188\u0189\u0005a\u0000\u0000\u0189\u018a\u0005t"+
+ "\u0000\u0000\u018a\u018b\u0005o\u0000\u0000\u018b\u018c\u0005r\u0000\u0000"+
+ "\u018c&\u0001\u0000\u0000\u0000\u018d\u018e\u0005g\u0000\u0000\u018e\u018f"+
+ "\u0005r\u0000\u0000\u018f\u0190\u0005o\u0000\u0000\u0190\u0191\u0005u"+
+ "\u0000\u0000\u0191\u0192\u0005p\u0000\u0000\u0192\u0193\u0005i\u0000\u0000"+
+ "\u0193\u0194\u0005n\u0000\u0000\u0194\u0195\u0005g\u0000\u0000\u0195\u0196"+
+ "\u0005-\u0000\u0000\u0196\u0197\u0005s\u0000\u0000\u0197\u0198\u0005e"+
+ "\u0000\u0000\u0198\u0199\u0005p\u0000\u0000\u0199\u019a\u0005a\u0000\u0000"+
+ "\u019a\u019b\u0005r\u0000\u0000\u019b\u019c\u0005a\u0000\u0000\u019c\u019d"+
+ "\u0005t\u0000\u0000\u019d\u019e\u0005o\u0000\u0000\u019e\u019f\u0005r"+
+ "\u0000\u0000\u019f(\u0001\u0000\u0000\u0000\u01a0\u01a1\u0005i\u0000\u0000"+
+ "\u01a1\u01a2\u0005n\u0000\u0000\u01a2\u01a3\u0005f\u0000\u0000\u01a3\u01a4"+
+ "\u0005i\u0000\u0000\u01a4\u01a5\u0005n\u0000\u0000\u01a5\u01a6\u0005i"+
+ "\u0000\u0000\u01a6\u01a7\u0005t\u0000\u0000\u01a7\u01a8\u0005y\u0000\u0000"+
+ "\u01a8*\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005m\u0000\u0000\u01aa\u01ab"+
+ "\u0005i\u0000\u0000\u01ab\u01ac\u0005n\u0000\u0000\u01ac\u01ad\u0005u"+
+ "\u0000\u0000\u01ad\u01ae\u0005s\u0000\u0000\u01ae\u01af\u0005-\u0000\u0000"+
+ "\u01af\u01b0\u0005s\u0000\u0000\u01b0\u01b1\u0005i\u0000\u0000\u01b1\u01b2"+
+ "\u0005g\u0000\u0000\u01b2\u01b3\u0005n\u0000\u0000\u01b3,\u0001\u0000"+
+ "\u0000\u0000\u01b4\u01b5\u0005N\u0000\u0000\u01b5\u01b6\u0005a\u0000\u0000"+
+ "\u01b6\u01b7\u0005N\u0000\u0000\u01b7.\u0001\u0000\u0000\u0000\u01b8\u01b9"+
+ "\u0005p\u0000\u0000\u01b9\u01ba\u0005e\u0000\u0000\u01ba\u01bb\u0005r"+
+ "\u0000\u0000\u01bb\u01bc\u0005c\u0000\u0000\u01bc\u01bd\u0005e\u0000\u0000"+
+ "\u01bd\u01be\u0005n\u0000\u0000\u01be\u01bf\u0005t\u0000\u0000\u01bf0"+
+ "\u0001\u0000\u0000\u0000\u01c0\u01c1\u0005p\u0000\u0000\u01c1\u01c2\u0005"+
+ "e\u0000\u0000\u01c2\u01c3\u0005r\u0000\u0000\u01c3\u01c4\u0005-\u0000"+
+ "\u0000\u01c4\u01c5\u0005m\u0000\u0000\u01c5\u01c6\u0005i\u0000\u0000\u01c6"+
+ "\u01c7\u0005l\u0000\u0000\u01c7\u01c8\u0005l\u0000\u0000\u01c8\u01c9\u0005"+
+ "e\u0000\u0000\u01c92\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005z\u0000"+
+ "\u0000\u01cb\u01cc\u0005e\u0000\u0000\u01cc\u01cd\u0005r\u0000\u0000\u01cd"+
+ "\u01ce\u0005o\u0000\u0000\u01ce\u01cf\u0005-\u0000\u0000\u01cf\u01d0\u0005"+
+ "d\u0000\u0000\u01d0\u01d1\u0005i\u0000\u0000\u01d1\u01d2\u0005g\u0000"+
+ "\u0000\u01d2\u01d3\u0005i\u0000\u0000\u01d3\u01d4\u0005t\u0000\u0000\u01d4"+
+ "4\u0001\u0000\u0000\u0000\u01d5\u01d6\u0005d\u0000\u0000\u01d6\u01d7\u0005"+
+ "i\u0000\u0000\u01d7\u01d8\u0005g\u0000\u0000\u01d8\u01d9\u0005i\u0000"+
+ "\u0000\u01d9\u01da\u0005t\u0000\u0000\u01da6\u0001\u0000\u0000\u0000\u01db"+
+ "\u01dc\u0005p\u0000\u0000\u01dc\u01dd\u0005a\u0000\u0000\u01dd\u01de\u0005"+
+ "t\u0000\u0000\u01de\u01df\u0005t\u0000\u0000\u01df\u01e0\u0005e\u0000"+
+ "\u0000\u01e0\u01e1\u0005r\u0000\u0000\u01e1\u01e2\u0005n\u0000\u0000\u01e2"+
+ "\u01e3\u0005-\u0000\u0000\u01e3\u01e4\u0005s\u0000\u0000\u01e4\u01e5\u0005"+
+ "e\u0000\u0000\u01e5\u01e6\u0005p\u0000\u0000\u01e6\u01e7\u0005a\u0000"+
+ "\u0000\u01e7\u01e8\u0005r\u0000\u0000\u01e8\u01e9\u0005a\u0000\u0000\u01e9"+
+ "\u01ea\u0005t\u0000\u0000\u01ea\u01eb\u0005o\u0000\u0000\u01eb\u01ec\u0005"+
+ "r\u0000\u0000\u01ec8\u0001\u0000\u0000\u0000\u01ed\u01ee\u0005i\u0000"+
+ "\u0000\u01ee\u01ef\u0005m\u0000\u0000\u01ef\u01f0\u0005p\u0000\u0000\u01f0"+
+ "\u01f1\u0005o\u0000\u0000\u01f1\u01f2\u0005r\u0000\u0000\u01f2\u01f3\u0005"+
+ "t\u0000\u0000\u01f3:\u0001\u0000\u0000\u0000\u01f4\u01f5\u0005e\u0000"+
+ "\u0000\u01f5\u01f6\u0005x\u0000\u0000\u01f6\u01f7\u0005t\u0000\u0000\u01f7"+
+ "\u01f8\u0005e\u0000\u0000\u01f8\u01f9\u0005r\u0000\u0000\u01f9\u01fa\u0005"+
+ "n\u0000\u0000\u01fa\u01fb\u0005a\u0000\u0000\u01fb\u01fc\u0005l\u0000"+
+ "\u0000\u01fc<\u0001\u0000\u0000\u0000\u01fd\u01fe\u0005f\u0000\u0000\u01fe"+
+ "\u01ff\u0005u\u0000\u0000\u01ff\u0200\u0005n\u0000\u0000\u0200\u0201\u0005"+
+ "c\u0000\u0000\u0201\u0202\u0005t\u0000\u0000\u0202\u0203\u0005i\u0000"+
+ "\u0000\u0203\u0204\u0005o\u0000\u0000\u0204\u0205\u0005n\u0000\u0000\u0205"+
+ ">\u0001\u0000\u0000\u0000\u0206\u0207\u0005j\u0000\u0000\u0207\u0208\u0005"+
+ "s\u0000\u0000\u0208\u0209\u0005o\u0000\u0000\u0209\u020a\u0005u\u0000"+
+ "\u0000\u020a\u020b\u0005n\u0000\u0000\u020b\u020c\u0005d\u0000\u0000\u020c"+
+ "@\u0001\u0000\u0000\u0000\u020d\u020e\u0005c\u0000\u0000\u020e\u020f\u0005"+
+ "o\u0000\u0000\u020f\u0210\u0005m\u0000\u0000\u0210\u0211\u0005p\u0000"+
+ "\u0000\u0211\u0212\u0005a\u0000\u0000\u0212\u0213\u0005c\u0000\u0000\u0213"+
+ "\u0214\u0005t\u0000\u0000\u0214B\u0001\u0000\u0000\u0000\u0215\u0216\u0005"+
+ "v\u0000\u0000\u0216\u0217\u0005e\u0000\u0000\u0217\u0218\u0005r\u0000"+
+ "\u0000\u0218\u0219\u0005b\u0000\u0000\u0219\u021a\u0005o\u0000\u0000\u021a"+
+ "\u021b\u0005s\u0000\u0000\u021b\u021c\u0005e\u0000\u0000\u021cD\u0001"+
+ "\u0000\u0000\u0000\u021d\u021e\u0005s\u0000\u0000\u021e\u021f\u0005c\u0000"+
+ "\u0000\u021f\u0220\u0005h\u0000\u0000\u0220\u0221\u0005e\u0000\u0000\u0221"+
+ "\u0222\u0005m\u0000\u0000\u0222\u0223\u0005a\u0000\u0000\u0223F\u0001"+
+ "\u0000\u0000\u0000\u0224\u0225\u0005e\u0000\u0000\u0225\u0226\u0005q\u0000"+
+ "\u0000\u0226H\u0001\u0000\u0000\u0000\u0227\u0228\u0005n\u0000\u0000\u0228"+
+ "\u0229\u0005e\u0000\u0000\u0229J\u0001\u0000\u0000\u0000\u022a\u022b\u0005"+
+ "l\u0000\u0000\u022b\u022c\u0005t\u0000\u0000\u022cL\u0001\u0000\u0000"+
+ "\u0000\u022d\u022e\u0005l\u0000\u0000\u022e\u022f\u0005e\u0000\u0000\u022f"+
+ "N\u0001\u0000\u0000\u0000\u0230\u0231\u0005g\u0000\u0000\u0231\u0232\u0005"+
+ "t\u0000\u0000\u0232P\u0001\u0000\u0000\u0000\u0233\u0234\u0005g\u0000"+
+ "\u0000\u0234\u0235\u0005e\u0000\u0000\u0235R\u0001\u0000\u0000\u0000\u0236"+
+ "\u0237\u0005!\u0000\u0000\u0237\u0238\u0005=\u0000\u0000\u0238T\u0001"+
+ "\u0000\u0000\u0000\u0239\u023a\u0005<\u0000\u0000\u023aV\u0001\u0000\u0000"+
+ "\u0000\u023b\u023c\u0005<\u0000\u0000\u023c\u023d\u0005=\u0000\u0000\u023d"+
+ "X\u0001\u0000\u0000\u0000\u023e\u023f\u0005>\u0000\u0000\u023fZ\u0001"+
+ "\u0000\u0000\u0000\u0240\u0241\u0005>\u0000\u0000\u0241\u0242\u0005=\u0000"+
+ "\u0000\u0242\\\u0001\u0000\u0000\u0000\u0243\u0244\u0005|\u0000\u0000"+
+ "\u0244\u0245\u0005|\u0000\u0000\u0245^\u0001\u0000\u0000\u0000\u0246\u0247"+
+ "\u0005+\u0000\u0000\u0247`\u0001\u0000\u0000\u0000\u0248\u0249\u0005-"+
+ "\u0000\u0000\u0249b\u0001\u0000\u0000\u0000\u024a\u024b\u0005d\u0000\u0000"+
+ "\u024b\u024c\u0005i\u0000\u0000\u024c\u024d\u0005v\u0000\u0000\u024dd"+
+ "\u0001\u0000\u0000\u0000\u024e\u024f\u0005i\u0000\u0000\u024f\u0250\u0005"+
+ "d\u0000\u0000\u0250\u0251\u0005i\u0000\u0000\u0251\u0252\u0005v\u0000"+
+ "\u0000\u0252f\u0001\u0000\u0000\u0000\u0253\u0254\u0005m\u0000\u0000\u0254"+
+ "\u0255\u0005o\u0000\u0000\u0255\u0256\u0005d\u0000\u0000\u0256h\u0001"+
+ "\u0000\u0000\u0000\u0257\u0258\u0005!\u0000\u0000\u0258j\u0001\u0000\u0000"+
+ "\u0000\u0259\u025a\u0005[\u0000\u0000\u025al\u0001\u0000\u0000\u0000\u025b"+
+ "\u025c\u0005]\u0000\u0000\u025cn\u0001\u0000\u0000\u0000\u025d\u025e\u0005"+
+ ".\u0000\u0000\u025ep\u0001\u0000\u0000\u0000\u025f\u0260\u0005$\u0000"+
+ "\u0000\u0260\u0261\u0005$\u0000\u0000\u0261r\u0001\u0000\u0000\u0000\u0262"+
+ "\u0263\u0005#\u0000\u0000\u0263t\u0001\u0000\u0000\u0000\u0264\u0265\u0005"+
+ "{\u0000\u0000\u0265\u0266\u0005|\u0000\u0000\u0266v\u0001\u0000\u0000"+
+ "\u0000\u0267\u0268\u0005|\u0000\u0000\u0268\u0269\u0005}\u0000\u0000\u0269"+
+ "x\u0001\u0000\u0000\u0000\u026a\u026b\u0005f\u0000\u0000\u026b\u026c\u0005"+
+ "o\u0000\u0000\u026c\u026d\u0005r\u0000\u0000\u026dz\u0001\u0000\u0000"+
+ "\u0000\u026e\u026f\u0005l\u0000\u0000\u026f\u0270\u0005e\u0000\u0000\u0270"+
+ "\u0271\u0005t\u0000\u0000\u0271|\u0001\u0000\u0000\u0000\u0272\u0273\u0005"+
+ "w\u0000\u0000\u0273\u0274\u0005h\u0000\u0000\u0274\u0275\u0005e\u0000"+
+ "\u0000\u0275\u0276\u0005r\u0000\u0000\u0276\u0277\u0005e\u0000\u0000\u0277"+
+ "~\u0001\u0000\u0000\u0000\u0278\u0279\u0005g\u0000\u0000\u0279\u027a\u0005"+
+ "r\u0000\u0000\u027a\u027b\u0005o\u0000\u0000\u027b\u027c\u0005u\u0000"+
+ "\u0000\u027c\u027d\u0005p\u0000\u0000\u027d\u0080\u0001\u0000\u0000\u0000"+
+ "\u027e\u027f\u0005b\u0000\u0000\u027f\u0280\u0005y\u0000\u0000\u0280\u0082"+
+ "\u0001\u0000\u0000\u0000\u0281\u0282\u0005o\u0000\u0000\u0282\u0283\u0005"+
+ "r\u0000\u0000\u0283\u0284\u0005d\u0000\u0000\u0284\u0285\u0005e\u0000"+
+ "\u0000\u0285\u0286\u0005r\u0000\u0000\u0286\u0084\u0001\u0000\u0000\u0000"+
+ "\u0287\u0288\u0005r\u0000\u0000\u0288\u0289\u0005e\u0000\u0000\u0289\u028a"+
+ "\u0005t\u0000\u0000\u028a\u028b\u0005u\u0000\u0000\u028b\u028c\u0005r"+
+ "\u0000\u0000\u028c\u028d\u0005n\u0000\u0000\u028d\u0086\u0001\u0000\u0000"+
+ "\u0000\u028e\u028f\u0005i\u0000\u0000\u028f\u0290\u0005f\u0000\u0000\u0290"+
+ "\u0088\u0001\u0000\u0000\u0000\u0291\u0292\u0005i\u0000\u0000\u0292\u0293"+
+ "\u0005n\u0000\u0000\u0293\u008a\u0001\u0000\u0000\u0000\u0294\u0295\u0005"+
+ "a\u0000\u0000\u0295\u0296\u0005s\u0000\u0000\u0296\u008c\u0001\u0000\u0000"+
+ "\u0000\u0297\u0298\u0005a\u0000\u0000\u0298\u0299\u0005t\u0000\u0000\u0299"+
+ "\u008e\u0001\u0000\u0000\u0000\u029a\u029b\u0005a\u0000\u0000\u029b\u029c"+
+ "\u0005l\u0000\u0000\u029c\u029d\u0005l\u0000\u0000\u029d\u029e\u0005o"+
+ "\u0000\u0000\u029e\u029f\u0005w\u0000\u0000\u029f\u02a0\u0005i\u0000\u0000"+
+ "\u02a0\u02a1\u0005n\u0000\u0000\u02a1\u02a2\u0005g\u0000\u0000\u02a2\u0090"+
+ "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0005e\u0000\u0000\u02a4\u02a5\u0005"+
+ "m\u0000\u0000\u02a5\u02a6\u0005p\u0000\u0000\u02a6\u02a7\u0005t\u0000"+
+ "\u0000\u02a7\u02a8\u0005y\u0000\u0000\u02a8\u0092\u0001\u0000\u0000\u0000"+
+ "\u02a9\u02aa\u0005c\u0000\u0000\u02aa\u02ab\u0005o\u0000\u0000\u02ab\u02ac"+
+ "\u0005u\u0000\u0000\u02ac\u02ad\u0005n\u0000\u0000\u02ad\u02ae\u0005t"+
+ "\u0000\u0000\u02ae\u0094\u0001\u0000\u0000\u0000\u02af\u02b0\u0005s\u0000"+
+ "\u0000\u02b0\u02b1\u0005t\u0000\u0000\u02b1\u02b2\u0005a\u0000\u0000\u02b2"+
+ "\u02b3\u0005b\u0000\u0000\u02b3\u02b4\u0005l\u0000\u0000\u02b4\u02b5\u0005"+
+ "e\u0000\u0000\u02b5\u0096\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005a\u0000"+
+ "\u0000\u02b7\u02b8\u0005s\u0000\u0000\u02b8\u02b9\u0005c\u0000\u0000\u02b9"+
+ "\u02ba\u0005e\u0000\u0000\u02ba\u02bb\u0005n\u0000\u0000\u02bb\u02bc\u0005"+
+ "d\u0000\u0000\u02bc\u02bd\u0005i\u0000\u0000\u02bd\u02be\u0005n\u0000"+
+ "\u0000\u02be\u02bf\u0005g\u0000\u0000\u02bf\u0098\u0001\u0000\u0000\u0000"+
+ "\u02c0\u02c1\u0005d\u0000\u0000\u02c1\u02c2\u0005e\u0000\u0000\u02c2\u02c3"+
+ "\u0005s\u0000\u0000\u02c3\u02c4\u0005c\u0000\u0000\u02c4\u02c5\u0005e"+
+ "\u0000\u0000\u02c5\u02c6\u0005n\u0000\u0000\u02c6\u02c7\u0005d\u0000\u0000"+
+ "\u02c7\u02c8\u0005i\u0000\u0000\u02c8\u02c9\u0005n\u0000\u0000\u02c9\u02ca"+
+ "\u0005g\u0000\u0000\u02ca\u009a\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005"+
+ "s\u0000\u0000\u02cc\u02cd\u0005o\u0000\u0000\u02cd\u02ce\u0005m\u0000"+
+ "\u0000\u02ce\u02cf\u0005e\u0000\u0000\u02cf\u009c\u0001\u0000\u0000\u0000"+
+ "\u02d0\u02d1\u0005e\u0000\u0000\u02d1\u02d2\u0005v\u0000\u0000\u02d2\u02d3"+
+ "\u0005e\u0000\u0000\u02d3\u02d4\u0005r\u0000\u0000\u02d4\u02d5\u0005y"+
+ "\u0000\u0000\u02d5\u009e\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005s\u0000"+
+ "\u0000\u02d7\u02d8\u0005a\u0000\u0000\u02d8\u02d9\u0005t\u0000\u0000\u02d9"+
+ "\u02da\u0005i\u0000\u0000\u02da\u02db\u0005s\u0000\u0000\u02db\u02dc\u0005"+
+ "f\u0000\u0000\u02dc\u02dd\u0005i\u0000\u0000\u02dd\u02de\u0005e\u0000"+
+ "\u0000\u02de\u02df\u0005s\u0000\u0000\u02df\u00a0\u0001\u0000\u0000\u0000"+
+ "\u02e0\u02e1\u0005c\u0000\u0000\u02e1\u02e2\u0005o\u0000\u0000\u02e2\u02e3"+
+ "\u0005l\u0000\u0000\u02e3\u02e4\u0005l\u0000\u0000\u02e4\u02e5\u0005a"+
+ "\u0000\u0000\u02e5\u02e6\u0005t\u0000\u0000\u02e6\u02e7\u0005i\u0000\u0000"+
+ "\u02e7\u02e8\u0005o\u0000\u0000\u02e8\u02e9\u0005n\u0000\u0000\u02e9\u00a2"+
+ "\u0001\u0000\u0000\u0000\u02ea\u02eb\u0005g\u0000\u0000\u02eb\u02ec\u0005"+
+ "r\u0000\u0000\u02ec\u02ed\u0005e\u0000\u0000\u02ed\u02ee\u0005a\u0000"+
+ "\u0000\u02ee\u02ef\u0005t\u0000\u0000\u02ef\u02f0\u0005e\u0000\u0000\u02f0"+
+ "\u02f1\u0005s\u0000\u0000\u02f1\u02f2\u0005t\u0000\u0000\u02f2\u00a4\u0001"+
+ "\u0000\u0000\u0000\u02f3\u02f4\u0005l\u0000\u0000\u02f4\u02f5\u0005e\u0000"+
+ "\u0000\u02f5\u02f6\u0005a\u0000\u0000\u02f6\u02f7\u0005s\u0000\u0000\u02f7"+
+ "\u02f8\u0005t\u0000\u0000\u02f8\u00a6\u0001\u0000\u0000\u0000\u02f9\u02fa"+
+ "\u0005s\u0000\u0000\u02fa\u02fb\u0005w\u0000\u0000\u02fb\u02fc\u0005i"+
+ "\u0000\u0000\u02fc\u02fd\u0005t\u0000\u0000\u02fd\u02fe\u0005c\u0000\u0000"+
+ "\u02fe\u02ff\u0005h\u0000\u0000\u02ff\u00a8\u0001\u0000\u0000\u0000\u0300"+
+ "\u0301\u0005c\u0000\u0000\u0301\u0302\u0005a\u0000\u0000\u0302\u0303\u0005"+
+ "s\u0000\u0000\u0303\u0304\u0005e\u0000\u0000\u0304\u00aa\u0001\u0000\u0000"+
+ "\u0000\u0305\u0306\u0005t\u0000\u0000\u0306\u0307\u0005r\u0000\u0000\u0307"+
+ "\u0308\u0005y\u0000\u0000\u0308\u00ac\u0001\u0000\u0000\u0000\u0309\u030a"+
+ "\u0005c\u0000\u0000\u030a\u030b\u0005a\u0000\u0000\u030b\u030c\u0005t"+
+ "\u0000\u0000\u030c\u030d\u0005c\u0000\u0000\u030d\u030e\u0005h\u0000\u0000"+
+ "\u030e\u00ae\u0001\u0000\u0000\u0000\u030f\u0310\u0005d\u0000\u0000\u0310"+
+ "\u0311\u0005e\u0000\u0000\u0311\u0312\u0005f\u0000\u0000\u0312\u0313\u0005"+
+ "a\u0000\u0000\u0313\u0314\u0005u\u0000\u0000\u0314\u0315\u0005l\u0000"+
+ "\u0000\u0315\u0316\u0005t\u0000\u0000\u0316\u00b0\u0001\u0000\u0000\u0000"+
+ "\u0317\u0318\u0005t\u0000\u0000\u0318\u0319\u0005h\u0000\u0000\u0319\u031a"+
+ "\u0005e\u0000\u0000\u031a\u031b\u0005n\u0000\u0000\u031b\u00b2\u0001\u0000"+
+ "\u0000\u0000\u031c\u031d\u0005e\u0000\u0000\u031d\u031e\u0005l\u0000\u0000"+
+ "\u031e\u031f\u0005s\u0000\u0000\u031f\u0320\u0005e\u0000\u0000\u0320\u00b4"+
+ "\u0001\u0000\u0000\u0000\u0321\u0322\u0005t\u0000\u0000\u0322\u0323\u0005"+
+ "y\u0000\u0000\u0323\u0324\u0005p\u0000\u0000\u0324\u0325\u0005e\u0000"+
+ "\u0000\u0325\u0326\u0005s\u0000\u0000\u0326\u0327\u0005w\u0000\u0000\u0327"+
+ "\u0328\u0005i\u0000\u0000\u0328\u0329\u0005t\u0000\u0000\u0329\u032a\u0005"+
+ "c\u0000\u0000\u032a\u032b\u0005h\u0000\u0000\u032b\u00b6\u0001\u0000\u0000"+
+ "\u0000\u032c\u032d\u0005o\u0000\u0000\u032d\u032e\u0005r\u0000\u0000\u032e"+
+ "\u00b8\u0001\u0000\u0000\u0000\u032f\u0330\u0005a\u0000\u0000\u0330\u0331"+
+ "\u0005n\u0000\u0000\u0331\u0332\u0005d\u0000\u0000\u0332\u00ba\u0001\u0000"+
+ "\u0000\u0000\u0333\u0334\u0005n\u0000\u0000\u0334\u0335\u0005o\u0000\u0000"+
+ "\u0335\u0336\u0005t\u0000\u0000\u0336\u00bc\u0001\u0000\u0000\u0000\u0337"+
+ "\u0338\u0005t\u0000\u0000\u0338\u0339\u0005o\u0000\u0000\u0339\u00be\u0001"+
+ "\u0000\u0000\u0000\u033a\u033b\u0005i\u0000\u0000\u033b\u033c\u0005n\u0000"+
+ "\u0000\u033c\u033d\u0005s\u0000\u0000\u033d\u033e\u0005t\u0000\u0000\u033e"+
+ "\u033f\u0005a\u0000\u0000\u033f\u0340\u0005n\u0000\u0000\u0340\u0341\u0005"+
+ "c\u0000\u0000\u0341\u0342\u0005e\u0000\u0000\u0342\u00c0\u0001\u0000\u0000"+
+ "\u0000\u0343\u0344\u0005o\u0000\u0000\u0344\u0345\u0005f\u0000\u0000\u0345"+
+ "\u00c2\u0001\u0000\u0000\u0000\u0346\u0347\u0005s\u0000\u0000\u0347\u0348"+
+ "\u0005t\u0000\u0000\u0348\u0349\u0005a\u0000\u0000\u0349\u034a\u0005t"+
+ "\u0000\u0000\u034a\u034b\u0005i\u0000\u0000\u034b\u034c\u0005c\u0000\u0000"+
+ "\u034c\u034d\u0005a\u0000\u0000\u034d\u034e\u0005l\u0000\u0000\u034e\u034f"+
+ "\u0005l\u0000\u0000\u034f\u0350\u0005y\u0000\u0000\u0350\u00c4\u0001\u0000"+
+ "\u0000\u0000\u0351\u0352\u0005i\u0000\u0000\u0352\u0353\u0005s\u0000\u0000"+
+ "\u0353\u00c6\u0001\u0000\u0000\u0000\u0354\u0355\u0005t\u0000\u0000\u0355"+
+ "\u0356\u0005r\u0000\u0000\u0356\u0357\u0005e\u0000\u0000\u0357\u0358\u0005"+
+ "a\u0000\u0000\u0358\u0359\u0005t\u0000\u0000\u0359\u00c8\u0001\u0000\u0000"+
+ "\u0000\u035a\u035b\u0005c\u0000\u0000\u035b\u035c\u0005a\u0000\u0000\u035c"+
+ "\u035d\u0005s\u0000\u0000\u035d\u035e\u0005t\u0000\u0000\u035e\u00ca\u0001"+
+ "\u0000\u0000\u0000\u035f\u0360\u0005c\u0000\u0000\u0360\u0361\u0005a\u0000"+
+ "\u0000\u0361\u0362\u0005s\u0000\u0000\u0362\u0363\u0005t\u0000\u0000\u0363"+
+ "\u0364\u0005a\u0000\u0000\u0364\u0365\u0005b\u0000\u0000\u0365\u0366\u0005"+
+ "l\u0000\u0000\u0366\u0367\u0005e\u0000\u0000\u0367\u00cc\u0001\u0000\u0000"+
+ "\u0000\u0368\u0369\u0005v\u0000\u0000\u0369\u036a\u0005e\u0000\u0000\u036a"+
+ "\u036b\u0005r\u0000\u0000\u036b\u036c\u0005s\u0000\u0000\u036c\u036d\u0005"+
+ "i\u0000\u0000\u036d\u036e\u0005o\u0000\u0000\u036e\u036f\u0005n\u0000"+
+ "\u0000\u036f\u00ce\u0001\u0000\u0000\u0000\u0370\u0371\u0005j\u0000\u0000"+
+ "\u0371\u0372\u0005s\u0000\u0000\u0372\u0373\u0005o\u0000\u0000\u0373\u0374"+
+ "\u0005n\u0000\u0000\u0374\u0375\u0005i\u0000\u0000\u0375\u0376\u0005q"+
+ "\u0000\u0000\u0376\u00d0\u0001\u0000\u0000\u0000\u0377\u0378\u0005u\u0000"+
+ "\u0000\u0378\u0379\u0005n\u0000\u0000\u0379\u037a\u0005o\u0000\u0000\u037a"+
+ "\u037b\u0005r\u0000\u0000\u037b\u037c\u0005d\u0000\u0000\u037c\u037d\u0005"+
+ "e\u0000\u0000\u037d\u037e\u0005r\u0000\u0000\u037e\u037f\u0005e\u0000"+
+ "\u0000\u037f\u0380\u0005d\u0000\u0000\u0380\u00d2\u0001\u0000\u0000\u0000"+
+ "\u0381\u0382\u0005t\u0000\u0000\u0382\u0383\u0005r\u0000\u0000\u0383\u0384"+
+ "\u0005u\u0000\u0000\u0384\u0385\u0005e\u0000\u0000\u0385\u00d4\u0001\u0000"+
+ "\u0000\u0000\u0386\u0387\u0005f\u0000\u0000\u0387\u0388\u0005a\u0000\u0000"+
+ "\u0388\u0389\u0005l\u0000\u0000\u0389\u038a\u0005s\u0000\u0000\u038a\u038b"+
+ "\u0005e\u0000\u0000\u038b\u00d6\u0001\u0000\u0000\u0000\u038c\u038d\u0005"+
+ "t\u0000\u0000\u038d\u038e\u0005y\u0000\u0000\u038e\u038f\u0005p\u0000"+
+ "\u0000\u038f\u0390\u0005e\u0000\u0000\u0390\u00d8\u0001\u0000\u0000\u0000"+
+ "\u0391\u0392\u0005v\u0000\u0000\u0392\u0393\u0005a\u0000\u0000\u0393\u0394"+
+ "\u0005l\u0000\u0000\u0394\u0395\u0005i\u0000\u0000\u0395\u0396\u0005d"+
+ "\u0000\u0000\u0396\u0397\u0005a\u0000\u0000\u0397\u0398\u0005t\u0000\u0000"+
+ "\u0398\u0399\u0005e\u0000\u0000\u0399\u00da\u0001\u0000\u0000\u0000\u039a"+
+ "\u039b\u0005a\u0000\u0000\u039b\u039c\u0005n\u0000\u0000\u039c\u039d\u0005"+
+ "n\u0000\u0000\u039d\u039e\u0005o\u0000\u0000\u039e\u039f\u0005t\u0000"+
+ "\u0000\u039f\u03a0\u0005a\u0000\u0000\u03a0\u03a1\u0005t\u0000\u0000\u03a1"+
+ "\u03a2\u0005e\u0000\u0000\u03a2\u00dc\u0001\u0000\u0000\u0000\u03a3\u03a4"+
+ "\u0005d\u0000\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6\u0005c"+
+ "\u0000\u0000\u03a6\u03a7\u0005l\u0000\u0000\u03a7\u03a8\u0005a\u0000\u0000"+
+ "\u03a8\u03a9\u0005r\u0000\u0000\u03a9\u03aa\u0005e\u0000\u0000\u03aa\u00de"+
+ "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005c\u0000\u0000\u03ac\u03ad\u0005"+
+ "o\u0000\u0000\u03ad\u03ae\u0005n\u0000\u0000\u03ae\u03af\u0005t\u0000"+
+ "\u0000\u03af\u03b0\u0005e\u0000\u0000\u03b0\u03b1\u0005x\u0000\u0000\u03b1"+
+ "\u03b2\u0005t\u0000\u0000\u03b2\u00e0\u0001\u0000\u0000\u0000\u03b3\u03b4"+
+ "\u0005i\u0000\u0000\u03b4\u03b5\u0005t\u0000\u0000\u03b5\u03b6\u0005e"+
+ "\u0000\u0000\u03b6\u03b7\u0005m\u0000\u0000\u03b7\u00e2\u0001\u0000\u0000"+
+ "\u0000\u03b8\u03b9\u0005v\u0000\u0000\u03b9\u03ba\u0005a\u0000\u0000\u03ba"+
+ "\u03bb\u0005r\u0000\u0000\u03bb\u03bc\u0005i\u0000\u0000\u03bc\u03bd\u0005"+
+ "a\u0000\u0000\u03bd\u03be\u0005b\u0000\u0000\u03be\u03bf\u0005l\u0000"+
+ "\u0000\u03bf\u03c0\u0005e\u0000\u0000\u03c0\u00e4\u0001\u0000\u0000\u0000"+
+ "\u03c1\u03c2\u0005i\u0000\u0000\u03c2\u03c3\u0005n\u0000\u0000\u03c3\u03c4"+
+ "\u0005s\u0000\u0000\u03c4\u03c5\u0005e\u0000\u0000\u03c5\u03c6\u0005r"+
+ "\u0000\u0000\u03c6\u03c7\u0005t\u0000\u0000\u03c7\u00e6\u0001\u0000\u0000"+
+ "\u0000\u03c8\u03c9\u0005d\u0000\u0000\u03c9\u03ca\u0005e\u0000\u0000\u03ca"+
+ "\u03cb\u0005l\u0000\u0000\u03cb\u03cc\u0005e\u0000\u0000\u03cc\u03cd\u0005"+
+ "t\u0000\u0000\u03cd\u03ce\u0005e\u0000\u0000\u03ce\u00e8\u0001\u0000\u0000"+
+ "\u0000\u03cf\u03d0\u0005r\u0000\u0000\u03d0\u03d1\u0005e\u0000\u0000\u03d1"+
+ "\u03d2\u0005n\u0000\u0000\u03d2\u03d3\u0005a\u0000\u0000\u03d3\u03d4\u0005"+
+ "m\u0000\u0000\u03d4\u03d5\u0005e\u0000\u0000\u03d5\u00ea\u0001\u0000\u0000"+
+ "\u0000\u03d6\u03d7\u0005r\u0000\u0000\u03d7\u03d8\u0005e\u0000\u0000\u03d8"+
+ "\u03d9\u0005p\u0000\u0000\u03d9\u03da\u0005l\u0000\u0000\u03da\u03db\u0005"+
+ "a\u0000\u0000\u03db\u03dc\u0005c\u0000\u0000\u03dc\u03dd\u0005e\u0000"+
+ "\u0000\u03dd\u00ec\u0001\u0000\u0000\u0000\u03de\u03df\u0005c\u0000\u0000"+
+ "\u03df\u03e0\u0005o\u0000\u0000\u03e0\u03e1\u0005p\u0000\u0000\u03e1\u03e2"+
+ "\u0005y\u0000\u0000\u03e2\u00ee\u0001\u0000\u0000\u0000\u03e3\u03e4\u0005"+
+ "m\u0000\u0000\u03e4\u03e5\u0005o\u0000\u0000\u03e5\u03e6\u0005d\u0000"+
+ "\u0000\u03e6\u03e7\u0005i\u0000\u0000\u03e7\u03e8\u0005f\u0000\u0000\u03e8"+
+ "\u03e9\u0005y\u0000\u0000\u03e9\u00f0\u0001\u0000\u0000\u0000\u03ea\u03eb"+
+ "\u0005a\u0000\u0000\u03eb\u03ec\u0005p\u0000\u0000\u03ec\u03ed\u0005p"+
+ "\u0000\u0000\u03ed\u03ee\u0005e\u0000\u0000\u03ee\u03ef\u0005n\u0000\u0000"+
+ "\u03ef\u03f0\u0005d\u0000\u0000\u03f0\u00f2\u0001\u0000\u0000\u0000\u03f1"+
+ "\u03f2\u0005i\u0000\u0000\u03f2\u03f3\u0005n\u0000\u0000\u03f3\u03f4\u0005"+
+ "t\u0000\u0000\u03f4\u03f5\u0005o\u0000\u0000\u03f5\u00f4\u0001\u0000\u0000"+
+ "\u0000\u03f6\u03f7\u0005v\u0000\u0000\u03f7\u03f8\u0005a\u0000\u0000\u03f8"+
+ "\u03f9\u0005l\u0000\u0000\u03f9\u03fa\u0005u\u0000\u0000\u03fa\u03fb\u0005"+
+ "e\u0000\u0000\u03fb\u00f6\u0001\u0000\u0000\u0000\u03fc\u03fd\u0005w\u0000"+
+ "\u0000\u03fd\u03fe\u0005i\u0000\u0000\u03fe\u03ff\u0005t\u0000\u0000\u03ff"+
+ "\u0400\u0005h\u0000\u0000\u0400\u00f8\u0001\u0000\u0000\u0000\u0401\u0402"+
+ "\u0005p\u0000\u0000\u0402\u0403\u0005o\u0000\u0000\u0403\u0404\u0005s"+
+ "\u0000\u0000\u0404\u0405\u0005i\u0000\u0000\u0405\u0406\u0005t\u0000\u0000"+
+ "\u0406\u0407\u0005i\u0000\u0000\u0407\u0408\u0005o\u0000\u0000\u0408\u0409"+
+ "\u0005n\u0000\u0000\u0409\u00fa\u0001\u0000\u0000\u0000\u040a\u040b\u0005"+
+ "j\u0000\u0000\u040b\u040c\u0005s\u0000\u0000\u040c\u040d\u0005o\u0000"+
+ "\u0000\u040d\u040e\u0005n\u0000\u0000\u040e\u00fc\u0001\u0000\u0000\u0000"+
+ "\u040f\u0410\u0005u\u0000\u0000\u0410\u0411\u0005p\u0000\u0000\u0411\u0412"+
+ "\u0005d\u0000\u0000\u0412\u0413\u0005a\u0000\u0000\u0413\u0414\u0005t"+
+ "\u0000\u0000\u0414\u0415\u0005i\u0000\u0000\u0415\u0416\u0005n\u0000\u0000"+
+ "\u0416\u0417\u0005g\u0000\u0000\u0417\u00fe\u0001\u0000\u0000\u0000\u0418"+
+ "\u0419\u0005b\u0000\u0000\u0419\u041a\u0005r\u0000\u0000\u041a\u041b\u0005"+
+ "e\u0000\u0000\u041b\u041c\u0005a\u0000\u0000\u041c\u041d\u0005k\u0000"+
+ "\u0000\u041d\u0100\u0001\u0000\u0000\u0000\u041e\u041f\u0005l\u0000\u0000"+
+ "\u041f\u0420\u0005o\u0000\u0000\u0420\u0421\u0005o\u0000\u0000\u0421\u0422"+
+ "\u0005p\u0000\u0000\u0422\u0102\u0001\u0000\u0000\u0000\u0423\u0424\u0005"+
+ "c\u0000\u0000\u0424\u0425\u0005o\u0000\u0000\u0425\u0426\u0005n\u0000"+
+ "\u0000\u0426\u0427\u0005t\u0000\u0000\u0427\u0428\u0005i\u0000\u0000\u0428"+
+ "\u0429\u0005n\u0000\u0000\u0429\u042a\u0005u\u0000\u0000\u042a\u042b\u0005"+
+ "e\u0000\u0000\u042b\u0104\u0001\u0000\u0000\u0000\u042c\u042d\u0005e\u0000"+
+ "\u0000\u042d\u042e\u0005x\u0000\u0000\u042e\u042f\u0005i\u0000\u0000\u042f"+
+ "\u0430\u0005t\u0000\u0000\u0430\u0106\u0001\u0000\u0000\u0000\u0431\u0432"+
+ "\u0005r\u0000\u0000\u0432\u0433\u0005e\u0000\u0000\u0433\u0434\u0005t"+
+ "\u0000\u0000\u0434\u0435\u0005u\u0000\u0000\u0435\u0436\u0005r\u0000\u0000"+
+ "\u0436\u0437\u0005n\u0000\u0000\u0437\u0438\u0005i\u0000\u0000\u0438\u0439"+
+ "\u0005n\u0000\u0000\u0439\u043a\u0005g\u0000\u0000\u043a\u0108\u0001\u0000"+
+ "\u0000\u0000\u043b\u043c\u0005w\u0000\u0000\u043c\u043d\u0005h\u0000\u0000"+
+ "\u043d\u043e\u0005i\u0000\u0000\u043e\u043f\u0005l\u0000\u0000\u043f\u0440"+
+ "\u0005e\u0000\u0000\u0440\u010a\u0001\u0000\u0000\u0000\u0441\u0446\u0005"+
+ "\"\u0000\u0000\u0442\u0445\u0003\u010d\u0086\u0000\u0443\u0445\b\u0000"+
+ "\u0000\u0000\u0444\u0442\u0001\u0000\u0000\u0000\u0444\u0443\u0001\u0000"+
+ "\u0000\u0000\u0445\u0448\u0001\u0000\u0000\u0000\u0446\u0444\u0001\u0000"+
+ "\u0000\u0000\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0449\u0001\u0000"+
+ "\u0000\u0000\u0448\u0446\u0001\u0000\u0000\u0000\u0449\u044a\u0005\"\u0000"+
+ "\u0000\u044a\u010c\u0001\u0000\u0000\u0000\u044b\u044e\u0005\\\u0000\u0000"+
+ "\u044c\u044f\u0007\u0001\u0000\u0000\u044d\u044f\u0003\u010f\u0087\u0000"+
+ "\u044e\u044c\u0001\u0000\u0000\u0000\u044e\u044d\u0001\u0000\u0000\u0000"+
+ "\u044f\u010e\u0001\u0000\u0000\u0000\u0450\u0451\u0005u\u0000\u0000\u0451"+
+ "\u0452\u0003\u0111\u0088\u0000\u0452\u0453\u0003\u0111\u0088\u0000\u0453"+
+ "\u0454\u0003\u0111\u0088\u0000\u0454\u0455\u0003\u0111\u0088\u0000\u0455"+
+ "\u0110\u0001\u0000\u0000\u0000\u0456\u0457\u0007\u0002\u0000\u0000\u0457"+
+ "\u0112\u0001\u0000\u0000\u0000\u0458\u0459\u0005?\u0000\u0000\u0459\u0114"+
+ "\u0001\u0000\u0000\u0000\u045a\u045b\u0005n\u0000\u0000\u045b\u045c\u0005"+
+ "u\u0000\u0000\u045c\u045d\u0005l\u0000\u0000\u045d\u045e\u0005l\u0000"+
+ "\u0000\u045e\u0116\u0001\u0000\u0000\u0000\u045f\u0460\u0003\u0119\u008c"+
+ "\u0000\u0460\u0118\u0001\u0000\u0000\u0000\u0461\u0465\u0003\u011b\u008d"+
+ "\u0000\u0462\u0465\u0003\u011d\u008e\u0000\u0463\u0465\u0003\u011f\u008f"+
+ "\u0000\u0464\u0461\u0001\u0000\u0000\u0000\u0464\u0462\u0001\u0000\u0000"+
+ "\u0000\u0464\u0463\u0001\u0000\u0000\u0000\u0465\u011a\u0001\u0000\u0000"+
+ "\u0000\u0466\u0467\u0003\u0121\u0090\u0000\u0467\u011c\u0001\u0000\u0000"+
+ "\u0000\u0468\u0469\u0005.\u0000\u0000\u0469\u0473\u0003\u0121\u0090\u0000"+
+ "\u046a\u046b\u0003\u0121\u0090\u0000\u046b\u046f\u0005.\u0000\u0000\u046c"+
+ "\u046e\u0007\u0003\u0000\u0000\u046d\u046c\u0001\u0000\u0000\u0000\u046e"+
+ "\u0471\u0001\u0000\u0000\u0000\u046f\u046d\u0001\u0000\u0000\u0000\u046f"+
+ "\u0470\u0001\u0000\u0000\u0000\u0470\u0473\u0001\u0000\u0000\u0000\u0471"+
+ "\u046f\u0001\u0000\u0000\u0000\u0472\u0468\u0001\u0000\u0000\u0000\u0472"+
+ "\u046a\u0001\u0000\u0000\u0000\u0473\u011e\u0001\u0000\u0000\u0000\u0474"+
+ "\u0475\u0005.\u0000\u0000\u0475\u0481\u0003\u0121\u0090\u0000\u0476\u047e"+
+ "\u0003\u0121\u0090\u0000\u0477\u047b\u0005.\u0000\u0000\u0478\u047a\u0007"+
+ "\u0003\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u047a\u047d\u0001"+
+ "\u0000\u0000\u0000\u047b\u0479\u0001\u0000\u0000\u0000\u047b\u047c\u0001"+
+ "\u0000\u0000\u0000\u047c\u047f\u0001\u0000\u0000\u0000\u047d\u047b\u0001"+
+ "\u0000\u0000\u0000\u047e\u0477\u0001\u0000\u0000\u0000\u047e\u047f\u0001"+
+ "\u0000\u0000\u0000\u047f\u0481\u0001\u0000\u0000\u0000\u0480\u0474\u0001"+
+ "\u0000\u0000\u0000\u0480\u0476\u0001\u0000\u0000\u0000\u0481\u0482\u0001"+
+ "\u0000\u0000\u0000\u0482\u0484\u0007\u0004\u0000\u0000\u0483\u0485\u0007"+
+ "\u0005\u0000\u0000\u0484\u0483\u0001\u0000\u0000\u0000\u0484\u0485\u0001"+
+ "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0487\u0003"+
+ "\u0121\u0090\u0000\u0487\u0120\u0001\u0000\u0000\u0000\u0488\u048a\u0007"+
+ "\u0003\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001"+
+ "\u0000\u0000\u0000\u048b\u0489\u0001\u0000\u0000\u0000\u048b\u048c\u0001"+
+ "\u0000\u0000\u0000\u048c\u0122\u0001\u0000\u0000\u0000\u048d\u048e\u0007"+
+ "\u0006\u0000\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u0006"+
+ "\u0091\u0000\u0000\u0490\u0124\u0001\u0000\u0000\u0000\u0491\u0495\u0003"+
+ "\u0127\u0093\u0000\u0492\u0494\u0003\u0129\u0094\u0000\u0493\u0492\u0001"+
+ "\u0000\u0000\u0000\u0494\u0497\u0001\u0000\u0000\u0000\u0495\u0493\u0001"+
+ "\u0000\u0000\u0000\u0495\u0496\u0001\u0000\u0000\u0000\u0496\u0126\u0001"+
+ "\u0000\u0000\u0000\u0497\u0495\u0001\u0000\u0000\u0000\u0498\u049a\u0007"+
+ "\u0007\u0000\u0000\u0499\u0498\u0001\u0000\u0000\u0000\u049a\u0128\u0001"+
+ "\u0000\u0000\u0000\u049b\u049e\u0003\u0127\u0093\u0000\u049c\u049e\u0007"+
+ "\b\u0000\u0000\u049d\u049b\u0001\u0000\u0000\u0000\u049d\u049c\u0001\u0000"+
+ "\u0000\u0000\u049e\u012a\u0001\u0000\u0000\u0000\u049f\u04a0\u0005(\u0000"+
+ "\u0000\u04a0\u04a9\u0005:\u0000\u0000\u04a1\u04a8\u0003\u012b\u0095\u0000"+
+ "\u04a2\u04a3\u0005(\u0000\u0000\u04a3\u04a8\b\t\u0000\u0000\u04a4\u04a5"+
+ "\u0005:\u0000\u0000\u04a5\u04a8\b\n\u0000\u0000\u04a6\u04a8\b\u000b\u0000"+
+ "\u0000\u04a7\u04a1\u0001\u0000\u0000\u0000\u04a7\u04a2\u0001\u0000\u0000"+
+ "\u0000\u04a7\u04a4\u0001\u0000\u0000\u0000\u04a7\u04a6\u0001\u0000\u0000"+
+ "\u0000\u04a8\u04ab\u0001\u0000\u0000\u0000\u04a9\u04a7\u0001\u0000\u0000"+
+ "\u0000\u04a9\u04aa\u0001\u0000\u0000\u0000\u04aa\u04ad\u0001\u0000\u0000"+
+ "\u0000\u04ab\u04a9\u0001\u0000\u0000\u0000\u04ac\u04ae\u0005:\u0000\u0000"+
+ "\u04ad\u04ac\u0001\u0000\u0000\u0000\u04ae\u04af\u0001\u0000\u0000\u0000"+
+ "\u04af\u04ad\u0001\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000\u0000"+
+ "\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005)\u0000\u0000\u04b2"+
+ "\u04b3\u0001\u0000\u0000\u0000\u04b3\u04b4\u0006\u0095\u0000\u0000\u04b4"+
+ "\u012c\u0001\u0000\u0000\u0000\u04b5\u04b6\b\f\u0000\u0000\u04b6\u012e"+
+ "\u0001\u0000\u0000\u0000\u0012\u0000\u0444\u0446\u044e\u0464\u046f\u0472"+
+ "\u047b\u047e\u0480\u0484\u048b\u0495\u0499\u049d\u04a7\u04a9\u04af\u0001"+
+ "\u0000\u0001\u0000";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
index 74d3a280cf..90fc814284 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
@@ -121,27 +121,28 @@ Kmodify=120
Kappend=121
Kinto=122
Kvalue=123
-Kjson=124
-Kwith=125
-Kposition=126
-Kbreak=127
-Kloop=128
-Kcontinue=129
-Kexit=130
-Kreturning=131
-Kwhile=132
-STRING=133
-ArgumentPlaceholder=134
-NullLiteral=135
-Literal=136
-NumericLiteral=137
-IntegerLiteral=138
-DecimalLiteral=139
-DoubleLiteral=140
-WS=141
-NCName=142
-XQComment=143
-ContentChar=144
+Kwith=124
+Kposition=125
+Kjson=126
+Kupdating=127
+Kbreak=128
+Kloop=129
+Kcontinue=130
+Kexit=131
+Kreturning=132
+Kwhile=133
+STRING=134
+ArgumentPlaceholder=135
+NullLiteral=136
+Literal=137
+NumericLiteral=138
+IntegerLiteral=139
+DecimalLiteral=140
+DoubleLiteral=141
+WS=142
+NCName=143
+XQComment=144
+ContentChar=145
';'=1
'module'=2
'namespace'=3
@@ -265,14 +266,15 @@ ContentChar=144
'append'=121
'into'=122
'value'=123
-'json'=124
-'with'=125
-'position'=126
-'break'=127
-'loop'=128
-'continue'=129
-'exit'=130
-'returning'=131
-'while'=132
-'?'=134
-'null'=135
+'with'=124
+'position'=125
+'json'=126
+'updating'=127
+'break'=128
+'loop'=129
+'continue'=130
+'exit'=131
+'returning'=132
+'while'=133
+'?'=135
+'null'=136
diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java
index 7f7947c755..355a01ca9c 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqParser.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java
@@ -3,25 +3,14 @@
// Java header
package org.rumbledb.parser;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.antlr.v4.runtime.NoViableAltException;
-import org.antlr.v4.runtime.Parser;
-import org.antlr.v4.runtime.ParserRuleContext;
-import org.antlr.v4.runtime.RecognitionException;
-import org.antlr.v4.runtime.RuntimeMetaData;
-import org.antlr.v4.runtime.Token;
-import org.antlr.v4.runtime.TokenStream;
-import org.antlr.v4.runtime.Vocabulary;
-import org.antlr.v4.runtime.VocabularyImpl;
-import org.antlr.v4.runtime.atn.ATN;
-import org.antlr.v4.runtime.atn.ATNDeserializer;
-import org.antlr.v4.runtime.atn.ParserATNSimulator;
-import org.antlr.v4.runtime.atn.PredictionContextCache;
+import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
-import org.antlr.v4.runtime.tree.ParseTreeVisitor;
-import org.antlr.v4.runtime.tree.TerminalNode;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"})
public class JsoniqParser extends Parser {
@@ -48,11 +37,11 @@ public class JsoniqParser extends Parser {
Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108,
Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114,
Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120,
- Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126,
- Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132,
- STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137,
- IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142,
- XQComment=143, ContentChar=144;
+ Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126,
+ Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132,
+ Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137,
+ NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141,
+ WS=142, NCName=143, XQComment=144, ContentChar=145;
public static final int
RULE_moduleAndThisIsIt = 0, RULE_module = 1, RULE_mainModule = 2, RULE_libraryModule = 3,
RULE_prolog = 4, RULE_program = 5, RULE_statements = 6, RULE_statementsAndExpr = 7,
@@ -145,9 +134,9 @@ private static String[] makeLiteralNames() {
"'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'",
"'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'",
"'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'",
- "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'",
- "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'",
- "'returning'", "'while'", null, "'?'", "'null'"
+ "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'",
+ "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'",
+ "'exit'", "'returning'", "'while'", null, "'?'", "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -166,10 +155,10 @@ private static String[] makeSymbolicNames() {
"Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion",
"Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate",
"Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename",
- "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson",
- "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning",
- "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal",
- "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
+ "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith",
+ "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit",
+ "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral",
+ "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
"WS", "NCName", "XQComment", "ContentChar"
};
}
@@ -397,9 +386,10 @@ public final ModuleContext module() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -804,7 +794,7 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws
setState(312);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) {
{
setState(311);
expr();
@@ -1787,9 +1777,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -1888,9 +1879,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -2117,9 +2109,11 @@ public final CaseStatementContext caseStatement() throws RecognitionException {
@SuppressWarnings("CheckReturnValue")
public static class AnnotationContext extends ParserRuleContext {
public QnameContext name;
+ public Token updating;
public QnameContext qname() {
return getRuleContext(QnameContext.class,0);
}
+ public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); }
public List Literal() { return getTokens(JsoniqParser.Literal); }
public TerminalNode Literal(int i) {
return getToken(JsoniqParser.Literal, i);
@@ -2142,40 +2136,56 @@ public final AnnotationContext annotation() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(461);
- match(T__12);
- setState(462);
- ((AnnotationContext)_localctx).name = qname();
- setState(473);
+ setState(476);
_errHandler.sync(this);
- _la = _input.LA(1);
- if (_la==T__8) {
+ switch (_input.LA(1)) {
+ case T__12:
{
- setState(463);
- match(T__8);
- setState(464);
- match(Literal);
- setState(469);
+ setState(461);
+ match(T__12);
+ setState(462);
+ ((AnnotationContext)_localctx).name = qname();
+ setState(473);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
- {
+ if (_la==T__8) {
{
- setState(465);
- match(T__13);
- setState(466);
+ setState(463);
+ match(T__8);
+ setState(464);
match(Literal);
- }
- }
- setState(471);
+ setState(469);
_errHandler.sync(this);
_la = _input.LA(1);
+ while (_la==T__13) {
+ {
+ {
+ setState(465);
+ match(T__13);
+ setState(466);
+ match(Literal);
+ }
+ }
+ setState(471);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(472);
+ match(T__9);
+ }
}
- setState(472);
- match(T__9);
+
+ }
+ break;
+ case Kupdating:
+ {
+ setState(475);
+ ((AnnotationContext)_localctx).updating = match(Kupdating);
}
+ break;
+ default:
+ throw new NoViableAltException(this);
}
-
}
}
catch (RecognitionException re) {
@@ -2215,17 +2225,17 @@ public final AnnotationsContext annotations() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(478);
+ setState(481);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__12) {
+ while (_la==T__12 || _la==Kupdating) {
{
{
- setState(475);
+ setState(478);
annotation();
}
}
- setState(480);
+ setState(483);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2272,29 +2282,29 @@ public final VarDeclStatementContext varDeclStatement() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(481);
+ setState(484);
annotations();
- setState(482);
+ setState(485);
match(Kvariable);
- setState(483);
+ setState(486);
varDeclForStatement();
- setState(488);
+ setState(491);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(484);
+ setState(487);
match(T__13);
- setState(485);
+ setState(488);
varDeclForStatement();
}
}
- setState(490);
+ setState(493);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(491);
+ setState(494);
match(T__0);
}
}
@@ -2342,28 +2352,28 @@ public final VarDeclForStatementContext varDeclForStatement() throws Recognition
try {
enterOuterAlt(_localctx, 1);
{
- setState(493);
- ((VarDeclForStatementContext)_localctx).var_ref = varRef();
setState(496);
+ ((VarDeclForStatementContext)_localctx).var_ref = varRef();
+ setState(499);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(494);
+ setState(497);
match(Kas);
- setState(495);
+ setState(498);
sequenceType();
}
}
- setState(500);
+ setState(503);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5) {
{
- setState(498);
+ setState(501);
match(T__5);
- setState(499);
+ setState(502);
((VarDeclForStatementContext)_localctx).exprSingle = exprSingle();
((VarDeclForStatementContext)_localctx).expr_vals.add(((VarDeclForStatementContext)_localctx).exprSingle);
}
@@ -2410,15 +2420,15 @@ public final WhileStatementContext whileStatement() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(502);
+ setState(505);
match(Kwhile);
- setState(503);
+ setState(506);
match(T__8);
- setState(504);
+ setState(507);
((WhileStatementContext)_localctx).test_expr = expr();
- setState(505);
+ setState(508);
match(T__9);
- setState(506);
+ setState(509);
((WhileStatementContext)_localctx).stmt = statement();
}
}
@@ -2462,34 +2472,34 @@ public final SetterContext setter() throws RecognitionException {
SetterContext _localctx = new SetterContext(_ctx, getState());
enterRule(_localctx, 58, RULE_setter);
try {
- setState(512);
+ setState(515);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(508);
+ setState(511);
defaultCollationDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(509);
+ setState(512);
orderingModeDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(510);
+ setState(513);
emptyOrderDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(511);
+ setState(514);
decimalFormatDecl();
}
break;
@@ -2530,15 +2540,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(514);
+ setState(517);
match(Kdeclare);
- setState(515);
+ setState(518);
match(T__2);
- setState(516);
+ setState(519);
match(NCName);
- setState(517);
+ setState(520);
match(T__3);
- setState(518);
+ setState(521);
uriLiteral();
}
}
@@ -2582,34 +2592,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException {
AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState());
enterRule(_localctx, 62, RULE_annotatedDecl);
try {
- setState(524);
+ setState(527);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(520);
+ setState(523);
functionDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(521);
+ setState(524);
varDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(522);
+ setState(525);
typeDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(523);
+ setState(526);
contextItemDecl();
}
break;
@@ -2651,13 +2661,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti
try {
enterOuterAlt(_localctx, 1);
{
- setState(526);
+ setState(529);
match(Kdeclare);
- setState(527);
+ setState(530);
match(Kdefault);
- setState(528);
+ setState(531);
match(Kcollation);
- setState(529);
+ setState(532);
uriLiteral();
}
}
@@ -2694,11 +2704,11 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(531);
+ setState(534);
match(Kdeclare);
- setState(532);
+ setState(535);
match(T__14);
- setState(533);
+ setState(536);
_la = _input.LA(1);
if ( !(_la==T__15 || _la==Kunordered) ) {
_errHandler.recoverInline(this);
@@ -2748,16 +2758,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(535);
+ setState(538);
match(Kdeclare);
- setState(536);
+ setState(539);
match(Kdefault);
- setState(537);
+ setState(540);
match(Korder);
- setState(538);
+ setState(541);
match(Kempty);
{
- setState(539);
+ setState(542);
((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==Kgreatest || _la==Kleast) ) {
@@ -2819,17 +2829,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(541);
+ setState(544);
match(Kdeclare);
- setState(546);
+ setState(549);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__16:
{
{
- setState(542);
+ setState(545);
match(T__16);
- setState(543);
+ setState(546);
qname();
}
}
@@ -2837,9 +2847,9 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
case Kdefault:
{
{
- setState(544);
+ setState(547);
match(Kdefault);
- setState(545);
+ setState(548);
match(T__16);
}
}
@@ -2847,21 +2857,21 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
default:
throw new NoViableAltException(this);
}
- setState(554);
+ setState(557);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 536346624L) != 0)) {
{
{
- setState(548);
+ setState(551);
dfPropertyName();
- setState(549);
+ setState(552);
match(T__3);
- setState(550);
+ setState(553);
stringLiteral();
}
}
- setState(556);
+ setState(559);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2911,17 +2921,17 @@ public final QnameContext qname() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(562);
+ setState(565);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) {
case 1:
{
- setState(559);
+ setState(562);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NCName:
{
- setState(557);
+ setState(560);
((QnameContext)_localctx).ns = match(NCName);
}
break;
@@ -2988,9 +2998,10 @@ public final QnameContext qname() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -2999,24 +3010,24 @@ public final QnameContext qname() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(558);
+ setState(561);
((QnameContext)_localctx).nskw = keyWords();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(561);
+ setState(564);
match(T__17);
}
break;
}
- setState(566);
+ setState(569);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NCName:
{
- setState(564);
+ setState(567);
((QnameContext)_localctx).local_name = match(NCName);
}
break;
@@ -3083,9 +3094,10 @@ public final QnameContext qname() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -3094,7 +3106,7 @@ public final QnameContext qname() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(565);
+ setState(568);
((QnameContext)_localctx).local_namekw = keyWords();
}
break;
@@ -3134,7 +3146,7 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(568);
+ setState(571);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 536346624L) != 0)) ) {
_errHandler.recoverInline(this);
@@ -3187,48 +3199,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(570);
+ setState(573);
match(T__28);
- setState(571);
+ setState(574);
match(T__1);
- setState(575);
+ setState(578);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__2) {
{
- setState(572);
+ setState(575);
match(T__2);
- setState(573);
+ setState(576);
((ModuleImportContext)_localctx).prefix = match(NCName);
- setState(574);
+ setState(577);
match(T__3);
}
}
- setState(577);
+ setState(580);
((ModuleImportContext)_localctx).targetNamespace = uriLiteral();
- setState(587);
+ setState(590);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kat) {
{
- setState(578);
+ setState(581);
match(Kat);
- setState(579);
+ setState(582);
uriLiteral();
- setState(584);
+ setState(587);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(580);
+ setState(583);
match(T__13);
- setState(581);
+ setState(584);
uriLiteral();
}
}
- setState(586);
+ setState(589);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3284,35 +3296,35 @@ public final VarDeclContext varDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(589);
+ setState(592);
match(Kdeclare);
- setState(590);
+ setState(593);
annotations();
- setState(591);
+ setState(594);
match(Kvariable);
- setState(592);
- varRef();
setState(595);
+ varRef();
+ setState(598);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(593);
+ setState(596);
match(Kas);
- setState(594);
+ setState(597);
sequenceType();
}
}
- setState(604);
+ setState(607);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__5:
{
{
- setState(597);
+ setState(600);
match(T__5);
- setState(598);
+ setState(601);
exprSingle();
}
}
@@ -3320,16 +3332,16 @@ public final VarDeclContext varDecl() throws RecognitionException {
case T__29:
{
{
- setState(599);
- ((VarDeclContext)_localctx).external = match(T__29);
setState(602);
+ ((VarDeclContext)_localctx).external = match(T__29);
+ setState(605);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5) {
{
- setState(600);
+ setState(603);
match(T__5);
- setState(601);
+ setState(604);
exprSingle();
}
}
@@ -3384,33 +3396,33 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(606);
+ setState(609);
match(Kdeclare);
- setState(607);
+ setState(610);
match(Kcontext);
- setState(608);
- match(Kitem);
setState(611);
+ match(Kitem);
+ setState(614);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(609);
+ setState(612);
match(Kas);
- setState(610);
+ setState(613);
sequenceType();
}
}
- setState(620);
+ setState(623);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__5:
{
{
- setState(613);
+ setState(616);
match(T__5);
- setState(614);
+ setState(617);
exprSingle();
}
}
@@ -3418,16 +3430,16 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio
case T__29:
{
{
- setState(615);
- ((ContextItemDeclContext)_localctx).external = match(T__29);
setState(618);
+ ((ContextItemDeclContext)_localctx).external = match(T__29);
+ setState(621);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5) {
{
- setState(616);
+ setState(619);
match(T__5);
- setState(617);
+ setState(620);
exprSingle();
}
}
@@ -3456,6 +3468,7 @@ public static class FunctionDeclContext extends ParserRuleContext {
public QnameContext fn_name;
public SequenceTypeContext return_type;
public StatementsAndOptionalExprContext fn_body;
+ public Token is_external;
public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); }
public AnnotationsContext annotations() {
return getRuleContext(AnnotationsContext.class,0);
@@ -3491,59 +3504,59 @@ public final FunctionDeclContext functionDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(622);
+ setState(625);
match(Kdeclare);
- setState(623);
+ setState(626);
annotations();
- setState(624);
+ setState(627);
match(T__30);
- setState(625);
+ setState(628);
((FunctionDeclContext)_localctx).fn_name = qname();
- setState(626);
+ setState(629);
match(T__8);
- setState(628);
+ setState(631);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(627);
+ setState(630);
paramList();
}
}
- setState(630);
- match(T__9);
setState(633);
+ match(T__9);
+ setState(636);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(631);
+ setState(634);
match(Kas);
- setState(632);
+ setState(635);
((FunctionDeclContext)_localctx).return_type = sequenceType();
}
}
- setState(640);
+ setState(643);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__6:
{
- setState(635);
+ setState(638);
match(T__6);
{
- setState(636);
+ setState(639);
((FunctionDeclContext)_localctx).fn_body = statementsAndOptionalExpr();
}
- setState(637);
+ setState(640);
match(T__7);
}
break;
case T__29:
{
- setState(639);
- match(T__29);
+ setState(642);
+ ((FunctionDeclContext)_localctx).is_external = match(T__29);
}
break;
default:
@@ -3596,25 +3609,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(642);
+ setState(645);
match(Kdeclare);
- setState(643);
+ setState(646);
match(Ktype);
- setState(644);
+ setState(647);
((TypeDeclContext)_localctx).type_name = qname();
- setState(645);
+ setState(648);
match(Kas);
- setState(647);
+ setState(650);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
case 1:
{
- setState(646);
+ setState(649);
((TypeDeclContext)_localctx).schema = schemaLanguage();
}
break;
}
- setState(649);
+ setState(652);
((TypeDeclContext)_localctx).type_definition = exprSingle();
}
}
@@ -3647,33 +3660,33 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException
SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState());
enterRule(_localctx, 86, RULE_schemaLanguage);
try {
- setState(657);
+ setState(660);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(651);
+ setState(654);
match(T__31);
- setState(652);
+ setState(655);
match(T__32);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(653);
+ setState(656);
match(T__31);
- setState(654);
+ setState(657);
match(T__33);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(655);
+ setState(658);
match(Kjson);
- setState(656);
+ setState(659);
match(T__34);
}
break;
@@ -3716,21 +3729,21 @@ public final ParamListContext paramList() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(659);
+ setState(662);
param();
- setState(664);
+ setState(667);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(660);
+ setState(663);
match(T__13);
- setState(661);
+ setState(664);
param();
}
}
- setState(666);
+ setState(669);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3774,18 +3787,18 @@ public final ParamContext param() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(667);
+ setState(670);
match(T__4);
- setState(668);
- qname();
setState(671);
+ qname();
+ setState(674);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(669);
+ setState(672);
match(Kas);
- setState(670);
+ setState(673);
sequenceType();
}
}
@@ -3829,21 +3842,21 @@ public final ExprContext expr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(673);
+ setState(676);
exprSingle();
- setState(678);
+ setState(681);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(674);
+ setState(677);
match(T__13);
- setState(675);
+ setState(678);
exprSingle();
}
}
- setState(680);
+ setState(683);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3895,48 +3908,48 @@ public final ExprSingleContext exprSingle() throws RecognitionException {
ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState());
enterRule(_localctx, 94, RULE_exprSingle);
try {
- setState(687);
+ setState(690);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(681);
+ setState(684);
exprSimple();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(682);
+ setState(685);
flowrExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(683);
+ setState(686);
switchExpr();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(684);
+ setState(687);
typeSwitchExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(685);
+ setState(688);
ifExpr();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(686);
+ setState(689);
tryCatchExpr();
}
break;
@@ -3994,62 +4007,62 @@ public final ExprSimpleContext exprSimple() throws RecognitionException {
ExprSimpleContext _localctx = new ExprSimpleContext(_ctx, getState());
enterRule(_localctx, 96, RULE_exprSimple);
try {
- setState(697);
+ setState(700);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(689);
+ setState(692);
quantifiedExpr();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(690);
+ setState(693);
orExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(691);
+ setState(694);
insertExpr();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(692);
+ setState(695);
deleteExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(693);
+ setState(696);
renameExpr();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(694);
+ setState(697);
replaceExpr();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(695);
+ setState(698);
transformExpr();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(696);
+ setState(699);
appendExpr();
}
break;
@@ -4129,66 +4142,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(701);
+ setState(704);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(699);
+ setState(702);
((FlowrExprContext)_localctx).start_for = forClause();
}
break;
case Klet:
{
- setState(700);
+ setState(703);
((FlowrExprContext)_localctx).start_let = letClause();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(711);
+ setState(714);
_errHandler.sync(this);
_la = _input.LA(1);
while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & 24623L) != 0)) {
{
- setState(709);
+ setState(712);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(703);
+ setState(706);
forClause();
}
break;
case Klet:
{
- setState(704);
+ setState(707);
letClause();
}
break;
case Kwhere:
{
- setState(705);
+ setState(708);
whereClause();
}
break;
case Kgroup:
{
- setState(706);
+ setState(709);
groupByClause();
}
break;
case Korder:
case Kstable:
{
- setState(707);
+ setState(710);
orderByClause();
}
break;
case Kcount:
{
- setState(708);
+ setState(711);
countClause();
}
break;
@@ -4196,13 +4209,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException {
throw new NoViableAltException(this);
}
}
- setState(713);
+ setState(716);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(714);
+ setState(717);
match(Kreturn);
- setState(715);
+ setState(718);
((FlowrExprContext)_localctx).return_expr = exprSingle();
}
}
@@ -4246,25 +4259,25 @@ public final ForClauseContext forClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(717);
+ setState(720);
match(Kfor);
- setState(718);
+ setState(721);
((ForClauseContext)_localctx).forVar = forVar();
((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar);
- setState(723);
+ setState(726);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(719);
+ setState(722);
match(T__13);
- setState(720);
+ setState(723);
((ForClauseContext)_localctx).forVar = forVar();
((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar);
}
}
- setState(725);
+ setState(728);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4323,47 +4336,47 @@ public final ForVarContext forVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(726);
- ((ForVarContext)_localctx).var_ref = varRef();
setState(729);
+ ((ForVarContext)_localctx).var_ref = varRef();
+ setState(732);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(727);
+ setState(730);
match(Kas);
- setState(728);
+ setState(731);
((ForVarContext)_localctx).seq = sequenceType();
}
}
- setState(733);
+ setState(736);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kallowing) {
{
- setState(731);
+ setState(734);
((ForVarContext)_localctx).flag = match(Kallowing);
- setState(732);
+ setState(735);
match(Kempty);
}
}
- setState(737);
+ setState(740);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kat) {
{
- setState(735);
+ setState(738);
match(Kat);
- setState(736);
+ setState(739);
((ForVarContext)_localctx).at = varRef();
}
}
- setState(739);
+ setState(742);
match(Kin);
- setState(740);
+ setState(743);
((ForVarContext)_localctx).ex = exprSingle();
}
}
@@ -4407,25 +4420,25 @@ public final LetClauseContext letClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(742);
+ setState(745);
match(Klet);
- setState(743);
+ setState(746);
((LetClauseContext)_localctx).letVar = letVar();
((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar);
- setState(748);
+ setState(751);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(744);
+ setState(747);
match(T__13);
- setState(745);
+ setState(748);
((LetClauseContext)_localctx).letVar = letVar();
((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar);
}
}
- setState(750);
+ setState(753);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4475,23 +4488,23 @@ public final LetVarContext letVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(751);
- ((LetVarContext)_localctx).var_ref = varRef();
setState(754);
+ ((LetVarContext)_localctx).var_ref = varRef();
+ setState(757);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(752);
+ setState(755);
match(Kas);
- setState(753);
+ setState(756);
((LetVarContext)_localctx).seq = sequenceType();
}
}
- setState(756);
+ setState(759);
match(T__5);
- setState(757);
+ setState(760);
((LetVarContext)_localctx).ex = exprSingle();
}
}
@@ -4529,9 +4542,9 @@ public final WhereClauseContext whereClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(759);
+ setState(762);
match(Kwhere);
- setState(760);
+ setState(763);
exprSingle();
}
}
@@ -4576,27 +4589,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(762);
+ setState(765);
match(Kgroup);
- setState(763);
+ setState(766);
match(Kby);
- setState(764);
+ setState(767);
((GroupByClauseContext)_localctx).groupByVar = groupByVar();
((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar);
- setState(769);
+ setState(772);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(765);
+ setState(768);
match(T__13);
- setState(766);
+ setState(769);
((GroupByClauseContext)_localctx).groupByVar = groupByVar();
((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar);
}
}
- setState(771);
+ setState(774);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4652,40 +4665,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(772);
+ setState(775);
((GroupByVarContext)_localctx).var_ref = varRef();
- setState(779);
+ setState(782);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5 || _la==Kas) {
{
- setState(775);
+ setState(778);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(773);
+ setState(776);
match(Kas);
- setState(774);
+ setState(777);
((GroupByVarContext)_localctx).seq = sequenceType();
}
}
- setState(777);
+ setState(780);
((GroupByVarContext)_localctx).decl = match(T__5);
- setState(778);
+ setState(781);
((GroupByVarContext)_localctx).ex = exprSingle();
}
}
- setState(783);
+ setState(786);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kcollation) {
{
- setState(781);
+ setState(784);
match(Kcollation);
- setState(782);
+ setState(785);
((GroupByVarContext)_localctx).uri = uriLiteral();
}
}
@@ -4733,15 +4746,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(790);
+ setState(793);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Korder:
{
{
- setState(785);
+ setState(788);
match(Korder);
- setState(786);
+ setState(789);
match(Kby);
}
}
@@ -4749,11 +4762,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
case Kstable:
{
{
- setState(787);
+ setState(790);
((OrderByClauseContext)_localctx).stb = match(Kstable);
- setState(788);
+ setState(791);
match(Korder);
- setState(789);
+ setState(792);
match(Kby);
}
}
@@ -4761,21 +4774,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(792);
+ setState(795);
orderByExpr();
- setState(797);
+ setState(800);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(793);
+ setState(796);
match(T__13);
- setState(794);
+ setState(797);
orderByExpr();
}
}
- setState(799);
+ setState(802);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4829,20 +4842,20 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(800);
- ((OrderByExprContext)_localctx).ex = exprSingle();
setState(803);
+ ((OrderByExprContext)_localctx).ex = exprSingle();
+ setState(806);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kascending:
{
- setState(801);
+ setState(804);
match(Kascending);
}
break;
case Kdescending:
{
- setState(802);
+ setState(805);
((OrderByExprContext)_localctx).desc = match(Kdescending);
}
break;
@@ -4861,25 +4874,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
default:
break;
}
- setState(810);
+ setState(813);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kempty) {
{
- setState(805);
- match(Kempty);
setState(808);
+ match(Kempty);
+ setState(811);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kgreatest:
{
- setState(806);
+ setState(809);
((OrderByExprContext)_localctx).gr = match(Kgreatest);
}
break;
case Kleast:
{
- setState(807);
+ setState(810);
((OrderByExprContext)_localctx).ls = match(Kleast);
}
break;
@@ -4889,14 +4902,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
}
}
- setState(814);
+ setState(817);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kcollation) {
{
- setState(812);
+ setState(815);
match(Kcollation);
- setState(813);
+ setState(816);
((OrderByExprContext)_localctx).uril = uriLiteral();
}
}
@@ -4937,9 +4950,9 @@ public final CountClauseContext countClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(816);
+ setState(819);
match(Kcount);
- setState(817);
+ setState(820);
varRef();
}
}
@@ -4990,47 +5003,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(821);
+ setState(824);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Ksome:
{
- setState(819);
+ setState(822);
((QuantifiedExprContext)_localctx).so = match(Ksome);
}
break;
case Kevery:
{
- setState(820);
+ setState(823);
((QuantifiedExprContext)_localctx).ev = match(Kevery);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(823);
+ setState(826);
((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar();
((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar);
- setState(828);
+ setState(831);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(824);
+ setState(827);
match(T__13);
- setState(825);
+ setState(828);
((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar();
((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar);
}
}
- setState(830);
+ setState(833);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(831);
+ setState(834);
match(Ksatisfies);
- setState(832);
+ setState(835);
exprSingle();
}
}
@@ -5076,23 +5089,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(834);
- varRef();
setState(837);
+ varRef();
+ setState(840);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(835);
+ setState(838);
match(Kas);
- setState(836);
+ setState(839);
sequenceType();
}
}
- setState(839);
+ setState(842);
match(Kin);
- setState(840);
+ setState(843);
exprSingle();
}
}
@@ -5146,34 +5159,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(842);
+ setState(845);
match(Kswitch);
- setState(843);
+ setState(846);
match(T__8);
- setState(844);
+ setState(847);
((SwitchExprContext)_localctx).cond = expr();
- setState(845);
+ setState(848);
match(T__9);
- setState(847);
+ setState(850);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(846);
+ setState(849);
((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause();
((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause);
}
}
- setState(849);
+ setState(852);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(851);
+ setState(854);
match(Kdefault);
- setState(852);
+ setState(855);
match(Kreturn);
- setState(853);
+ setState(856);
((SwitchExprContext)_localctx).def = exprSingle();
}
}
@@ -5222,26 +5235,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(857);
+ setState(860);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(855);
+ setState(858);
match(Kcase);
- setState(856);
+ setState(859);
((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle();
((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle);
}
}
- setState(859);
+ setState(862);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(861);
+ setState(864);
match(Kreturn);
- setState(862);
+ setState(865);
((SwitchCaseClauseContext)_localctx).ret = exprSingle();
}
}
@@ -5299,44 +5312,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(864);
+ setState(867);
match(Ktypeswitch);
- setState(865);
+ setState(868);
match(T__8);
- setState(866);
+ setState(869);
((TypeSwitchExprContext)_localctx).cond = expr();
- setState(867);
+ setState(870);
match(T__9);
- setState(869);
+ setState(872);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(868);
+ setState(871);
((TypeSwitchExprContext)_localctx).caseClause = caseClause();
((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause);
}
}
- setState(871);
+ setState(874);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(873);
+ setState(876);
match(Kdefault);
- setState(875);
+ setState(878);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(874);
+ setState(877);
((TypeSwitchExprContext)_localctx).var_ref = varRef();
}
}
- setState(877);
+ setState(880);
match(Kreturn);
- setState(878);
+ setState(881);
((TypeSwitchExprContext)_localctx).def = exprSingle();
}
}
@@ -5390,43 +5403,43 @@ public final CaseClauseContext caseClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(880);
+ setState(883);
match(Kcase);
- setState(884);
+ setState(887);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(881);
+ setState(884);
((CaseClauseContext)_localctx).var_ref = varRef();
- setState(882);
+ setState(885);
match(Kas);
}
}
- setState(886);
+ setState(889);
((CaseClauseContext)_localctx).sequenceType = sequenceType();
((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType);
- setState(891);
+ setState(894);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__11) {
{
{
- setState(887);
+ setState(890);
match(T__11);
- setState(888);
+ setState(891);
((CaseClauseContext)_localctx).sequenceType = sequenceType();
((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType);
}
}
- setState(893);
+ setState(896);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(894);
+ setState(897);
match(Kreturn);
- setState(895);
+ setState(898);
((CaseClauseContext)_localctx).ret = exprSingle();
}
}
@@ -5475,21 +5488,21 @@ public final IfExprContext ifExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(897);
+ setState(900);
match(Kif);
- setState(898);
+ setState(901);
match(T__8);
- setState(899);
+ setState(902);
((IfExprContext)_localctx).test_condition = expr();
- setState(900);
+ setState(903);
match(T__9);
- setState(901);
+ setState(904);
match(Kthen);
- setState(902);
+ setState(905);
((IfExprContext)_localctx).branch = exprSingle();
- setState(903);
+ setState(906);
match(Kelse);
- setState(904);
+ setState(907);
((IfExprContext)_localctx).else_branch = exprSingle();
}
}
@@ -5537,15 +5550,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(906);
+ setState(909);
match(Ktry);
- setState(907);
+ setState(910);
match(T__6);
- setState(908);
+ setState(911);
((TryCatchExprContext)_localctx).try_expression = expr();
- setState(909);
+ setState(912);
match(T__7);
- setState(911);
+ setState(914);
_errHandler.sync(this);
_alt = 1;
do {
@@ -5553,7 +5566,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
case 1:
{
{
- setState(910);
+ setState(913);
((TryCatchExprContext)_localctx).catchClause = catchClause();
((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause);
}
@@ -5562,9 +5575,9 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(913);
+ setState(916);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,81,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,82,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -5614,14 +5627,14 @@ public final CatchClauseContext catchClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(915);
- match(Kcatch);
setState(918);
+ match(Kcatch);
+ setState(921);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__10:
{
- setState(916);
+ setState(919);
((CatchClauseContext)_localctx).s11 = match(T__10);
((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11);
}
@@ -5689,9 +5702,10 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -5701,7 +5715,7 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case NullLiteral:
case NCName:
{
- setState(917);
+ setState(920);
((CatchClauseContext)_localctx).qname = qname();
((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname);
}
@@ -5709,20 +5723,20 @@ public final CatchClauseContext catchClause() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(927);
+ setState(930);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__11) {
{
{
- setState(920);
- match(T__11);
setState(923);
+ match(T__11);
+ setState(926);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__10:
{
- setState(921);
+ setState(924);
((CatchClauseContext)_localctx).s11 = match(T__10);
((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11);
}
@@ -5790,9 +5804,10 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -5802,7 +5817,7 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case NullLiteral:
case NCName:
{
- setState(922);
+ setState(925);
((CatchClauseContext)_localctx).qname = qname();
((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname);
}
@@ -5812,15 +5827,15 @@ public final CatchClauseContext catchClause() throws RecognitionException {
}
}
}
- setState(929);
+ setState(932);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(930);
+ setState(933);
match(T__6);
- setState(931);
+ setState(934);
((CatchClauseContext)_localctx).catch_expression = expr();
- setState(932);
+ setState(935);
match(T__7);
}
}
@@ -5868,26 +5883,26 @@ public final OrExprContext orExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(934);
+ setState(937);
((OrExprContext)_localctx).main_expr = andExpr();
- setState(939);
+ setState(942);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,85,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(935);
+ setState(938);
match(Kor);
- setState(936);
+ setState(939);
((OrExprContext)_localctx).andExpr = andExpr();
((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr);
}
}
}
- setState(941);
+ setState(944);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,85,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
}
}
}
@@ -5935,26 +5950,26 @@ public final AndExprContext andExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(942);
+ setState(945);
((AndExprContext)_localctx).main_expr = notExpr();
- setState(947);
+ setState(950);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,87,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(943);
+ setState(946);
match(Kand);
- setState(944);
+ setState(947);
((AndExprContext)_localctx).notExpr = notExpr();
((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr);
}
}
}
- setState(949);
+ setState(952);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,87,_ctx);
}
}
}
@@ -5995,18 +6010,18 @@ public final NotExprContext notExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(951);
+ setState(954);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) {
case 1:
{
- setState(950);
+ setState(953);
((NotExprContext)_localctx).Knot = match(Knot);
((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot);
}
break;
}
- setState(953);
+ setState(956);
((NotExprContext)_localctx).main_expr = comparisonExpr();
}
}
@@ -6037,7 +6052,7 @@ public static class ComparisonExprContext extends ParserRuleContext {
public Token s44;
public Token s45;
public Token s46;
- public Token _tset1828;
+ public Token _tset1837;
public StringConcatExprContext stringConcatExpr;
public List rhs = new ArrayList();
public List stringConcatExpr() {
@@ -6064,26 +6079,26 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(955);
- ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr();
setState(958);
+ ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr();
+ setState(961);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 140668768878608L) != 0)) {
{
- setState(956);
- ((ComparisonExprContext)_localctx)._tset1828 = _input.LT(1);
+ setState(959);
+ ((ComparisonExprContext)_localctx)._tset1837 = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 140668768878608L) != 0)) ) {
- ((ComparisonExprContext)_localctx)._tset1828 = (Token)_errHandler.recoverInline(this);
+ ((ComparisonExprContext)_localctx)._tset1837 = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
- ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1828);
- setState(957);
+ ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1837);
+ setState(960);
((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr();
((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr);
}
@@ -6131,22 +6146,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(960);
+ setState(963);
((StringConcatExprContext)_localctx).main_expr = rangeExpr();
- setState(965);
+ setState(968);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__46) {
{
{
- setState(961);
+ setState(964);
match(T__46);
- setState(962);
+ setState(965);
((StringConcatExprContext)_localctx).rangeExpr = rangeExpr();
((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr);
}
}
- setState(967);
+ setState(970);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -6192,16 +6207,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(968);
- ((RangeExprContext)_localctx).main_expr = additiveExpr();
setState(971);
+ ((RangeExprContext)_localctx).main_expr = additiveExpr();
+ setState(974);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) {
case 1:
{
- setState(969);
+ setState(972);
match(Kto);
- setState(970);
+ setState(973);
((RangeExprContext)_localctx).additiveExpr = additiveExpr();
((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr);
}
@@ -6226,7 +6241,7 @@ public static class AdditiveExprContext extends ParserRuleContext {
public Token s48;
public List op = new ArrayList();
public Token s49;
- public Token _tset1937;
+ public Token _tset1946;
public MultiplicativeExprContext multiplicativeExpr;
public List rhs = new ArrayList();
public List multiplicativeExpr() {
@@ -6254,36 +6269,36 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(973);
+ setState(976);
((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr();
- setState(978);
+ setState(981);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,91,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,92,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(974);
- ((AdditiveExprContext)_localctx)._tset1937 = _input.LT(1);
+ setState(977);
+ ((AdditiveExprContext)_localctx)._tset1946 = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__47 || _la==T__48) ) {
- ((AdditiveExprContext)_localctx)._tset1937 = (Token)_errHandler.recoverInline(this);
+ ((AdditiveExprContext)_localctx)._tset1946 = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
- ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1937);
- setState(975);
+ ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1946);
+ setState(978);
((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr();
((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr);
}
}
}
- setState(980);
+ setState(983);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,91,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,92,_ctx);
}
}
}
@@ -6306,7 +6321,7 @@ public static class MultiplicativeExprContext extends ParserRuleContext {
public Token s50;
public Token s51;
public Token s52;
- public Token _tset1965;
+ public Token _tset1974;
public InstanceOfExprContext instanceOfExpr;
public List rhs = new ArrayList();
public List instanceOfExpr() {
@@ -6333,32 +6348,32 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(981);
+ setState(984);
((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr();
- setState(986);
+ setState(989);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 7881299347900416L) != 0)) {
{
{
- setState(982);
- ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1);
+ setState(985);
+ ((MultiplicativeExprContext)_localctx)._tset1974 = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7881299347900416L) != 0)) ) {
- ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this);
+ ((MultiplicativeExprContext)_localctx)._tset1974 = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
- ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965);
- setState(983);
+ ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1974);
+ setState(986);
((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr();
((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr);
}
}
- setState(988);
+ setState(991);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -6404,18 +6419,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(989);
+ setState(992);
((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr();
- setState(993);
+ setState(996);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) {
case 1:
{
- setState(990);
+ setState(993);
match(Kinstance);
- setState(991);
+ setState(994);
match(Kof);
- setState(992);
+ setState(995);
((InstanceOfExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6462,18 +6477,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(995);
+ setState(998);
((IsStaticallyExprContext)_localctx).main_expr = treatExpr();
- setState(999);
+ setState(1002);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) {
case 1:
{
- setState(996);
+ setState(999);
match(Kis);
- setState(997);
+ setState(1000);
match(Kstatically);
- setState(998);
+ setState(1001);
((IsStaticallyExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6520,18 +6535,18 @@ public final TreatExprContext treatExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1001);
+ setState(1004);
((TreatExprContext)_localctx).main_expr = castableExpr();
- setState(1005);
+ setState(1008);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
case 1:
{
- setState(1002);
+ setState(1005);
match(Ktreat);
- setState(1003);
+ setState(1006);
match(Kas);
- setState(1004);
+ setState(1007);
((TreatExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6578,18 +6593,18 @@ public final CastableExprContext castableExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1007);
+ setState(1010);
((CastableExprContext)_localctx).main_expr = castExpr();
- setState(1011);
+ setState(1014);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) {
case 1:
{
- setState(1008);
+ setState(1011);
match(Kcastable);
- setState(1009);
+ setState(1012);
match(Kas);
- setState(1010);
+ setState(1013);
((CastableExprContext)_localctx).single = singleType();
}
break;
@@ -6636,18 +6651,18 @@ public final CastExprContext castExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1013);
+ setState(1016);
((CastExprContext)_localctx).main_expr = arrowExpr();
- setState(1017);
+ setState(1020);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) {
case 1:
{
- setState(1014);
+ setState(1017);
match(Kcast);
- setState(1015);
+ setState(1018);
match(Kas);
- setState(1016);
+ setState(1019);
((CastExprContext)_localctx).single = singleType();
}
break;
@@ -6705,33 +6720,33 @@ public final ArrowExprContext arrowExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1019);
+ setState(1022);
((ArrowExprContext)_localctx).main_expr = unaryExpr();
- setState(1028);
+ setState(1031);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,98,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,99,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
{
- setState(1020);
+ setState(1023);
match(T__3);
- setState(1021);
+ setState(1024);
match(T__44);
}
- setState(1023);
+ setState(1026);
((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier();
((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier);
- setState(1024);
+ setState(1027);
((ArrowExprContext)_localctx).argumentList = argumentList();
((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList);
}
}
}
- setState(1030);
+ setState(1033);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,98,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,99,_ctx);
}
}
}
@@ -6772,7 +6787,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState());
enterRule(_localctx, 166, RULE_arrowFunctionSpecifier);
try {
- setState(1034);
+ setState(1037);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
@@ -6838,9 +6853,10 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -6851,21 +6867,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
case NCName:
enterOuterAlt(_localctx, 1);
{
- setState(1031);
+ setState(1034);
qname();
}
break;
case T__4:
enterOuterAlt(_localctx, 2);
{
- setState(1032);
+ setState(1035);
varRef();
}
break;
case T__8:
enterOuterAlt(_localctx, 3);
{
- setState(1033);
+ setState(1036);
parenthesizedExpr();
}
break;
@@ -6889,7 +6905,7 @@ public static class UnaryExprContext extends ParserRuleContext {
public Token s49;
public List op = new ArrayList();
public Token s48;
- public Token _tset2144;
+ public Token _tset2153;
public ValueExprContext main_expr;
public ValueExprContext valueExpr() {
return getRuleContext(ValueExprContext.class,0);
@@ -6912,31 +6928,31 @@ public final UnaryExprContext unaryExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1039);
+ setState(1042);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__47 || _la==T__48) {
{
{
- setState(1036);
- ((UnaryExprContext)_localctx)._tset2144 = _input.LT(1);
+ setState(1039);
+ ((UnaryExprContext)_localctx)._tset2153 = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__47 || _la==T__48) ) {
- ((UnaryExprContext)_localctx)._tset2144 = (Token)_errHandler.recoverInline(this);
+ ((UnaryExprContext)_localctx)._tset2153 = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
- ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2144);
+ ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2153);
}
}
- setState(1041);
+ setState(1044);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1042);
+ setState(1045);
((UnaryExprContext)_localctx).main_expr = valueExpr();
}
}
@@ -6980,27 +6996,27 @@ public final ValueExprContext valueExpr() throws RecognitionException {
ValueExprContext _localctx = new ValueExprContext(_ctx, getState());
enterRule(_localctx, 170, RULE_valueExpr);
try {
- setState(1047);
+ setState(1050);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1044);
+ setState(1047);
((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1045);
+ setState(1048);
((ValueExprContext)_localctx).validate_expr = validateExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1046);
+ setState(1049);
((ValueExprContext)_localctx).annotate_expr = annotateExpr();
}
break;
@@ -7044,17 +7060,17 @@ public final ValidateExprContext validateExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1049);
+ setState(1052);
match(Kvalidate);
- setState(1050);
+ setState(1053);
match(Ktype);
- setState(1051);
+ setState(1054);
sequenceType();
- setState(1052);
+ setState(1055);
match(T__6);
- setState(1053);
+ setState(1056);
expr();
- setState(1054);
+ setState(1057);
match(T__7);
}
}
@@ -7096,17 +7112,17 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1056);
+ setState(1059);
match(Kannotate);
- setState(1057);
+ setState(1060);
match(Ktype);
- setState(1058);
+ setState(1061);
sequenceType();
- setState(1059);
+ setState(1062);
match(T__6);
- setState(1060);
+ setState(1063);
expr();
- setState(1061);
+ setState(1064);
match(T__7);
}
}
@@ -7150,22 +7166,22 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1063);
+ setState(1066);
((SimpleMapExprContext)_localctx).main_expr = postFixExpr();
- setState(1068);
+ setState(1071);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__52) {
{
{
- setState(1064);
+ setState(1067);
match(T__52);
- setState(1065);
+ setState(1068);
((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr();
((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr);
}
}
- setState(1070);
+ setState(1073);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -7236,53 +7252,53 @@ public final PostFixExprContext postFixExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1071);
+ setState(1074);
((PostFixExprContext)_localctx).main_expr = primaryExpr();
- setState(1079);
+ setState(1082);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
- setState(1077);
+ setState(1080);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,104,_ctx) ) {
case 1:
{
- setState(1072);
+ setState(1075);
arrayLookup();
}
break;
case 2:
{
- setState(1073);
+ setState(1076);
predicate();
}
break;
case 3:
{
- setState(1074);
+ setState(1077);
objectLookup();
}
break;
case 4:
{
- setState(1075);
+ setState(1078);
arrayUnboxing();
}
break;
case 5:
{
- setState(1076);
+ setState(1079);
argumentList();
}
break;
}
}
}
- setState(1081);
+ setState(1084);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
}
}
}
@@ -7319,15 +7335,15 @@ public final ArrayLookupContext arrayLookup() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1082);
+ setState(1085);
match(T__53);
- setState(1083);
+ setState(1086);
match(T__53);
- setState(1084);
+ setState(1087);
expr();
- setState(1085);
+ setState(1088);
match(T__54);
- setState(1086);
+ setState(1089);
match(T__54);
}
}
@@ -7361,9 +7377,9 @@ public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1088);
+ setState(1091);
match(T__53);
- setState(1089);
+ setState(1092);
match(T__54);
}
}
@@ -7400,11 +7416,11 @@ public final PredicateContext predicate() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1091);
+ setState(1094);
match(T__53);
- setState(1092);
+ setState(1095);
expr();
- setState(1093);
+ setState(1096);
match(T__54);
}
}
@@ -7460,9 +7476,9 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1095);
+ setState(1098);
match(T__55);
- setState(1102);
+ setState(1105);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
@@ -7528,9 +7544,10 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -7539,37 +7556,37 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(1096);
+ setState(1099);
((ObjectLookupContext)_localctx).kw = keyWords();
}
break;
case STRING:
{
- setState(1097);
+ setState(1100);
((ObjectLookupContext)_localctx).lt = stringLiteral();
}
break;
case NCName:
{
- setState(1098);
+ setState(1101);
((ObjectLookupContext)_localctx).nc = match(NCName);
}
break;
case T__8:
{
- setState(1099);
+ setState(1102);
((ObjectLookupContext)_localctx).pe = parenthesizedExpr();
}
break;
case T__4:
{
- setState(1100);
+ setState(1103);
((ObjectLookupContext)_localctx).vr = varRef();
}
break;
case T__56:
{
- setState(1101);
+ setState(1104);
((ObjectLookupContext)_localctx).ci = contextItemExpr();
}
break;
@@ -7643,111 +7660,111 @@ public final PrimaryExprContext primaryExpr() throws RecognitionException {
PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState());
enterRule(_localctx, 188, RULE_primaryExpr);
try {
- setState(1119);
+ setState(1122);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1104);
+ setState(1107);
match(NullLiteral);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1105);
+ setState(1108);
match(Ktrue);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1106);
+ setState(1109);
match(Kfalse);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1107);
+ setState(1110);
match(Literal);
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1108);
+ setState(1111);
stringLiteral();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1109);
+ setState(1112);
varRef();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1110);
+ setState(1113);
parenthesizedExpr();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1111);
+ setState(1114);
contextItemExpr();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(1112);
+ setState(1115);
objectConstructor();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(1113);
+ setState(1116);
functionCall();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(1114);
+ setState(1117);
orderedExpr();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(1115);
+ setState(1118);
unorderedExpr();
}
break;
case 13:
enterOuterAlt(_localctx, 13);
{
- setState(1116);
+ setState(1119);
arrayConstructor();
}
break;
case 14:
enterOuterAlt(_localctx, 14);
{
- setState(1117);
+ setState(1120);
functionItemExpr();
}
break;
case 15:
enterOuterAlt(_localctx, 15);
{
- setState(1118);
+ setState(1121);
blockExpr();
}
break;
@@ -7786,11 +7803,11 @@ public final BlockExprContext blockExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1121);
+ setState(1124);
match(T__6);
- setState(1122);
+ setState(1125);
statementsAndExpr();
- setState(1123);
+ setState(1126);
match(T__7);
}
}
@@ -7828,9 +7845,9 @@ public final VarRefContext varRef() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1125);
+ setState(1128);
match(T__4);
- setState(1126);
+ setState(1129);
((VarRefContext)_localctx).var_name = qname();
}
}
@@ -7868,19 +7885,19 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(1128);
+ setState(1131);
match(T__8);
- setState(1130);
+ setState(1133);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) {
{
- setState(1129);
+ setState(1132);
expr();
}
}
- setState(1132);
+ setState(1135);
match(T__9);
}
}
@@ -7914,7 +7931,7 @@ public final ContextItemExprContext contextItemExpr() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(1134);
+ setState(1137);
match(T__56);
}
}
@@ -7951,13 +7968,13 @@ public final OrderedExprContext orderedExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1136);
+ setState(1139);
match(T__15);
- setState(1137);
+ setState(1140);
match(T__6);
- setState(1138);
+ setState(1141);
expr();
- setState(1139);
+ setState(1142);
match(T__7);
}
}
@@ -7995,13 +8012,13 @@ public final UnorderedExprContext unorderedExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1141);
+ setState(1144);
match(Kunordered);
- setState(1142);
+ setState(1145);
match(T__6);
- setState(1143);
+ setState(1146);
expr();
- setState(1144);
+ setState(1147);
match(T__7);
}
}
@@ -8042,9 +8059,9 @@ public final FunctionCallContext functionCall() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1146);
+ setState(1149);
((FunctionCallContext)_localctx).fn_name = qname();
- setState(1147);
+ setState(1150);
argumentList();
}
}
@@ -8087,34 +8104,34 @@ public final ArgumentListContext argumentList() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1149);
+ setState(1152);
match(T__8);
- setState(1156);
+ setState(1159);
_errHandler.sync(this);
_la = _input.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16895L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33791L) != 0)) {
{
{
- setState(1150);
+ setState(1153);
((ArgumentListContext)_localctx).argument = argument();
((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument);
- setState(1152);
+ setState(1155);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__13) {
{
- setState(1151);
+ setState(1154);
match(T__13);
}
}
}
}
- setState(1158);
+ setState(1161);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1159);
+ setState(1162);
match(T__9);
}
}
@@ -8150,7 +8167,7 @@ public final ArgumentContext argument() throws RecognitionException {
ArgumentContext _localctx = new ArgumentContext(_ctx, getState());
enterRule(_localctx, 206, RULE_argument);
try {
- setState(1163);
+ setState(1166);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__4:
@@ -8227,9 +8244,10 @@ public final ArgumentContext argument() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -8242,14 +8260,14 @@ public final ArgumentContext argument() throws RecognitionException {
case NCName:
enterOuterAlt(_localctx, 1);
{
- setState(1161);
+ setState(1164);
exprSingle();
}
break;
case ArgumentPlaceholder:
enterOuterAlt(_localctx, 2);
{
- setState(1162);
+ setState(1165);
match(ArgumentPlaceholder);
}
break;
@@ -8291,99 +8309,23 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept
FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState());
enterRule(_localctx, 208, RULE_functionItemExpr);
try {
- setState(1167);
+ setState(1170);
_errHandler.sync(this);
- switch (_input.LA(1)) {
- case Kfor:
- case Klet:
- case Kwhere:
- case Kgroup:
- case Kby:
- case Korder:
- case Kreturn:
- case Kif:
- case Kin:
- case Kas:
- case Kat:
- case Kallowing:
- case Kempty:
- case Kcount:
- case Kstable:
- case Kascending:
- case Kdescending:
- case Ksome:
- case Kevery:
- case Ksatisfies:
- case Kcollation:
- case Kgreatest:
- case Kleast:
- case Kswitch:
- case Kcase:
- case Ktry:
- case Kcatch:
- case Kdefault:
- case Kthen:
- case Kelse:
- case Ktypeswitch:
- case Kor:
- case Kand:
- case Knot:
- case Kto:
- case Kinstance:
- case Kof:
- case Kstatically:
- case Kis:
- case Ktreat:
- case Kcast:
- case Kcastable:
- case Kversion:
- case Kjsoniq:
- case Kunordered:
- case Ktrue:
- case Kfalse:
- case Ktype:
- case Kvalidate:
- case Kannotate:
- case Kdeclare:
- case Kcontext:
- case Kitem:
- case Kvariable:
- case Kinsert:
- case Kdelete:
- case Krename:
- case Kreplace:
- case Kcopy:
- case Kmodify:
- case Kappend:
- case Kinto:
- case Kvalue:
- case Kjson:
- case Kwith:
- case Kposition:
- case Kbreak:
- case Kloop:
- case Kcontinue:
- case Kexit:
- case Kreturning:
- case Kwhile:
- case NullLiteral:
- case NCName:
+ switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) {
+ case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1165);
+ setState(1168);
namedFunctionRef();
}
break;
- case T__12:
- case T__30:
+ case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1166);
+ setState(1169);
inlineFunctionExpr();
}
break;
- default:
- throw new NoViableAltException(this);
}
}
catch (RecognitionException re) {
@@ -8422,11 +8364,11 @@ public final NamedFunctionRefContext namedFunctionRef() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(1169);
+ setState(1172);
((NamedFunctionRefContext)_localctx).fn_name = qname();
- setState(1170);
+ setState(1173);
match(T__57);
- setState(1171);
+ setState(1174);
((NamedFunctionRefContext)_localctx).arity = match(Literal);
}
}
@@ -8476,44 +8418,44 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(1173);
+ setState(1176);
annotations();
- setState(1174);
+ setState(1177);
match(T__30);
- setState(1175);
+ setState(1178);
match(T__8);
- setState(1177);
+ setState(1180);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(1176);
+ setState(1179);
paramList();
}
}
- setState(1179);
- match(T__9);
setState(1182);
+ match(T__9);
+ setState(1185);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(1180);
+ setState(1183);
match(Kas);
- setState(1181);
+ setState(1184);
((InlineFunctionExprContext)_localctx).return_type = sequenceType();
}
}
{
- setState(1184);
+ setState(1187);
match(T__6);
{
- setState(1185);
+ setState(1188);
((InlineFunctionExprContext)_localctx).fn_body = statementsAndOptionalExpr();
}
- setState(1186);
+ setState(1189);
match(T__7);
}
}
@@ -8567,32 +8509,32 @@ public final InsertExprContext insertExpr() throws RecognitionException {
enterRule(_localctx, 214, RULE_insertExpr);
int _la;
try {
- setState(1211);
+ setState(1214);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1188);
+ setState(1191);
match(Kinsert);
- setState(1189);
+ setState(1192);
match(Kjson);
- setState(1190);
+ setState(1193);
((InsertExprContext)_localctx).to_insert_expr = exprSingle();
- setState(1191);
+ setState(1194);
match(Kinto);
- setState(1192);
+ setState(1195);
((InsertExprContext)_localctx).main_expr = exprSingle();
- setState(1196);
+ setState(1199);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
case 1:
{
- setState(1193);
+ setState(1196);
match(Kat);
- setState(1194);
+ setState(1197);
match(Kposition);
- setState(1195);
+ setState(1198);
((InsertExprContext)_localctx).pos_expr = exprSingle();
}
break;
@@ -8602,31 +8544,31 @@ public final InsertExprContext insertExpr() throws RecognitionException {
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1198);
+ setState(1201);
match(Kinsert);
- setState(1199);
+ setState(1202);
match(Kjson);
- setState(1200);
+ setState(1203);
pairConstructor();
- setState(1205);
+ setState(1208);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1201);
+ setState(1204);
match(T__13);
- setState(1202);
+ setState(1205);
pairConstructor();
}
}
- setState(1207);
+ setState(1210);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1208);
+ setState(1211);
match(Kinto);
- setState(1209);
+ setState(1212);
((InsertExprContext)_localctx).main_expr = exprSingle();
}
break;
@@ -8667,11 +8609,11 @@ public final DeleteExprContext deleteExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1213);
+ setState(1216);
match(Kdelete);
- setState(1214);
+ setState(1217);
match(Kjson);
- setState(1215);
+ setState(1218);
updateLocator();
}
}
@@ -8715,15 +8657,15 @@ public final RenameExprContext renameExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1217);
+ setState(1220);
match(Krename);
- setState(1218);
+ setState(1221);
match(Kjson);
- setState(1219);
+ setState(1222);
updateLocator();
- setState(1220);
+ setState(1223);
match(Kas);
- setState(1221);
+ setState(1224);
((RenameExprContext)_localctx).name_expr = exprSingle();
}
}
@@ -8769,19 +8711,19 @@ public final ReplaceExprContext replaceExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1223);
+ setState(1226);
match(Kreplace);
- setState(1224);
+ setState(1227);
match(Kvalue);
- setState(1225);
+ setState(1228);
match(Kof);
- setState(1226);
+ setState(1229);
match(Kjson);
- setState(1227);
+ setState(1230);
updateLocator();
- setState(1228);
+ setState(1231);
match(Kwith);
- setState(1229);
+ setState(1232);
((ReplaceExprContext)_localctx).replacer_expr = exprSingle();
}
}
@@ -8833,33 +8775,33 @@ public final TransformExprContext transformExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1231);
+ setState(1234);
match(Kcopy);
- setState(1232);
+ setState(1235);
copyDecl();
- setState(1237);
+ setState(1240);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1233);
+ setState(1236);
match(T__13);
- setState(1234);
+ setState(1237);
copyDecl();
}
}
- setState(1239);
+ setState(1242);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1240);
+ setState(1243);
match(Kmodify);
- setState(1241);
+ setState(1244);
((TransformExprContext)_localctx).mod_expr = exprSingle();
- setState(1242);
+ setState(1245);
match(Kreturn);
- setState(1243);
+ setState(1246);
((TransformExprContext)_localctx).ret_expr = exprSingle();
}
}
@@ -8904,15 +8846,15 @@ public final AppendExprContext appendExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1245);
+ setState(1248);
match(Kappend);
- setState(1246);
+ setState(1249);
match(Kjson);
- setState(1247);
+ setState(1250);
((AppendExprContext)_localctx).to_append_expr = exprSingle();
- setState(1248);
+ setState(1251);
match(Kinto);
- setState(1249);
+ setState(1252);
((AppendExprContext)_localctx).array_expr = exprSingle();
}
}
@@ -8963,27 +8905,27 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1251);
+ setState(1254);
((UpdateLocatorContext)_localctx).main_expr = primaryExpr();
- setState(1254);
+ setState(1257);
_errHandler.sync(this);
_alt = 1;
do {
switch (_alt) {
case 1:
{
- setState(1254);
+ setState(1257);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__53:
{
- setState(1252);
+ setState(1255);
arrayLookup();
}
break;
case T__55:
{
- setState(1253);
+ setState(1256);
objectLookup();
}
break;
@@ -8995,9 +8937,9 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(1256);
+ setState(1259);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,119,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,120,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -9039,11 +8981,11 @@ public final CopyDeclContext copyDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1258);
+ setState(1261);
((CopyDeclContext)_localctx).var_ref = varRef();
- setState(1259);
+ setState(1262);
match(T__5);
- setState(1260);
+ setState(1263);
((CopyDeclContext)_localctx).src_expr = exprSingle();
}
}
@@ -9061,7 +9003,7 @@ public final CopyDeclContext copyDecl() throws RecognitionException {
@SuppressWarnings("CheckReturnValue")
public static class SequenceTypeContext extends ParserRuleContext {
public ItemTypeContext item;
- public Token s134;
+ public Token s135;
public List question = new ArrayList();
public Token s11;
public List star = new ArrayList();
@@ -9086,15 +9028,15 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState());
enterRule(_localctx, 230, RULE_sequenceType);
try {
- setState(1270);
+ setState(1273);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__8:
enterOuterAlt(_localctx, 1);
{
- setState(1262);
+ setState(1265);
match(T__8);
- setState(1263);
+ setState(1266);
match(T__9);
}
break;
@@ -9162,9 +9104,10 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -9175,28 +9118,28 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
case NCName:
enterOuterAlt(_localctx, 2);
{
- setState(1264);
+ setState(1267);
((SequenceTypeContext)_localctx).item = itemType();
- setState(1268);
+ setState(1271);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
case 1:
{
- setState(1265);
- ((SequenceTypeContext)_localctx).s134 = match(ArgumentPlaceholder);
- ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s134);
+ setState(1268);
+ ((SequenceTypeContext)_localctx).s135 = match(ArgumentPlaceholder);
+ ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s135);
}
break;
case 2:
{
- setState(1266);
+ setState(1269);
((SequenceTypeContext)_localctx).s11 = match(T__10);
((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s11);
}
break;
case 3:
{
- setState(1267);
+ setState(1270);
((SequenceTypeContext)_localctx).s48 = match(T__47);
((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s48);
}
@@ -9248,53 +9191,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce
enterRule(_localctx, 232, RULE_objectConstructor);
int _la;
try {
- setState(1288);
+ setState(1291);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__6:
enterOuterAlt(_localctx, 1);
{
- setState(1272);
+ setState(1275);
match(T__6);
- setState(1281);
+ setState(1284);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) {
{
- setState(1273);
+ setState(1276);
pairConstructor();
- setState(1278);
+ setState(1281);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1274);
+ setState(1277);
match(T__13);
- setState(1275);
+ setState(1278);
pairConstructor();
}
}
- setState(1280);
+ setState(1283);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(1283);
+ setState(1286);
match(T__7);
}
break;
case T__58:
enterOuterAlt(_localctx, 2);
{
- setState(1284);
+ setState(1287);
((ObjectConstructorContext)_localctx).s59 = match(T__58);
((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s59);
- setState(1285);
+ setState(1288);
expr();
- setState(1286);
+ setState(1289);
match(T__59);
}
break;
@@ -9337,27 +9280,27 @@ public final ItemTypeContext itemType() throws RecognitionException {
ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState());
enterRule(_localctx, 234, RULE_itemType);
try {
- setState(1293);
+ setState(1296);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1290);
+ setState(1293);
qname();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1291);
+ setState(1294);
match(NullLiteral);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1292);
+ setState(1295);
functionTest();
}
break;
@@ -9399,18 +9342,18 @@ public final FunctionTestContext functionTest() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1297);
+ setState(1300);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) {
case 1:
{
- setState(1295);
+ setState(1298);
anyFunctionTest();
}
break;
case 2:
{
- setState(1296);
+ setState(1299);
typedFunctionTest();
}
break;
@@ -9447,13 +9390,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(1299);
+ setState(1302);
match(T__30);
- setState(1300);
+ setState(1303);
match(T__8);
- setState(1301);
+ setState(1304);
match(T__10);
- setState(1302);
+ setState(1305);
match(T__9);
}
}
@@ -9498,43 +9441,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(1304);
+ setState(1307);
match(T__30);
- setState(1305);
+ setState(1308);
match(T__8);
- setState(1314);
+ setState(1317);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2305843007066209792L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16543L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2305843007066209792L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33087L) != 0)) {
{
- setState(1306);
+ setState(1309);
((TypedFunctionTestContext)_localctx).sequenceType = sequenceType();
((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType);
- setState(1311);
+ setState(1314);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1307);
+ setState(1310);
match(T__13);
- setState(1308);
+ setState(1311);
((TypedFunctionTestContext)_localctx).sequenceType = sequenceType();
((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType);
}
}
- setState(1313);
+ setState(1316);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(1316);
+ setState(1319);
match(T__9);
- setState(1317);
+ setState(1320);
match(Kas);
- setState(1318);
+ setState(1321);
((TypedFunctionTestContext)_localctx).rt = sequenceType();
}
}
@@ -9552,7 +9495,7 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce
@SuppressWarnings("CheckReturnValue")
public static class SingleTypeContext extends ParserRuleContext {
public ItemTypeContext item;
- public Token s134;
+ public Token s135;
public List question = new ArrayList();
public ItemTypeContext itemType() {
return getRuleContext(ItemTypeContext.class,0);
@@ -9575,16 +9518,16 @@ public final SingleTypeContext singleType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1320);
+ setState(1323);
((SingleTypeContext)_localctx).item = itemType();
- setState(1322);
+ setState(1325);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
case 1:
{
- setState(1321);
- ((SingleTypeContext)_localctx).s134 = match(ArgumentPlaceholder);
- ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s134);
+ setState(1324);
+ ((SingleTypeContext)_localctx).s135 = match(ArgumentPlaceholder);
+ ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s135);
}
break;
}
@@ -9632,23 +9575,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(1326);
+ setState(1329);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) {
case 1:
{
- setState(1324);
+ setState(1327);
((PairConstructorContext)_localctx).lhs = exprSingle();
}
break;
case 2:
{
- setState(1325);
+ setState(1328);
((PairConstructorContext)_localctx).name = match(NCName);
}
break;
}
- setState(1328);
+ setState(1331);
_la = _input.LA(1);
if ( !(_la==T__17 || _la==ArgumentPlaceholder) ) {
_errHandler.recoverInline(this);
@@ -9658,7 +9601,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio
_errHandler.reportMatch(this);
consume();
}
- setState(1329);
+ setState(1332);
((PairConstructorContext)_localctx).rhs = exprSingle();
}
}
@@ -9696,19 +9639,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(1331);
+ setState(1334);
match(T__53);
- setState(1333);
+ setState(1336);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) {
{
- setState(1332);
+ setState(1335);
expr();
}
}
- setState(1335);
+ setState(1338);
match(T__54);
}
}
@@ -9745,7 +9688,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1337);
+ setState(1340);
stringLiteral();
}
}
@@ -9780,7 +9723,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1339);
+ setState(1342);
match(STRING);
}
}
@@ -9857,7 +9800,6 @@ public static class KeyWordsContext extends ParserRuleContext {
public TerminalNode Kappend() { return getToken(JsoniqParser.Kappend, 0); }
public TerminalNode Kcopy() { return getToken(JsoniqParser.Kcopy, 0); }
public TerminalNode Kmodify() { return getToken(JsoniqParser.Kmodify, 0); }
- public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); }
public TerminalNode Kinto() { return getToken(JsoniqParser.Kinto, 0); }
public TerminalNode Kvalue() { return getToken(JsoniqParser.Kvalue, 0); }
public TerminalNode Kwith() { return getToken(JsoniqParser.Kwith, 0); }
@@ -9870,6 +9812,8 @@ public static class KeyWordsContext extends ParserRuleContext {
public TerminalNode Kexit() { return getToken(JsoniqParser.Kexit, 0); }
public TerminalNode Kreturning() { return getToken(JsoniqParser.Kreturning, 0); }
public TerminalNode Kwhile() { return getToken(JsoniqParser.Kwhile, 0); }
+ public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); }
+ public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); }
public KeyWordsContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -9888,9 +9832,9 @@ public final KeyWordsContext keyWords() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1341);
+ setState(1344);
_la = _input.LA(1);
- if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & -1L) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 1279L) != 0)) ) {
+ if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & -1L) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 2559L) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -9912,7 +9856,7 @@ public final KeyWordsContext keyWords() throws RecognitionException {
}
public static final String _serializedATN =
- "\u0004\u0001\u0090\u0540\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+
+ "\u0004\u0001\u0091\u0543\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+
"\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+
"\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+
"\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+
@@ -9976,770 +9920,773 @@ public final KeyWordsContext keyWords() throws RecognitionException {
"\u0017\u01c6\b\u0017\n\u0017\f\u0017\u01c9\t\u0017\u0001\u0017\u0001\u0017"+
"\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+
"\u0001\u0018\u0005\u0018\u01d4\b\u0018\n\u0018\f\u0018\u01d7\t\u0018\u0001"+
- "\u0018\u0003\u0018\u01da\b\u0018\u0001\u0019\u0005\u0019\u01dd\b\u0019"+
- "\n\u0019\f\u0019\u01e0\t\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+
- "\u001a\u0001\u001a\u0005\u001a\u01e7\b\u001a\n\u001a\f\u001a\u01ea\t\u001a"+
- "\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0003\u001b"+
- "\u01f1\b\u001b\u0001\u001b\u0001\u001b\u0003\u001b\u01f5\b\u001b\u0001"+
- "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+
- "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0003\u001d\u0201\b\u001d\u0001"+
- "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+
- "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u020d\b\u001f\u0001"+
- " \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001\"\u0001"+
- "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#"+
- "\u0003#\u0223\b#\u0001#\u0001#\u0001#\u0001#\u0005#\u0229\b#\n#\f#\u022c"+
- "\t#\u0001$\u0001$\u0003$\u0230\b$\u0001$\u0003$\u0233\b$\u0001$\u0001"+
- "$\u0003$\u0237\b$\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0003"+
- "&\u0240\b&\u0001&\u0001&\u0001&\u0001&\u0001&\u0005&\u0247\b&\n&\f&\u024a"+
- "\t&\u0003&\u024c\b&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003"+
- "\'\u0254\b\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003\'\u025b\b\'"+
- "\u0003\'\u025d\b\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u0264\b("+
- "\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u026b\b(\u0003(\u026d\b(\u0001"+
- ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u0275\b)\u0001)\u0001)\u0001"+
- ")\u0003)\u027a\b)\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u0281\b)\u0001"+
- "*\u0001*\u0001*\u0001*\u0001*\u0003*\u0288\b*\u0001*\u0001*\u0001+\u0001"+
- "+\u0001+\u0001+\u0001+\u0001+\u0003+\u0292\b+\u0001,\u0001,\u0001,\u0005"+
- ",\u0297\b,\n,\f,\u029a\t,\u0001-\u0001-\u0001-\u0001-\u0003-\u02a0\b-"+
- "\u0001.\u0001.\u0001.\u0005.\u02a5\b.\n.\f.\u02a8\t.\u0001/\u0001/\u0001"+
- "/\u0001/\u0001/\u0001/\u0003/\u02b0\b/\u00010\u00010\u00010\u00010\u0001"+
- "0\u00010\u00010\u00010\u00030\u02ba\b0\u00011\u00011\u00031\u02be\b1\u0001"+
- "1\u00011\u00011\u00011\u00011\u00011\u00051\u02c6\b1\n1\f1\u02c9\t1\u0001"+
- "1\u00011\u00011\u00012\u00012\u00012\u00012\u00052\u02d2\b2\n2\f2\u02d5"+
- "\t2\u00013\u00013\u00013\u00033\u02da\b3\u00013\u00013\u00033\u02de\b"+
- "3\u00013\u00013\u00033\u02e2\b3\u00013\u00013\u00013\u00014\u00014\u0001"+
- "4\u00014\u00054\u02eb\b4\n4\f4\u02ee\t4\u00015\u00015\u00015\u00035\u02f3"+
- "\b5\u00015\u00015\u00015\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+
- "7\u00017\u00057\u0300\b7\n7\f7\u0303\t7\u00018\u00018\u00018\u00038\u0308"+
- "\b8\u00018\u00018\u00038\u030c\b8\u00018\u00018\u00038\u0310\b8\u0001"+
- "9\u00019\u00019\u00019\u00019\u00039\u0317\b9\u00019\u00019\u00019\u0005"+
- "9\u031c\b9\n9\f9\u031f\t9\u0001:\u0001:\u0001:\u0003:\u0324\b:\u0001:"+
- "\u0001:\u0001:\u0003:\u0329\b:\u0003:\u032b\b:\u0001:\u0001:\u0003:\u032f"+
- "\b:\u0001;\u0001;\u0001;\u0001<\u0001<\u0003<\u0336\b<\u0001<\u0001<\u0001"+
- "<\u0005<\u033b\b<\n<\f<\u033e\t<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+
- "=\u0003=\u0346\b=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001"+
- ">\u0004>\u0350\b>\u000b>\f>\u0351\u0001>\u0001>\u0001>\u0001>\u0001?\u0001"+
- "?\u0004?\u035a\b?\u000b?\f?\u035b\u0001?\u0001?\u0001?\u0001@\u0001@\u0001"+
- "@\u0001@\u0001@\u0004@\u0366\b@\u000b@\f@\u0367\u0001@\u0001@\u0003@\u036c"+
- "\b@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0003A\u0375\bA\u0001"+
- "A\u0001A\u0001A\u0005A\u037a\bA\nA\fA\u037d\tA\u0001A\u0001A\u0001A\u0001"+
- "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001"+
- "C\u0001C\u0001C\u0001C\u0004C\u0390\bC\u000bC\fC\u0391\u0001D\u0001D\u0001"+
- "D\u0003D\u0397\bD\u0001D\u0001D\u0001D\u0003D\u039c\bD\u0005D\u039e\b"+
- "D\nD\fD\u03a1\tD\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0005"+
- "E\u03aa\bE\nE\fE\u03ad\tE\u0001F\u0001F\u0001F\u0005F\u03b2\bF\nF\fF\u03b5"+
- "\tF\u0001G\u0003G\u03b8\bG\u0001G\u0001G\u0001H\u0001H\u0001H\u0003H\u03bf"+
- "\bH\u0001I\u0001I\u0001I\u0005I\u03c4\bI\nI\fI\u03c7\tI\u0001J\u0001J"+
- "\u0001J\u0003J\u03cc\bJ\u0001K\u0001K\u0001K\u0005K\u03d1\bK\nK\fK\u03d4"+
- "\tK\u0001L\u0001L\u0001L\u0005L\u03d9\bL\nL\fL\u03dc\tL\u0001M\u0001M"+
- "\u0001M\u0001M\u0003M\u03e2\bM\u0001N\u0001N\u0001N\u0001N\u0003N\u03e8"+
- "\bN\u0001O\u0001O\u0001O\u0001O\u0003O\u03ee\bO\u0001P\u0001P\u0001P\u0001"+
- "P\u0003P\u03f4\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0003Q\u03fa\bQ\u0001R\u0001"+
- "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0005R\u0403\bR\nR\fR\u0406\tR\u0001"+
- "S\u0001S\u0001S\u0003S\u040b\bS\u0001T\u0005T\u040e\bT\nT\fT\u0411\tT"+
- "\u0001T\u0001T\u0001U\u0001U\u0001U\u0003U\u0418\bU\u0001V\u0001V\u0001"+
- "V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+
- "W\u0001W\u0001X\u0001X\u0001X\u0005X\u042b\bX\nX\fX\u042e\tX\u0001Y\u0001"+
- "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0005Y\u0436\bY\nY\fY\u0439\tY\u0001Z\u0001"+
- "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+
- "\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0003]\u044f"+
- "\b]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+
- "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0003^\u0460\b^\u0001_\u0001_\u0001"+
- "_\u0001_\u0001`\u0001`\u0001`\u0001a\u0001a\u0003a\u046b\ba\u0001a\u0001"+
- "a\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001"+
- "d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0003f\u0481"+
- "\bf\u0005f\u0483\bf\nf\ff\u0486\tf\u0001f\u0001f\u0001g\u0001g\u0003g"+
- "\u048c\bg\u0001h\u0001h\u0003h\u0490\bh\u0001i\u0001i\u0001i\u0001i\u0001"+
- "j\u0001j\u0001j\u0001j\u0003j\u049a\bj\u0001j\u0001j\u0001j\u0003j\u049f"+
- "\bj\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001"+
- "k\u0001k\u0001k\u0003k\u04ad\bk\u0001k\u0001k\u0001k\u0001k\u0001k\u0005"+
- "k\u04b4\bk\nk\fk\u04b7\tk\u0001k\u0001k\u0001k\u0003k\u04bc\bk\u0001l"+
- "\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+
- "n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001"+
- "o\u0001o\u0005o\u04d4\bo\no\fo\u04d7\to\u0001o\u0001o\u0001o\u0001o\u0001"+
- "o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0004"+
- "q\u04e7\bq\u000bq\fq\u04e8\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001"+
- "s\u0001s\u0001s\u0001s\u0003s\u04f5\bs\u0003s\u04f7\bs\u0001t\u0001t\u0001"+
- "t\u0001t\u0005t\u04fd\bt\nt\ft\u0500\tt\u0003t\u0502\bt\u0001t\u0001t"+
- "\u0001t\u0001t\u0001t\u0003t\u0509\bt\u0001u\u0001u\u0001u\u0003u\u050e"+
- "\bu\u0001v\u0001v\u0003v\u0512\bv\u0001w\u0001w\u0001w\u0001w\u0001w\u0001"+
- "x\u0001x\u0001x\u0001x\u0001x\u0005x\u051e\bx\nx\fx\u0521\tx\u0003x\u0523"+
- "\bx\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0003y\u052b\by\u0001z\u0001"+
- "z\u0003z\u052f\bz\u0001z\u0001z\u0001z\u0001{\u0001{\u0003{\u0536\b{\u0001"+
- "{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001~\u0001~\u0001~\u0000\u0000"+
- "\u007f\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+
- "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+
- "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+
- "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+
- "\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8"+
- "\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0"+
- "\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8"+
- "\u00fa\u00fc\u0000\b\u0002\u0000\u0010\u0010ii\u0001\u0000RS\u0001\u0000"+
- "\u0013\u001c\u0002\u0000\u0004\u0004$.\u0001\u000001\u0002\u0000\u000b"+
- "\u000b24\u0002\u0000\u0012\u0012\u0086\u0086\u0002\u0000=\u0084\u0087"+
- "\u0087\u0581\u0000\u00fe\u0001\u0000\u0000\u0000\u0002\u0106\u0001\u0000"+
- "\u0000\u0000\u0004\u010c\u0001\u0000\u0000\u0000\u0006\u010f\u0001\u0000"+
- "\u0000\u0000\b\u0120\u0001\u0000\u0000\u0000\n\u012b\u0001\u0000\u0000"+
- "\u0000\f\u0130\u0001\u0000\u0000\u0000\u000e\u0133\u0001\u0000\u0000\u0000"+
- "\u0010\u0136\u0001\u0000\u0000\u0000\u0012\u0147\u0001\u0000\u0000\u0000"+
- "\u0014\u0149\u0001\u0000\u0000\u0000\u0016\u014c\u0001\u0000\u0000\u0000"+
- "\u0018\u0152\u0001\u0000\u0000\u0000\u001a\u0156\u0001\u0000\u0000\u0000"+
- "\u001c\u015a\u0001\u0000\u0000\u0000\u001e\u015e\u0001\u0000\u0000\u0000"+
- " \u0165\u0001\u0000\u0000\u0000\"\u0175\u0001\u0000\u0000\u0000$\u017e"+
- "\u0001\u0000\u0000\u0000&\u018d\u0001\u0000\u0000\u0000(\u0194\u0001\u0000"+
- "\u0000\u0000*\u019b\u0001\u0000\u0000\u0000,\u01ac\u0001\u0000\u0000\u0000"+
- ".\u01bc\u0001\u0000\u0000\u00000\u01cd\u0001\u0000\u0000\u00002\u01de"+
- "\u0001\u0000\u0000\u00004\u01e1\u0001\u0000\u0000\u00006\u01ed\u0001\u0000"+
- "\u0000\u00008\u01f6\u0001\u0000\u0000\u0000:\u0200\u0001\u0000\u0000\u0000"+
- "<\u0202\u0001\u0000\u0000\u0000>\u020c\u0001\u0000\u0000\u0000@\u020e"+
- "\u0001\u0000\u0000\u0000B\u0213\u0001\u0000\u0000\u0000D\u0217\u0001\u0000"+
- "\u0000\u0000F\u021d\u0001\u0000\u0000\u0000H\u0232\u0001\u0000\u0000\u0000"+
- "J\u0238\u0001\u0000\u0000\u0000L\u023a\u0001\u0000\u0000\u0000N\u024d"+
- "\u0001\u0000\u0000\u0000P\u025e\u0001\u0000\u0000\u0000R\u026e\u0001\u0000"+
- "\u0000\u0000T\u0282\u0001\u0000\u0000\u0000V\u0291\u0001\u0000\u0000\u0000"+
- "X\u0293\u0001\u0000\u0000\u0000Z\u029b\u0001\u0000\u0000\u0000\\\u02a1"+
- "\u0001\u0000\u0000\u0000^\u02af\u0001\u0000\u0000\u0000`\u02b9\u0001\u0000"+
- "\u0000\u0000b\u02bd\u0001\u0000\u0000\u0000d\u02cd\u0001\u0000\u0000\u0000"+
- "f\u02d6\u0001\u0000\u0000\u0000h\u02e6\u0001\u0000\u0000\u0000j\u02ef"+
- "\u0001\u0000\u0000\u0000l\u02f7\u0001\u0000\u0000\u0000n\u02fa\u0001\u0000"+
- "\u0000\u0000p\u0304\u0001\u0000\u0000\u0000r\u0316\u0001\u0000\u0000\u0000"+
- "t\u0320\u0001\u0000\u0000\u0000v\u0330\u0001\u0000\u0000\u0000x\u0335"+
- "\u0001\u0000\u0000\u0000z\u0342\u0001\u0000\u0000\u0000|\u034a\u0001\u0000"+
- "\u0000\u0000~\u0359\u0001\u0000\u0000\u0000\u0080\u0360\u0001\u0000\u0000"+
- "\u0000\u0082\u0370\u0001\u0000\u0000\u0000\u0084\u0381\u0001\u0000\u0000"+
- "\u0000\u0086\u038a\u0001\u0000\u0000\u0000\u0088\u0393\u0001\u0000\u0000"+
- "\u0000\u008a\u03a6\u0001\u0000\u0000\u0000\u008c\u03ae\u0001\u0000\u0000"+
- "\u0000\u008e\u03b7\u0001\u0000\u0000\u0000\u0090\u03bb\u0001\u0000\u0000"+
- "\u0000\u0092\u03c0\u0001\u0000\u0000\u0000\u0094\u03c8\u0001\u0000\u0000"+
- "\u0000\u0096\u03cd\u0001\u0000\u0000\u0000\u0098\u03d5\u0001\u0000\u0000"+
- "\u0000\u009a\u03dd\u0001\u0000\u0000\u0000\u009c\u03e3\u0001\u0000\u0000"+
- "\u0000\u009e\u03e9\u0001\u0000\u0000\u0000\u00a0\u03ef\u0001\u0000\u0000"+
- "\u0000\u00a2\u03f5\u0001\u0000\u0000\u0000\u00a4\u03fb\u0001\u0000\u0000"+
- "\u0000\u00a6\u040a\u0001\u0000\u0000\u0000\u00a8\u040f\u0001\u0000\u0000"+
- "\u0000\u00aa\u0417\u0001\u0000\u0000\u0000\u00ac\u0419\u0001\u0000\u0000"+
- "\u0000\u00ae\u0420\u0001\u0000\u0000\u0000\u00b0\u0427\u0001\u0000\u0000"+
- "\u0000\u00b2\u042f\u0001\u0000\u0000\u0000\u00b4\u043a\u0001\u0000\u0000"+
- "\u0000\u00b6\u0440\u0001\u0000\u0000\u0000\u00b8\u0443\u0001\u0000\u0000"+
- "\u0000\u00ba\u0447\u0001\u0000\u0000\u0000\u00bc\u045f\u0001\u0000\u0000"+
- "\u0000\u00be\u0461\u0001\u0000\u0000\u0000\u00c0\u0465\u0001\u0000\u0000"+
- "\u0000\u00c2\u0468\u0001\u0000\u0000\u0000\u00c4\u046e\u0001\u0000\u0000"+
- "\u0000\u00c6\u0470\u0001\u0000\u0000\u0000\u00c8\u0475\u0001\u0000\u0000"+
- "\u0000\u00ca\u047a\u0001\u0000\u0000\u0000\u00cc\u047d\u0001\u0000\u0000"+
- "\u0000\u00ce\u048b\u0001\u0000\u0000\u0000\u00d0\u048f\u0001\u0000\u0000"+
- "\u0000\u00d2\u0491\u0001\u0000\u0000\u0000\u00d4\u0495\u0001\u0000\u0000"+
- "\u0000\u00d6\u04bb\u0001\u0000\u0000\u0000\u00d8\u04bd\u0001\u0000\u0000"+
- "\u0000\u00da\u04c1\u0001\u0000\u0000\u0000\u00dc\u04c7\u0001\u0000\u0000"+
- "\u0000\u00de\u04cf\u0001\u0000\u0000\u0000\u00e0\u04dd\u0001\u0000\u0000"+
- "\u0000\u00e2\u04e3\u0001\u0000\u0000\u0000\u00e4\u04ea\u0001\u0000\u0000"+
- "\u0000\u00e6\u04f6\u0001\u0000\u0000\u0000\u00e8\u0508\u0001\u0000\u0000"+
- "\u0000\u00ea\u050d\u0001\u0000\u0000\u0000\u00ec\u0511\u0001\u0000\u0000"+
- "\u0000\u00ee\u0513\u0001\u0000\u0000\u0000\u00f0\u0518\u0001\u0000\u0000"+
- "\u0000\u00f2\u0528\u0001\u0000\u0000\u0000\u00f4\u052e\u0001\u0000\u0000"+
- "\u0000\u00f6\u0533\u0001\u0000\u0000\u0000\u00f8\u0539\u0001\u0000\u0000"+
- "\u0000\u00fa\u053b\u0001\u0000\u0000\u0000\u00fc\u053d\u0001\u0000\u0000"+
- "\u0000\u00fe\u00ff\u0003\u0002\u0001\u0000\u00ff\u0100\u0005\u0000\u0000"+
- "\u0001\u0100\u0001\u0001\u0000\u0000\u0000\u0101\u0102\u0005h\u0000\u0000"+
- "\u0102\u0103\u0005g\u0000\u0000\u0103\u0104\u0003\u00fa}\u0000\u0104\u0105"+
- "\u0005\u0001\u0000\u0000\u0105\u0107\u0001\u0000\u0000\u0000\u0106\u0101"+
- "\u0001\u0000\u0000\u0000\u0106\u0107\u0001\u0000\u0000\u0000\u0107\u010a"+
- "\u0001\u0000\u0000\u0000\u0108\u010b\u0003\u0006\u0003\u0000\u0109\u010b"+
- "\u0003\u0004\u0002\u0000\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u0109"+
- "\u0001\u0000\u0000\u0000\u010b\u0003\u0001\u0000\u0000\u0000\u010c\u010d"+
- "\u0003\b\u0004\u0000\u010d\u010e\u0003\n\u0005\u0000\u010e\u0005\u0001"+
- "\u0000\u0000\u0000\u010f\u0110\u0005\u0002\u0000\u0000\u0110\u0111\u0005"+
- "\u0003\u0000\u0000\u0111\u0112\u0005\u008e\u0000\u0000\u0112\u0113\u0005"+
- "\u0004\u0000\u0000\u0113\u0114\u0003\u00f8|\u0000\u0114\u0115\u0005\u0001"+
- "\u0000\u0000\u0115\u0116\u0003\b\u0004\u0000\u0116\u0007\u0001\u0000\u0000"+
- "\u0000\u0117\u011b\u0003:\u001d\u0000\u0118\u011b\u0003<\u001e\u0000\u0119"+
- "\u011b\u0003L&\u0000\u011a\u0117\u0001\u0000\u0000\u0000\u011a\u0118\u0001"+
- "\u0000\u0000\u0000\u011a\u0119\u0001\u0000\u0000\u0000\u011b\u011c\u0001"+
- "\u0000\u0000\u0000\u011c\u011d\u0005\u0001\u0000\u0000\u011d\u011f\u0001"+
- "\u0000\u0000\u0000\u011e\u011a\u0001\u0000\u0000\u0000\u011f\u0122\u0001"+
- "\u0000\u0000\u0000\u0120\u011e\u0001\u0000\u0000\u0000\u0120\u0121\u0001"+
- "\u0000\u0000\u0000\u0121\u0128\u0001\u0000\u0000\u0000\u0122\u0120\u0001"+
- "\u0000\u0000\u0000\u0123\u0124\u0003>\u001f\u0000\u0124\u0125\u0005\u0001"+
- "\u0000\u0000\u0125\u0127\u0001\u0000\u0000\u0000\u0126\u0123\u0001\u0000"+
- "\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128\u0126\u0001\u0000"+
- "\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129\t\u0001\u0000\u0000"+
- "\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b\u012c\u0003\u0010\b\u0000"+
- "\u012c\u000b\u0001\u0000\u0000\u0000\u012d\u012f\u0003\u0012\t\u0000\u012e"+
- "\u012d\u0001\u0000\u0000\u0000\u012f\u0132\u0001\u0000\u0000\u0000\u0130"+
- "\u012e\u0001\u0000\u0000\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131"+
- "\r\u0001\u0000\u0000\u0000\u0132\u0130\u0001\u0000\u0000\u0000\u0133\u0134"+
- "\u0003\f\u0006\u0000\u0134\u0135\u0003\\.\u0000\u0135\u000f\u0001\u0000"+
- "\u0000\u0000\u0136\u0138\u0003\f\u0006\u0000\u0137\u0139\u0003\\.\u0000"+
- "\u0138\u0137\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000\u0000\u0000"+
- "\u0139\u0011\u0001\u0000\u0000\u0000\u013a\u0148\u0003\u0014\n\u0000\u013b"+
- "\u0148\u0003\u0016\u000b\u0000\u013c\u0148\u0003\u0018\f\u0000\u013d\u0148"+
- "\u0003\u001a\r\u0000\u013e\u0148\u0003\u001c\u000e\u0000\u013f\u0148\u0003"+
- "\u001e\u000f\u0000\u0140\u0148\u0003 \u0010\u0000\u0141\u0148\u0003\""+
- "\u0011\u0000\u0142\u0148\u0003$\u0012\u0000\u0143\u0148\u0003(\u0014\u0000"+
- "\u0144\u0148\u0003,\u0016\u0000\u0145\u0148\u00034\u001a\u0000\u0146\u0148"+
- "\u00038\u001c\u0000\u0147\u013a\u0001\u0000\u0000\u0000\u0147\u013b\u0001"+
- "\u0000\u0000\u0000\u0147\u013c\u0001\u0000\u0000\u0000\u0147\u013d\u0001"+
- "\u0000\u0000\u0000\u0147\u013e\u0001\u0000\u0000\u0000\u0147\u013f\u0001"+
- "\u0000\u0000\u0000\u0147\u0140\u0001\u0000\u0000\u0000\u0147\u0141\u0001"+
- "\u0000\u0000\u0000\u0147\u0142\u0001\u0000\u0000\u0000\u0147\u0143\u0001"+
- "\u0000\u0000\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147\u0145\u0001"+
- "\u0000\u0000\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148\u0013\u0001"+
- "\u0000\u0000\u0000\u0149\u014a\u0003`0\u0000\u014a\u014b\u0005\u0001\u0000"+
- "\u0000\u014b\u0015\u0001\u0000\u0000\u0000\u014c\u014d\u0005\u0005\u0000"+
- "\u0000\u014d\u014e\u0003H$\u0000\u014e\u014f\u0005\u0006\u0000\u0000\u014f"+
- "\u0150\u0003^/\u0000\u0150\u0151\u0005\u0001\u0000\u0000\u0151\u0017\u0001"+
- "\u0000\u0000\u0000\u0152\u0153\u0005\u0007\u0000\u0000\u0153\u0154\u0003"+
- "\f\u0006\u0000\u0154\u0155\u0005\b\u0000\u0000\u0155\u0019\u0001\u0000"+
- "\u0000\u0000\u0156\u0157\u0005\u007f\u0000\u0000\u0157\u0158\u0005\u0080"+
- "\u0000\u0000\u0158\u0159\u0005\u0001\u0000\u0000\u0159\u001b\u0001\u0000"+
- "\u0000\u0000\u015a\u015b\u0005\u0081\u0000\u0000\u015b\u015c\u0005\u0080"+
- "\u0000\u0000\u015c\u015d\u0005\u0001\u0000\u0000\u015d\u001d\u0001\u0000"+
- "\u0000\u0000\u015e\u015f\u0005\u0082\u0000\u0000\u015f\u0160\u0005\u0083"+
- "\u0000\u0000\u0160\u0161\u0003^/\u0000\u0161\u0162\u0005\u0001\u0000\u0000"+
- "\u0162\u001f\u0001\u0000\u0000\u0000\u0163\u0166\u0003d2\u0000\u0164\u0166"+
- "\u0003h4\u0000\u0165\u0163\u0001\u0000\u0000\u0000\u0165\u0164\u0001\u0000"+
- "\u0000\u0000\u0166\u016f\u0001\u0000\u0000\u0000\u0167\u016e\u0003d2\u0000"+
- "\u0168\u016e\u0003h4\u0000\u0169\u016e\u0003l6\u0000\u016a\u016e\u0003"+
- "n7\u0000\u016b\u016e\u0003r9\u0000\u016c\u016e\u0003v;\u0000\u016d\u0167"+
- "\u0001\u0000\u0000\u0000\u016d\u0168\u0001\u0000\u0000\u0000\u016d\u0169"+
- "\u0001\u0000\u0000\u0000\u016d\u016a\u0001\u0000\u0000\u0000\u016d\u016b"+
- "\u0001\u0000\u0000\u0000\u016d\u016c\u0001\u0000\u0000\u0000\u016e\u0171"+
- "\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u016f\u0170"+
- "\u0001\u0000\u0000\u0000\u0170\u0172\u0001\u0000\u0000\u0000\u0171\u016f"+
- "\u0001\u0000\u0000\u0000\u0172\u0173\u0005C\u0000\u0000\u0173\u0174\u0003"+
- "\u0012\t\u0000\u0174!\u0001\u0000\u0000\u0000\u0175\u0176\u0005D\u0000"+
- "\u0000\u0176\u0177\u0005\t\u0000\u0000\u0177\u0178\u0003\\.\u0000\u0178"+
- "\u0179\u0005\n\u0000\u0000\u0179\u017a\u0005Y\u0000\u0000\u017a\u017b"+
- "\u0003\u0012\t\u0000\u017b\u017c\u0005Z\u0000\u0000\u017c\u017d\u0003"+
- "\u0012\t\u0000\u017d#\u0001\u0000\u0000\u0000\u017e\u017f\u0005T\u0000"+
- "\u0000\u017f\u0180\u0005\t\u0000\u0000\u0180\u0181\u0003\\.\u0000\u0181"+
- "\u0183\u0005\n\u0000\u0000\u0182\u0184\u0003&\u0013\u0000\u0183\u0182"+
- "\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0183"+
- "\u0001\u0000\u0000\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u0186\u0187"+
- "\u0001\u0000\u0000\u0000\u0187\u0188\u0005X\u0000\u0000\u0188\u0189\u0005"+
- "C\u0000\u0000\u0189\u018a\u0003\u0012\t\u0000\u018a%\u0001\u0000\u0000"+
- "\u0000\u018b\u018c\u0005U\u0000\u0000\u018c\u018e\u0003^/\u0000\u018d"+
- "\u018b\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f"+
- "\u018d\u0001\u0000\u0000\u0000\u018f\u0190\u0001\u0000\u0000\u0000\u0190"+
- "\u0191\u0001\u0000\u0000\u0000\u0191\u0192\u0005C\u0000\u0000\u0192\u0193"+
- "\u0003\u0012\t\u0000\u0193\'\u0001\u0000\u0000\u0000\u0194\u0195\u0005"+
- "V\u0000\u0000\u0195\u0197\u0003\u0018\f\u0000\u0196\u0198\u0003*\u0015"+
- "\u0000\u0197\u0196\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000"+
- "\u0000\u0199\u0197\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000"+
- "\u0000\u019a)\u0001\u0000\u0000\u0000\u019b\u019e\u0005W\u0000\u0000\u019c"+
- "\u019f\u0005\u000b\u0000\u0000\u019d\u019f\u0003H$\u0000\u019e\u019c\u0001"+
- "\u0000\u0000\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a7\u0001"+
- "\u0000\u0000\u0000\u01a0\u01a3\u0005\f\u0000\u0000\u01a1\u01a4\u0005\u000b"+
- "\u0000\u0000\u01a2\u01a4\u0003H$\u0000\u01a3\u01a1\u0001\u0000\u0000\u0000"+
- "\u01a3\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a6\u0001\u0000\u0000\u0000"+
- "\u01a5\u01a0\u0001\u0000\u0000\u0000\u01a6\u01a9\u0001\u0000\u0000\u0000"+
- "\u01a7\u01a5\u0001\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000"+
- "\u01a8\u01aa\u0001\u0000\u0000\u0000\u01a9\u01a7\u0001\u0000\u0000\u0000"+
- "\u01aa\u01ab\u0003\u0018\f\u0000\u01ab+\u0001\u0000\u0000\u0000\u01ac"+
- "\u01ad\u0005[\u0000\u0000\u01ad\u01ae\u0005\t\u0000\u0000\u01ae\u01af"+
- "\u0003\\.\u0000\u01af\u01b1\u0005\n\u0000\u0000\u01b0\u01b2\u0003.\u0017"+
- "\u0000\u01b1\u01b0\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000"+
- "\u0000\u01b3\u01b1\u0001\u0000\u0000\u0000\u01b3\u01b4\u0001\u0000\u0000"+
- "\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7\u0005X\u0000\u0000"+
- "\u01b6\u01b8\u0003\u00c0`\u0000\u01b7\u01b6\u0001\u0000\u0000\u0000\u01b7"+
- "\u01b8\u0001\u0000\u0000\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9"+
- "\u01ba\u0005C\u0000\u0000\u01ba\u01bb\u0003\u0012\t\u0000\u01bb-\u0001"+
- "\u0000\u0000\u0000\u01bc\u01c0\u0005U\u0000\u0000\u01bd\u01be\u0003\u00c0"+
- "`\u0000\u01be\u01bf\u0005F\u0000\u0000\u01bf\u01c1\u0001\u0000\u0000\u0000"+
- "\u01c0\u01bd\u0001\u0000\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000"+
- "\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c7\u0003\u00e6s\u0000\u01c3"+
- "\u01c4\u0005\f\u0000\u0000\u01c4\u01c6\u0003\u00e6s\u0000\u01c5\u01c3"+
- "\u0001\u0000\u0000\u0000\u01c6\u01c9\u0001\u0000\u0000\u0000\u01c7\u01c5"+
- "\u0001\u0000\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01ca"+
- "\u0001\u0000\u0000\u0000\u01c9\u01c7\u0001\u0000\u0000\u0000\u01ca\u01cb"+
- "\u0005C\u0000\u0000\u01cb\u01cc\u0003\u0012\t\u0000\u01cc/\u0001\u0000"+
- "\u0000\u0000\u01cd\u01ce\u0005\r\u0000\u0000\u01ce\u01d9\u0003H$\u0000"+
- "\u01cf\u01d0\u0005\t\u0000\u0000\u01d0\u01d5\u0005\u0088\u0000\u0000\u01d1"+
- "\u01d2\u0005\u000e\u0000\u0000\u01d2\u01d4\u0005\u0088\u0000\u0000\u01d3"+
- "\u01d1\u0001\u0000\u0000\u0000\u01d4\u01d7\u0001\u0000\u0000\u0000\u01d5"+
- "\u01d3\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6"+
- "\u01d8\u0001\u0000\u0000\u0000\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d8"+
- "\u01da\u0005\n\u0000\u0000\u01d9\u01cf\u0001\u0000\u0000\u0000\u01d9\u01da"+
- "\u0001\u0000\u0000\u0000\u01da1\u0001\u0000\u0000\u0000\u01db\u01dd\u0003"+
- "0\u0018\u0000\u01dc\u01db\u0001\u0000\u0000\u0000\u01dd\u01e0\u0001\u0000"+
- "\u0000\u0000\u01de\u01dc\u0001\u0000\u0000\u0000\u01de\u01df\u0001\u0000"+
- "\u0000\u0000\u01df3\u0001\u0000\u0000\u0000\u01e0\u01de\u0001\u0000\u0000"+
- "\u0000\u01e1\u01e2\u00032\u0019\u0000\u01e2\u01e3\u0005r\u0000\u0000\u01e3"+
- "\u01e8\u00036\u001b\u0000\u01e4\u01e5\u0005\u000e\u0000\u0000\u01e5\u01e7"+
- "\u00036\u001b\u0000\u01e6\u01e4\u0001\u0000\u0000\u0000\u01e7\u01ea\u0001"+
- "\u0000\u0000\u0000\u01e8\u01e6\u0001\u0000\u0000\u0000\u01e8\u01e9\u0001"+
- "\u0000\u0000\u0000\u01e9\u01eb\u0001\u0000\u0000\u0000\u01ea\u01e8\u0001"+
- "\u0000\u0000\u0000\u01eb\u01ec\u0005\u0001\u0000\u0000\u01ec5\u0001\u0000"+
- "\u0000\u0000\u01ed\u01f0\u0003\u00c0`\u0000\u01ee\u01ef\u0005F\u0000\u0000"+
- "\u01ef\u01f1\u0003\u00e6s\u0000\u01f0\u01ee\u0001\u0000\u0000\u0000\u01f0"+
- "\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f4\u0001\u0000\u0000\u0000\u01f2"+
- "\u01f3\u0005\u0006\u0000\u0000\u01f3\u01f5\u0003^/\u0000\u01f4\u01f2\u0001"+
- "\u0000\u0000\u0000\u01f4\u01f5\u0001\u0000\u0000\u0000\u01f57\u0001\u0000"+
- "\u0000\u0000\u01f6\u01f7\u0005\u0084\u0000\u0000\u01f7\u01f8\u0005\t\u0000"+
- "\u0000\u01f8\u01f9\u0003\\.\u0000\u01f9\u01fa\u0005\n\u0000\u0000\u01fa"+
- "\u01fb\u0003\u0012\t\u0000\u01fb9\u0001\u0000\u0000\u0000\u01fc\u0201"+
- "\u0003@ \u0000\u01fd\u0201\u0003B!\u0000\u01fe\u0201\u0003D\"\u0000\u01ff"+
- "\u0201\u0003F#\u0000\u0200\u01fc\u0001\u0000\u0000\u0000\u0200\u01fd\u0001"+
- "\u0000\u0000\u0000\u0200\u01fe\u0001\u0000\u0000\u0000\u0200\u01ff\u0001"+
- "\u0000\u0000\u0000\u0201;\u0001\u0000\u0000\u0000\u0202\u0203\u0005o\u0000"+
- "\u0000\u0203\u0204\u0005\u0003\u0000\u0000\u0204\u0205\u0005\u008e\u0000"+
- "\u0000\u0205\u0206\u0005\u0004\u0000\u0000\u0206\u0207\u0003\u00f8|\u0000"+
- "\u0207=\u0001\u0000\u0000\u0000\u0208\u020d\u0003R)\u0000\u0209\u020d"+
- "\u0003N\'\u0000\u020a\u020d\u0003T*\u0000\u020b\u020d\u0003P(\u0000\u020c"+
- "\u0208\u0001\u0000\u0000\u0000\u020c\u0209\u0001\u0000\u0000\u0000\u020c"+
- "\u020a\u0001\u0000\u0000\u0000\u020c\u020b\u0001\u0000\u0000\u0000\u020d"+
- "?\u0001\u0000\u0000\u0000\u020e\u020f\u0005o\u0000\u0000\u020f\u0210\u0005"+
- "X\u0000\u0000\u0210\u0211\u0005Q\u0000\u0000\u0211\u0212\u0003\u00f8|"+
- "\u0000\u0212A\u0001\u0000\u0000\u0000\u0213\u0214\u0005o\u0000\u0000\u0214"+
- "\u0215\u0005\u000f\u0000\u0000\u0215\u0216\u0007\u0000\u0000\u0000\u0216"+
- "C\u0001\u0000\u0000\u0000\u0217\u0218\u0005o\u0000\u0000\u0218\u0219\u0005"+
- "X\u0000\u0000\u0219\u021a\u0005B\u0000\u0000\u021a\u021b\u0005I\u0000"+
- "\u0000\u021b\u021c\u0007\u0001\u0000\u0000\u021cE\u0001\u0000\u0000\u0000"+
- "\u021d\u0222\u0005o\u0000\u0000\u021e\u021f\u0005\u0011\u0000\u0000\u021f"+
- "\u0223\u0003H$\u0000\u0220\u0221\u0005X\u0000\u0000\u0221\u0223\u0005"+
- "\u0011\u0000\u0000\u0222\u021e\u0001\u0000\u0000\u0000\u0222\u0220\u0001"+
- "\u0000\u0000\u0000\u0223\u022a\u0001\u0000\u0000\u0000\u0224\u0225\u0003"+
- "J%\u0000\u0225\u0226\u0005\u0004\u0000\u0000\u0226\u0227\u0003\u00fa}"+
- "\u0000\u0227\u0229\u0001\u0000\u0000\u0000\u0228\u0224\u0001\u0000\u0000"+
- "\u0000\u0229\u022c\u0001\u0000\u0000\u0000\u022a\u0228\u0001\u0000\u0000"+
- "\u0000\u022a\u022b\u0001\u0000\u0000\u0000\u022bG\u0001\u0000\u0000\u0000"+
- "\u022c\u022a\u0001\u0000\u0000\u0000\u022d\u0230\u0005\u008e\u0000\u0000"+
- "\u022e\u0230\u0003\u00fc~\u0000\u022f\u022d\u0001\u0000\u0000\u0000\u022f"+
- "\u022e\u0001\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231"+
- "\u0233\u0005\u0012\u0000\u0000\u0232\u022f\u0001\u0000\u0000\u0000\u0232"+
- "\u0233\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234"+
- "\u0237\u0005\u008e\u0000\u0000\u0235\u0237\u0003\u00fc~\u0000\u0236\u0234"+
- "\u0001\u0000\u0000\u0000\u0236\u0235\u0001\u0000\u0000\u0000\u0237I\u0001"+
- "\u0000\u0000\u0000\u0238\u0239\u0007\u0002\u0000\u0000\u0239K\u0001\u0000"+
- "\u0000\u0000\u023a\u023b\u0005\u001d\u0000\u0000\u023b\u023f\u0005\u0002"+
- "\u0000\u0000\u023c\u023d\u0005\u0003\u0000\u0000\u023d\u023e\u0005\u008e"+
- "\u0000\u0000\u023e\u0240\u0005\u0004\u0000\u0000\u023f\u023c\u0001\u0000"+
- "\u0000\u0000\u023f\u0240\u0001\u0000\u0000\u0000\u0240\u0241\u0001\u0000"+
- "\u0000\u0000\u0241\u024b\u0003\u00f8|\u0000\u0242\u0243\u0005G\u0000\u0000"+
- "\u0243\u0248\u0003\u00f8|\u0000\u0244\u0245\u0005\u000e\u0000\u0000\u0245"+
- "\u0247\u0003\u00f8|\u0000\u0246\u0244\u0001\u0000\u0000\u0000\u0247\u024a"+
- "\u0001\u0000\u0000\u0000\u0248\u0246\u0001\u0000\u0000\u0000\u0248\u0249"+
- "\u0001\u0000\u0000\u0000\u0249\u024c\u0001\u0000\u0000\u0000\u024a\u0248"+
- "\u0001\u0000\u0000\u0000\u024b\u0242\u0001\u0000\u0000\u0000\u024b\u024c"+
- "\u0001\u0000\u0000\u0000\u024cM\u0001\u0000\u0000\u0000\u024d\u024e\u0005"+
- "o\u0000\u0000\u024e\u024f\u00032\u0019\u0000\u024f\u0250\u0005r\u0000"+
- "\u0000\u0250\u0253\u0003\u00c0`\u0000\u0251\u0252\u0005F\u0000\u0000\u0252"+
- "\u0254\u0003\u00e6s\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254"+
- "\u0001\u0000\u0000\u0000\u0254\u025c\u0001\u0000\u0000\u0000\u0255\u0256"+
- "\u0005\u0006\u0000\u0000\u0256\u025d\u0003^/\u0000\u0257\u025a\u0005\u001e"+
- "\u0000\u0000\u0258\u0259\u0005\u0006\u0000\u0000\u0259\u025b\u0003^/\u0000"+
- "\u025a\u0258\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000\u0000"+
- "\u025b\u025d\u0001\u0000\u0000\u0000\u025c\u0255\u0001\u0000\u0000\u0000"+
- "\u025c\u0257\u0001\u0000\u0000\u0000\u025dO\u0001\u0000\u0000\u0000\u025e"+
- "\u025f\u0005o\u0000\u0000\u025f\u0260\u0005p\u0000\u0000\u0260\u0263\u0005"+
- "q\u0000\u0000\u0261\u0262\u0005F\u0000\u0000\u0262\u0264\u0003\u00e6s"+
- "\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000"+
- "\u0000\u0264\u026c\u0001\u0000\u0000\u0000\u0265\u0266\u0005\u0006\u0000"+
- "\u0000\u0266\u026d\u0003^/\u0000\u0267\u026a\u0005\u001e\u0000\u0000\u0268"+
- "\u0269\u0005\u0006\u0000\u0000\u0269\u026b\u0003^/\u0000\u026a\u0268\u0001"+
- "\u0000\u0000\u0000\u026a\u026b\u0001\u0000\u0000\u0000\u026b\u026d\u0001"+
- "\u0000\u0000\u0000\u026c\u0265\u0001\u0000\u0000\u0000\u026c\u0267\u0001"+
- "\u0000\u0000\u0000\u026dQ\u0001\u0000\u0000\u0000\u026e\u026f\u0005o\u0000"+
- "\u0000\u026f\u0270\u00032\u0019\u0000\u0270\u0271\u0005\u001f\u0000\u0000"+
- "\u0271\u0272\u0003H$\u0000\u0272\u0274\u0005\t\u0000\u0000\u0273\u0275"+
- "\u0003X,\u0000\u0274\u0273\u0001\u0000\u0000\u0000\u0274\u0275\u0001\u0000"+
- "\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000\u0276\u0279\u0005\n\u0000"+
- "\u0000\u0277\u0278\u0005F\u0000\u0000\u0278\u027a\u0003\u00e6s\u0000\u0279"+
- "\u0277\u0001\u0000\u0000\u0000\u0279\u027a\u0001\u0000\u0000\u0000\u027a"+
- "\u0280\u0001\u0000\u0000\u0000\u027b\u027c\u0005\u0007\u0000\u0000\u027c"+
- "\u027d\u0003\u0010\b\u0000\u027d\u027e\u0005\b\u0000\u0000\u027e\u0281"+
- "\u0001\u0000\u0000\u0000\u027f\u0281\u0005\u001e\u0000\u0000\u0280\u027b"+
- "\u0001\u0000\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0281S\u0001"+
- "\u0000\u0000\u0000\u0282\u0283\u0005o\u0000\u0000\u0283\u0284\u0005l\u0000"+
- "\u0000\u0284\u0285\u0003H$\u0000\u0285\u0287\u0005F\u0000\u0000\u0286"+
- "\u0288\u0003V+\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0287\u0288\u0001"+
- "\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289\u028a\u0003"+
- "^/\u0000\u028aU\u0001\u0000\u0000\u0000\u028b\u028c\u0005 \u0000\u0000"+
- "\u028c\u0292\u0005!\u0000\u0000\u028d\u028e\u0005 \u0000\u0000\u028e\u0292"+
- "\u0005\"\u0000\u0000\u028f\u0290\u0005|\u0000\u0000\u0290\u0292\u0005"+
- "#\u0000\u0000\u0291\u028b\u0001\u0000\u0000\u0000\u0291\u028d\u0001\u0000"+
- "\u0000\u0000\u0291\u028f\u0001\u0000\u0000\u0000\u0292W\u0001\u0000\u0000"+
- "\u0000\u0293\u0298\u0003Z-\u0000\u0294\u0295\u0005\u000e\u0000\u0000\u0295"+
- "\u0297\u0003Z-\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0297\u029a\u0001"+
- "\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0298\u0299\u0001"+
- "\u0000\u0000\u0000\u0299Y\u0001\u0000\u0000\u0000\u029a\u0298\u0001\u0000"+
- "\u0000\u0000\u029b\u029c\u0005\u0005\u0000\u0000\u029c\u029f\u0003H$\u0000"+
- "\u029d\u029e\u0005F\u0000\u0000\u029e\u02a0\u0003\u00e6s\u0000\u029f\u029d"+
- "\u0001\u0000\u0000\u0000\u029f\u02a0\u0001\u0000\u0000\u0000\u02a0[\u0001"+
- "\u0000\u0000\u0000\u02a1\u02a6\u0003^/\u0000\u02a2\u02a3\u0005\u000e\u0000"+
- "\u0000\u02a3\u02a5\u0003^/\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a5"+
- "\u02a8\u0001\u0000\u0000\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6"+
- "\u02a7\u0001\u0000\u0000\u0000\u02a7]\u0001\u0000\u0000\u0000\u02a8\u02a6"+
- "\u0001\u0000\u0000\u0000\u02a9\u02b0\u0003`0\u0000\u02aa\u02b0\u0003b"+
- "1\u0000\u02ab\u02b0\u0003|>\u0000\u02ac\u02b0\u0003\u0080@\u0000\u02ad"+
- "\u02b0\u0003\u0084B\u0000\u02ae\u02b0\u0003\u0086C\u0000\u02af\u02a9\u0001"+
- "\u0000\u0000\u0000\u02af\u02aa\u0001\u0000\u0000\u0000\u02af\u02ab\u0001"+
- "\u0000\u0000\u0000\u02af\u02ac\u0001\u0000\u0000\u0000\u02af\u02ad\u0001"+
- "\u0000\u0000\u0000\u02af\u02ae\u0001\u0000\u0000\u0000\u02b0_\u0001\u0000"+
- "\u0000\u0000\u02b1\u02ba\u0003x<\u0000\u02b2\u02ba\u0003\u008aE\u0000"+
- "\u02b3\u02ba\u0003\u00d6k\u0000\u02b4\u02ba\u0003\u00d8l\u0000\u02b5\u02ba"+
- "\u0003\u00dam\u0000\u02b6\u02ba\u0003\u00dcn\u0000\u02b7\u02ba\u0003\u00de"+
- "o\u0000\u02b8\u02ba\u0003\u00e0p\u0000\u02b9\u02b1\u0001\u0000\u0000\u0000"+
- "\u02b9\u02b2\u0001\u0000\u0000\u0000\u02b9\u02b3\u0001\u0000\u0000\u0000"+
- "\u02b9\u02b4\u0001\u0000\u0000\u0000\u02b9\u02b5\u0001\u0000\u0000\u0000"+
- "\u02b9\u02b6\u0001\u0000\u0000\u0000\u02b9\u02b7\u0001\u0000\u0000\u0000"+
- "\u02b9\u02b8\u0001\u0000\u0000\u0000\u02baa\u0001\u0000\u0000\u0000\u02bb"+
- "\u02be\u0003d2\u0000\u02bc\u02be\u0003h4\u0000\u02bd\u02bb\u0001\u0000"+
- "\u0000\u0000\u02bd\u02bc\u0001\u0000\u0000\u0000\u02be\u02c7\u0001\u0000"+
- "\u0000\u0000\u02bf\u02c6\u0003d2\u0000\u02c0\u02c6\u0003h4\u0000\u02c1"+
- "\u02c6\u0003l6\u0000\u02c2\u02c6\u0003n7\u0000\u02c3\u02c6\u0003r9\u0000"+
- "\u02c4\u02c6\u0003v;\u0000\u02c5\u02bf\u0001\u0000\u0000\u0000\u02c5\u02c0"+
- "\u0001\u0000\u0000\u0000\u02c5\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c2"+
- "\u0001\u0000\u0000\u0000\u02c5\u02c3\u0001\u0000\u0000\u0000\u02c5\u02c4"+
- "\u0001\u0000\u0000\u0000\u02c6\u02c9\u0001\u0000\u0000\u0000\u02c7\u02c5"+
- "\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02ca"+
- "\u0001\u0000\u0000\u0000\u02c9\u02c7\u0001\u0000\u0000\u0000\u02ca\u02cb"+
- "\u0005C\u0000\u0000\u02cb\u02cc\u0003^/\u0000\u02ccc\u0001\u0000\u0000"+
- "\u0000\u02cd\u02ce\u0005=\u0000\u0000\u02ce\u02d3\u0003f3\u0000\u02cf"+
- "\u02d0\u0005\u000e\u0000\u0000\u02d0\u02d2\u0003f3\u0000\u02d1\u02cf\u0001"+
- "\u0000\u0000\u0000\u02d2\u02d5\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001"+
- "\u0000\u0000\u0000\u02d3\u02d4\u0001\u0000\u0000\u0000\u02d4e\u0001\u0000"+
- "\u0000\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d6\u02d9\u0003\u00c0"+
- "`\u0000\u02d7\u02d8\u0005F\u0000\u0000\u02d8\u02da\u0003\u00e6s\u0000"+
- "\u02d9\u02d7\u0001\u0000\u0000\u0000\u02d9\u02da\u0001\u0000\u0000\u0000"+
- "\u02da\u02dd\u0001\u0000\u0000\u0000\u02db\u02dc\u0005H\u0000\u0000\u02dc"+
- "\u02de\u0005I\u0000\u0000\u02dd\u02db\u0001\u0000\u0000\u0000\u02dd\u02de"+
- "\u0001\u0000\u0000\u0000\u02de\u02e1\u0001\u0000\u0000\u0000\u02df\u02e0"+
- "\u0005G\u0000\u0000\u02e0\u02e2\u0003\u00c0`\u0000\u02e1\u02df\u0001\u0000"+
- "\u0000\u0000\u02e1\u02e2\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000"+
- "\u0000\u0000\u02e3\u02e4\u0005E\u0000\u0000\u02e4\u02e5\u0003^/\u0000"+
- "\u02e5g\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005>\u0000\u0000\u02e7\u02ec"+
- "\u0003j5\u0000\u02e8\u02e9\u0005\u000e\u0000\u0000\u02e9\u02eb\u0003j"+
- "5\u0000\u02ea\u02e8\u0001\u0000\u0000\u0000\u02eb\u02ee\u0001\u0000\u0000"+
- "\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000\u02ec\u02ed\u0001\u0000\u0000"+
- "\u0000\u02edi\u0001\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000"+
- "\u02ef\u02f2\u0003\u00c0`\u0000\u02f0\u02f1\u0005F\u0000\u0000\u02f1\u02f3"+
- "\u0003\u00e6s\u0000\u02f2\u02f0\u0001\u0000\u0000\u0000\u02f2\u02f3\u0001"+
- "\u0000\u0000\u0000\u02f3\u02f4\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005"+
- "\u0006\u0000\u0000\u02f5\u02f6\u0003^/\u0000\u02f6k\u0001\u0000\u0000"+
- "\u0000\u02f7\u02f8\u0005?\u0000\u0000\u02f8\u02f9\u0003^/\u0000\u02f9"+
- "m\u0001\u0000\u0000\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0005"+
- "A\u0000\u0000\u02fc\u0301\u0003p8\u0000\u02fd\u02fe\u0005\u000e\u0000"+
- "\u0000\u02fe\u0300\u0003p8\u0000\u02ff\u02fd\u0001\u0000\u0000\u0000\u0300"+
- "\u0303\u0001\u0000\u0000\u0000\u0301\u02ff\u0001\u0000\u0000\u0000\u0301"+
- "\u0302\u0001\u0000\u0000\u0000\u0302o\u0001\u0000\u0000\u0000\u0303\u0301"+
- "\u0001\u0000\u0000\u0000\u0304\u030b\u0003\u00c0`\u0000\u0305\u0306\u0005"+
- "F\u0000\u0000\u0306\u0308\u0003\u00e6s\u0000\u0307\u0305\u0001\u0000\u0000"+
- "\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308\u0309\u0001\u0000\u0000"+
- "\u0000\u0309\u030a\u0005\u0006\u0000\u0000\u030a\u030c\u0003^/\u0000\u030b"+
- "\u0307\u0001\u0000\u0000\u0000\u030b\u030c\u0001\u0000\u0000\u0000\u030c"+
- "\u030f\u0001\u0000\u0000\u0000\u030d\u030e\u0005Q\u0000\u0000\u030e\u0310"+
- "\u0003\u00f8|\u0000\u030f\u030d\u0001\u0000\u0000\u0000\u030f\u0310\u0001"+
- "\u0000\u0000\u0000\u0310q\u0001\u0000\u0000\u0000\u0311\u0312\u0005B\u0000"+
- "\u0000\u0312\u0317\u0005A\u0000\u0000\u0313\u0314\u0005K\u0000\u0000\u0314"+
- "\u0315\u0005B\u0000\u0000\u0315\u0317\u0005A\u0000\u0000\u0316\u0311\u0001"+
- "\u0000\u0000\u0000\u0316\u0313\u0001\u0000\u0000\u0000\u0317\u0318\u0001"+
- "\u0000\u0000\u0000\u0318\u031d\u0003t:\u0000\u0319\u031a\u0005\u000e\u0000"+
- "\u0000\u031a\u031c\u0003t:\u0000\u031b\u0319\u0001\u0000\u0000\u0000\u031c"+
- "\u031f\u0001\u0000\u0000\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d"+
- "\u031e\u0001\u0000\u0000\u0000\u031es\u0001\u0000\u0000\u0000\u031f\u031d"+
- "\u0001\u0000\u0000\u0000\u0320\u0323\u0003^/\u0000\u0321\u0324\u0005L"+
- "\u0000\u0000\u0322\u0324\u0005M\u0000\u0000\u0323\u0321\u0001\u0000\u0000"+
- "\u0000\u0323\u0322\u0001\u0000\u0000\u0000\u0323\u0324\u0001\u0000\u0000"+
- "\u0000\u0324\u032a\u0001\u0000\u0000\u0000\u0325\u0328\u0005I\u0000\u0000"+
- "\u0326\u0329\u0005R\u0000\u0000\u0327\u0329\u0005S\u0000\u0000\u0328\u0326"+
- "\u0001\u0000\u0000\u0000\u0328\u0327\u0001\u0000\u0000\u0000\u0329\u032b"+
- "\u0001\u0000\u0000\u0000\u032a\u0325\u0001\u0000\u0000\u0000\u032a\u032b"+
- "\u0001\u0000\u0000\u0000\u032b\u032e\u0001\u0000\u0000\u0000\u032c\u032d"+
- "\u0005Q\u0000\u0000\u032d\u032f\u0003\u00f8|\u0000\u032e\u032c\u0001\u0000"+
- "\u0000\u0000\u032e\u032f\u0001\u0000\u0000\u0000\u032fu\u0001\u0000\u0000"+
- "\u0000\u0330\u0331\u0005J\u0000\u0000\u0331\u0332\u0003\u00c0`\u0000\u0332"+
- "w\u0001\u0000\u0000\u0000\u0333\u0336\u0005N\u0000\u0000\u0334\u0336\u0005"+
- "O\u0000\u0000\u0335\u0333\u0001\u0000\u0000\u0000\u0335\u0334\u0001\u0000"+
- "\u0000\u0000\u0336\u0337\u0001\u0000\u0000\u0000\u0337\u033c\u0003z=\u0000"+
- "\u0338\u0339\u0005\u000e\u0000\u0000\u0339\u033b\u0003z=\u0000\u033a\u0338"+
- "\u0001\u0000\u0000\u0000\u033b\u033e\u0001\u0000\u0000\u0000\u033c\u033a"+
- "\u0001\u0000\u0000\u0000\u033c\u033d\u0001\u0000\u0000\u0000\u033d\u033f"+
- "\u0001\u0000\u0000\u0000\u033e\u033c\u0001\u0000\u0000\u0000\u033f\u0340"+
- "\u0005P\u0000\u0000\u0340\u0341\u0003^/\u0000\u0341y\u0001\u0000\u0000"+
- "\u0000\u0342\u0345\u0003\u00c0`\u0000\u0343\u0344\u0005F\u0000\u0000\u0344"+
- "\u0346\u0003\u00e6s\u0000\u0345\u0343\u0001\u0000\u0000\u0000\u0345\u0346"+
- "\u0001\u0000\u0000\u0000\u0346\u0347\u0001\u0000\u0000\u0000\u0347\u0348"+
- "\u0005E\u0000\u0000\u0348\u0349\u0003^/\u0000\u0349{\u0001\u0000\u0000"+
- "\u0000\u034a\u034b\u0005T\u0000\u0000\u034b\u034c\u0005\t\u0000\u0000"+
- "\u034c\u034d\u0003\\.\u0000\u034d\u034f\u0005\n\u0000\u0000\u034e\u0350"+
- "\u0003~?\u0000\u034f\u034e\u0001\u0000\u0000\u0000\u0350\u0351\u0001\u0000"+
- "\u0000\u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0352\u0001\u0000"+
- "\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0005X\u0000"+
- "\u0000\u0354\u0355\u0005C\u0000\u0000\u0355\u0356\u0003^/\u0000\u0356"+
- "}\u0001\u0000\u0000\u0000\u0357\u0358\u0005U\u0000\u0000\u0358\u035a\u0003"+
- "^/\u0000\u0359\u0357\u0001\u0000\u0000\u0000\u035a\u035b\u0001\u0000\u0000"+
- "\u0000\u035b\u0359\u0001\u0000\u0000\u0000\u035b\u035c\u0001\u0000\u0000"+
- "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0005C\u0000\u0000"+
- "\u035e\u035f\u0003^/\u0000\u035f\u007f\u0001\u0000\u0000\u0000\u0360\u0361"+
- "\u0005[\u0000\u0000\u0361\u0362\u0005\t\u0000\u0000\u0362\u0363\u0003"+
- "\\.\u0000\u0363\u0365\u0005\n\u0000\u0000\u0364\u0366\u0003\u0082A\u0000"+
- "\u0365\u0364\u0001\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000"+
- "\u0367\u0365\u0001\u0000\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000"+
- "\u0368\u0369\u0001\u0000\u0000\u0000\u0369\u036b\u0005X\u0000\u0000\u036a"+
- "\u036c\u0003\u00c0`\u0000\u036b\u036a\u0001\u0000\u0000\u0000\u036b\u036c"+
- "\u0001\u0000\u0000\u0000\u036c\u036d\u0001\u0000\u0000\u0000\u036d\u036e"+
- "\u0005C\u0000\u0000\u036e\u036f\u0003^/\u0000\u036f\u0081\u0001\u0000"+
- "\u0000\u0000\u0370\u0374\u0005U\u0000\u0000\u0371\u0372\u0003\u00c0`\u0000"+
- "\u0372\u0373\u0005F\u0000\u0000\u0373\u0375\u0001\u0000\u0000\u0000\u0374"+
- "\u0371\u0001\u0000\u0000\u0000\u0374\u0375\u0001\u0000\u0000\u0000\u0375"+
- "\u0376\u0001\u0000\u0000\u0000\u0376\u037b\u0003\u00e6s\u0000\u0377\u0378"+
- "\u0005\f\u0000\u0000\u0378\u037a\u0003\u00e6s\u0000\u0379\u0377\u0001"+
- "\u0000\u0000\u0000\u037a\u037d\u0001\u0000\u0000\u0000\u037b\u0379\u0001"+
- "\u0000\u0000\u0000\u037b\u037c\u0001\u0000\u0000\u0000\u037c\u037e\u0001"+
- "\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000\u0000\u037e\u037f\u0005"+
- "C\u0000\u0000\u037f\u0380\u0003^/\u0000\u0380\u0083\u0001\u0000\u0000"+
- "\u0000\u0381\u0382\u0005D\u0000\u0000\u0382\u0383\u0005\t\u0000\u0000"+
- "\u0383\u0384\u0003\\.\u0000\u0384\u0385\u0005\n\u0000\u0000\u0385\u0386"+
- "\u0005Y\u0000\u0000\u0386\u0387\u0003^/\u0000\u0387\u0388\u0005Z\u0000"+
- "\u0000\u0388\u0389\u0003^/\u0000\u0389\u0085\u0001\u0000\u0000\u0000\u038a"+
- "\u038b\u0005V\u0000\u0000\u038b\u038c\u0005\u0007\u0000\u0000\u038c\u038d"+
- "\u0003\\.\u0000\u038d\u038f\u0005\b\u0000\u0000\u038e\u0390\u0003\u0088"+
- "D\u0000\u038f\u038e\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+
- "\u0000\u0391\u038f\u0001\u0000\u0000\u0000\u0391\u0392\u0001\u0000\u0000"+
- "\u0000\u0392\u0087\u0001\u0000\u0000\u0000\u0393\u0396\u0005W\u0000\u0000"+
- "\u0394\u0397\u0005\u000b\u0000\u0000\u0395\u0397\u0003H$\u0000\u0396\u0394"+
- "\u0001\u0000\u0000\u0000\u0396\u0395\u0001\u0000\u0000\u0000\u0397\u039f"+
- "\u0001\u0000\u0000\u0000\u0398\u039b\u0005\f\u0000\u0000\u0399\u039c\u0005"+
- "\u000b\u0000\u0000\u039a\u039c\u0003H$\u0000\u039b\u0399\u0001\u0000\u0000"+
- "\u0000\u039b\u039a\u0001\u0000\u0000\u0000\u039c\u039e\u0001\u0000\u0000"+
- "\u0000\u039d\u0398\u0001\u0000\u0000\u0000\u039e\u03a1\u0001\u0000\u0000"+
- "\u0000\u039f\u039d\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+
- "\u0000\u03a0\u03a2\u0001\u0000\u0000\u0000\u03a1\u039f\u0001\u0000\u0000"+
- "\u0000\u03a2\u03a3\u0005\u0007\u0000\u0000\u03a3\u03a4\u0003\\.\u0000"+
- "\u03a4\u03a5\u0005\b\u0000\u0000\u03a5\u0089\u0001\u0000\u0000\u0000\u03a6"+
- "\u03ab\u0003\u008cF\u0000\u03a7\u03a8\u0005\\\u0000\u0000\u03a8\u03aa"+
- "\u0003\u008cF\u0000\u03a9\u03a7\u0001\u0000\u0000\u0000\u03aa\u03ad\u0001"+
- "\u0000\u0000\u0000\u03ab\u03a9\u0001\u0000\u0000\u0000\u03ab\u03ac\u0001"+
- "\u0000\u0000\u0000\u03ac\u008b\u0001\u0000\u0000\u0000\u03ad\u03ab\u0001"+
- "\u0000\u0000\u0000\u03ae\u03b3\u0003\u008eG\u0000\u03af\u03b0\u0005]\u0000"+
- "\u0000\u03b0\u03b2\u0003\u008eG\u0000\u03b1\u03af\u0001\u0000\u0000\u0000"+
- "\u03b2\u03b5\u0001\u0000\u0000\u0000\u03b3\u03b1\u0001\u0000\u0000\u0000"+
- "\u03b3\u03b4\u0001\u0000\u0000\u0000\u03b4\u008d\u0001\u0000\u0000\u0000"+
- "\u03b5\u03b3\u0001\u0000\u0000\u0000\u03b6\u03b8\u0005^\u0000\u0000\u03b7"+
- "\u03b6\u0001\u0000\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8"+
- "\u03b9\u0001\u0000\u0000\u0000\u03b9\u03ba\u0003\u0090H\u0000\u03ba\u008f"+
- "\u0001\u0000\u0000\u0000\u03bb\u03be\u0003\u0092I\u0000\u03bc\u03bd\u0007"+
- "\u0003\u0000\u0000\u03bd\u03bf\u0003\u0092I\u0000\u03be\u03bc\u0001\u0000"+
- "\u0000\u0000\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u0091\u0001\u0000"+
- "\u0000\u0000\u03c0\u03c5\u0003\u0094J\u0000\u03c1\u03c2\u0005/\u0000\u0000"+
- "\u03c2\u03c4\u0003\u0094J\u0000\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4"+
- "\u03c7\u0001\u0000\u0000\u0000\u03c5\u03c3\u0001\u0000\u0000\u0000\u03c5"+
- "\u03c6\u0001\u0000\u0000\u0000\u03c6\u0093\u0001\u0000\u0000\u0000\u03c7"+
- "\u03c5\u0001\u0000\u0000\u0000\u03c8\u03cb\u0003\u0096K\u0000\u03c9\u03ca"+
- "\u0005_\u0000\u0000\u03ca\u03cc\u0003\u0096K\u0000\u03cb\u03c9\u0001\u0000"+
- "\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000\u03cc\u0095\u0001\u0000"+
- "\u0000\u0000\u03cd\u03d2\u0003\u0098L\u0000\u03ce\u03cf\u0007\u0004\u0000"+
- "\u0000\u03cf\u03d1\u0003\u0098L\u0000\u03d0\u03ce\u0001\u0000\u0000\u0000"+
- "\u03d1\u03d4\u0001\u0000\u0000\u0000\u03d2\u03d0\u0001\u0000\u0000\u0000"+
- "\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u0097\u0001\u0000\u0000\u0000"+
- "\u03d4\u03d2\u0001\u0000\u0000\u0000\u03d5\u03da\u0003\u009aM\u0000\u03d6"+
- "\u03d7\u0007\u0005\u0000\u0000\u03d7\u03d9\u0003\u009aM\u0000\u03d8\u03d6"+
- "\u0001\u0000\u0000\u0000\u03d9\u03dc\u0001\u0000\u0000\u0000\u03da\u03d8"+
- "\u0001\u0000\u0000\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u0099"+
- "\u0001\u0000\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dd\u03e1"+
- "\u0003\u009cN\u0000\u03de\u03df\u0005`\u0000\u0000\u03df\u03e0\u0005a"+
- "\u0000\u0000\u03e0\u03e2\u0003\u00e6s\u0000\u03e1\u03de\u0001\u0000\u0000"+
- "\u0000\u03e1\u03e2\u0001\u0000\u0000\u0000\u03e2\u009b\u0001\u0000\u0000"+
- "\u0000\u03e3\u03e7\u0003\u009eO\u0000\u03e4\u03e5\u0005c\u0000\u0000\u03e5"+
- "\u03e6\u0005b\u0000\u0000\u03e6\u03e8\u0003\u00e6s\u0000\u03e7\u03e4\u0001"+
- "\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u009d\u0001"+
- "\u0000\u0000\u0000\u03e9\u03ed\u0003\u00a0P\u0000\u03ea\u03eb\u0005d\u0000"+
- "\u0000\u03eb\u03ec\u0005F\u0000\u0000\u03ec\u03ee\u0003\u00e6s\u0000\u03ed"+
- "\u03ea\u0001\u0000\u0000\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee"+
- "\u009f\u0001\u0000\u0000\u0000\u03ef\u03f3\u0003\u00a2Q\u0000\u03f0\u03f1"+
- "\u0005f\u0000\u0000\u03f1\u03f2\u0005F\u0000\u0000\u03f2\u03f4\u0003\u00f2"+
- "y\u0000\u03f3\u03f0\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001\u0000\u0000"+
- "\u0000\u03f4\u00a1\u0001\u0000\u0000\u0000\u03f5\u03f9\u0003\u00a4R\u0000"+
- "\u03f6\u03f7\u0005e\u0000\u0000\u03f7\u03f8\u0005F\u0000\u0000\u03f8\u03fa"+
- "\u0003\u00f2y\u0000\u03f9\u03f6\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001"+
- "\u0000\u0000\u0000\u03fa\u00a3\u0001\u0000\u0000\u0000\u03fb\u0404\u0003"+
- "\u00a8T\u0000\u03fc\u03fd\u0005\u0004\u0000\u0000\u03fd\u03fe\u0005-\u0000"+
- "\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400\u0003\u00a6S\u0000"+
- "\u0400\u0401\u0003\u00ccf\u0000\u0401\u0403\u0001\u0000\u0000\u0000\u0402"+
- "\u03fc\u0001\u0000\u0000\u0000\u0403\u0406\u0001\u0000\u0000\u0000\u0404"+
- "\u0402\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000\u0000\u0000\u0405"+
- "\u00a5\u0001\u0000\u0000\u0000\u0406\u0404\u0001\u0000\u0000\u0000\u0407"+
- "\u040b\u0003H$\u0000\u0408\u040b\u0003\u00c0`\u0000\u0409\u040b\u0003"+
- "\u00c2a\u0000\u040a\u0407\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000"+
- "\u0000\u0000\u040a\u0409\u0001\u0000\u0000\u0000\u040b\u00a7\u0001\u0000"+
- "\u0000\u0000\u040c\u040e\u0007\u0004\u0000\u0000\u040d\u040c\u0001\u0000"+
- "\u0000\u0000\u040e\u0411\u0001\u0000\u0000\u0000\u040f\u040d\u0001\u0000"+
- "\u0000\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410\u0412\u0001\u0000"+
- "\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0412\u0413\u0003\u00aa"+
- "U\u0000\u0413\u00a9\u0001\u0000\u0000\u0000\u0414\u0418\u0003\u00b0X\u0000"+
- "\u0415\u0418\u0003\u00acV\u0000\u0416\u0418\u0003\u00aeW\u0000\u0417\u0414"+
- "\u0001\u0000\u0000\u0000\u0417\u0415\u0001\u0000\u0000\u0000\u0417\u0416"+
- "\u0001\u0000\u0000\u0000\u0418\u00ab\u0001\u0000\u0000\u0000\u0419\u041a"+
- "\u0005m\u0000\u0000\u041a\u041b\u0005l\u0000\u0000\u041b\u041c\u0003\u00e6"+
- "s\u0000\u041c\u041d\u0005\u0007\u0000\u0000\u041d\u041e\u0003\\.\u0000"+
- "\u041e\u041f\u0005\b\u0000\u0000\u041f\u00ad\u0001\u0000\u0000\u0000\u0420"+
- "\u0421\u0005n\u0000\u0000\u0421\u0422\u0005l\u0000\u0000\u0422\u0423\u0003"+
- "\u00e6s\u0000\u0423\u0424\u0005\u0007\u0000\u0000\u0424\u0425\u0003\\"+
- ".\u0000\u0425\u0426\u0005\b\u0000\u0000\u0426\u00af\u0001\u0000\u0000"+
- "\u0000\u0427\u042c\u0003\u00b2Y\u0000\u0428\u0429\u00055\u0000\u0000\u0429"+
- "\u042b\u0003\u00b2Y\u0000\u042a\u0428\u0001\u0000\u0000\u0000\u042b\u042e"+
- "\u0001\u0000\u0000\u0000\u042c\u042a\u0001\u0000\u0000\u0000\u042c\u042d"+
- "\u0001\u0000\u0000\u0000\u042d\u00b1\u0001\u0000\u0000\u0000\u042e\u042c"+
- "\u0001\u0000\u0000\u0000\u042f\u0437\u0003\u00bc^\u0000\u0430\u0436\u0003"+
- "\u00b4Z\u0000\u0431\u0436\u0003\u00b8\\\u0000\u0432\u0436\u0003\u00ba"+
- "]\u0000\u0433\u0436\u0003\u00b6[\u0000\u0434\u0436\u0003\u00ccf\u0000"+
- "\u0435\u0430\u0001\u0000\u0000\u0000\u0435\u0431\u0001\u0000\u0000\u0000"+
- "\u0435\u0432\u0001\u0000\u0000\u0000\u0435\u0433\u0001\u0000\u0000\u0000"+
- "\u0435\u0434\u0001\u0000\u0000\u0000\u0436\u0439\u0001\u0000\u0000\u0000"+
- "\u0437\u0435\u0001\u0000\u0000\u0000\u0437\u0438\u0001\u0000\u0000\u0000"+
- "\u0438\u00b3\u0001\u0000\u0000\u0000\u0439\u0437\u0001\u0000\u0000\u0000"+
- "\u043a\u043b\u00056\u0000\u0000\u043b\u043c\u00056\u0000\u0000\u043c\u043d"+
- "\u0003\\.\u0000\u043d\u043e\u00057\u0000\u0000\u043e\u043f\u00057\u0000"+
- "\u0000\u043f\u00b5\u0001\u0000\u0000\u0000\u0440\u0441\u00056\u0000\u0000"+
- "\u0441\u0442\u00057\u0000\u0000\u0442\u00b7\u0001\u0000\u0000\u0000\u0443"+
- "\u0444\u00056\u0000\u0000\u0444\u0445\u0003\\.\u0000\u0445\u0446\u0005"+
- "7\u0000\u0000\u0446\u00b9\u0001\u0000\u0000\u0000\u0447\u044e\u00058\u0000"+
- "\u0000\u0448\u044f\u0003\u00fc~\u0000\u0449\u044f\u0003\u00fa}\u0000\u044a"+
- "\u044f\u0005\u008e\u0000\u0000\u044b\u044f\u0003\u00c2a\u0000\u044c\u044f"+
- "\u0003\u00c0`\u0000\u044d\u044f\u0003\u00c4b\u0000\u044e\u0448\u0001\u0000"+
- "\u0000\u0000\u044e\u0449\u0001\u0000\u0000\u0000\u044e\u044a\u0001\u0000"+
- "\u0000\u0000\u044e\u044b\u0001\u0000\u0000\u0000\u044e\u044c\u0001\u0000"+
- "\u0000\u0000\u044e\u044d\u0001\u0000\u0000\u0000\u044f\u00bb\u0001\u0000"+
- "\u0000\u0000\u0450\u0460\u0005\u0087\u0000\u0000\u0451\u0460\u0005j\u0000"+
- "\u0000\u0452\u0460\u0005k\u0000\u0000\u0453\u0460\u0005\u0088\u0000\u0000"+
- "\u0454\u0460\u0003\u00fa}\u0000\u0455\u0460\u0003\u00c0`\u0000\u0456\u0460"+
- "\u0003\u00c2a\u0000\u0457\u0460\u0003\u00c4b\u0000\u0458\u0460\u0003\u00e8"+
- "t\u0000\u0459\u0460\u0003\u00cae\u0000\u045a\u0460\u0003\u00c6c\u0000"+
- "\u045b\u0460\u0003\u00c8d\u0000\u045c\u0460\u0003\u00f6{\u0000\u045d\u0460"+
- "\u0003\u00d0h\u0000\u045e\u0460\u0003\u00be_\u0000\u045f\u0450\u0001\u0000"+
- "\u0000\u0000\u045f\u0451\u0001\u0000\u0000\u0000\u045f\u0452\u0001\u0000"+
- "\u0000\u0000\u045f\u0453\u0001\u0000\u0000\u0000\u045f\u0454\u0001\u0000"+
- "\u0000\u0000\u045f\u0455\u0001\u0000\u0000\u0000\u045f\u0456\u0001\u0000"+
- "\u0000\u0000\u045f\u0457\u0001\u0000\u0000\u0000\u045f\u0458\u0001\u0000"+
- "\u0000\u0000\u045f\u0459\u0001\u0000\u0000\u0000\u045f\u045a\u0001\u0000"+
- "\u0000\u0000\u045f\u045b\u0001\u0000\u0000\u0000\u045f\u045c\u0001\u0000"+
- "\u0000\u0000\u045f\u045d\u0001\u0000\u0000\u0000\u045f\u045e\u0001\u0000"+
- "\u0000\u0000\u0460\u00bd\u0001\u0000\u0000\u0000\u0461\u0462\u0005\u0007"+
- "\u0000\u0000\u0462\u0463\u0003\u000e\u0007\u0000\u0463\u0464\u0005\b\u0000"+
- "\u0000\u0464\u00bf\u0001\u0000\u0000\u0000\u0465\u0466\u0005\u0005\u0000"+
- "\u0000\u0466\u0467\u0003H$\u0000\u0467\u00c1\u0001\u0000\u0000\u0000\u0468"+
- "\u046a\u0005\t\u0000\u0000\u0469\u046b\u0003\\.\u0000\u046a\u0469\u0001"+
- "\u0000\u0000\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u046c\u0001"+
- "\u0000\u0000\u0000\u046c\u046d\u0005\n\u0000\u0000\u046d\u00c3\u0001\u0000"+
- "\u0000\u0000\u046e\u046f\u00059\u0000\u0000\u046f\u00c5\u0001\u0000\u0000"+
- "\u0000\u0470\u0471\u0005\u0010\u0000\u0000\u0471\u0472\u0005\u0007\u0000"+
- "\u0000\u0472\u0473\u0003\\.\u0000\u0473\u0474\u0005\b\u0000\u0000\u0474"+
- "\u00c7\u0001\u0000\u0000\u0000\u0475\u0476\u0005i\u0000\u0000\u0476\u0477"+
- "\u0005\u0007\u0000\u0000\u0477\u0478\u0003\\.\u0000\u0478\u0479\u0005"+
- "\b\u0000\u0000\u0479\u00c9\u0001\u0000\u0000\u0000\u047a\u047b\u0003H"+
- "$\u0000\u047b\u047c\u0003\u00ccf\u0000\u047c\u00cb\u0001\u0000\u0000\u0000"+
- "\u047d\u0484\u0005\t\u0000\u0000\u047e\u0480\u0003\u00ceg\u0000\u047f"+
- "\u0481\u0005\u000e\u0000\u0000\u0480\u047f\u0001\u0000\u0000\u0000\u0480"+
- "\u0481\u0001\u0000\u0000\u0000\u0481\u0483\u0001\u0000\u0000\u0000\u0482"+
- "\u047e\u0001\u0000\u0000\u0000\u0483\u0486\u0001\u0000\u0000\u0000\u0484"+
- "\u0482\u0001\u0000\u0000\u0000\u0484\u0485\u0001\u0000\u0000\u0000\u0485"+
- "\u0487\u0001\u0000\u0000\u0000\u0486\u0484\u0001\u0000\u0000\u0000\u0487"+
- "\u0488\u0005\n\u0000\u0000\u0488\u00cd\u0001\u0000\u0000\u0000\u0489\u048c"+
- "\u0003^/\u0000\u048a\u048c\u0005\u0086\u0000\u0000\u048b\u0489\u0001\u0000"+
- "\u0000\u0000\u048b\u048a\u0001\u0000\u0000\u0000\u048c\u00cf\u0001\u0000"+
- "\u0000\u0000\u048d\u0490\u0003\u00d2i\u0000\u048e\u0490\u0003\u00d4j\u0000"+
- "\u048f\u048d\u0001\u0000\u0000\u0000\u048f\u048e\u0001\u0000\u0000\u0000"+
- "\u0490\u00d1\u0001\u0000\u0000\u0000\u0491\u0492\u0003H$\u0000\u0492\u0493"+
- "\u0005:\u0000\u0000\u0493\u0494\u0005\u0088\u0000\u0000\u0494\u00d3\u0001"+
- "\u0000\u0000\u0000\u0495\u0496\u00032\u0019\u0000\u0496\u0497\u0005\u001f"+
- "\u0000\u0000\u0497\u0499\u0005\t\u0000\u0000\u0498\u049a\u0003X,\u0000"+
- "\u0499\u0498\u0001\u0000\u0000\u0000\u0499\u049a\u0001\u0000\u0000\u0000"+
- "\u049a\u049b\u0001\u0000\u0000\u0000\u049b\u049e\u0005\n\u0000\u0000\u049c"+
- "\u049d\u0005F\u0000\u0000\u049d\u049f\u0003\u00e6s\u0000\u049e\u049c\u0001"+
- "\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u04a0\u0001"+
- "\u0000\u0000\u0000\u04a0\u04a1\u0005\u0007\u0000\u0000\u04a1\u04a2\u0003"+
- "\u0010\b\u0000\u04a2\u04a3\u0005\b\u0000\u0000\u04a3\u00d5\u0001\u0000"+
- "\u0000\u0000\u04a4\u04a5\u0005s\u0000\u0000\u04a5\u04a6\u0005|\u0000\u0000"+
- "\u04a6\u04a7\u0003^/\u0000\u04a7\u04a8\u0005z\u0000\u0000\u04a8\u04ac"+
- "\u0003^/\u0000\u04a9\u04aa\u0005G\u0000\u0000\u04aa\u04ab\u0005~\u0000"+
- "\u0000\u04ab\u04ad\u0003^/\u0000\u04ac\u04a9\u0001\u0000\u0000\u0000\u04ac"+
- "\u04ad\u0001\u0000\u0000\u0000\u04ad\u04bc\u0001\u0000\u0000\u0000\u04ae"+
- "\u04af\u0005s\u0000\u0000\u04af\u04b0\u0005|\u0000\u0000\u04b0\u04b5\u0003"+
- "\u00f4z\u0000\u04b1\u04b2\u0005\u000e\u0000\u0000\u04b2\u04b4\u0003\u00f4"+
- "z\u0000\u04b3\u04b1\u0001\u0000\u0000\u0000\u04b4\u04b7\u0001\u0000\u0000"+
- "\u0000\u04b5\u04b3\u0001\u0000\u0000\u0000\u04b5\u04b6\u0001\u0000\u0000"+
- "\u0000\u04b6\u04b8\u0001\u0000\u0000\u0000\u04b7\u04b5\u0001\u0000\u0000"+
- "\u0000\u04b8\u04b9\u0005z\u0000\u0000\u04b9\u04ba\u0003^/\u0000\u04ba"+
- "\u04bc\u0001\u0000\u0000\u0000\u04bb\u04a4\u0001\u0000\u0000\u0000\u04bb"+
- "\u04ae\u0001\u0000\u0000\u0000\u04bc\u00d7\u0001\u0000\u0000\u0000\u04bd"+
- "\u04be\u0005t\u0000\u0000\u04be\u04bf\u0005|\u0000\u0000\u04bf\u04c0\u0003"+
- "\u00e2q\u0000\u04c0\u00d9\u0001\u0000\u0000\u0000\u04c1\u04c2\u0005u\u0000"+
- "\u0000\u04c2\u04c3\u0005|\u0000\u0000\u04c3\u04c4\u0003\u00e2q\u0000\u04c4"+
- "\u04c5\u0005F\u0000\u0000\u04c5\u04c6\u0003^/\u0000\u04c6\u00db\u0001"+
- "\u0000\u0000\u0000\u04c7\u04c8\u0005v\u0000\u0000\u04c8\u04c9\u0005{\u0000"+
- "\u0000\u04c9\u04ca\u0005a\u0000\u0000\u04ca\u04cb\u0005|\u0000\u0000\u04cb"+
- "\u04cc\u0003\u00e2q\u0000\u04cc\u04cd\u0005}\u0000\u0000\u04cd\u04ce\u0003"+
- "^/\u0000\u04ce\u00dd\u0001\u0000\u0000\u0000\u04cf\u04d0\u0005w\u0000"+
- "\u0000\u04d0\u04d5\u0003\u00e4r\u0000\u04d1\u04d2\u0005\u000e\u0000\u0000"+
- "\u04d2\u04d4\u0003\u00e4r\u0000\u04d3\u04d1\u0001\u0000\u0000\u0000\u04d4"+
- "\u04d7\u0001\u0000\u0000\u0000\u04d5\u04d3\u0001\u0000\u0000\u0000\u04d5"+
- "\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d8\u0001\u0000\u0000\u0000\u04d7"+
- "\u04d5\u0001\u0000\u0000\u0000\u04d8\u04d9\u0005x\u0000\u0000\u04d9\u04da"+
- "\u0003^/\u0000\u04da\u04db\u0005C\u0000\u0000\u04db\u04dc\u0003^/\u0000"+
- "\u04dc\u00df\u0001\u0000\u0000\u0000\u04dd\u04de\u0005y\u0000\u0000\u04de"+
- "\u04df\u0005|\u0000\u0000\u04df\u04e0\u0003^/\u0000\u04e0\u04e1\u0005"+
- "z\u0000\u0000\u04e1\u04e2\u0003^/\u0000\u04e2\u00e1\u0001\u0000\u0000"+
- "\u0000\u04e3\u04e6\u0003\u00bc^\u0000\u04e4\u04e7\u0003\u00b4Z\u0000\u04e5"+
- "\u04e7\u0003\u00ba]\u0000\u04e6\u04e4\u0001\u0000\u0000\u0000\u04e6\u04e5"+
- "\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001\u0000\u0000\u0000\u04e8\u04e6"+
- "\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9\u00e3"+
- "\u0001\u0000\u0000\u0000\u04ea\u04eb\u0003\u00c0`\u0000\u04eb\u04ec\u0005"+
- "\u0006\u0000\u0000\u04ec\u04ed\u0003^/\u0000\u04ed\u00e5\u0001\u0000\u0000"+
- "\u0000\u04ee\u04ef\u0005\t\u0000\u0000\u04ef\u04f7\u0005\n\u0000\u0000"+
- "\u04f0\u04f4\u0003\u00eau\u0000\u04f1\u04f5\u0005\u0086\u0000\u0000\u04f2"+
- "\u04f5\u0005\u000b\u0000\u0000\u04f3\u04f5\u00050\u0000\u0000\u04f4\u04f1"+
- "\u0001\u0000\u0000\u0000\u04f4\u04f2\u0001\u0000\u0000\u0000\u04f4\u04f3"+
- "\u0001\u0000\u0000\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f7"+
- "\u0001\u0000\u0000\u0000\u04f6\u04ee\u0001\u0000\u0000\u0000\u04f6\u04f0"+
- "\u0001\u0000\u0000\u0000\u04f7\u00e7\u0001\u0000\u0000\u0000\u04f8\u0501"+
- "\u0005\u0007\u0000\u0000\u04f9\u04fe\u0003\u00f4z\u0000\u04fa\u04fb\u0005"+
- "\u000e\u0000\u0000\u04fb\u04fd\u0003\u00f4z\u0000\u04fc\u04fa\u0001\u0000"+
- "\u0000\u0000\u04fd\u0500\u0001\u0000\u0000\u0000\u04fe\u04fc\u0001\u0000"+
- "\u0000\u0000\u04fe\u04ff\u0001\u0000\u0000\u0000\u04ff\u0502\u0001\u0000"+
- "\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0501\u04f9\u0001\u0000"+
- "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000"+
- "\u0000\u0000\u0503\u0509\u0005\b\u0000\u0000\u0504\u0505\u0005;\u0000"+
- "\u0000\u0505\u0506\u0003\\.\u0000\u0506\u0507\u0005<\u0000\u0000\u0507"+
- "\u0509\u0001\u0000\u0000\u0000\u0508\u04f8\u0001\u0000\u0000\u0000\u0508"+
- "\u0504\u0001\u0000\u0000\u0000\u0509\u00e9\u0001\u0000\u0000\u0000\u050a"+
- "\u050e\u0003H$\u0000\u050b\u050e\u0005\u0087\u0000\u0000\u050c\u050e\u0003"+
- "\u00ecv\u0000\u050d\u050a\u0001\u0000\u0000\u0000\u050d\u050b\u0001\u0000"+
- "\u0000\u0000\u050d\u050c\u0001\u0000\u0000\u0000\u050e\u00eb\u0001\u0000"+
- "\u0000\u0000\u050f\u0512\u0003\u00eew\u0000\u0510\u0512\u0003\u00f0x\u0000"+
- "\u0511\u050f\u0001\u0000\u0000\u0000\u0511\u0510\u0001\u0000\u0000\u0000"+
- "\u0512\u00ed\u0001\u0000\u0000\u0000\u0513\u0514\u0005\u001f\u0000\u0000"+
- "\u0514\u0515\u0005\t\u0000\u0000\u0515\u0516\u0005\u000b\u0000\u0000\u0516"+
- "\u0517\u0005\n\u0000\u0000\u0517\u00ef\u0001\u0000\u0000\u0000\u0518\u0519"+
- "\u0005\u001f\u0000\u0000\u0519\u0522\u0005\t\u0000\u0000\u051a\u051f\u0003"+
- "\u00e6s\u0000\u051b\u051c\u0005\u000e\u0000\u0000\u051c\u051e\u0003\u00e6"+
- "s\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051e\u0521\u0001\u0000\u0000"+
- "\u0000\u051f\u051d\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000"+
- "\u0000\u0520\u0523\u0001\u0000\u0000\u0000\u0521\u051f\u0001\u0000\u0000"+
- "\u0000\u0522\u051a\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000"+
- "\u0000\u0523\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0005\n\u0000\u0000"+
- "\u0525\u0526\u0005F\u0000\u0000\u0526\u0527\u0003\u00e6s\u0000\u0527\u00f1"+
- "\u0001\u0000\u0000\u0000\u0528\u052a\u0003\u00eau\u0000\u0529\u052b\u0005"+
- "\u0086\u0000\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001"+
- "\u0000\u0000\u0000\u052b\u00f3\u0001\u0000\u0000\u0000\u052c\u052f\u0003"+
- "^/\u0000\u052d\u052f\u0005\u008e\u0000\u0000\u052e\u052c\u0001\u0000\u0000"+
- "\u0000\u052e\u052d\u0001\u0000\u0000\u0000\u052f\u0530\u0001\u0000\u0000"+
- "\u0000\u0530\u0531\u0007\u0006\u0000\u0000\u0531\u0532\u0003^/\u0000\u0532"+
- "\u00f5\u0001\u0000\u0000\u0000\u0533\u0535\u00056\u0000\u0000\u0534\u0536"+
- "\u0003\\.\u0000\u0535\u0534\u0001\u0000\u0000\u0000\u0535\u0536\u0001"+
- "\u0000\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537\u0538\u0005"+
- "7\u0000\u0000\u0538\u00f7\u0001\u0000\u0000\u0000\u0539\u053a\u0003\u00fa"+
- "}\u0000\u053a\u00f9\u0001\u0000\u0000\u0000\u053b\u053c\u0005\u0085\u0000"+
- "\u0000\u053c\u00fb\u0001\u0000\u0000\u0000\u053d\u053e\u0007\u0007\u0000"+
- "\u0000\u053e\u00fd\u0001\u0000\u0000\u0000\u0084\u0106\u010a\u011a\u0120"+
+ "\u0018\u0003\u0018\u01da\b\u0018\u0001\u0018\u0003\u0018\u01dd\b\u0018"+
+ "\u0001\u0019\u0005\u0019\u01e0\b\u0019\n\u0019\f\u0019\u01e3\t\u0019\u0001"+
+ "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u01ea"+
+ "\b\u001a\n\u001a\f\u001a\u01ed\t\u001a\u0001\u001a\u0001\u001a\u0001\u001b"+
+ "\u0001\u001b\u0001\u001b\u0003\u001b\u01f4\b\u001b\u0001\u001b\u0001\u001b"+
+ "\u0003\u001b\u01f8\b\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+
+ "\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+
+ "\u0003\u001d\u0204\b\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+
+ "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+
+ "\u0003\u001f\u0210\b\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+
+ "!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+
+ "#\u0001#\u0001#\u0001#\u0001#\u0003#\u0226\b#\u0001#\u0001#\u0001#\u0001"+
+ "#\u0005#\u022c\b#\n#\f#\u022f\t#\u0001$\u0001$\u0003$\u0233\b$\u0001$"+
+ "\u0003$\u0236\b$\u0001$\u0001$\u0003$\u023a\b$\u0001%\u0001%\u0001&\u0001"+
+ "&\u0001&\u0001&\u0001&\u0003&\u0243\b&\u0001&\u0001&\u0001&\u0001&\u0001"+
+ "&\u0005&\u024a\b&\n&\f&\u024d\t&\u0003&\u024f\b&\u0001\'\u0001\'\u0001"+
+ "\'\u0001\'\u0001\'\u0001\'\u0003\'\u0257\b\'\u0001\'\u0001\'\u0001\'\u0001"+
+ "\'\u0001\'\u0003\'\u025e\b\'\u0003\'\u0260\b\'\u0001(\u0001(\u0001(\u0001"+
+ "(\u0001(\u0003(\u0267\b(\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u026e"+
+ "\b(\u0003(\u0270\b(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u0278"+
+ "\b)\u0001)\u0001)\u0001)\u0003)\u027d\b)\u0001)\u0001)\u0001)\u0001)\u0001"+
+ ")\u0003)\u0284\b)\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u028b\b*\u0001"+
+ "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u0295\b+\u0001"+
+ ",\u0001,\u0001,\u0005,\u029a\b,\n,\f,\u029d\t,\u0001-\u0001-\u0001-\u0001"+
+ "-\u0003-\u02a3\b-\u0001.\u0001.\u0001.\u0005.\u02a8\b.\n.\f.\u02ab\t."+
+ "\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02b3\b/\u00010\u0001"+
+ "0\u00010\u00010\u00010\u00010\u00010\u00010\u00030\u02bd\b0\u00011\u0001"+
+ "1\u00031\u02c1\b1\u00011\u00011\u00011\u00011\u00011\u00011\u00051\u02c9"+
+ "\b1\n1\f1\u02cc\t1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0005"+
+ "2\u02d5\b2\n2\f2\u02d8\t2\u00013\u00013\u00013\u00033\u02dd\b3\u00013"+
+ "\u00013\u00033\u02e1\b3\u00013\u00013\u00033\u02e5\b3\u00013\u00013\u0001"+
+ "3\u00014\u00014\u00014\u00014\u00054\u02ee\b4\n4\f4\u02f1\t4\u00015\u0001"+
+ "5\u00015\u00035\u02f6\b5\u00015\u00015\u00015\u00016\u00016\u00016\u0001"+
+ "7\u00017\u00017\u00017\u00017\u00057\u0303\b7\n7\f7\u0306\t7\u00018\u0001"+
+ "8\u00018\u00038\u030b\b8\u00018\u00018\u00038\u030f\b8\u00018\u00018\u0003"+
+ "8\u0313\b8\u00019\u00019\u00019\u00019\u00019\u00039\u031a\b9\u00019\u0001"+
+ "9\u00019\u00059\u031f\b9\n9\f9\u0322\t9\u0001:\u0001:\u0001:\u0003:\u0327"+
+ "\b:\u0001:\u0001:\u0001:\u0003:\u032c\b:\u0003:\u032e\b:\u0001:\u0001"+
+ ":\u0003:\u0332\b:\u0001;\u0001;\u0001;\u0001<\u0001<\u0003<\u0339\b<\u0001"+
+ "<\u0001<\u0001<\u0005<\u033e\b<\n<\f<\u0341\t<\u0001<\u0001<\u0001<\u0001"+
+ "=\u0001=\u0001=\u0003=\u0349\b=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+
+ ">\u0001>\u0001>\u0004>\u0353\b>\u000b>\f>\u0354\u0001>\u0001>\u0001>\u0001"+
+ ">\u0001?\u0001?\u0004?\u035d\b?\u000b?\f?\u035e\u0001?\u0001?\u0001?\u0001"+
+ "@\u0001@\u0001@\u0001@\u0001@\u0004@\u0369\b@\u000b@\f@\u036a\u0001@\u0001"+
+ "@\u0003@\u036f\b@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0003"+
+ "A\u0378\bA\u0001A\u0001A\u0001A\u0005A\u037d\bA\nA\fA\u0380\tA\u0001A"+
+ "\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+
+ "B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0004C\u0393\bC\u000bC\fC"+
+ "\u0394\u0001D\u0001D\u0001D\u0003D\u039a\bD\u0001D\u0001D\u0001D\u0003"+
+ "D\u039f\bD\u0005D\u03a1\bD\nD\fD\u03a4\tD\u0001D\u0001D\u0001D\u0001D"+
+ "\u0001E\u0001E\u0001E\u0005E\u03ad\bE\nE\fE\u03b0\tE\u0001F\u0001F\u0001"+
+ "F\u0005F\u03b5\bF\nF\fF\u03b8\tF\u0001G\u0003G\u03bb\bG\u0001G\u0001G"+
+ "\u0001H\u0001H\u0001H\u0003H\u03c2\bH\u0001I\u0001I\u0001I\u0005I\u03c7"+
+ "\bI\nI\fI\u03ca\tI\u0001J\u0001J\u0001J\u0003J\u03cf\bJ\u0001K\u0001K"+
+ "\u0001K\u0005K\u03d4\bK\nK\fK\u03d7\tK\u0001L\u0001L\u0001L\u0005L\u03dc"+
+ "\bL\nL\fL\u03df\tL\u0001M\u0001M\u0001M\u0001M\u0003M\u03e5\bM\u0001N"+
+ "\u0001N\u0001N\u0001N\u0003N\u03eb\bN\u0001O\u0001O\u0001O\u0001O\u0003"+
+ "O\u03f1\bO\u0001P\u0001P\u0001P\u0001P\u0003P\u03f7\bP\u0001Q\u0001Q\u0001"+
+ "Q\u0001Q\u0003Q\u03fd\bQ\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+
+ "R\u0005R\u0406\bR\nR\fR\u0409\tR\u0001S\u0001S\u0001S\u0003S\u040e\bS"+
+ "\u0001T\u0005T\u0411\bT\nT\fT\u0414\tT\u0001T\u0001T\u0001U\u0001U\u0001"+
+ "U\u0003U\u041b\bU\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+
+ "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0005"+
+ "X\u042e\bX\nX\fX\u0431\tX\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0005"+
+ "Y\u0439\bY\nY\fY\u043c\tY\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+
+ "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+
+ "]\u0001]\u0001]\u0001]\u0003]\u0452\b]\u0001^\u0001^\u0001^\u0001^\u0001"+
+ "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+
+ "^\u0003^\u0463\b^\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001"+
+ "a\u0001a\u0003a\u046e\ba\u0001a\u0001a\u0001b\u0001b\u0001c\u0001c\u0001"+
+ "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001"+
+ "e\u0001f\u0001f\u0001f\u0003f\u0484\bf\u0005f\u0486\bf\nf\ff\u0489\tf"+
+ "\u0001f\u0001f\u0001g\u0001g\u0003g\u048f\bg\u0001h\u0001h\u0003h\u0493"+
+ "\bh\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0003j\u049d"+
+ "\bj\u0001j\u0001j\u0001j\u0003j\u04a2\bj\u0001j\u0001j\u0001j\u0001j\u0001"+
+ "k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0003k\u04b0\bk\u0001"+
+ "k\u0001k\u0001k\u0001k\u0001k\u0005k\u04b7\bk\nk\fk\u04ba\tk\u0001k\u0001"+
+ "k\u0001k\u0003k\u04bf\bk\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001"+
+ "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001"+
+ "n\u0001n\u0001o\u0001o\u0001o\u0001o\u0005o\u04d7\bo\no\fo\u04da\to\u0001"+
+ "o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001"+
+ "p\u0001q\u0001q\u0001q\u0004q\u04ea\bq\u000bq\fq\u04eb\u0001r\u0001r\u0001"+
+ "r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0003s\u04f8\bs\u0003"+
+ "s\u04fa\bs\u0001t\u0001t\u0001t\u0001t\u0005t\u0500\bt\nt\ft\u0503\tt"+
+ "\u0003t\u0505\bt\u0001t\u0001t\u0001t\u0001t\u0001t\u0003t\u050c\bt\u0001"+
+ "u\u0001u\u0001u\u0003u\u0511\bu\u0001v\u0001v\u0003v\u0515\bv\u0001w\u0001"+
+ "w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0005x\u0521"+
+ "\bx\nx\fx\u0524\tx\u0003x\u0526\bx\u0001x\u0001x\u0001x\u0001x\u0001y"+
+ "\u0001y\u0003y\u052e\by\u0001z\u0001z\u0003z\u0532\bz\u0001z\u0001z\u0001"+
+ "z\u0001{\u0001{\u0003{\u0539\b{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001"+
+ "}\u0001~\u0001~\u0001~\u0000\u0000\u007f\u0000\u0002\u0004\u0006\b\n\f"+
+ "\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:"+
+ "<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+
+ "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+
+ "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba"+
+ "\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2"+
+ "\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+
+ "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u0000\b\u0002\u0000"+
+ "\u0010\u0010ii\u0001\u0000RS\u0001\u0000\u0013\u001c\u0002\u0000\u0004"+
+ "\u0004$.\u0001\u000001\u0002\u0000\u000b\u000b24\u0002\u0000\u0012\u0012"+
+ "\u0087\u0087\u0002\u0000=\u0085\u0088\u0088\u0585\u0000\u00fe\u0001\u0000"+
+ "\u0000\u0000\u0002\u0106\u0001\u0000\u0000\u0000\u0004\u010c\u0001\u0000"+
+ "\u0000\u0000\u0006\u010f\u0001\u0000\u0000\u0000\b\u0120\u0001\u0000\u0000"+
+ "\u0000\n\u012b\u0001\u0000\u0000\u0000\f\u0130\u0001\u0000\u0000\u0000"+
+ "\u000e\u0133\u0001\u0000\u0000\u0000\u0010\u0136\u0001\u0000\u0000\u0000"+
+ "\u0012\u0147\u0001\u0000\u0000\u0000\u0014\u0149\u0001\u0000\u0000\u0000"+
+ "\u0016\u014c\u0001\u0000\u0000\u0000\u0018\u0152\u0001\u0000\u0000\u0000"+
+ "\u001a\u0156\u0001\u0000\u0000\u0000\u001c\u015a\u0001\u0000\u0000\u0000"+
+ "\u001e\u015e\u0001\u0000\u0000\u0000 \u0165\u0001\u0000\u0000\u0000\""+
+ "\u0175\u0001\u0000\u0000\u0000$\u017e\u0001\u0000\u0000\u0000&\u018d\u0001"+
+ "\u0000\u0000\u0000(\u0194\u0001\u0000\u0000\u0000*\u019b\u0001\u0000\u0000"+
+ "\u0000,\u01ac\u0001\u0000\u0000\u0000.\u01bc\u0001\u0000\u0000\u00000"+
+ "\u01dc\u0001\u0000\u0000\u00002\u01e1\u0001\u0000\u0000\u00004\u01e4\u0001"+
+ "\u0000\u0000\u00006\u01f0\u0001\u0000\u0000\u00008\u01f9\u0001\u0000\u0000"+
+ "\u0000:\u0203\u0001\u0000\u0000\u0000<\u0205\u0001\u0000\u0000\u0000>"+
+ "\u020f\u0001\u0000\u0000\u0000@\u0211\u0001\u0000\u0000\u0000B\u0216\u0001"+
+ "\u0000\u0000\u0000D\u021a\u0001\u0000\u0000\u0000F\u0220\u0001\u0000\u0000"+
+ "\u0000H\u0235\u0001\u0000\u0000\u0000J\u023b\u0001\u0000\u0000\u0000L"+
+ "\u023d\u0001\u0000\u0000\u0000N\u0250\u0001\u0000\u0000\u0000P\u0261\u0001"+
+ "\u0000\u0000\u0000R\u0271\u0001\u0000\u0000\u0000T\u0285\u0001\u0000\u0000"+
+ "\u0000V\u0294\u0001\u0000\u0000\u0000X\u0296\u0001\u0000\u0000\u0000Z"+
+ "\u029e\u0001\u0000\u0000\u0000\\\u02a4\u0001\u0000\u0000\u0000^\u02b2"+
+ "\u0001\u0000\u0000\u0000`\u02bc\u0001\u0000\u0000\u0000b\u02c0\u0001\u0000"+
+ "\u0000\u0000d\u02d0\u0001\u0000\u0000\u0000f\u02d9\u0001\u0000\u0000\u0000"+
+ "h\u02e9\u0001\u0000\u0000\u0000j\u02f2\u0001\u0000\u0000\u0000l\u02fa"+
+ "\u0001\u0000\u0000\u0000n\u02fd\u0001\u0000\u0000\u0000p\u0307\u0001\u0000"+
+ "\u0000\u0000r\u0319\u0001\u0000\u0000\u0000t\u0323\u0001\u0000\u0000\u0000"+
+ "v\u0333\u0001\u0000\u0000\u0000x\u0338\u0001\u0000\u0000\u0000z\u0345"+
+ "\u0001\u0000\u0000\u0000|\u034d\u0001\u0000\u0000\u0000~\u035c\u0001\u0000"+
+ "\u0000\u0000\u0080\u0363\u0001\u0000\u0000\u0000\u0082\u0373\u0001\u0000"+
+ "\u0000\u0000\u0084\u0384\u0001\u0000\u0000\u0000\u0086\u038d\u0001\u0000"+
+ "\u0000\u0000\u0088\u0396\u0001\u0000\u0000\u0000\u008a\u03a9\u0001\u0000"+
+ "\u0000\u0000\u008c\u03b1\u0001\u0000\u0000\u0000\u008e\u03ba\u0001\u0000"+
+ "\u0000\u0000\u0090\u03be\u0001\u0000\u0000\u0000\u0092\u03c3\u0001\u0000"+
+ "\u0000\u0000\u0094\u03cb\u0001\u0000\u0000\u0000\u0096\u03d0\u0001\u0000"+
+ "\u0000\u0000\u0098\u03d8\u0001\u0000\u0000\u0000\u009a\u03e0\u0001\u0000"+
+ "\u0000\u0000\u009c\u03e6\u0001\u0000\u0000\u0000\u009e\u03ec\u0001\u0000"+
+ "\u0000\u0000\u00a0\u03f2\u0001\u0000\u0000\u0000\u00a2\u03f8\u0001\u0000"+
+ "\u0000\u0000\u00a4\u03fe\u0001\u0000\u0000\u0000\u00a6\u040d\u0001\u0000"+
+ "\u0000\u0000\u00a8\u0412\u0001\u0000\u0000\u0000\u00aa\u041a\u0001\u0000"+
+ "\u0000\u0000\u00ac\u041c\u0001\u0000\u0000\u0000\u00ae\u0423\u0001\u0000"+
+ "\u0000\u0000\u00b0\u042a\u0001\u0000\u0000\u0000\u00b2\u0432\u0001\u0000"+
+ "\u0000\u0000\u00b4\u043d\u0001\u0000\u0000\u0000\u00b6\u0443\u0001\u0000"+
+ "\u0000\u0000\u00b8\u0446\u0001\u0000\u0000\u0000\u00ba\u044a\u0001\u0000"+
+ "\u0000\u0000\u00bc\u0462\u0001\u0000\u0000\u0000\u00be\u0464\u0001\u0000"+
+ "\u0000\u0000\u00c0\u0468\u0001\u0000\u0000\u0000\u00c2\u046b\u0001\u0000"+
+ "\u0000\u0000\u00c4\u0471\u0001\u0000\u0000\u0000\u00c6\u0473\u0001\u0000"+
+ "\u0000\u0000\u00c8\u0478\u0001\u0000\u0000\u0000\u00ca\u047d\u0001\u0000"+
+ "\u0000\u0000\u00cc\u0480\u0001\u0000\u0000\u0000\u00ce\u048e\u0001\u0000"+
+ "\u0000\u0000\u00d0\u0492\u0001\u0000\u0000\u0000\u00d2\u0494\u0001\u0000"+
+ "\u0000\u0000\u00d4\u0498\u0001\u0000\u0000\u0000\u00d6\u04be\u0001\u0000"+
+ "\u0000\u0000\u00d8\u04c0\u0001\u0000\u0000\u0000\u00da\u04c4\u0001\u0000"+
+ "\u0000\u0000\u00dc\u04ca\u0001\u0000\u0000\u0000\u00de\u04d2\u0001\u0000"+
+ "\u0000\u0000\u00e0\u04e0\u0001\u0000\u0000\u0000\u00e2\u04e6\u0001\u0000"+
+ "\u0000\u0000\u00e4\u04ed\u0001\u0000\u0000\u0000\u00e6\u04f9\u0001\u0000"+
+ "\u0000\u0000\u00e8\u050b\u0001\u0000\u0000\u0000\u00ea\u0510\u0001\u0000"+
+ "\u0000\u0000\u00ec\u0514\u0001\u0000\u0000\u0000\u00ee\u0516\u0001\u0000"+
+ "\u0000\u0000\u00f0\u051b\u0001\u0000\u0000\u0000\u00f2\u052b\u0001\u0000"+
+ "\u0000\u0000\u00f4\u0531\u0001\u0000\u0000\u0000\u00f6\u0536\u0001\u0000"+
+ "\u0000\u0000\u00f8\u053c\u0001\u0000\u0000\u0000\u00fa\u053e\u0001\u0000"+
+ "\u0000\u0000\u00fc\u0540\u0001\u0000\u0000\u0000\u00fe\u00ff\u0003\u0002"+
+ "\u0001\u0000\u00ff\u0100\u0005\u0000\u0000\u0001\u0100\u0001\u0001\u0000"+
+ "\u0000\u0000\u0101\u0102\u0005h\u0000\u0000\u0102\u0103\u0005g\u0000\u0000"+
+ "\u0103\u0104\u0003\u00fa}\u0000\u0104\u0105\u0005\u0001\u0000\u0000\u0105"+
+ "\u0107\u0001\u0000\u0000\u0000\u0106\u0101\u0001\u0000\u0000\u0000\u0106"+
+ "\u0107\u0001\u0000\u0000\u0000\u0107\u010a\u0001\u0000\u0000\u0000\u0108"+
+ "\u010b\u0003\u0006\u0003\u0000\u0109\u010b\u0003\u0004\u0002\u0000\u010a"+
+ "\u0108\u0001\u0000\u0000\u0000\u010a\u0109\u0001\u0000\u0000\u0000\u010b"+
+ "\u0003\u0001\u0000\u0000\u0000\u010c\u010d\u0003\b\u0004\u0000\u010d\u010e"+
+ "\u0003\n\u0005\u0000\u010e\u0005\u0001\u0000\u0000\u0000\u010f\u0110\u0005"+
+ "\u0002\u0000\u0000\u0110\u0111\u0005\u0003\u0000\u0000\u0111\u0112\u0005"+
+ "\u008f\u0000\u0000\u0112\u0113\u0005\u0004\u0000\u0000\u0113\u0114\u0003"+
+ "\u00f8|\u0000\u0114\u0115\u0005\u0001\u0000\u0000\u0115\u0116\u0003\b"+
+ "\u0004\u0000\u0116\u0007\u0001\u0000\u0000\u0000\u0117\u011b\u0003:\u001d"+
+ "\u0000\u0118\u011b\u0003<\u001e\u0000\u0119\u011b\u0003L&\u0000\u011a"+
+ "\u0117\u0001\u0000\u0000\u0000\u011a\u0118\u0001\u0000\u0000\u0000\u011a"+
+ "\u0119\u0001\u0000\u0000\u0000\u011b\u011c\u0001\u0000\u0000\u0000\u011c"+
+ "\u011d\u0005\u0001\u0000\u0000\u011d\u011f\u0001\u0000\u0000\u0000\u011e"+
+ "\u011a\u0001\u0000\u0000\u0000\u011f\u0122\u0001\u0000\u0000\u0000\u0120"+
+ "\u011e\u0001\u0000\u0000\u0000\u0120\u0121\u0001\u0000\u0000\u0000\u0121"+
+ "\u0128\u0001\u0000\u0000\u0000\u0122\u0120\u0001\u0000\u0000\u0000\u0123"+
+ "\u0124\u0003>\u001f\u0000\u0124\u0125\u0005\u0001\u0000\u0000\u0125\u0127"+
+ "\u0001\u0000\u0000\u0000\u0126\u0123\u0001\u0000\u0000\u0000\u0127\u012a"+
+ "\u0001\u0000\u0000\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0128\u0129"+
+ "\u0001\u0000\u0000\u0000\u0129\t\u0001\u0000\u0000\u0000\u012a\u0128\u0001"+
+ "\u0000\u0000\u0000\u012b\u012c\u0003\u0010\b\u0000\u012c\u000b\u0001\u0000"+
+ "\u0000\u0000\u012d\u012f\u0003\u0012\t\u0000\u012e\u012d\u0001\u0000\u0000"+
+ "\u0000\u012f\u0132\u0001\u0000\u0000\u0000\u0130\u012e\u0001\u0000\u0000"+
+ "\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131\r\u0001\u0000\u0000\u0000"+
+ "\u0132\u0130\u0001\u0000\u0000\u0000\u0133\u0134\u0003\f\u0006\u0000\u0134"+
+ "\u0135\u0003\\.\u0000\u0135\u000f\u0001\u0000\u0000\u0000\u0136\u0138"+
+ "\u0003\f\u0006\u0000\u0137\u0139\u0003\\.\u0000\u0138\u0137\u0001\u0000"+
+ "\u0000\u0000\u0138\u0139\u0001\u0000\u0000\u0000\u0139\u0011\u0001\u0000"+
+ "\u0000\u0000\u013a\u0148\u0003\u0014\n\u0000\u013b\u0148\u0003\u0016\u000b"+
+ "\u0000\u013c\u0148\u0003\u0018\f\u0000\u013d\u0148\u0003\u001a\r\u0000"+
+ "\u013e\u0148\u0003\u001c\u000e\u0000\u013f\u0148\u0003\u001e\u000f\u0000"+
+ "\u0140\u0148\u0003 \u0010\u0000\u0141\u0148\u0003\"\u0011\u0000\u0142"+
+ "\u0148\u0003$\u0012\u0000\u0143\u0148\u0003(\u0014\u0000\u0144\u0148\u0003"+
+ ",\u0016\u0000\u0145\u0148\u00034\u001a\u0000\u0146\u0148\u00038\u001c"+
+ "\u0000\u0147\u013a\u0001\u0000\u0000\u0000\u0147\u013b\u0001\u0000\u0000"+
+ "\u0000\u0147\u013c\u0001\u0000\u0000\u0000\u0147\u013d\u0001\u0000\u0000"+
+ "\u0000\u0147\u013e\u0001\u0000\u0000\u0000\u0147\u013f\u0001\u0000\u0000"+
+ "\u0000\u0147\u0140\u0001\u0000\u0000\u0000\u0147\u0141\u0001\u0000\u0000"+
+ "\u0000\u0147\u0142\u0001\u0000\u0000\u0000\u0147\u0143\u0001\u0000\u0000"+
+ "\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147\u0145\u0001\u0000\u0000"+
+ "\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148\u0013\u0001\u0000\u0000"+
+ "\u0000\u0149\u014a\u0003`0\u0000\u014a\u014b\u0005\u0001\u0000\u0000\u014b"+
+ "\u0015\u0001\u0000\u0000\u0000\u014c\u014d\u0005\u0005\u0000\u0000\u014d"+
+ "\u014e\u0003H$\u0000\u014e\u014f\u0005\u0006\u0000\u0000\u014f\u0150\u0003"+
+ "^/\u0000\u0150\u0151\u0005\u0001\u0000\u0000\u0151\u0017\u0001\u0000\u0000"+
+ "\u0000\u0152\u0153\u0005\u0007\u0000\u0000\u0153\u0154\u0003\f\u0006\u0000"+
+ "\u0154\u0155\u0005\b\u0000\u0000\u0155\u0019\u0001\u0000\u0000\u0000\u0156"+
+ "\u0157\u0005\u0080\u0000\u0000\u0157\u0158\u0005\u0081\u0000\u0000\u0158"+
+ "\u0159\u0005\u0001\u0000\u0000\u0159\u001b\u0001\u0000\u0000\u0000\u015a"+
+ "\u015b\u0005\u0082\u0000\u0000\u015b\u015c\u0005\u0081\u0000\u0000\u015c"+
+ "\u015d\u0005\u0001\u0000\u0000\u015d\u001d\u0001\u0000\u0000\u0000\u015e"+
+ "\u015f\u0005\u0083\u0000\u0000\u015f\u0160\u0005\u0084\u0000\u0000\u0160"+
+ "\u0161\u0003^/\u0000\u0161\u0162\u0005\u0001\u0000\u0000\u0162\u001f\u0001"+
+ "\u0000\u0000\u0000\u0163\u0166\u0003d2\u0000\u0164\u0166\u0003h4\u0000"+
+ "\u0165\u0163\u0001\u0000\u0000\u0000\u0165\u0164\u0001\u0000\u0000\u0000"+
+ "\u0166\u016f\u0001\u0000\u0000\u0000\u0167\u016e\u0003d2\u0000\u0168\u016e"+
+ "\u0003h4\u0000\u0169\u016e\u0003l6\u0000\u016a\u016e\u0003n7\u0000\u016b"+
+ "\u016e\u0003r9\u0000\u016c\u016e\u0003v;\u0000\u016d\u0167\u0001\u0000"+
+ "\u0000\u0000\u016d\u0168\u0001\u0000\u0000\u0000\u016d\u0169\u0001\u0000"+
+ "\u0000\u0000\u016d\u016a\u0001\u0000\u0000\u0000\u016d\u016b\u0001\u0000"+
+ "\u0000\u0000\u016d\u016c\u0001\u0000\u0000\u0000\u016e\u0171\u0001\u0000"+
+ "\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u016f\u0170\u0001\u0000"+
+ "\u0000\u0000\u0170\u0172\u0001\u0000\u0000\u0000\u0171\u016f\u0001\u0000"+
+ "\u0000\u0000\u0172\u0173\u0005C\u0000\u0000\u0173\u0174\u0003\u0012\t"+
+ "\u0000\u0174!\u0001\u0000\u0000\u0000\u0175\u0176\u0005D\u0000\u0000\u0176"+
+ "\u0177\u0005\t\u0000\u0000\u0177\u0178\u0003\\.\u0000\u0178\u0179\u0005"+
+ "\n\u0000\u0000\u0179\u017a\u0005Y\u0000\u0000\u017a\u017b\u0003\u0012"+
+ "\t\u0000\u017b\u017c\u0005Z\u0000\u0000\u017c\u017d\u0003\u0012\t\u0000"+
+ "\u017d#\u0001\u0000\u0000\u0000\u017e\u017f\u0005T\u0000\u0000\u017f\u0180"+
+ "\u0005\t\u0000\u0000\u0180\u0181\u0003\\.\u0000\u0181\u0183\u0005\n\u0000"+
+ "\u0000\u0182\u0184\u0003&\u0013\u0000\u0183\u0182\u0001\u0000\u0000\u0000"+
+ "\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000\u0000\u0000"+
+ "\u0185\u0186\u0001\u0000\u0000\u0000\u0186\u0187\u0001\u0000\u0000\u0000"+
+ "\u0187\u0188\u0005X\u0000\u0000\u0188\u0189\u0005C\u0000\u0000\u0189\u018a"+
+ "\u0003\u0012\t\u0000\u018a%\u0001\u0000\u0000\u0000\u018b\u018c\u0005"+
+ "U\u0000\u0000\u018c\u018e\u0003^/\u0000\u018d\u018b\u0001\u0000\u0000"+
+ "\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u018d\u0001\u0000\u0000"+
+ "\u0000\u018f\u0190\u0001\u0000\u0000\u0000\u0190\u0191\u0001\u0000\u0000"+
+ "\u0000\u0191\u0192\u0005C\u0000\u0000\u0192\u0193\u0003\u0012\t\u0000"+
+ "\u0193\'\u0001\u0000\u0000\u0000\u0194\u0195\u0005V\u0000\u0000\u0195"+
+ "\u0197\u0003\u0018\f\u0000\u0196\u0198\u0003*\u0015\u0000\u0197\u0196"+
+ "\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0199\u0197"+
+ "\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a)\u0001"+
+ "\u0000\u0000\u0000\u019b\u019e\u0005W\u0000\u0000\u019c\u019f\u0005\u000b"+
+ "\u0000\u0000\u019d\u019f\u0003H$\u0000\u019e\u019c\u0001\u0000\u0000\u0000"+
+ "\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a7\u0001\u0000\u0000\u0000"+
+ "\u01a0\u01a3\u0005\f\u0000\u0000\u01a1\u01a4\u0005\u000b\u0000\u0000\u01a2"+
+ "\u01a4\u0003H$\u0000\u01a3\u01a1\u0001\u0000\u0000\u0000\u01a3\u01a2\u0001"+
+ "\u0000\u0000\u0000\u01a4\u01a6\u0001\u0000\u0000\u0000\u01a5\u01a0\u0001"+
+ "\u0000\u0000\u0000\u01a6\u01a9\u0001\u0000\u0000\u0000\u01a7\u01a5\u0001"+
+ "\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01aa\u0001"+
+ "\u0000\u0000\u0000\u01a9\u01a7\u0001\u0000\u0000\u0000\u01aa\u01ab\u0003"+
+ "\u0018\f\u0000\u01ab+\u0001\u0000\u0000\u0000\u01ac\u01ad\u0005[\u0000"+
+ "\u0000\u01ad\u01ae\u0005\t\u0000\u0000\u01ae\u01af\u0003\\.\u0000\u01af"+
+ "\u01b1\u0005\n\u0000\u0000\u01b0\u01b2\u0003.\u0017\u0000\u01b1\u01b0"+
+ "\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b1"+
+ "\u0001\u0000\u0000\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4\u01b5"+
+ "\u0001\u0000\u0000\u0000\u01b5\u01b7\u0005X\u0000\u0000\u01b6\u01b8\u0003"+
+ "\u00c0`\u0000\u01b7\u01b6\u0001\u0000\u0000\u0000\u01b7\u01b8\u0001\u0000"+
+ "\u0000\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005C\u0000"+
+ "\u0000\u01ba\u01bb\u0003\u0012\t\u0000\u01bb-\u0001\u0000\u0000\u0000"+
+ "\u01bc\u01c0\u0005U\u0000\u0000\u01bd\u01be\u0003\u00c0`\u0000\u01be\u01bf"+
+ "\u0005F\u0000\u0000\u01bf\u01c1\u0001\u0000\u0000\u0000\u01c0\u01bd\u0001"+
+ "\u0000\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000\u01c1\u01c2\u0001"+
+ "\u0000\u0000\u0000\u01c2\u01c7\u0003\u00e6s\u0000\u01c3\u01c4\u0005\f"+
+ "\u0000\u0000\u01c4\u01c6\u0003\u00e6s\u0000\u01c5\u01c3\u0001\u0000\u0000"+
+ "\u0000\u01c6\u01c9\u0001\u0000\u0000\u0000\u01c7\u01c5\u0001\u0000\u0000"+
+ "\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01ca\u0001\u0000\u0000"+
+ "\u0000\u01c9\u01c7\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005C\u0000\u0000"+
+ "\u01cb\u01cc\u0003\u0012\t\u0000\u01cc/\u0001\u0000\u0000\u0000\u01cd"+
+ "\u01ce\u0005\r\u0000\u0000\u01ce\u01d9\u0003H$\u0000\u01cf\u01d0\u0005"+
+ "\t\u0000\u0000\u01d0\u01d5\u0005\u0089\u0000\u0000\u01d1\u01d2\u0005\u000e"+
+ "\u0000\u0000\u01d2\u01d4\u0005\u0089\u0000\u0000\u01d3\u01d1\u0001\u0000"+
+ "\u0000\u0000\u01d4\u01d7\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001\u0000"+
+ "\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d8\u0001\u0000"+
+ "\u0000\u0000\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d8\u01da\u0005\n\u0000"+
+ "\u0000\u01d9\u01cf\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000"+
+ "\u0000\u01da\u01dd\u0001\u0000\u0000\u0000\u01db\u01dd\u0005\u007f\u0000"+
+ "\u0000\u01dc\u01cd\u0001\u0000\u0000\u0000\u01dc\u01db\u0001\u0000\u0000"+
+ "\u0000\u01dd1\u0001\u0000\u0000\u0000\u01de\u01e0\u00030\u0018\u0000\u01df"+
+ "\u01de\u0001\u0000\u0000\u0000\u01e0\u01e3\u0001\u0000\u0000\u0000\u01e1"+
+ "\u01df\u0001\u0000\u0000\u0000\u01e1\u01e2\u0001\u0000\u0000\u0000\u01e2"+
+ "3\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e4\u01e5"+
+ "\u00032\u0019\u0000\u01e5\u01e6\u0005r\u0000\u0000\u01e6\u01eb\u00036"+
+ "\u001b\u0000\u01e7\u01e8\u0005\u000e\u0000\u0000\u01e8\u01ea\u00036\u001b"+
+ "\u0000\u01e9\u01e7\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000"+
+ "\u0000\u01eb\u01e9\u0001\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000"+
+ "\u0000\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000"+
+ "\u0000\u01ee\u01ef\u0005\u0001\u0000\u0000\u01ef5\u0001\u0000\u0000\u0000"+
+ "\u01f0\u01f3\u0003\u00c0`\u0000\u01f1\u01f2\u0005F\u0000\u0000\u01f2\u01f4"+
+ "\u0003\u00e6s\u0000\u01f3\u01f1\u0001\u0000\u0000\u0000\u01f3\u01f4\u0001"+
+ "\u0000\u0000\u0000\u01f4\u01f7\u0001\u0000\u0000\u0000\u01f5\u01f6\u0005"+
+ "\u0006\u0000\u0000\u01f6\u01f8\u0003^/\u0000\u01f7\u01f5\u0001\u0000\u0000"+
+ "\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f87\u0001\u0000\u0000\u0000"+
+ "\u01f9\u01fa\u0005\u0085\u0000\u0000\u01fa\u01fb\u0005\t\u0000\u0000\u01fb"+
+ "\u01fc\u0003\\.\u0000\u01fc\u01fd\u0005\n\u0000\u0000\u01fd\u01fe\u0003"+
+ "\u0012\t\u0000\u01fe9\u0001\u0000\u0000\u0000\u01ff\u0204\u0003@ \u0000"+
+ "\u0200\u0204\u0003B!\u0000\u0201\u0204\u0003D\"\u0000\u0202\u0204\u0003"+
+ "F#\u0000\u0203\u01ff\u0001\u0000\u0000\u0000\u0203\u0200\u0001\u0000\u0000"+
+ "\u0000\u0203\u0201\u0001\u0000\u0000\u0000\u0203\u0202\u0001\u0000\u0000"+
+ "\u0000\u0204;\u0001\u0000\u0000\u0000\u0205\u0206\u0005o\u0000\u0000\u0206"+
+ "\u0207\u0005\u0003\u0000\u0000\u0207\u0208\u0005\u008f\u0000\u0000\u0208"+
+ "\u0209\u0005\u0004\u0000\u0000\u0209\u020a\u0003\u00f8|\u0000\u020a=\u0001"+
+ "\u0000\u0000\u0000\u020b\u0210\u0003R)\u0000\u020c\u0210\u0003N\'\u0000"+
+ "\u020d\u0210\u0003T*\u0000\u020e\u0210\u0003P(\u0000\u020f\u020b\u0001"+
+ "\u0000\u0000\u0000\u020f\u020c\u0001\u0000\u0000\u0000\u020f\u020d\u0001"+
+ "\u0000\u0000\u0000\u020f\u020e\u0001\u0000\u0000\u0000\u0210?\u0001\u0000"+
+ "\u0000\u0000\u0211\u0212\u0005o\u0000\u0000\u0212\u0213\u0005X\u0000\u0000"+
+ "\u0213\u0214\u0005Q\u0000\u0000\u0214\u0215\u0003\u00f8|\u0000\u0215A"+
+ "\u0001\u0000\u0000\u0000\u0216\u0217\u0005o\u0000\u0000\u0217\u0218\u0005"+
+ "\u000f\u0000\u0000\u0218\u0219\u0007\u0000\u0000\u0000\u0219C\u0001\u0000"+
+ "\u0000\u0000\u021a\u021b\u0005o\u0000\u0000\u021b\u021c\u0005X\u0000\u0000"+
+ "\u021c\u021d\u0005B\u0000\u0000\u021d\u021e\u0005I\u0000\u0000\u021e\u021f"+
+ "\u0007\u0001\u0000\u0000\u021fE\u0001\u0000\u0000\u0000\u0220\u0225\u0005"+
+ "o\u0000\u0000\u0221\u0222\u0005\u0011\u0000\u0000\u0222\u0226\u0003H$"+
+ "\u0000\u0223\u0224\u0005X\u0000\u0000\u0224\u0226\u0005\u0011\u0000\u0000"+
+ "\u0225\u0221\u0001\u0000\u0000\u0000\u0225\u0223\u0001\u0000\u0000\u0000"+
+ "\u0226\u022d\u0001\u0000\u0000\u0000\u0227\u0228\u0003J%\u0000\u0228\u0229"+
+ "\u0005\u0004\u0000\u0000\u0229\u022a\u0003\u00fa}\u0000\u022a\u022c\u0001"+
+ "\u0000\u0000\u0000\u022b\u0227\u0001\u0000\u0000\u0000\u022c\u022f\u0001"+
+ "\u0000\u0000\u0000\u022d\u022b\u0001\u0000\u0000\u0000\u022d\u022e\u0001"+
+ "\u0000\u0000\u0000\u022eG\u0001\u0000\u0000\u0000\u022f\u022d\u0001\u0000"+
+ "\u0000\u0000\u0230\u0233\u0005\u008f\u0000\u0000\u0231\u0233\u0003\u00fc"+
+ "~\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0231\u0001\u0000\u0000"+
+ "\u0000\u0233\u0234\u0001\u0000\u0000\u0000\u0234\u0236\u0005\u0012\u0000"+
+ "\u0000\u0235\u0232\u0001\u0000\u0000\u0000\u0235\u0236\u0001\u0000\u0000"+
+ "\u0000\u0236\u0239\u0001\u0000\u0000\u0000\u0237\u023a\u0005\u008f\u0000"+
+ "\u0000\u0238\u023a\u0003\u00fc~\u0000\u0239\u0237\u0001\u0000\u0000\u0000"+
+ "\u0239\u0238\u0001\u0000\u0000\u0000\u023aI\u0001\u0000\u0000\u0000\u023b"+
+ "\u023c\u0007\u0002\u0000\u0000\u023cK\u0001\u0000\u0000\u0000\u023d\u023e"+
+ "\u0005\u001d\u0000\u0000\u023e\u0242\u0005\u0002\u0000\u0000\u023f\u0240"+
+ "\u0005\u0003\u0000\u0000\u0240\u0241\u0005\u008f\u0000\u0000\u0241\u0243"+
+ "\u0005\u0004\u0000\u0000\u0242\u023f\u0001\u0000\u0000\u0000\u0242\u0243"+
+ "\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u024e"+
+ "\u0003\u00f8|\u0000\u0245\u0246\u0005G\u0000\u0000\u0246\u024b\u0003\u00f8"+
+ "|\u0000\u0247\u0248\u0005\u000e\u0000\u0000\u0248\u024a\u0003\u00f8|\u0000"+
+ "\u0249\u0247\u0001\u0000\u0000\u0000\u024a\u024d\u0001\u0000\u0000\u0000"+
+ "\u024b\u0249\u0001\u0000\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000"+
+ "\u024c\u024f\u0001\u0000\u0000\u0000\u024d\u024b\u0001\u0000\u0000\u0000"+
+ "\u024e\u0245\u0001\u0000\u0000\u0000\u024e\u024f\u0001\u0000\u0000\u0000"+
+ "\u024fM\u0001\u0000\u0000\u0000\u0250\u0251\u0005o\u0000\u0000\u0251\u0252"+
+ "\u00032\u0019\u0000\u0252\u0253\u0005r\u0000\u0000\u0253\u0256\u0003\u00c0"+
+ "`\u0000\u0254\u0255\u0005F\u0000\u0000\u0255\u0257\u0003\u00e6s\u0000"+
+ "\u0256\u0254\u0001\u0000\u0000\u0000\u0256\u0257\u0001\u0000\u0000\u0000"+
+ "\u0257\u025f\u0001\u0000\u0000\u0000\u0258\u0259\u0005\u0006\u0000\u0000"+
+ "\u0259\u0260\u0003^/\u0000\u025a\u025d\u0005\u001e\u0000\u0000\u025b\u025c"+
+ "\u0005\u0006\u0000\u0000\u025c\u025e\u0003^/\u0000\u025d\u025b\u0001\u0000"+
+ "\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001\u0000"+
+ "\u0000\u0000\u025f\u0258\u0001\u0000\u0000\u0000\u025f\u025a\u0001\u0000"+
+ "\u0000\u0000\u0260O\u0001\u0000\u0000\u0000\u0261\u0262\u0005o\u0000\u0000"+
+ "\u0262\u0263\u0005p\u0000\u0000\u0263\u0266\u0005q\u0000\u0000\u0264\u0265"+
+ "\u0005F\u0000\u0000\u0265\u0267\u0003\u00e6s\u0000\u0266\u0264\u0001\u0000"+
+ "\u0000\u0000\u0266\u0267\u0001\u0000\u0000\u0000\u0267\u026f\u0001\u0000"+
+ "\u0000\u0000\u0268\u0269\u0005\u0006\u0000\u0000\u0269\u0270\u0003^/\u0000"+
+ "\u026a\u026d\u0005\u001e\u0000\u0000\u026b\u026c\u0005\u0006\u0000\u0000"+
+ "\u026c\u026e\u0003^/\u0000\u026d\u026b\u0001\u0000\u0000\u0000\u026d\u026e"+
+ "\u0001\u0000\u0000\u0000\u026e\u0270\u0001\u0000\u0000\u0000\u026f\u0268"+
+ "\u0001\u0000\u0000\u0000\u026f\u026a\u0001\u0000\u0000\u0000\u0270Q\u0001"+
+ "\u0000\u0000\u0000\u0271\u0272\u0005o\u0000\u0000\u0272\u0273\u00032\u0019"+
+ "\u0000\u0273\u0274\u0005\u001f\u0000\u0000\u0274\u0275\u0003H$\u0000\u0275"+
+ "\u0277\u0005\t\u0000\u0000\u0276\u0278\u0003X,\u0000\u0277\u0276\u0001"+
+ "\u0000\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278\u0279\u0001"+
+ "\u0000\u0000\u0000\u0279\u027c\u0005\n\u0000\u0000\u027a\u027b\u0005F"+
+ "\u0000\u0000\u027b\u027d\u0003\u00e6s\u0000\u027c\u027a\u0001\u0000\u0000"+
+ "\u0000\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u0283\u0001\u0000\u0000"+
+ "\u0000\u027e\u027f\u0005\u0007\u0000\u0000\u027f\u0280\u0003\u0010\b\u0000"+
+ "\u0280\u0281\u0005\b\u0000\u0000\u0281\u0284\u0001\u0000\u0000\u0000\u0282"+
+ "\u0284\u0005\u001e\u0000\u0000\u0283\u027e\u0001\u0000\u0000\u0000\u0283"+
+ "\u0282\u0001\u0000\u0000\u0000\u0284S\u0001\u0000\u0000\u0000\u0285\u0286"+
+ "\u0005o\u0000\u0000\u0286\u0287\u0005l\u0000\u0000\u0287\u0288\u0003H"+
+ "$\u0000\u0288\u028a\u0005F\u0000\u0000\u0289\u028b\u0003V+\u0000\u028a"+
+ "\u0289\u0001\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000\u0000\u028b"+
+ "\u028c\u0001\u0000\u0000\u0000\u028c\u028d\u0003^/\u0000\u028dU\u0001"+
+ "\u0000\u0000\u0000\u028e\u028f\u0005 \u0000\u0000\u028f\u0295\u0005!\u0000"+
+ "\u0000\u0290\u0291\u0005 \u0000\u0000\u0291\u0295\u0005\"\u0000\u0000"+
+ "\u0292\u0293\u0005~\u0000\u0000\u0293\u0295\u0005#\u0000\u0000\u0294\u028e"+
+ "\u0001\u0000\u0000\u0000\u0294\u0290\u0001\u0000\u0000\u0000\u0294\u0292"+
+ "\u0001\u0000\u0000\u0000\u0295W\u0001\u0000\u0000\u0000\u0296\u029b\u0003"+
+ "Z-\u0000\u0297\u0298\u0005\u000e\u0000\u0000\u0298\u029a\u0003Z-\u0000"+
+ "\u0299\u0297\u0001\u0000\u0000\u0000\u029a\u029d\u0001\u0000\u0000\u0000"+
+ "\u029b\u0299\u0001\u0000\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000"+
+ "\u029cY\u0001\u0000\u0000\u0000\u029d\u029b\u0001\u0000\u0000\u0000\u029e"+
+ "\u029f\u0005\u0005\u0000\u0000\u029f\u02a2\u0003H$\u0000\u02a0\u02a1\u0005"+
+ "F\u0000\u0000\u02a1\u02a3\u0003\u00e6s\u0000\u02a2\u02a0\u0001\u0000\u0000"+
+ "\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3[\u0001\u0000\u0000\u0000"+
+ "\u02a4\u02a9\u0003^/\u0000\u02a5\u02a6\u0005\u000e\u0000\u0000\u02a6\u02a8"+
+ "\u0003^/\u0000\u02a7\u02a5\u0001\u0000\u0000\u0000\u02a8\u02ab\u0001\u0000"+
+ "\u0000\u0000\u02a9\u02a7\u0001\u0000\u0000\u0000\u02a9\u02aa\u0001\u0000"+
+ "\u0000\u0000\u02aa]\u0001\u0000\u0000\u0000\u02ab\u02a9\u0001\u0000\u0000"+
+ "\u0000\u02ac\u02b3\u0003`0\u0000\u02ad\u02b3\u0003b1\u0000\u02ae\u02b3"+
+ "\u0003|>\u0000\u02af\u02b3\u0003\u0080@\u0000\u02b0\u02b3\u0003\u0084"+
+ "B\u0000\u02b1\u02b3\u0003\u0086C\u0000\u02b2\u02ac\u0001\u0000\u0000\u0000"+
+ "\u02b2\u02ad\u0001\u0000\u0000\u0000\u02b2\u02ae\u0001\u0000\u0000\u0000"+
+ "\u02b2\u02af\u0001\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000\u0000\u0000"+
+ "\u02b2\u02b1\u0001\u0000\u0000\u0000\u02b3_\u0001\u0000\u0000\u0000\u02b4"+
+ "\u02bd\u0003x<\u0000\u02b5\u02bd\u0003\u008aE\u0000\u02b6\u02bd\u0003"+
+ "\u00d6k\u0000\u02b7\u02bd\u0003\u00d8l\u0000\u02b8\u02bd\u0003\u00dam"+
+ "\u0000\u02b9\u02bd\u0003\u00dcn\u0000\u02ba\u02bd\u0003\u00deo\u0000\u02bb"+
+ "\u02bd\u0003\u00e0p\u0000\u02bc\u02b4\u0001\u0000\u0000\u0000\u02bc\u02b5"+
+ "\u0001\u0000\u0000\u0000\u02bc\u02b6\u0001\u0000\u0000\u0000\u02bc\u02b7"+
+ "\u0001\u0000\u0000\u0000\u02bc\u02b8\u0001\u0000\u0000\u0000\u02bc\u02b9"+
+ "\u0001\u0000\u0000\u0000\u02bc\u02ba\u0001\u0000\u0000\u0000\u02bc\u02bb"+
+ "\u0001\u0000\u0000\u0000\u02bda\u0001\u0000\u0000\u0000\u02be\u02c1\u0003"+
+ "d2\u0000\u02bf\u02c1\u0003h4\u0000\u02c0\u02be\u0001\u0000\u0000\u0000"+
+ "\u02c0\u02bf\u0001\u0000\u0000\u0000\u02c1\u02ca\u0001\u0000\u0000\u0000"+
+ "\u02c2\u02c9\u0003d2\u0000\u02c3\u02c9\u0003h4\u0000\u02c4\u02c9\u0003"+
+ "l6\u0000\u02c5\u02c9\u0003n7\u0000\u02c6\u02c9\u0003r9\u0000\u02c7\u02c9"+
+ "\u0003v;\u0000\u02c8\u02c2\u0001\u0000\u0000\u0000\u02c8\u02c3\u0001\u0000"+
+ "\u0000\u0000\u02c8\u02c4\u0001\u0000\u0000\u0000\u02c8\u02c5\u0001\u0000"+
+ "\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c7\u0001\u0000"+
+ "\u0000\u0000\u02c9\u02cc\u0001\u0000\u0000\u0000\u02ca\u02c8\u0001\u0000"+
+ "\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cd\u0001\u0000"+
+ "\u0000\u0000\u02cc\u02ca\u0001\u0000\u0000\u0000\u02cd\u02ce\u0005C\u0000"+
+ "\u0000\u02ce\u02cf\u0003^/\u0000\u02cfc\u0001\u0000\u0000\u0000\u02d0"+
+ "\u02d1\u0005=\u0000\u0000\u02d1\u02d6\u0003f3\u0000\u02d2\u02d3\u0005"+
+ "\u000e\u0000\u0000\u02d3\u02d5\u0003f3\u0000\u02d4\u02d2\u0001\u0000\u0000"+
+ "\u0000\u02d5\u02d8\u0001\u0000\u0000\u0000\u02d6\u02d4\u0001\u0000\u0000"+
+ "\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d7e\u0001\u0000\u0000\u0000"+
+ "\u02d8\u02d6\u0001\u0000\u0000\u0000\u02d9\u02dc\u0003\u00c0`\u0000\u02da"+
+ "\u02db\u0005F\u0000\u0000\u02db\u02dd\u0003\u00e6s\u0000\u02dc\u02da\u0001"+
+ "\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02e0\u0001"+
+ "\u0000\u0000\u0000\u02de\u02df\u0005H\u0000\u0000\u02df\u02e1\u0005I\u0000"+
+ "\u0000\u02e0\u02de\u0001\u0000\u0000\u0000\u02e0\u02e1\u0001\u0000\u0000"+
+ "\u0000\u02e1\u02e4\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005G\u0000\u0000"+
+ "\u02e3\u02e5\u0003\u00c0`\u0000\u02e4\u02e2\u0001\u0000\u0000\u0000\u02e4"+
+ "\u02e5\u0001\u0000\u0000\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6"+
+ "\u02e7\u0005E\u0000\u0000\u02e7\u02e8\u0003^/\u0000\u02e8g\u0001\u0000"+
+ "\u0000\u0000\u02e9\u02ea\u0005>\u0000\u0000\u02ea\u02ef\u0003j5\u0000"+
+ "\u02eb\u02ec\u0005\u000e\u0000\u0000\u02ec\u02ee\u0003j5\u0000\u02ed\u02eb"+
+ "\u0001\u0000\u0000\u0000\u02ee\u02f1\u0001\u0000\u0000\u0000\u02ef\u02ed"+
+ "\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0i\u0001"+
+ "\u0000\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f2\u02f5\u0003"+
+ "\u00c0`\u0000\u02f3\u02f4\u0005F\u0000\u0000\u02f4\u02f6\u0003\u00e6s"+
+ "\u0000\u02f5\u02f3\u0001\u0000\u0000\u0000\u02f5\u02f6\u0001\u0000\u0000"+
+ "\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005\u0006\u0000"+
+ "\u0000\u02f8\u02f9\u0003^/\u0000\u02f9k\u0001\u0000\u0000\u0000\u02fa"+
+ "\u02fb\u0005?\u0000\u0000\u02fb\u02fc\u0003^/\u0000\u02fcm\u0001\u0000"+
+ "\u0000\u0000\u02fd\u02fe\u0005@\u0000\u0000\u02fe\u02ff\u0005A\u0000\u0000"+
+ "\u02ff\u0304\u0003p8\u0000\u0300\u0301\u0005\u000e\u0000\u0000\u0301\u0303"+
+ "\u0003p8\u0000\u0302\u0300\u0001\u0000\u0000\u0000\u0303\u0306\u0001\u0000"+
+ "\u0000\u0000\u0304\u0302\u0001\u0000\u0000\u0000\u0304\u0305\u0001\u0000"+
+ "\u0000\u0000\u0305o\u0001\u0000\u0000\u0000\u0306\u0304\u0001\u0000\u0000"+
+ "\u0000\u0307\u030e\u0003\u00c0`\u0000\u0308\u0309\u0005F\u0000\u0000\u0309"+
+ "\u030b\u0003\u00e6s\u0000\u030a\u0308\u0001\u0000\u0000\u0000\u030a\u030b"+
+ "\u0001\u0000\u0000\u0000\u030b\u030c\u0001\u0000\u0000\u0000\u030c\u030d"+
+ "\u0005\u0006\u0000\u0000\u030d\u030f\u0003^/\u0000\u030e\u030a\u0001\u0000"+
+ "\u0000\u0000\u030e\u030f\u0001\u0000\u0000\u0000\u030f\u0312\u0001\u0000"+
+ "\u0000\u0000\u0310\u0311\u0005Q\u0000\u0000\u0311\u0313\u0003\u00f8|\u0000"+
+ "\u0312\u0310\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000\u0000"+
+ "\u0313q\u0001\u0000\u0000\u0000\u0314\u0315\u0005B\u0000\u0000\u0315\u031a"+
+ "\u0005A\u0000\u0000\u0316\u0317\u0005K\u0000\u0000\u0317\u0318\u0005B"+
+ "\u0000\u0000\u0318\u031a\u0005A\u0000\u0000\u0319\u0314\u0001\u0000\u0000"+
+ "\u0000\u0319\u0316\u0001\u0000\u0000\u0000\u031a\u031b\u0001\u0000\u0000"+
+ "\u0000\u031b\u0320\u0003t:\u0000\u031c\u031d\u0005\u000e\u0000\u0000\u031d"+
+ "\u031f\u0003t:\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031f\u0322\u0001"+
+ "\u0000\u0000\u0000\u0320\u031e\u0001\u0000\u0000\u0000\u0320\u0321\u0001"+
+ "\u0000\u0000\u0000\u0321s\u0001\u0000\u0000\u0000\u0322\u0320\u0001\u0000"+
+ "\u0000\u0000\u0323\u0326\u0003^/\u0000\u0324\u0327\u0005L\u0000\u0000"+
+ "\u0325\u0327\u0005M\u0000\u0000\u0326\u0324\u0001\u0000\u0000\u0000\u0326"+
+ "\u0325\u0001\u0000\u0000\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327"+
+ "\u032d\u0001\u0000\u0000\u0000\u0328\u032b\u0005I\u0000\u0000\u0329\u032c"+
+ "\u0005R\u0000\u0000\u032a\u032c\u0005S\u0000\u0000\u032b\u0329\u0001\u0000"+
+ "\u0000\u0000\u032b\u032a\u0001\u0000\u0000\u0000\u032c\u032e\u0001\u0000"+
+ "\u0000\u0000\u032d\u0328\u0001\u0000\u0000\u0000\u032d\u032e\u0001\u0000"+
+ "\u0000\u0000\u032e\u0331\u0001\u0000\u0000\u0000\u032f\u0330\u0005Q\u0000"+
+ "\u0000\u0330\u0332\u0003\u00f8|\u0000\u0331\u032f\u0001\u0000\u0000\u0000"+
+ "\u0331\u0332\u0001\u0000\u0000\u0000\u0332u\u0001\u0000\u0000\u0000\u0333"+
+ "\u0334\u0005J\u0000\u0000\u0334\u0335\u0003\u00c0`\u0000\u0335w\u0001"+
+ "\u0000\u0000\u0000\u0336\u0339\u0005N\u0000\u0000\u0337\u0339\u0005O\u0000"+
+ "\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0338\u0337\u0001\u0000\u0000"+
+ "\u0000\u0339\u033a\u0001\u0000\u0000\u0000\u033a\u033f\u0003z=\u0000\u033b"+
+ "\u033c\u0005\u000e\u0000\u0000\u033c\u033e\u0003z=\u0000\u033d\u033b\u0001"+
+ "\u0000\u0000\u0000\u033e\u0341\u0001\u0000\u0000\u0000\u033f\u033d\u0001"+
+ "\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000\u0000\u0340\u0342\u0001"+
+ "\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000\u0000\u0342\u0343\u0005"+
+ "P\u0000\u0000\u0343\u0344\u0003^/\u0000\u0344y\u0001\u0000\u0000\u0000"+
+ "\u0345\u0348\u0003\u00c0`\u0000\u0346\u0347\u0005F\u0000\u0000\u0347\u0349"+
+ "\u0003\u00e6s\u0000\u0348\u0346\u0001\u0000\u0000\u0000\u0348\u0349\u0001"+
+ "\u0000\u0000\u0000\u0349\u034a\u0001\u0000\u0000\u0000\u034a\u034b\u0005"+
+ "E\u0000\u0000\u034b\u034c\u0003^/\u0000\u034c{\u0001\u0000\u0000\u0000"+
+ "\u034d\u034e\u0005T\u0000\u0000\u034e\u034f\u0005\t\u0000\u0000\u034f"+
+ "\u0350\u0003\\.\u0000\u0350\u0352\u0005\n\u0000\u0000\u0351\u0353\u0003"+
+ "~?\u0000\u0352\u0351\u0001\u0000\u0000\u0000\u0353\u0354\u0001\u0000\u0000"+
+ "\u0000\u0354\u0352\u0001\u0000\u0000\u0000\u0354\u0355\u0001\u0000\u0000"+
+ "\u0000\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0357\u0005X\u0000\u0000"+
+ "\u0357\u0358\u0005C\u0000\u0000\u0358\u0359\u0003^/\u0000\u0359}\u0001"+
+ "\u0000\u0000\u0000\u035a\u035b\u0005U\u0000\u0000\u035b\u035d\u0003^/"+
+ "\u0000\u035c\u035a\u0001\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000"+
+ "\u0000\u035e\u035c\u0001\u0000\u0000\u0000\u035e\u035f\u0001\u0000\u0000"+
+ "\u0000\u035f\u0360\u0001\u0000\u0000\u0000\u0360\u0361\u0005C\u0000\u0000"+
+ "\u0361\u0362\u0003^/\u0000\u0362\u007f\u0001\u0000\u0000\u0000\u0363\u0364"+
+ "\u0005[\u0000\u0000\u0364\u0365\u0005\t\u0000\u0000\u0365\u0366\u0003"+
+ "\\.\u0000\u0366\u0368\u0005\n\u0000\u0000\u0367\u0369\u0003\u0082A\u0000"+
+ "\u0368\u0367\u0001\u0000\u0000\u0000\u0369\u036a\u0001\u0000\u0000\u0000"+
+ "\u036a\u0368\u0001\u0000\u0000\u0000\u036a\u036b\u0001\u0000\u0000\u0000"+
+ "\u036b\u036c\u0001\u0000\u0000\u0000\u036c\u036e\u0005X\u0000\u0000\u036d"+
+ "\u036f\u0003\u00c0`\u0000\u036e\u036d\u0001\u0000\u0000\u0000\u036e\u036f"+
+ "\u0001\u0000\u0000\u0000\u036f\u0370\u0001\u0000\u0000\u0000\u0370\u0371"+
+ "\u0005C\u0000\u0000\u0371\u0372\u0003^/\u0000\u0372\u0081\u0001\u0000"+
+ "\u0000\u0000\u0373\u0377\u0005U\u0000\u0000\u0374\u0375\u0003\u00c0`\u0000"+
+ "\u0375\u0376\u0005F\u0000\u0000\u0376\u0378\u0001\u0000\u0000\u0000\u0377"+
+ "\u0374\u0001\u0000\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378"+
+ "\u0379\u0001\u0000\u0000\u0000\u0379\u037e\u0003\u00e6s\u0000\u037a\u037b"+
+ "\u0005\f\u0000\u0000\u037b\u037d\u0003\u00e6s\u0000\u037c\u037a\u0001"+
+ "\u0000\u0000\u0000\u037d\u0380\u0001\u0000\u0000\u0000\u037e\u037c\u0001"+
+ "\u0000\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u0381\u0001"+
+ "\u0000\u0000\u0000\u0380\u037e\u0001\u0000\u0000\u0000\u0381\u0382\u0005"+
+ "C\u0000\u0000\u0382\u0383\u0003^/\u0000\u0383\u0083\u0001\u0000\u0000"+
+ "\u0000\u0384\u0385\u0005D\u0000\u0000\u0385\u0386\u0005\t\u0000\u0000"+
+ "\u0386\u0387\u0003\\.\u0000\u0387\u0388\u0005\n\u0000\u0000\u0388\u0389"+
+ "\u0005Y\u0000\u0000\u0389\u038a\u0003^/\u0000\u038a\u038b\u0005Z\u0000"+
+ "\u0000\u038b\u038c\u0003^/\u0000\u038c\u0085\u0001\u0000\u0000\u0000\u038d"+
+ "\u038e\u0005V\u0000\u0000\u038e\u038f\u0005\u0007\u0000\u0000\u038f\u0390"+
+ "\u0003\\.\u0000\u0390\u0392\u0005\b\u0000\u0000\u0391\u0393\u0003\u0088"+
+ "D\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000"+
+ "\u0000\u0394\u0392\u0001\u0000\u0000\u0000\u0394\u0395\u0001\u0000\u0000"+
+ "\u0000\u0395\u0087\u0001\u0000\u0000\u0000\u0396\u0399\u0005W\u0000\u0000"+
+ "\u0397\u039a\u0005\u000b\u0000\u0000\u0398\u039a\u0003H$\u0000\u0399\u0397"+
+ "\u0001\u0000\u0000\u0000\u0399\u0398\u0001\u0000\u0000\u0000\u039a\u03a2"+
+ "\u0001\u0000\u0000\u0000\u039b\u039e\u0005\f\u0000\u0000\u039c\u039f\u0005"+
+ "\u000b\u0000\u0000\u039d\u039f\u0003H$\u0000\u039e\u039c\u0001\u0000\u0000"+
+ "\u0000\u039e\u039d\u0001\u0000\u0000\u0000\u039f\u03a1\u0001\u0000\u0000"+
+ "\u0000\u03a0\u039b\u0001\u0000\u0000\u0000\u03a1\u03a4\u0001\u0000\u0000"+
+ "\u0000\u03a2\u03a0\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001\u0000\u0000"+
+ "\u0000\u03a3\u03a5\u0001\u0000\u0000\u0000\u03a4\u03a2\u0001\u0000\u0000"+
+ "\u0000\u03a5\u03a6\u0005\u0007\u0000\u0000\u03a6\u03a7\u0003\\.\u0000"+
+ "\u03a7\u03a8\u0005\b\u0000\u0000\u03a8\u0089\u0001\u0000\u0000\u0000\u03a9"+
+ "\u03ae\u0003\u008cF\u0000\u03aa\u03ab\u0005\\\u0000\u0000\u03ab\u03ad"+
+ "\u0003\u008cF\u0000\u03ac\u03aa\u0001\u0000\u0000\u0000\u03ad\u03b0\u0001"+
+ "\u0000\u0000\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000\u03ae\u03af\u0001"+
+ "\u0000\u0000\u0000\u03af\u008b\u0001\u0000\u0000\u0000\u03b0\u03ae\u0001"+
+ "\u0000\u0000\u0000\u03b1\u03b6\u0003\u008eG\u0000\u03b2\u03b3\u0005]\u0000"+
+ "\u0000\u03b3\u03b5\u0003\u008eG\u0000\u03b4\u03b2\u0001\u0000\u0000\u0000"+
+ "\u03b5\u03b8\u0001\u0000\u0000\u0000\u03b6\u03b4\u0001\u0000\u0000\u0000"+
+ "\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u008d\u0001\u0000\u0000\u0000"+
+ "\u03b8\u03b6\u0001\u0000\u0000\u0000\u03b9\u03bb\u0005^\u0000\u0000\u03ba"+
+ "\u03b9\u0001\u0000\u0000\u0000\u03ba\u03bb\u0001\u0000\u0000\u0000\u03bb"+
+ "\u03bc\u0001\u0000\u0000\u0000\u03bc\u03bd\u0003\u0090H\u0000\u03bd\u008f"+
+ "\u0001\u0000\u0000\u0000\u03be\u03c1\u0003\u0092I\u0000\u03bf\u03c0\u0007"+
+ "\u0003\u0000\u0000\u03c0\u03c2\u0003\u0092I\u0000\u03c1\u03bf\u0001\u0000"+
+ "\u0000\u0000\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2\u0091\u0001\u0000"+
+ "\u0000\u0000\u03c3\u03c8\u0003\u0094J\u0000\u03c4\u03c5\u0005/\u0000\u0000"+
+ "\u03c5\u03c7\u0003\u0094J\u0000\u03c6\u03c4\u0001\u0000\u0000\u0000\u03c7"+
+ "\u03ca\u0001\u0000\u0000\u0000\u03c8\u03c6\u0001\u0000\u0000\u0000\u03c8"+
+ "\u03c9\u0001\u0000\u0000\u0000\u03c9\u0093\u0001\u0000\u0000\u0000\u03ca"+
+ "\u03c8\u0001\u0000\u0000\u0000\u03cb\u03ce\u0003\u0096K\u0000\u03cc\u03cd"+
+ "\u0005_\u0000\u0000\u03cd\u03cf\u0003\u0096K\u0000\u03ce\u03cc\u0001\u0000"+
+ "\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03cf\u0095\u0001\u0000"+
+ "\u0000\u0000\u03d0\u03d5\u0003\u0098L\u0000\u03d1\u03d2\u0007\u0004\u0000"+
+ "\u0000\u03d2\u03d4\u0003\u0098L\u0000\u03d3\u03d1\u0001\u0000\u0000\u0000"+
+ "\u03d4\u03d7\u0001\u0000\u0000\u0000\u03d5\u03d3\u0001\u0000\u0000\u0000"+
+ "\u03d5\u03d6\u0001\u0000\u0000\u0000\u03d6\u0097\u0001\u0000\u0000\u0000"+
+ "\u03d7\u03d5\u0001\u0000\u0000\u0000\u03d8\u03dd\u0003\u009aM\u0000\u03d9"+
+ "\u03da\u0007\u0005\u0000\u0000\u03da\u03dc\u0003\u009aM\u0000\u03db\u03d9"+
+ "\u0001\u0000\u0000\u0000\u03dc\u03df\u0001\u0000\u0000\u0000\u03dd\u03db"+
+ "\u0001\u0000\u0000\u0000\u03dd\u03de\u0001\u0000\u0000\u0000\u03de\u0099"+
+ "\u0001\u0000\u0000\u0000\u03df\u03dd\u0001\u0000\u0000\u0000\u03e0\u03e4"+
+ "\u0003\u009cN\u0000\u03e1\u03e2\u0005`\u0000\u0000\u03e2\u03e3\u0005a"+
+ "\u0000\u0000\u03e3\u03e5\u0003\u00e6s\u0000\u03e4\u03e1\u0001\u0000\u0000"+
+ "\u0000\u03e4\u03e5\u0001\u0000\u0000\u0000\u03e5\u009b\u0001\u0000\u0000"+
+ "\u0000\u03e6\u03ea\u0003\u009eO\u0000\u03e7\u03e8\u0005c\u0000\u0000\u03e8"+
+ "\u03e9\u0005b\u0000\u0000\u03e9\u03eb\u0003\u00e6s\u0000\u03ea\u03e7\u0001"+
+ "\u0000\u0000\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03eb\u009d\u0001"+
+ "\u0000\u0000\u0000\u03ec\u03f0\u0003\u00a0P\u0000\u03ed\u03ee\u0005d\u0000"+
+ "\u0000\u03ee\u03ef\u0005F\u0000\u0000\u03ef\u03f1\u0003\u00e6s\u0000\u03f0"+
+ "\u03ed\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1"+
+ "\u009f\u0001\u0000\u0000\u0000\u03f2\u03f6\u0003\u00a2Q\u0000\u03f3\u03f4"+
+ "\u0005f\u0000\u0000\u03f4\u03f5\u0005F\u0000\u0000\u03f5\u03f7\u0003\u00f2"+
+ "y\u0000\u03f6\u03f3\u0001\u0000\u0000\u0000\u03f6\u03f7\u0001\u0000\u0000"+
+ "\u0000\u03f7\u00a1\u0001\u0000\u0000\u0000\u03f8\u03fc\u0003\u00a4R\u0000"+
+ "\u03f9\u03fa\u0005e\u0000\u0000\u03fa\u03fb\u0005F\u0000\u0000\u03fb\u03fd"+
+ "\u0003\u00f2y\u0000\u03fc\u03f9\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001"+
+ "\u0000\u0000\u0000\u03fd\u00a3\u0001\u0000\u0000\u0000\u03fe\u0407\u0003"+
+ "\u00a8T\u0000\u03ff\u0400\u0005\u0004\u0000\u0000\u0400\u0401\u0005-\u0000"+
+ "\u0000\u0401\u0402\u0001\u0000\u0000\u0000\u0402\u0403\u0003\u00a6S\u0000"+
+ "\u0403\u0404\u0003\u00ccf\u0000\u0404\u0406\u0001\u0000\u0000\u0000\u0405"+
+ "\u03ff\u0001\u0000\u0000\u0000\u0406\u0409\u0001\u0000\u0000\u0000\u0407"+
+ "\u0405\u0001\u0000\u0000\u0000\u0407\u0408\u0001\u0000\u0000\u0000\u0408"+
+ "\u00a5\u0001\u0000\u0000\u0000\u0409\u0407\u0001\u0000\u0000\u0000\u040a"+
+ "\u040e\u0003H$\u0000\u040b\u040e\u0003\u00c0`\u0000\u040c\u040e\u0003"+
+ "\u00c2a\u0000\u040d\u040a\u0001\u0000\u0000\u0000\u040d\u040b\u0001\u0000"+
+ "\u0000\u0000\u040d\u040c\u0001\u0000\u0000\u0000\u040e\u00a7\u0001\u0000"+
+ "\u0000\u0000\u040f\u0411\u0007\u0004\u0000\u0000\u0410\u040f\u0001\u0000"+
+ "\u0000\u0000\u0411\u0414\u0001\u0000\u0000\u0000\u0412\u0410\u0001\u0000"+
+ "\u0000\u0000\u0412\u0413\u0001\u0000\u0000\u0000\u0413\u0415\u0001\u0000"+
+ "\u0000\u0000\u0414\u0412\u0001\u0000\u0000\u0000\u0415\u0416\u0003\u00aa"+
+ "U\u0000\u0416\u00a9\u0001\u0000\u0000\u0000\u0417\u041b\u0003\u00b0X\u0000"+
+ "\u0418\u041b\u0003\u00acV\u0000\u0419\u041b\u0003\u00aeW\u0000\u041a\u0417"+
+ "\u0001\u0000\u0000\u0000\u041a\u0418\u0001\u0000\u0000\u0000\u041a\u0419"+
+ "\u0001\u0000\u0000\u0000\u041b\u00ab\u0001\u0000\u0000\u0000\u041c\u041d"+
+ "\u0005m\u0000\u0000\u041d\u041e\u0005l\u0000\u0000\u041e\u041f\u0003\u00e6"+
+ "s\u0000\u041f\u0420\u0005\u0007\u0000\u0000\u0420\u0421\u0003\\.\u0000"+
+ "\u0421\u0422\u0005\b\u0000\u0000\u0422\u00ad\u0001\u0000\u0000\u0000\u0423"+
+ "\u0424\u0005n\u0000\u0000\u0424\u0425\u0005l\u0000\u0000\u0425\u0426\u0003"+
+ "\u00e6s\u0000\u0426\u0427\u0005\u0007\u0000\u0000\u0427\u0428\u0003\\"+
+ ".\u0000\u0428\u0429\u0005\b\u0000\u0000\u0429\u00af\u0001\u0000\u0000"+
+ "\u0000\u042a\u042f\u0003\u00b2Y\u0000\u042b\u042c\u00055\u0000\u0000\u042c"+
+ "\u042e\u0003\u00b2Y\u0000\u042d\u042b\u0001\u0000\u0000\u0000\u042e\u0431"+
+ "\u0001\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u042f\u0430"+
+ "\u0001\u0000\u0000\u0000\u0430\u00b1\u0001\u0000\u0000\u0000\u0431\u042f"+
+ "\u0001\u0000\u0000\u0000\u0432\u043a\u0003\u00bc^\u0000\u0433\u0439\u0003"+
+ "\u00b4Z\u0000\u0434\u0439\u0003\u00b8\\\u0000\u0435\u0439\u0003\u00ba"+
+ "]\u0000\u0436\u0439\u0003\u00b6[\u0000\u0437\u0439\u0003\u00ccf\u0000"+
+ "\u0438\u0433\u0001\u0000\u0000\u0000\u0438\u0434\u0001\u0000\u0000\u0000"+
+ "\u0438\u0435\u0001\u0000\u0000\u0000\u0438\u0436\u0001\u0000\u0000\u0000"+
+ "\u0438\u0437\u0001\u0000\u0000\u0000\u0439\u043c\u0001\u0000\u0000\u0000"+
+ "\u043a\u0438\u0001\u0000\u0000\u0000\u043a\u043b\u0001\u0000\u0000\u0000"+
+ "\u043b\u00b3\u0001\u0000\u0000\u0000\u043c\u043a\u0001\u0000\u0000\u0000"+
+ "\u043d\u043e\u00056\u0000\u0000\u043e\u043f\u00056\u0000\u0000\u043f\u0440"+
+ "\u0003\\.\u0000\u0440\u0441\u00057\u0000\u0000\u0441\u0442\u00057\u0000"+
+ "\u0000\u0442\u00b5\u0001\u0000\u0000\u0000\u0443\u0444\u00056\u0000\u0000"+
+ "\u0444\u0445\u00057\u0000\u0000\u0445\u00b7\u0001\u0000\u0000\u0000\u0446"+
+ "\u0447\u00056\u0000\u0000\u0447\u0448\u0003\\.\u0000\u0448\u0449\u0005"+
+ "7\u0000\u0000\u0449\u00b9\u0001\u0000\u0000\u0000\u044a\u0451\u00058\u0000"+
+ "\u0000\u044b\u0452\u0003\u00fc~\u0000\u044c\u0452\u0003\u00fa}\u0000\u044d"+
+ "\u0452\u0005\u008f\u0000\u0000\u044e\u0452\u0003\u00c2a\u0000\u044f\u0452"+
+ "\u0003\u00c0`\u0000\u0450\u0452\u0003\u00c4b\u0000\u0451\u044b\u0001\u0000"+
+ "\u0000\u0000\u0451\u044c\u0001\u0000\u0000\u0000\u0451\u044d\u0001\u0000"+
+ "\u0000\u0000\u0451\u044e\u0001\u0000\u0000\u0000\u0451\u044f\u0001\u0000"+
+ "\u0000\u0000\u0451\u0450\u0001\u0000\u0000\u0000\u0452\u00bb\u0001\u0000"+
+ "\u0000\u0000\u0453\u0463\u0005\u0088\u0000\u0000\u0454\u0463\u0005j\u0000"+
+ "\u0000\u0455\u0463\u0005k\u0000\u0000\u0456\u0463\u0005\u0089\u0000\u0000"+
+ "\u0457\u0463\u0003\u00fa}\u0000\u0458\u0463\u0003\u00c0`\u0000\u0459\u0463"+
+ "\u0003\u00c2a\u0000\u045a\u0463\u0003\u00c4b\u0000\u045b\u0463\u0003\u00e8"+
+ "t\u0000\u045c\u0463\u0003\u00cae\u0000\u045d\u0463\u0003\u00c6c\u0000"+
+ "\u045e\u0463\u0003\u00c8d\u0000\u045f\u0463\u0003\u00f6{\u0000\u0460\u0463"+
+ "\u0003\u00d0h\u0000\u0461\u0463\u0003\u00be_\u0000\u0462\u0453\u0001\u0000"+
+ "\u0000\u0000\u0462\u0454\u0001\u0000\u0000\u0000\u0462\u0455\u0001\u0000"+
+ "\u0000\u0000\u0462\u0456\u0001\u0000\u0000\u0000\u0462\u0457\u0001\u0000"+
+ "\u0000\u0000\u0462\u0458\u0001\u0000\u0000\u0000\u0462\u0459\u0001\u0000"+
+ "\u0000\u0000\u0462\u045a\u0001\u0000\u0000\u0000\u0462\u045b\u0001\u0000"+
+ "\u0000\u0000\u0462\u045c\u0001\u0000\u0000\u0000\u0462\u045d\u0001\u0000"+
+ "\u0000\u0000\u0462\u045e\u0001\u0000\u0000\u0000\u0462\u045f\u0001\u0000"+
+ "\u0000\u0000\u0462\u0460\u0001\u0000\u0000\u0000\u0462\u0461\u0001\u0000"+
+ "\u0000\u0000\u0463\u00bd\u0001\u0000\u0000\u0000\u0464\u0465\u0005\u0007"+
+ "\u0000\u0000\u0465\u0466\u0003\u000e\u0007\u0000\u0466\u0467\u0005\b\u0000"+
+ "\u0000\u0467\u00bf\u0001\u0000\u0000\u0000\u0468\u0469\u0005\u0005\u0000"+
+ "\u0000\u0469\u046a\u0003H$\u0000\u046a\u00c1\u0001\u0000\u0000\u0000\u046b"+
+ "\u046d\u0005\t\u0000\u0000\u046c\u046e\u0003\\.\u0000\u046d\u046c\u0001"+
+ "\u0000\u0000\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u046f\u0001"+
+ "\u0000\u0000\u0000\u046f\u0470\u0005\n\u0000\u0000\u0470\u00c3\u0001\u0000"+
+ "\u0000\u0000\u0471\u0472\u00059\u0000\u0000\u0472\u00c5\u0001\u0000\u0000"+
+ "\u0000\u0473\u0474\u0005\u0010\u0000\u0000\u0474\u0475\u0005\u0007\u0000"+
+ "\u0000\u0475\u0476\u0003\\.\u0000\u0476\u0477\u0005\b\u0000\u0000\u0477"+
+ "\u00c7\u0001\u0000\u0000\u0000\u0478\u0479\u0005i\u0000\u0000\u0479\u047a"+
+ "\u0005\u0007\u0000\u0000\u047a\u047b\u0003\\.\u0000\u047b\u047c\u0005"+
+ "\b\u0000\u0000\u047c\u00c9\u0001\u0000\u0000\u0000\u047d\u047e\u0003H"+
+ "$\u0000\u047e\u047f\u0003\u00ccf\u0000\u047f\u00cb\u0001\u0000\u0000\u0000"+
+ "\u0480\u0487\u0005\t\u0000\u0000\u0481\u0483\u0003\u00ceg\u0000\u0482"+
+ "\u0484\u0005\u000e\u0000\u0000\u0483\u0482\u0001\u0000\u0000\u0000\u0483"+
+ "\u0484\u0001\u0000\u0000\u0000\u0484\u0486\u0001\u0000\u0000\u0000\u0485"+
+ "\u0481\u0001\u0000\u0000\u0000\u0486\u0489\u0001\u0000\u0000\u0000\u0487"+
+ "\u0485\u0001\u0000\u0000\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488"+
+ "\u048a\u0001\u0000\u0000\u0000\u0489\u0487\u0001\u0000\u0000\u0000\u048a"+
+ "\u048b\u0005\n\u0000\u0000\u048b\u00cd\u0001\u0000\u0000\u0000\u048c\u048f"+
+ "\u0003^/\u0000\u048d\u048f\u0005\u0087\u0000\u0000\u048e\u048c\u0001\u0000"+
+ "\u0000\u0000\u048e\u048d\u0001\u0000\u0000\u0000\u048f\u00cf\u0001\u0000"+
+ "\u0000\u0000\u0490\u0493\u0003\u00d2i\u0000\u0491\u0493\u0003\u00d4j\u0000"+
+ "\u0492\u0490\u0001\u0000\u0000\u0000\u0492\u0491\u0001\u0000\u0000\u0000"+
+ "\u0493\u00d1\u0001\u0000\u0000\u0000\u0494\u0495\u0003H$\u0000\u0495\u0496"+
+ "\u0005:\u0000\u0000\u0496\u0497\u0005\u0089\u0000\u0000\u0497\u00d3\u0001"+
+ "\u0000\u0000\u0000\u0498\u0499\u00032\u0019\u0000\u0499\u049a\u0005\u001f"+
+ "\u0000\u0000\u049a\u049c\u0005\t\u0000\u0000\u049b\u049d\u0003X,\u0000"+
+ "\u049c\u049b\u0001\u0000\u0000\u0000\u049c\u049d\u0001\u0000\u0000\u0000"+
+ "\u049d\u049e\u0001\u0000\u0000\u0000\u049e\u04a1\u0005\n\u0000\u0000\u049f"+
+ "\u04a0\u0005F\u0000\u0000\u04a0\u04a2\u0003\u00e6s\u0000\u04a1\u049f\u0001"+
+ "\u0000\u0000\u0000\u04a1\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a3\u0001"+
+ "\u0000\u0000\u0000\u04a3\u04a4\u0005\u0007\u0000\u0000\u04a4\u04a5\u0003"+
+ "\u0010\b\u0000\u04a5\u04a6\u0005\b\u0000\u0000\u04a6\u00d5\u0001\u0000"+
+ "\u0000\u0000\u04a7\u04a8\u0005s\u0000\u0000\u04a8\u04a9\u0005~\u0000\u0000"+
+ "\u04a9\u04aa\u0003^/\u0000\u04aa\u04ab\u0005z\u0000\u0000\u04ab\u04af"+
+ "\u0003^/\u0000\u04ac\u04ad\u0005G\u0000\u0000\u04ad\u04ae\u0005}\u0000"+
+ "\u0000\u04ae\u04b0\u0003^/\u0000\u04af\u04ac\u0001\u0000\u0000\u0000\u04af"+
+ "\u04b0\u0001\u0000\u0000\u0000\u04b0\u04bf\u0001\u0000\u0000\u0000\u04b1"+
+ "\u04b2\u0005s\u0000\u0000\u04b2\u04b3\u0005~\u0000\u0000\u04b3\u04b8\u0003"+
+ "\u00f4z\u0000\u04b4\u04b5\u0005\u000e\u0000\u0000\u04b5\u04b7\u0003\u00f4"+
+ "z\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b7\u04ba\u0001\u0000\u0000"+
+ "\u0000\u04b8\u04b6\u0001\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000"+
+ "\u0000\u04b9\u04bb\u0001\u0000\u0000\u0000\u04ba\u04b8\u0001\u0000\u0000"+
+ "\u0000\u04bb\u04bc\u0005z\u0000\u0000\u04bc\u04bd\u0003^/\u0000\u04bd"+
+ "\u04bf\u0001\u0000\u0000\u0000\u04be\u04a7\u0001\u0000\u0000\u0000\u04be"+
+ "\u04b1\u0001\u0000\u0000\u0000\u04bf\u00d7\u0001\u0000\u0000\u0000\u04c0"+
+ "\u04c1\u0005t\u0000\u0000\u04c1\u04c2\u0005~\u0000\u0000\u04c2\u04c3\u0003"+
+ "\u00e2q\u0000\u04c3\u00d9\u0001\u0000\u0000\u0000\u04c4\u04c5\u0005u\u0000"+
+ "\u0000\u04c5\u04c6\u0005~\u0000\u0000\u04c6\u04c7\u0003\u00e2q\u0000\u04c7"+
+ "\u04c8\u0005F\u0000\u0000\u04c8\u04c9\u0003^/\u0000\u04c9\u00db\u0001"+
+ "\u0000\u0000\u0000\u04ca\u04cb\u0005v\u0000\u0000\u04cb\u04cc\u0005{\u0000"+
+ "\u0000\u04cc\u04cd\u0005a\u0000\u0000\u04cd\u04ce\u0005~\u0000\u0000\u04ce"+
+ "\u04cf\u0003\u00e2q\u0000\u04cf\u04d0\u0005|\u0000\u0000\u04d0\u04d1\u0003"+
+ "^/\u0000\u04d1\u00dd\u0001\u0000\u0000\u0000\u04d2\u04d3\u0005w\u0000"+
+ "\u0000\u04d3\u04d8\u0003\u00e4r\u0000\u04d4\u04d5\u0005\u000e\u0000\u0000"+
+ "\u04d5\u04d7\u0003\u00e4r\u0000\u04d6\u04d4\u0001\u0000\u0000\u0000\u04d7"+
+ "\u04da\u0001\u0000\u0000\u0000\u04d8\u04d6\u0001\u0000\u0000\u0000\u04d8"+
+ "\u04d9\u0001\u0000\u0000\u0000\u04d9\u04db\u0001\u0000\u0000\u0000\u04da"+
+ "\u04d8\u0001\u0000\u0000\u0000\u04db\u04dc\u0005x\u0000\u0000\u04dc\u04dd"+
+ "\u0003^/\u0000\u04dd\u04de\u0005C\u0000\u0000\u04de\u04df\u0003^/\u0000"+
+ "\u04df\u00df\u0001\u0000\u0000\u0000\u04e0\u04e1\u0005y\u0000\u0000\u04e1"+
+ "\u04e2\u0005~\u0000\u0000\u04e2\u04e3\u0003^/\u0000\u04e3\u04e4\u0005"+
+ "z\u0000\u0000\u04e4\u04e5\u0003^/\u0000\u04e5\u00e1\u0001\u0000\u0000"+
+ "\u0000\u04e6\u04e9\u0003\u00bc^\u0000\u04e7\u04ea\u0003\u00b4Z\u0000\u04e8"+
+ "\u04ea\u0003\u00ba]\u0000\u04e9\u04e7\u0001\u0000\u0000\u0000\u04e9\u04e8"+
+ "\u0001\u0000\u0000\u0000\u04ea\u04eb\u0001\u0000\u0000\u0000\u04eb\u04e9"+
+ "\u0001\u0000\u0000\u0000\u04eb\u04ec\u0001\u0000\u0000\u0000\u04ec\u00e3"+
+ "\u0001\u0000\u0000\u0000\u04ed\u04ee\u0003\u00c0`\u0000\u04ee\u04ef\u0005"+
+ "\u0006\u0000\u0000\u04ef\u04f0\u0003^/\u0000\u04f0\u00e5\u0001\u0000\u0000"+
+ "\u0000\u04f1\u04f2\u0005\t\u0000\u0000\u04f2\u04fa\u0005\n\u0000\u0000"+
+ "\u04f3\u04f7\u0003\u00eau\u0000\u04f4\u04f8\u0005\u0087\u0000\u0000\u04f5"+
+ "\u04f8\u0005\u000b\u0000\u0000\u04f6\u04f8\u00050\u0000\u0000\u04f7\u04f4"+
+ "\u0001\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000\u0000\u04f7\u04f6"+
+ "\u0001\u0000\u0000\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8\u04fa"+
+ "\u0001\u0000\u0000\u0000\u04f9\u04f1\u0001\u0000\u0000\u0000\u04f9\u04f3"+
+ "\u0001\u0000\u0000\u0000\u04fa\u00e7\u0001\u0000\u0000\u0000\u04fb\u0504"+
+ "\u0005\u0007\u0000\u0000\u04fc\u0501\u0003\u00f4z\u0000\u04fd\u04fe\u0005"+
+ "\u000e\u0000\u0000\u04fe\u0500\u0003\u00f4z\u0000\u04ff\u04fd\u0001\u0000"+
+ "\u0000\u0000\u0500\u0503\u0001\u0000\u0000\u0000\u0501\u04ff\u0001\u0000"+
+ "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0505\u0001\u0000"+
+ "\u0000\u0000\u0503\u0501\u0001\u0000\u0000\u0000\u0504\u04fc\u0001\u0000"+
+ "\u0000\u0000\u0504\u0505\u0001\u0000\u0000\u0000\u0505\u0506\u0001\u0000"+
+ "\u0000\u0000\u0506\u050c\u0005\b\u0000\u0000\u0507\u0508\u0005;\u0000"+
+ "\u0000\u0508\u0509\u0003\\.\u0000\u0509\u050a\u0005<\u0000\u0000\u050a"+
+ "\u050c\u0001\u0000\u0000\u0000\u050b\u04fb\u0001\u0000\u0000\u0000\u050b"+
+ "\u0507\u0001\u0000\u0000\u0000\u050c\u00e9\u0001\u0000\u0000\u0000\u050d"+
+ "\u0511\u0003H$\u0000\u050e\u0511\u0005\u0088\u0000\u0000\u050f\u0511\u0003"+
+ "\u00ecv\u0000\u0510\u050d\u0001\u0000\u0000\u0000\u0510\u050e\u0001\u0000"+
+ "\u0000\u0000\u0510\u050f\u0001\u0000\u0000\u0000\u0511\u00eb\u0001\u0000"+
+ "\u0000\u0000\u0512\u0515\u0003\u00eew\u0000\u0513\u0515\u0003\u00f0x\u0000"+
+ "\u0514\u0512\u0001\u0000\u0000\u0000\u0514\u0513\u0001\u0000\u0000\u0000"+
+ "\u0515\u00ed\u0001\u0000\u0000\u0000\u0516\u0517\u0005\u001f\u0000\u0000"+
+ "\u0517\u0518\u0005\t\u0000\u0000\u0518\u0519\u0005\u000b\u0000\u0000\u0519"+
+ "\u051a\u0005\n\u0000\u0000\u051a\u00ef\u0001\u0000\u0000\u0000\u051b\u051c"+
+ "\u0005\u001f\u0000\u0000\u051c\u0525\u0005\t\u0000\u0000\u051d\u0522\u0003"+
+ "\u00e6s\u0000\u051e\u051f\u0005\u000e\u0000\u0000\u051f\u0521\u0003\u00e6"+
+ "s\u0000\u0520\u051e\u0001\u0000\u0000\u0000\u0521\u0524\u0001\u0000\u0000"+
+ "\u0000\u0522\u0520\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000"+
+ "\u0000\u0523\u0526\u0001\u0000\u0000\u0000\u0524\u0522\u0001\u0000\u0000"+
+ "\u0000\u0525\u051d\u0001\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000"+
+ "\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0005\n\u0000\u0000"+
+ "\u0528\u0529\u0005F\u0000\u0000\u0529\u052a\u0003\u00e6s\u0000\u052a\u00f1"+
+ "\u0001\u0000\u0000\u0000\u052b\u052d\u0003\u00eau\u0000\u052c\u052e\u0005"+
+ "\u0087\u0000\u0000\u052d\u052c\u0001\u0000\u0000\u0000\u052d\u052e\u0001"+
+ "\u0000\u0000\u0000\u052e\u00f3\u0001\u0000\u0000\u0000\u052f\u0532\u0003"+
+ "^/\u0000\u0530\u0532\u0005\u008f\u0000\u0000\u0531\u052f\u0001\u0000\u0000"+
+ "\u0000\u0531\u0530\u0001\u0000\u0000\u0000\u0532\u0533\u0001\u0000\u0000"+
+ "\u0000\u0533\u0534\u0007\u0006\u0000\u0000\u0534\u0535\u0003^/\u0000\u0535"+
+ "\u00f5\u0001\u0000\u0000\u0000\u0536\u0538\u00056\u0000\u0000\u0537\u0539"+
+ "\u0003\\.\u0000\u0538\u0537\u0001\u0000\u0000\u0000\u0538\u0539\u0001"+
+ "\u0000\u0000\u0000\u0539\u053a\u0001\u0000\u0000\u0000\u053a\u053b\u0005"+
+ "7\u0000\u0000\u053b\u00f7\u0001\u0000\u0000\u0000\u053c\u053d\u0003\u00fa"+
+ "}\u0000\u053d\u00f9\u0001\u0000\u0000\u0000\u053e\u053f\u0005\u0086\u0000"+
+ "\u0000\u053f\u00fb\u0001\u0000\u0000\u0000\u0540\u0541\u0007\u0007\u0000"+
+ "\u0000\u0541\u00fd\u0001\u0000\u0000\u0000\u0085\u0106\u010a\u011a\u0120"+
"\u0128\u0130\u0138\u0147\u0165\u016d\u016f\u0185\u018f\u0199\u019e\u01a3"+
- "\u01a7\u01b3\u01b7\u01c0\u01c7\u01d5\u01d9\u01de\u01e8\u01f0\u01f4\u0200"+
- "\u020c\u0222\u022a\u022f\u0232\u0236\u023f\u0248\u024b\u0253\u025a\u025c"+
- "\u0263\u026a\u026c\u0274\u0279\u0280\u0287\u0291\u0298\u029f\u02a6\u02af"+
- "\u02b9\u02bd\u02c5\u02c7\u02d3\u02d9\u02dd\u02e1\u02ec\u02f2\u0301\u0307"+
- "\u030b\u030f\u0316\u031d\u0323\u0328\u032a\u032e\u0335\u033c\u0345\u0351"+
- "\u035b\u0367\u036b\u0374\u037b\u0391\u0396\u039b\u039f\u03ab\u03b3\u03b7"+
- "\u03be\u03c5\u03cb\u03d2\u03da\u03e1\u03e7\u03ed\u03f3\u03f9\u0404\u040a"+
- "\u040f\u0417\u042c\u0435\u0437\u044e\u045f\u046a\u0480\u0484\u048b\u048f"+
- "\u0499\u049e\u04ac\u04b5\u04bb\u04d5\u04e6\u04e8\u04f4\u04f6\u04fe\u0501"+
- "\u0508\u050d\u0511\u051f\u0522\u052a\u052e\u0535";
+ "\u01a7\u01b3\u01b7\u01c0\u01c7\u01d5\u01d9\u01dc\u01e1\u01eb\u01f3\u01f7"+
+ "\u0203\u020f\u0225\u022d\u0232\u0235\u0239\u0242\u024b\u024e\u0256\u025d"+
+ "\u025f\u0266\u026d\u026f\u0277\u027c\u0283\u028a\u0294\u029b\u02a2\u02a9"+
+ "\u02b2\u02bc\u02c0\u02c8\u02ca\u02d6\u02dc\u02e0\u02e4\u02ef\u02f5\u0304"+
+ "\u030a\u030e\u0312\u0319\u0320\u0326\u032b\u032d\u0331\u0338\u033f\u0348"+
+ "\u0354\u035e\u036a\u036e\u0377\u037e\u0394\u0399\u039e\u03a2\u03ae\u03b6"+
+ "\u03ba\u03c1\u03c8\u03ce\u03d5\u03dd\u03e4\u03ea\u03f0\u03f6\u03fc\u0407"+
+ "\u040d\u0412\u041a\u042f\u0438\u043a\u0451\u0462\u046d\u0483\u0487\u048e"+
+ "\u0492\u049c\u04a1\u04af\u04b8\u04be\u04d8\u04e9\u04eb\u04f7\u04f9\u0501"+
+ "\u0504\u050b\u0510\u0514\u0522\u0525\u052d\u0531\u0538";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/org/rumbledb/parser/XQueryLexer.interp b/src/main/java/org/rumbledb/parser/XQueryLexer.interp
new file mode 100644
index 0000000000..f2c9eb2158
--- /dev/null
+++ b/src/main/java/org/rumbledb/parser/XQueryLexer.interp
@@ -0,0 +1,1035 @@
+token literal names:
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+
+token symbolic names:
+null
+EscapeQuot
+EscapeApos
+DOUBLE_LBRACE
+DOUBLE_RBRACE
+IntegerLiteral
+DecimalLiteral
+DoubleLiteral
+DFPropertyName
+PredefinedEntityRef
+CharRef
+Quot
+Apos
+COMMENT
+XMLDECL
+PI
+CDATA
+PRAGMA
+WS
+EQUAL
+NOT_EQUAL
+LPAREN
+RPAREN
+LBRACKET
+RBRACKET
+LBRACE
+RBRACE
+STAR
+PLUS
+MINUS
+COMMA
+DOT
+DDOT
+COLON
+COLON_EQ
+SEMICOLON
+SLASH
+DSLASH
+BACKSLASH
+VBAR
+LANGLE
+RANGLE
+QUESTION
+AT
+DOLLAR
+MOD
+BANG
+HASH
+CARAT
+ARROW
+GRAVE
+CONCATENATION
+TILDE
+KW_ALLOWING
+KW_ANCESTOR
+KW_ANCESTOR_OR_SELF
+KW_AND
+KW_ARRAY
+KW_AS
+KW_ASCENDING
+KW_AT
+KW_ATTRIBUTE
+KW_BASE_URI
+KW_BOUNDARY_SPACE
+KW_BINARY
+KW_BY
+KW_CASE
+KW_CAST
+KW_CASTABLE
+KW_CATCH
+KW_CHILD
+KW_COLLATION
+KW_COMMENT
+KW_CONSTRUCTION
+KW_CONTEXT
+KW_COPY_NS
+KW_COUNT
+KW_DECLARE
+KW_DEFAULT
+KW_DESCENDANT
+KW_DESCENDANT_OR_SELF
+KW_DESCENDING
+KW_DECIMAL_FORMAT
+KW_DIV
+KW_DOCUMENT
+KW_DOCUMENT_NODE
+KW_ELEMENT
+KW_ELSE
+KW_EMPTY
+KW_EMPTY_SEQUENCE
+KW_ENCODING
+KW_END
+KW_EQ
+KW_EVERY
+KW_EXCEPT
+KW_EXTERNAL
+KW_FOLLOWING
+KW_FOLLOWING_SIBLING
+KW_FOR
+KW_FUNCTION
+KW_GE
+KW_GREATEST
+KW_GROUP
+KW_GT
+KW_IDIV
+KW_IF
+KW_IMPORT
+KW_IN
+KW_INHERIT
+KW_INSTANCE
+KW_INTERSECT
+KW_IS
+KW_ITEM
+KW_LAX
+KW_LE
+KW_LEAST
+KW_LET
+KW_LT
+KW_MAP
+KW_MOD
+KW_MODULE
+KW_NAMESPACE
+KW_NE
+KW_NEXT
+KW_NAMESPACE_NODE
+KW_NO_INHERIT
+KW_NO_PRESERVE
+KW_NODE
+KW_OF
+KW_ONLY
+KW_OPTION
+KW_OR
+KW_ORDER
+KW_ORDERED
+KW_ORDERING
+KW_PARENT
+KW_PRECEDING
+KW_PRECEDING_SIBLING
+KW_PRESERVE
+KW_PREVIOUS
+KW_PI
+KW_RETURN
+KW_SATISFIES
+KW_SCHEMA
+KW_SCHEMA_ATTR
+KW_SCHEMA_ELEM
+KW_SELF
+KW_SLIDING
+KW_SOME
+KW_STABLE
+KW_START
+KW_STRICT
+KW_STRIP
+KW_SWITCH
+KW_TEXT
+KW_THEN
+KW_TO
+KW_TREAT
+KW_TRY
+KW_TUMBLING
+KW_TYPE
+KW_TYPESWITCH
+KW_UNION
+KW_UNORDERED
+KW_UPDATE
+KW_VALIDATE
+KW_VARIABLE
+KW_VERSION
+KW_WHEN
+KW_WHERE
+KW_WINDOW
+KW_XQUERY
+KW_ARRAY_NODE
+KW_BOOLEAN_NODE
+KW_NULL_NODE
+KW_NUMBER_NODE
+KW_OBJECT_NODE
+KW_REPLACE
+KW_WITH
+KW_VALUE
+KW_INSERT
+KW_INTO
+KW_DELETE
+KW_RENAME
+URIQualifiedName
+FullQName
+NCNameWithLocalWildcard
+NCNameWithPrefixWildcard
+NCName
+XQDOC_COMMENT_START
+XQDOC_COMMENT_END
+XQDocComment
+XQComment
+CHAR
+ENTER_STRING
+EXIT_INTERPOLATION
+ContentChar
+BASIC_CHAR
+ENTER_INTERPOLATION
+EXIT_STRING
+EscapeQuot_QuotString
+DOUBLE_LBRACE_QuotString
+DOUBLE_RBRACE_QuotString
+EscapeApos_AposString
+
+rule names:
+IntegerLiteral
+DecimalLiteral
+DoubleLiteral
+DFPropertyName
+Digits
+PredefinedEntityRef
+CharRef
+Quot
+Apos
+COMMENT
+XMLDECL
+PI
+CDATA
+PRAGMA
+WS
+EQUAL
+NOT_EQUAL
+LPAREN
+RPAREN
+LBRACKET
+RBRACKET
+LBRACE
+RBRACE
+STAR
+PLUS
+MINUS
+COMMA
+DOT
+DDOT
+COLON
+COLON_EQ
+SEMICOLON
+SLASH
+DSLASH
+BACKSLASH
+VBAR
+LANGLE
+RANGLE
+QUESTION
+AT
+DOLLAR
+MOD
+BANG
+HASH
+CARAT
+ARROW
+GRAVE
+CONCATENATION
+TILDE
+KW_ALLOWING
+KW_ANCESTOR
+KW_ANCESTOR_OR_SELF
+KW_AND
+KW_ARRAY
+KW_AS
+KW_ASCENDING
+KW_AT
+KW_ATTRIBUTE
+KW_BASE_URI
+KW_BOUNDARY_SPACE
+KW_BINARY
+KW_BY
+KW_CASE
+KW_CAST
+KW_CASTABLE
+KW_CATCH
+KW_CHILD
+KW_COLLATION
+KW_COMMENT
+KW_CONSTRUCTION
+KW_CONTEXT
+KW_COPY_NS
+KW_COUNT
+KW_DECLARE
+KW_DEFAULT
+KW_DESCENDANT
+KW_DESCENDANT_OR_SELF
+KW_DESCENDING
+KW_DECIMAL_FORMAT
+KW_DIV
+KW_DOCUMENT
+KW_DOCUMENT_NODE
+KW_ELEMENT
+KW_ELSE
+KW_EMPTY
+KW_EMPTY_SEQUENCE
+KW_ENCODING
+KW_END
+KW_EQ
+KW_EVERY
+KW_EXCEPT
+KW_EXTERNAL
+KW_FOLLOWING
+KW_FOLLOWING_SIBLING
+KW_FOR
+KW_FUNCTION
+KW_GE
+KW_GREATEST
+KW_GROUP
+KW_GT
+KW_IDIV
+KW_IF
+KW_IMPORT
+KW_IN
+KW_INHERIT
+KW_INSTANCE
+KW_INTERSECT
+KW_IS
+KW_ITEM
+KW_LAX
+KW_LE
+KW_LEAST
+KW_LET
+KW_LT
+KW_MAP
+KW_MOD
+KW_MODULE
+KW_NAMESPACE
+KW_NE
+KW_NEXT
+KW_NAMESPACE_NODE
+KW_NO_INHERIT
+KW_NO_PRESERVE
+KW_NODE
+KW_OF
+KW_ONLY
+KW_OPTION
+KW_OR
+KW_ORDER
+KW_ORDERED
+KW_ORDERING
+KW_PARENT
+KW_PRECEDING
+KW_PRECEDING_SIBLING
+KW_PRESERVE
+KW_PREVIOUS
+KW_PI
+KW_RETURN
+KW_SATISFIES
+KW_SCHEMA
+KW_SCHEMA_ATTR
+KW_SCHEMA_ELEM
+KW_SELF
+KW_SLIDING
+KW_SOME
+KW_STABLE
+KW_START
+KW_STRICT
+KW_STRIP
+KW_SWITCH
+KW_TEXT
+KW_THEN
+KW_TO
+KW_TREAT
+KW_TRY
+KW_TUMBLING
+KW_TYPE
+KW_TYPESWITCH
+KW_UNION
+KW_UNORDERED
+KW_UPDATE
+KW_VALIDATE
+KW_VARIABLE
+KW_VERSION
+KW_WHEN
+KW_WHERE
+KW_WINDOW
+KW_XQUERY
+KW_ARRAY_NODE
+KW_BOOLEAN_NODE
+KW_NULL_NODE
+KW_NUMBER_NODE
+KW_OBJECT_NODE
+KW_REPLACE
+KW_WITH
+KW_VALUE
+KW_INSERT
+KW_INTO
+KW_DELETE
+KW_RENAME
+URIQualifiedName
+FullQName
+NCNameWithLocalWildcard
+NCNameWithPrefixWildcard
+NCName
+NameStartChar
+NameChar
+XQDOC_COMMENT_START
+XQDOC_COMMENT_END
+XQDocComment
+XQComment
+CHAR
+ENTER_STRING
+EXIT_INTERPOLATION
+ContentChar
+BASIC_CHAR
+GRAVE_STRING
+RBRACKET_STRING
+LBRACE_STRING
+ENTER_INTERPOLATION
+EXIT_STRING
+EscapeQuot_QuotString
+Quot_QuotString
+DOUBLE_LBRACE_QuotString
+DOUBLE_RBRACE_QuotString
+LBRACE_QuotString
+RBRACE_QuotString
+PredefinedEntityRef_QuotString
+CharRef_QuotString
+ContentChar_QuotString
+EscapeApos_AposString
+Apos_AposString
+DOUBLE_LBRACE_AposString
+DOUBLE_RBRACE_AposString
+LBRACE_AposString
+RBRACE_AposString
+PredefinedEntityRef_AposString
+CharRef_AposString
+ContentChar_AposString
+INT_QUOT_IntegerLiteral
+INT_QUOT_DecimalLiteral
+INT_QUOT_DoubleLiteral
+INT_QUOT_DFPropertyName
+INT_QUOT_PredefinedEntityRef
+INT_QUOT_CharRef
+INT_QUOT_EscapeQuot
+INT_QUOT_Apos
+INT_QUOT_Quot
+INT_QUOT_COMMENT
+INT_QUOT_XMLDECL
+INT_QUOT_PI
+INT_QUOT_CDATA
+INT_QUOT_PRAGMA
+INT_QUOT_WS
+INT_QUOT_EQUAL
+INT_QUOT_NOT_EQUAL
+INT_QUOT_LPAREN
+INT_QUOT_RPAREN
+INT_QUOT_LBRACKET
+INT_QUOT_RBRACKET
+INT_QUOT_LBRACE
+INT_QUOT_RBRACE_EXIT
+INT_QUOT_RBRACE
+INT_QUOT_STAR
+INT_QUOT_PLUS
+INT_QUOT_MINUS
+INT_QUOT_COMMA
+INT_QUOT_DOT
+INT_QUOT_DDOT
+INT_QUOT_COLON
+INT_QUOT_COLON_EQ
+INT_QUOT_SEMICOLON
+INT_QUOT_SLASH
+INT_QUOT_DSLASH
+INT_QUOT_BACKSLASH
+INT_QUOT_VBAR
+INT_QUOT_LANGLE
+INT_QUOT_RANGLE
+INT_QUOT_QUESTION
+INT_QUOT_AT
+INT_QUOT_DOLLAR
+INT_QUOT_MOD
+INT_QUOT_BANG
+INT_QUOT_HASH
+INT_QUOT_CARAT
+INT_QUOT_ARROW
+INT_QUOT_GRAVE
+INT_QUOT_CONCATENATION
+INT_QUOT_TILDE
+INT_QUOT_KW_ALLOWING
+INT_QUOT_KW_ANCESTOR
+INT_QUOT_KW_ANCESTOR_OR_SELF
+INT_QUOT_KW_AND
+INT_QUOT_KW_ARRAY
+INT_QUOT_KW_AS
+INT_QUOT_KW_ASCENDING
+INT_QUOT_KW_AT
+INT_QUOT_KW_ATTRIBUTE
+INT_QUOT_KW_BASE_URI
+INT_QUOT_KW_BOUNDARY_SPACE
+INT_QUOT_KW_BINARY
+INT_QUOT_KW_BY
+INT_QUOT_KW_CASE
+INT_QUOT_KW_CAST
+INT_QUOT_KW_CASTABLE
+INT_QUOT_KW_CATCH
+INT_QUOT_KW_CHILD
+INT_QUOT_KW_COLLATION
+INT_QUOT_KW_COMMENT
+INT_QUOT_KW_CONSTRUCTION
+INT_QUOT_KW_CONTEXT
+INT_QUOT_KW_COPY_NS
+INT_QUOT_KW_COUNT
+INT_QUOT_KW_DECLARE
+INT_QUOT_KW_DEFAULT
+INT_QUOT_KW_DESCENDANT
+INT_QUOT_KW_DESCENDANT_OR_SELF
+INT_QUOT_KW_DESCENDING
+INT_QUOT_KW_DECIMAL_FORMAT
+INT_QUOT_KW_DIV
+INT_QUOT_KW_DOCUMENT
+INT_QUOT_KW_DOCUMENT_NODE
+INT_QUOT_KW_ELEMENT
+INT_QUOT_KW_ELSE
+INT_QUOT_KW_EMPTY
+INT_QUOT_KW_EMPTY_SEQUENCE
+INT_QUOT_KW_ENCODING
+INT_QUOT_KW_END
+INT_QUOT_KW_EQ
+INT_QUOT_KW_EVERY
+INT_QUOT_KW_EXCEPT
+INT_QUOT_KW_EXTERNAL
+INT_QUOT_KW_FOLLOWING
+INT_QUOT_KW_FOLLOWING_SIBLING
+INT_QUOT_KW_FOR
+INT_QUOT_KW_FUNCTION
+INT_QUOT_KW_GE
+INT_QUOT_KW_GREATEST
+INT_QUOT_KW_GROUP
+INT_QUOT_KW_GT
+INT_QUOT_KW_IDIV
+INT_QUOT_KW_IF
+INT_QUOT_KW_IMPORT
+INT_QUOT_KW_IN
+INT_QUOT_KW_INHERIT
+INT_QUOT_KW_INSTANCE
+INT_QUOT_KW_INTERSECT
+INT_QUOT_KW_IS
+INT_QUOT_KW_ITEM
+INT_QUOT_KW_LAX
+INT_QUOT_KW_LE
+INT_QUOT_KW_LEAST
+INT_QUOT_KW_LET
+INT_QUOT_KW_LT
+INT_QUOT_KW_MAP
+INT_QUOT_KW_MOD
+INT_QUOT_KW_MODULE
+INT_QUOT_KW_NAMESPACE
+INT_QUOT_KW_NE
+INT_QUOT_KW_NEXT
+INT_QUOT_KW_NAMESPACE_NODE
+INT_QUOT_KW_NO_INHERIT
+INT_QUOT_KW_NO_PRESERVE
+INT_QUOT_KW_NODE
+INT_QUOT_KW_OF
+INT_QUOT_KW_ONLY
+INT_QUOT_KW_OPTION
+INT_QUOT_KW_OR
+INT_QUOT_KW_ORDER
+INT_QUOT_KW_ORDERED
+INT_QUOT_KW_ORDERING
+INT_QUOT_KW_PARENT
+INT_QUOT_KW_PRECEDING
+INT_QUOT_KW_PRECEDING_SIBLING
+INT_QUOT_KW_PRESERVE
+INT_QUOT_KW_PREVIOUS
+INT_QUOT_KW_PI
+INT_QUOT_KW_RETURN
+INT_QUOT_KW_SATISFIES
+INT_QUOT_KW_SCHEMA
+INT_QUOT_KW_SCHEMA_ATTR
+INT_QUOT_KW_SCHEMA_ELEM
+INT_QUOT_KW_SELF
+INT_QUOT_KW_SLIDING
+INT_QUOT_KW_SOME
+INT_QUOT_KW_STABLE
+INT_QUOT_KW_START
+INT_QUOT_KW_STRICT
+INT_QUOT_KW_STRIP
+INT_QUOT_KW_SWITCH
+INT_QUOT_KW_TEXT
+INT_QUOT_KW_THEN
+INT_QUOT_KW_TO
+INT_QUOT_KW_TREAT
+INT_QUOT_KW_TRY
+INT_QUOT_KW_TUMBLING
+INT_QUOT_KW_TYPE
+INT_QUOT_KW_TYPESWITCH
+INT_QUOT_KW_UNION
+INT_QUOT_KW_UNORDERED
+INT_QUOT_KW_UPDATE
+INT_QUOT_KW_VALIDATE
+INT_QUOT_KW_VARIABLE
+INT_QUOT_KW_VERSION
+INT_QUOT_KW_WHEN
+INT_QUOT_KW_WHERE
+INT_QUOT_KW_WINDOW
+INT_QUOT_KW_XQUERY
+INT_QUOT_KW_ARRAY_NODE
+INT_QUOT_KW_BOOLEAN_NODE
+INT_QUOT_KW_NULL_NODE
+INT_QUOT_KW_NUMBER_NODE
+INT_QUOT_KW_OBJECT_NODE
+INT_QUOT_KW_REPLACE
+INT_QUOT_KW_WITH
+INT_QUOT_KW_VALUE
+INT_QUOT_KW_INSERT
+INT_QUOT_KW_INTO
+INT_QUOT_KW_DELETE
+INT_QUOT_KW_RENAME
+INT_QUOT_URIQualifiedName
+INT_QUOT_FullQName
+INT_QUOT_NCNameWithLocalWildcard
+INT_QUOT_NCNameWithPrefixWildcard
+INT_QUOT_NCName
+INT_QUOT_XQDOC_COMMENT_START
+INT_QUOT_XQDOC_COMMENT_END
+INT_QUOT_XQDocComment
+INT_QUOT_XQComment
+INT_QUOT_CHAR
+INT_QUOT_ENTER_STRING
+INT_QUOT_EXIT_INTERPOLATION
+INT_ContentChar
+INT_APOS_IntegerLiteral
+INT_APOS_DecimalLiteral
+INT_APOS_DoubleLiteral
+INT_APOS_DFPropertyName
+INT_APOS_PredefinedEntityRef
+INT_APOS_CharRef
+INT_APOS_EscapeApos
+INT_APOS_Quot
+INT_APOS_Apos
+INT_APOS_COMMENT
+INT_APOS_XMLDECL
+INT_APOS_PI
+INT_APOS_CDATA
+INT_APOS_PRAGMA
+INT_APOS_WS
+INT_APOS_EQUAL
+INT_APOS_NOT_EQUAL
+INT_APOS_LPAREN
+INT_APOS_RPAREN
+INT_APOS_LBRACKET
+INT_APOS_RBRACKET
+INT_APOS_LBRACE
+INT_APOS_RBRACE_EXIT
+INT_APOS_RBRACE
+INT_APOS_STAR
+INT_APOS_PLUS
+INT_APOS_MINUS
+INT_APOS_COMMA
+INT_APOS_DOT
+INT_APOS_DDOT
+INT_APOS_COLON
+INT_APOS_COLON_EQ
+INT_APOS_SEMICOLON
+INT_APOS_SLASH
+INT_APOS_DSLASH
+INT_APOS_BACKSLASH
+INT_APOS_VBAR
+INT_APOS_LANGLE
+INT_APOS_RANGLE
+INT_APOS_QUESTION
+INT_APOS_AT
+INT_APOS_DOLLAR
+INT_APOS_MOD
+INT_APOS_BANG
+INT_APOS_HASH
+INT_APOS_CARAT
+INT_APOS_ARROW
+INT_APOS_GRAVE
+INT_APOS_CONCATENATION
+INT_APOS_TILDE
+INT_APOS_KW_ALLOWING
+INT_APOS_KW_ANCESTOR
+INT_APOS_KW_ANCESTOR_OR_SELF
+INT_APOS_KW_AND
+INT_APOS_KW_ARRAY
+INT_APOS_KW_AS
+INT_APOS_KW_ASCENDING
+INT_APOS_KW_AT
+INT_APOS_KW_ATTRIBUTE
+INT_APOS_KW_BASE_URI
+INT_APOS_KW_BOUNDARY_SPACE
+INT_APOS_KW_BINARY
+INT_APOS_KW_BY
+INT_APOS_KW_CASE
+INT_APOS_KW_CAST
+INT_APOS_KW_CASTABLE
+INT_APOS_KW_CATCH
+INT_APOS_KW_CHILD
+INT_APOS_KW_COLLATION
+INT_APOS_KW_COMMENT
+INT_APOS_KW_CONSTRUCTION
+INT_APOS_KW_CONTEXT
+INT_APOS_KW_COPY_NS
+INT_APOS_KW_COUNT
+INT_APOS_KW_DECLARE
+INT_APOS_KW_DEFAULT
+INT_APOS_KW_DESCENDANT
+INT_APOS_KW_DESCENDANT_OR_SELF
+INT_APOS_KW_DESCENDING
+INT_APOS_KW_DECIMAL_FORMAT
+INT_APOS_KW_DIV
+INT_APOS_KW_DOCUMENT
+INT_APOS_KW_DOCUMENT_NODE
+INT_APOS_KW_ELEMENT
+INT_APOS_KW_ELSE
+INT_APOS_KW_EMPTY
+INT_APOS_KW_EMPTY_SEQUENCE
+INT_APOS_KW_ENCODING
+INT_APOS_KW_END
+INT_APOS_KW_EQ
+INT_APOS_KW_EVERY
+INT_APOS_KW_EXCEPT
+INT_APOS_KW_EXTERNAL
+INT_APOS_KW_FOLLOWING
+INT_APOS_KW_FOLLOWING_SIBLING
+INT_APOS_KW_FOR
+INT_APOS_KW_FUNCTION
+INT_APOS_KW_GE
+INT_APOS_KW_GREATEST
+INT_APOS_KW_GROUP
+INT_APOS_KW_GT
+INT_APOS_KW_IDIV
+INT_APOS_KW_IF
+INT_APOS_KW_IMPORT
+INT_APOS_KW_IN
+INT_APOS_KW_INHERIT
+INT_APOS_KW_INSTANCE
+INT_APOS_KW_INTERSECT
+INT_APOS_KW_IS
+INT_APOS_KW_ITEM
+INT_APOS_KW_LAX
+INT_APOS_KW_LE
+INT_APOS_KW_LEAST
+INT_APOS_KW_LET
+INT_APOS_KW_LT
+INT_APOS_KW_MAP
+INT_APOS_KW_MOD
+INT_APOS_KW_MODULE
+INT_APOS_KW_NAMESPACE
+INT_APOS_KW_NE
+INT_APOS_KW_NEXT
+INT_APOS_KW_NAMESPACE_NODE
+INT_APOS_KW_NO_INHERIT
+INT_APOS_KW_NO_PRESERVE
+INT_APOS_KW_NODE
+INT_APOS_KW_OF
+INT_APOS_KW_ONLY
+INT_APOS_KW_OPTION
+INT_APOS_KW_OR
+INT_APOS_KW_ORDER
+INT_APOS_KW_ORDERED
+INT_APOS_KW_ORDERING
+INT_APOS_KW_PARENT
+INT_APOS_KW_PRECEDING
+INT_APOS_KW_PRECEDING_SIBLING
+INT_APOS_KW_PRESERVE
+INT_APOS_KW_PREVIOUS
+INT_APOS_KW_PI
+INT_APOS_KW_RETURN
+INT_APOS_KW_SATISFIES
+INT_APOS_KW_SCHEMA
+INT_APOS_KW_SCHEMA_ATTR
+INT_APOS_KW_SCHEMA_ELEM
+INT_APOS_KW_SELF
+INT_APOS_KW_SLIDING
+INT_APOS_KW_SOME
+INT_APOS_KW_STABLE
+INT_APOS_KW_START
+INT_APOS_KW_STRICT
+INT_APOS_KW_STRIP
+INT_APOS_KW_SWITCH
+INT_APOS_KW_TEXT
+INT_APOS_KW_THEN
+INT_APOS_KW_TO
+INT_APOS_KW_TREAT
+INT_APOS_KW_TRY
+INT_APOS_KW_TUMBLING
+INT_APOS_KW_TYPE
+INT_APOS_KW_TYPESWITCH
+INT_APOS_KW_UNION
+INT_APOS_KW_UNORDERED
+INT_APOS_KW_UPDATE
+INT_APOS_KW_VALIDATE
+INT_APOS_KW_VARIABLE
+INT_APOS_KW_VERSION
+INT_APOS_KW_WHEN
+INT_APOS_KW_WHERE
+INT_APOS_KW_WINDOW
+INT_APOS_KW_XQUERY
+INT_APOS_KW_ARRAY_NODE
+INT_APOS_KW_BOOLEAN_NODE
+INT_APOS_KW_NULL_NODE
+INT_APOS_KW_NUMBER_NODE
+INT_APOS_KW_OBJECT_NODE
+INT_APOS_KW_REPLACE
+INT_APOS_KW_WITH
+INT_APOS_KW_VALUE
+INT_APOS_KW_INSERT
+INT_APOS_KW_INTO
+INT_APOS_KW_DELETE
+INT_APOS_KW_RENAME
+INT_APOS_URIQualifiedName
+INT_APOS_FullQName
+INT_APOS_NCNameWithLocalWildcard
+INT_APOS_NCNameWithPrefixWildcard
+INT_APOS_NCName
+INT_APOS_XQDOC_COMMENT_START
+INT_APOS_XQDOC_COMMENT_END
+INT_APOS_XQDocComment
+INT_APOS_XQComment
+INT_APOS_CHAR
+INT_APOS_ENTER_STRING
+INT_APOS_EXIT_INTERPOLATION
+INT_APOS_ContentChar
+
+channel names:
+DEFAULT_TOKEN_CHANNEL
+HIDDEN
+
+mode names:
+DEFAULT_MODE
+STRING_MODE
+QUOT_LITERAL_STRING
+APOS_LITERAL_STRING
+STRING_INTERPOLATION_MODE_QUOT
+STRING_INTERPOLATION_MODE_APOS
+
+atn:
+[4, 0, 203, 6735, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 2, 346, 7, 346, 2, 347, 7, 347, 2, 348, 7, 348, 2, 349, 7, 349, 2, 350, 7, 350, 2, 351, 7, 351, 2, 352, 7, 352, 2, 353, 7, 353, 2, 354, 7, 354, 2, 355, 7, 355, 2, 356, 7, 356, 2, 357, 7, 357, 2, 358, 7, 358, 2, 359, 7, 359, 2, 360, 7, 360, 2, 361, 7, 361, 2, 362, 7, 362, 2, 363, 7, 363, 2, 364, 7, 364, 2, 365, 7, 365, 2, 366, 7, 366, 2, 367, 7, 367, 2, 368, 7, 368, 2, 369, 7, 369, 2, 370, 7, 370, 2, 371, 7, 371, 2, 372, 7, 372, 2, 373, 7, 373, 2, 374, 7, 374, 2, 375, 7, 375, 2, 376, 7, 376, 2, 377, 7, 377, 2, 378, 7, 378, 2, 379, 7, 379, 2, 380, 7, 380, 2, 381, 7, 381, 2, 382, 7, 382, 2, 383, 7, 383, 2, 384, 7, 384, 2, 385, 7, 385, 2, 386, 7, 386, 2, 387, 7, 387, 2, 388, 7, 388, 2, 389, 7, 389, 2, 390, 7, 390, 2, 391, 7, 391, 2, 392, 7, 392, 2, 393, 7, 393, 2, 394, 7, 394, 2, 395, 7, 395, 2, 396, 7, 396, 2, 397, 7, 397, 2, 398, 7, 398, 2, 399, 7, 399, 2, 400, 7, 400, 2, 401, 7, 401, 2, 402, 7, 402, 2, 403, 7, 403, 2, 404, 7, 404, 2, 405, 7, 405, 2, 406, 7, 406, 2, 407, 7, 407, 2, 408, 7, 408, 2, 409, 7, 409, 2, 410, 7, 410, 2, 411, 7, 411, 2, 412, 7, 412, 2, 413, 7, 413, 2, 414, 7, 414, 2, 415, 7, 415, 2, 416, 7, 416, 2, 417, 7, 417, 2, 418, 7, 418, 2, 419, 7, 419, 2, 420, 7, 420, 2, 421, 7, 421, 2, 422, 7, 422, 2, 423, 7, 423, 2, 424, 7, 424, 2, 425, 7, 425, 2, 426, 7, 426, 2, 427, 7, 427, 2, 428, 7, 428, 2, 429, 7, 429, 2, 430, 7, 430, 2, 431, 7, 431, 2, 432, 7, 432, 2, 433, 7, 433, 2, 434, 7, 434, 2, 435, 7, 435, 2, 436, 7, 436, 2, 437, 7, 437, 2, 438, 7, 438, 2, 439, 7, 439, 2, 440, 7, 440, 2, 441, 7, 441, 2, 442, 7, 442, 2, 443, 7, 443, 2, 444, 7, 444, 2, 445, 7, 445, 2, 446, 7, 446, 2, 447, 7, 447, 2, 448, 7, 448, 2, 449, 7, 449, 2, 450, 7, 450, 2, 451, 7, 451, 2, 452, 7, 452, 2, 453, 7, 453, 2, 454, 7, 454, 2, 455, 7, 455, 2, 456, 7, 456, 2, 457, 7, 457, 2, 458, 7, 458, 2, 459, 7, 459, 2, 460, 7, 460, 2, 461, 7, 461, 2, 462, 7, 462, 2, 463, 7, 463, 2, 464, 7, 464, 2, 465, 7, 465, 2, 466, 7, 466, 2, 467, 7, 467, 2, 468, 7, 468, 2, 469, 7, 469, 2, 470, 7, 470, 2, 471, 7, 471, 2, 472, 7, 472, 2, 473, 7, 473, 2, 474, 7, 474, 2, 475, 7, 475, 2, 476, 7, 476, 2, 477, 7, 477, 2, 478, 7, 478, 2, 479, 7, 479, 2, 480, 7, 480, 2, 481, 7, 481, 2, 482, 7, 482, 2, 483, 7, 483, 2, 484, 7, 484, 2, 485, 7, 485, 2, 486, 7, 486, 2, 487, 7, 487, 2, 488, 7, 488, 2, 489, 7, 489, 2, 490, 7, 490, 2, 491, 7, 491, 2, 492, 7, 492, 2, 493, 7, 493, 2, 494, 7, 494, 2, 495, 7, 495, 2, 496, 7, 496, 2, 497, 7, 497, 2, 498, 7, 498, 2, 499, 7, 499, 2, 500, 7, 500, 2, 501, 7, 501, 2, 502, 7, 502, 2, 503, 7, 503, 2, 504, 7, 504, 2, 505, 7, 505, 2, 506, 7, 506, 2, 507, 7, 507, 2, 508, 7, 508, 2, 509, 7, 509, 2, 510, 7, 510, 2, 511, 7, 511, 2, 512, 7, 512, 2, 513, 7, 513, 2, 514, 7, 514, 2, 515, 7, 515, 2, 516, 7, 516, 2, 517, 7, 517, 2, 518, 7, 518, 2, 519, 7, 519, 2, 520, 7, 520, 2, 521, 7, 521, 2, 522, 7, 522, 2, 523, 7, 523, 2, 524, 7, 524, 2, 525, 7, 525, 2, 526, 7, 526, 2, 527, 7, 527, 2, 528, 7, 528, 2, 529, 7, 529, 2, 530, 7, 530, 2, 531, 7, 531, 2, 532, 7, 532, 2, 533, 7, 533, 2, 534, 7, 534, 2, 535, 7, 535, 2, 536, 7, 536, 2, 537, 7, 537, 2, 538, 7, 538, 2, 539, 7, 539, 2, 540, 7, 540, 2, 541, 7, 541, 2, 542, 7, 542, 2, 543, 7, 543, 2, 544, 7, 544, 2, 545, 7, 545, 2, 546, 7, 546, 2, 547, 7, 547, 2, 548, 7, 548, 2, 549, 7, 549, 2, 550, 7, 550, 2, 551, 7, 551, 2, 552, 7, 552, 2, 553, 7, 553, 2, 554, 7, 554, 2, 555, 7, 555, 2, 556, 7, 556, 2, 557, 7, 557, 2, 558, 7, 558, 2, 559, 7, 559, 2, 560, 7, 560, 2, 561, 7, 561, 2, 562, 7, 562, 2, 563, 7, 563, 2, 564, 7, 564, 2, 565, 7, 565, 2, 566, 7, 566, 2, 567, 7, 567, 2, 568, 7, 568, 2, 569, 7, 569, 2, 570, 7, 570, 2, 571, 7, 571, 2, 572, 7, 572, 2, 573, 7, 573, 2, 574, 7, 574, 2, 575, 7, 575, 2, 576, 7, 576, 2, 577, 7, 577, 2, 578, 7, 578, 2, 579, 7, 579, 2, 580, 7, 580, 2, 581, 7, 581, 2, 582, 7, 582, 2, 583, 7, 583, 2, 584, 7, 584, 2, 585, 7, 585, 2, 586, 7, 586, 2, 587, 7, 587, 2, 588, 7, 588, 2, 589, 7, 589, 2, 590, 7, 590, 2, 591, 7, 591, 2, 592, 7, 592, 2, 593, 7, 593, 2, 594, 7, 594, 2, 595, 7, 595, 2, 596, 7, 596, 2, 597, 7, 597, 2, 598, 7, 598, 2, 599, 7, 599, 2, 600, 7, 600, 2, 601, 7, 601, 2, 602, 7, 602, 2, 603, 7, 603, 2, 604, 7, 604, 2, 605, 7, 605, 2, 606, 7, 606, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1228, 8, 1, 10, 1, 12, 1, 1231, 9, 1, 3, 1, 1233, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 1240, 8, 2, 10, 2, 12, 2, 1243, 9, 2, 3, 2, 1245, 8, 2, 3, 2, 1247, 8, 2, 1, 2, 1, 2, 3, 2, 1251, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1377, 8, 3, 1, 4, 4, 4, 1380, 8, 4, 11, 4, 12, 4, 1381, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 1400, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1408, 8, 6, 11, 6, 12, 6, 1409, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1418, 8, 6, 11, 6, 12, 6, 1419, 1, 6, 3, 6, 1423, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 1441, 8, 9, 10, 9, 12, 9, 1444, 9, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 1458, 8, 10, 10, 10, 12, 10, 1461, 9, 10, 3, 10, 1463, 8, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 1474, 8, 11, 10, 11, 12, 11, 1477, 9, 11, 3, 11, 1479, 8, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 1495, 8, 12, 10, 12, 12, 12, 1498, 9, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1508, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1513, 8, 13, 1, 13, 1, 13, 1, 13, 5, 13, 1518, 8, 13, 10, 13, 12, 13, 1521, 9, 13, 3, 13, 1523, 8, 13, 1, 13, 1, 13, 1, 13, 1, 14, 4, 14, 1529, 8, 14, 11, 14, 12, 14, 1530, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 2642, 8, 180, 10, 180, 12, 180, 2645, 9, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 5, 184, 2664, 8, 184, 10, 184, 12, 184, 2667, 9, 184, 1, 185, 3, 185, 2670, 8, 185, 1, 186, 1, 186, 3, 186, 2674, 8, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 4, 188, 2681, 8, 188, 11, 188, 12, 188, 2682, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 5, 189, 2693, 8, 189, 10, 189, 12, 189, 2696, 9, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 5, 190, 2710, 8, 190, 10, 190, 12, 190, 2713, 9, 190, 1, 190, 5, 190, 2716, 8, 190, 10, 190, 12, 190, 2719, 9, 190, 1, 190, 4, 190, 2722, 8, 190, 11, 190, 12, 190, 2723, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 3, 207, 2815, 8, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2825, 8, 208, 11, 208, 12, 208, 2826, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2835, 8, 208, 11, 208, 12, 208, 2836, 1, 208, 3, 208, 2840, 8, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 3, 216, 2893, 8, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2903, 8, 217, 11, 217, 12, 217, 2904, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2913, 8, 217, 11, 217, 12, 217, 2914, 1, 217, 3, 217, 2918, 8, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 5, 220, 2935, 8, 220, 10, 220, 12, 220, 2938, 9, 220, 3, 220, 2940, 8, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 5, 221, 2949, 8, 221, 10, 221, 12, 221, 2952, 9, 221, 3, 221, 2954, 8, 221, 3, 221, 2956, 8, 221, 1, 221, 1, 221, 3, 221, 2960, 8, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 3088, 8, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 3, 223, 3108, 8, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3118, 8, 224, 11, 224, 12, 224, 3119, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3128, 8, 224, 11, 224, 12, 224, 3129, 1, 224, 3, 224, 3133, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 5, 228, 3161, 8, 228, 10, 228, 12, 228, 3164, 9, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 5, 229, 3180, 8, 229, 10, 229, 12, 229, 3183, 9, 229, 3, 229, 3185, 8, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 5, 230, 3198, 8, 230, 10, 230, 12, 230, 3201, 9, 230, 3, 230, 3203, 8, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 5, 231, 3221, 8, 231, 10, 231, 12, 231, 3224, 9, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3236, 8, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3241, 8, 232, 1, 232, 1, 232, 1, 232, 5, 232, 3246, 8, 232, 10, 232, 12, 232, 3249, 9, 232, 3, 232, 3251, 8, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 4, 233, 3259, 8, 233, 11, 233, 12, 233, 3260, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 347, 1, 347, 1, 347, 1, 347, 1, 347, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 5, 400, 4712, 8, 400, 10, 400, 12, 400, 4715, 9, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 404, 1, 404, 5, 404, 4742, 8, 404, 10, 404, 12, 404, 4745, 9, 404, 1, 404, 1, 404, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 406, 4, 406, 4756, 8, 406, 11, 406, 12, 406, 4757, 1, 406, 1, 406, 1, 406, 1, 406, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 5, 407, 4770, 8, 407, 10, 407, 12, 407, 4773, 9, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 5, 408, 4789, 8, 408, 10, 408, 12, 408, 4792, 9, 408, 1, 408, 5, 408, 4795, 8, 408, 10, 408, 12, 408, 4798, 9, 408, 1, 408, 4, 408, 4801, 8, 408, 11, 408, 12, 408, 4802, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 409, 1, 409, 1, 409, 1, 409, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 412, 1, 412, 1, 412, 1, 412, 1, 413, 1, 413, 1, 413, 1, 413, 1, 414, 1, 414, 1, 414, 1, 414, 1, 414, 5, 414, 4840, 8, 414, 10, 414, 12, 414, 4843, 9, 414, 3, 414, 4845, 8, 414, 1, 414, 1, 414, 1, 415, 1, 415, 1, 415, 1, 415, 1, 415, 5, 415, 4854, 8, 415, 10, 415, 12, 415, 4857, 9, 415, 3, 415, 4859, 8, 415, 3, 415, 4861, 8, 415, 1, 415, 1, 415, 3, 415, 4865, 8, 415, 1, 415, 1, 415, 1, 415, 1, 415, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 3, 416, 4993, 8, 416, 1, 416, 1, 416, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 3, 417, 5013, 8, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5023, 8, 418, 11, 418, 12, 418, 5024, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5033, 8, 418, 11, 418, 12, 418, 5034, 1, 418, 3, 418, 5038, 8, 418, 1, 418, 1, 418, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 420, 1, 420, 1, 420, 1, 420, 1, 420, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 5, 422, 5066, 8, 422, 10, 422, 12, 422, 5069, 9, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 5, 423, 5085, 8, 423, 10, 423, 12, 423, 5088, 9, 423, 3, 423, 5090, 8, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 5, 424, 5103, 8, 424, 10, 424, 12, 424, 5106, 9, 424, 3, 424, 5108, 8, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 5, 425, 5126, 8, 425, 10, 425, 12, 425, 5129, 9, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5141, 8, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5146, 8, 426, 1, 426, 1, 426, 1, 426, 5, 426, 5151, 8, 426, 10, 426, 12, 426, 5154, 9, 426, 3, 426, 5156, 8, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 427, 4, 427, 5164, 8, 427, 11, 427, 12, 427, 5165, 1, 427, 1, 427, 1, 427, 1, 428, 1, 428, 1, 428, 1, 428, 1, 429, 1, 429, 1, 429, 1, 429, 1, 429, 1, 430, 1, 430, 1, 430, 1, 430, 1, 431, 1, 431, 1, 431, 1, 431, 1, 432, 1, 432, 1, 432, 1, 432, 1, 433, 1, 433, 1, 433, 1, 433, 1, 434, 1, 434, 1, 434, 1, 434, 1, 434, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 437, 1, 437, 1, 437, 1, 437, 1, 438, 1, 438, 1, 438, 1, 438, 1, 439, 1, 439, 1, 439, 1, 439, 1, 440, 1, 440, 1, 440, 1, 440, 1, 441, 1, 441, 1, 441, 1, 441, 1, 442, 1, 442, 1, 442, 1, 442, 1, 442, 1, 443, 1, 443, 1, 443, 1, 443, 1, 444, 1, 444, 1, 444, 1, 444, 1, 444, 1, 445, 1, 445, 1, 445, 1, 445, 1, 446, 1, 446, 1, 446, 1, 446, 1, 447, 1, 447, 1, 447, 1, 447, 1, 447, 1, 448, 1, 448, 1, 448, 1, 448, 1, 449, 1, 449, 1, 449, 1, 449, 1, 450, 1, 450, 1, 450, 1, 450, 1, 451, 1, 451, 1, 451, 1, 451, 1, 452, 1, 452, 1, 452, 1, 452, 1, 453, 1, 453, 1, 453, 1, 453, 1, 454, 1, 454, 1, 454, 1, 454, 1, 455, 1, 455, 1, 455, 1, 455, 1, 456, 1, 456, 1, 456, 1, 456, 1, 457, 1, 457, 1, 457, 1, 457, 1, 458, 1, 458, 1, 458, 1, 458, 1, 459, 1, 459, 1, 459, 1, 459, 1, 459, 1, 460, 1, 460, 1, 460, 1, 460, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 1, 462, 1, 462, 1, 462, 1, 462, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 470, 1, 470, 1, 470, 1, 470, 1, 470, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 475, 1, 475, 1, 475, 1, 475, 1, 475, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 502, 1, 502, 1, 502, 1, 502, 1, 502, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 510, 1, 510, 1, 510, 1, 510, 1, 510, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 513, 1, 513, 1, 513, 1, 513, 1, 513, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 515, 1, 515, 1, 515, 1, 515, 1, 515, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 517, 1, 517, 1, 517, 1, 517, 1, 517, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 521, 1, 521, 1, 521, 1, 521, 1, 521, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 524, 1, 524, 1, 524, 1, 524, 1, 524, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 532, 1, 532, 1, 532, 1, 532, 1, 532, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 5, 594, 6617, 8, 594, 10, 594, 12, 594, 6620, 9, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 598, 1, 598, 5, 598, 6647, 8, 598, 10, 598, 12, 598, 6650, 9, 598, 1, 598, 1, 598, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 600, 4, 600, 6661, 8, 600, 11, 600, 12, 600, 6662, 1, 600, 1, 600, 1, 600, 1, 600, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 5, 601, 6675, 8, 601, 10, 601, 12, 601, 6678, 9, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 5, 602, 6694, 8, 602, 10, 602, 12, 602, 6697, 9, 602, 1, 602, 5, 602, 6700, 8, 602, 10, 602, 12, 602, 6703, 9, 602, 1, 602, 4, 602, 6706, 8, 602, 11, 602, 12, 602, 6707, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 603, 1, 603, 1, 603, 1, 603, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 606, 1, 606, 1, 606, 1, 606, 12, 1459, 1475, 1496, 1519, 3181, 3199, 3222, 3247, 5086, 5104, 5127, 5152, 0, 607, 6, 5, 8, 6, 10, 7, 12, 8, 14, 0, 16, 9, 18, 10, 20, 11, 22, 12, 24, 13, 26, 14, 28, 15, 30, 16, 32, 17, 34, 18, 36, 19, 38, 20, 40, 21, 42, 22, 44, 23, 46, 24, 48, 25, 50, 26, 52, 27, 54, 28, 56, 29, 58, 30, 60, 31, 62, 32, 64, 33, 66, 34, 68, 35, 70, 36, 72, 37, 74, 38, 76, 39, 78, 40, 80, 41, 82, 42, 84, 43, 86, 44, 88, 45, 90, 46, 92, 47, 94, 48, 96, 49, 98, 50, 100, 51, 102, 52, 104, 53, 106, 54, 108, 55, 110, 56, 112, 57, 114, 58, 116, 59, 118, 60, 120, 61, 122, 62, 124, 63, 126, 64, 128, 65, 130, 66, 132, 67, 134, 68, 136, 69, 138, 70, 140, 71, 142, 72, 144, 73, 146, 74, 148, 75, 150, 76, 152, 77, 154, 78, 156, 79, 158, 80, 160, 81, 162, 82, 164, 83, 166, 84, 168, 85, 170, 86, 172, 87, 174, 88, 176, 89, 178, 90, 180, 91, 182, 92, 184, 93, 186, 94, 188, 95, 190, 96, 192, 97, 194, 98, 196, 99, 198, 100, 200, 101, 202, 102, 204, 103, 206, 104, 208, 105, 210, 106, 212, 107, 214, 108, 216, 109, 218, 110, 220, 111, 222, 112, 224, 113, 226, 114, 228, 115, 230, 116, 232, 117, 234, 118, 236, 119, 238, 120, 240, 121, 242, 122, 244, 123, 246, 124, 248, 125, 250, 126, 252, 127, 254, 128, 256, 129, 258, 130, 260, 131, 262, 132, 264, 133, 266, 134, 268, 135, 270, 136, 272, 137, 274, 138, 276, 139, 278, 140, 280, 141, 282, 142, 284, 143, 286, 144, 288, 145, 290, 146, 292, 147, 294, 148, 296, 149, 298, 150, 300, 151, 302, 152, 304, 153, 306, 154, 308, 155, 310, 156, 312, 157, 314, 158, 316, 159, 318, 160, 320, 161, 322, 162, 324, 163, 326, 164, 328, 165, 330, 166, 332, 167, 334, 168, 336, 169, 338, 170, 340, 171, 342, 172, 344, 173, 346, 174, 348, 175, 350, 176, 352, 177, 354, 178, 356, 179, 358, 180, 360, 181, 362, 182, 364, 183, 366, 184, 368, 185, 370, 186, 372, 187, 374, 188, 376, 0, 378, 0, 380, 189, 382, 190, 384, 191, 386, 192, 388, 193, 390, 194, 392, 195, 394, 196, 396, 197, 398, 0, 400, 0, 402, 0, 404, 198, 406, 199, 408, 200, 410, 0, 412, 201, 414, 202, 416, 0, 418, 0, 420, 0, 422, 0, 424, 0, 426, 203, 428, 0, 430, 0, 432, 0, 434, 0, 436, 0, 438, 0, 440, 0, 442, 0, 444, 0, 446, 0, 448, 0, 450, 0, 452, 0, 454, 0, 456, 0, 458, 0, 460, 0, 462, 0, 464, 0, 466, 0, 468, 0, 470, 0, 472, 0, 474, 0, 476, 0, 478, 0, 480, 0, 482, 0, 484, 0, 486, 0, 488, 0, 490, 0, 492, 0, 494, 0, 496, 0, 498, 0, 500, 0, 502, 0, 504, 0, 506, 0, 508, 0, 510, 0, 512, 0, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 542, 0, 544, 0, 546, 0, 548, 0, 550, 0, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 0, 568, 0, 570, 0, 572, 0, 574, 0, 576, 0, 578, 0, 580, 0, 582, 0, 584, 0, 586, 0, 588, 0, 590, 0, 592, 0, 594, 0, 596, 0, 598, 0, 600, 0, 602, 0, 604, 0, 606, 0, 608, 0, 610, 0, 612, 0, 614, 0, 616, 0, 618, 0, 620, 0, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 0, 636, 0, 638, 0, 640, 0, 642, 0, 644, 0, 646, 0, 648, 0, 650, 0, 652, 0, 654, 0, 656, 0, 658, 0, 660, 0, 662, 0, 664, 0, 666, 0, 668, 0, 670, 0, 672, 0, 674, 0, 676, 0, 678, 0, 680, 0, 682, 0, 684, 0, 686, 0, 688, 0, 690, 0, 692, 0, 694, 0, 696, 0, 698, 0, 700, 0, 702, 0, 704, 0, 706, 0, 708, 0, 710, 0, 712, 0, 714, 0, 716, 0, 718, 0, 720, 0, 722, 0, 724, 0, 726, 0, 728, 0, 730, 0, 732, 0, 734, 0, 736, 0, 738, 0, 740, 0, 742, 0, 744, 0, 746, 0, 748, 0, 750, 0, 752, 0, 754, 0, 756, 0, 758, 0, 760, 0, 762, 0, 764, 0, 766, 0, 768, 0, 770, 0, 772, 0, 774, 0, 776, 0, 778, 0, 780, 0, 782, 0, 784, 0, 786, 0, 788, 0, 790, 0, 792, 0, 794, 0, 796, 0, 798, 0, 800, 0, 802, 0, 804, 0, 806, 0, 808, 0, 810, 0, 812, 0, 814, 0, 816, 0, 818, 0, 820, 0, 822, 0, 824, 0, 826, 0, 828, 0, 830, 0, 832, 0, 834, 0, 836, 0, 838, 0, 840, 0, 842, 0, 844, 0, 846, 0, 848, 0, 850, 0, 852, 0, 854, 0, 856, 0, 858, 0, 860, 0, 862, 0, 864, 0, 866, 0, 868, 0, 870, 0, 872, 0, 874, 0, 876, 0, 878, 0, 880, 0, 882, 0, 884, 0, 886, 0, 888, 0, 890, 0, 892, 0, 894, 0, 896, 0, 898, 0, 900, 0, 902, 0, 904, 0, 906, 0, 908, 0, 910, 0, 912, 0, 914, 0, 916, 0, 918, 0, 920, 0, 922, 0, 924, 0, 926, 0, 928, 0, 930, 0, 932, 0, 934, 0, 936, 0, 938, 0, 940, 0, 942, 0, 944, 0, 946, 0, 948, 0, 950, 0, 952, 0, 954, 0, 956, 0, 958, 0, 960, 0, 962, 0, 964, 0, 966, 0, 968, 0, 970, 0, 972, 0, 974, 0, 976, 0, 978, 0, 980, 0, 982, 0, 984, 0, 986, 0, 988, 0, 990, 0, 992, 0, 994, 0, 996, 0, 998, 0, 1000, 0, 1002, 0, 1004, 0, 1006, 0, 1008, 0, 1010, 0, 1012, 0, 1014, 0, 1016, 0, 1018, 0, 1020, 0, 1022, 0, 1024, 0, 1026, 0, 1028, 0, 1030, 0, 1032, 0, 1034, 0, 1036, 0, 1038, 0, 1040, 0, 1042, 0, 1044, 0, 1046, 0, 1048, 0, 1050, 0, 1052, 0, 1054, 0, 1056, 0, 1058, 0, 1060, 0, 1062, 0, 1064, 0, 1066, 0, 1068, 0, 1070, 0, 1072, 0, 1074, 0, 1076, 0, 1078, 0, 1080, 0, 1082, 0, 1084, 0, 1086, 0, 1088, 0, 1090, 0, 1092, 0, 1094, 0, 1096, 0, 1098, 0, 1100, 0, 1102, 0, 1104, 0, 1106, 0, 1108, 0, 1110, 0, 1112, 0, 1114, 0, 1116, 0, 1118, 0, 1120, 0, 1122, 0, 1124, 0, 1126, 0, 1128, 0, 1130, 0, 1132, 0, 1134, 0, 1136, 0, 1138, 0, 1140, 0, 1142, 0, 1144, 0, 1146, 0, 1148, 0, 1150, 0, 1152, 0, 1154, 0, 1156, 0, 1158, 0, 1160, 0, 1162, 0, 1164, 0, 1166, 0, 1168, 0, 1170, 0, 1172, 0, 1174, 0, 1176, 0, 1178, 0, 1180, 0, 1182, 0, 1184, 0, 1186, 0, 1188, 0, 1190, 0, 1192, 0, 1194, 0, 1196, 0, 1198, 0, 1200, 0, 1202, 0, 1204, 0, 1206, 0, 1208, 0, 1210, 0, 1212, 0, 1214, 0, 1216, 0, 1218, 0, 6, 0, 1, 2, 3, 4, 5, 21, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 45, 45, 2, 0, 88, 88, 120, 120, 2, 0, 77, 77, 109, 109, 2, 0, 76, 76, 108, 108, 3, 0, 9, 10, 13, 13, 32, 32, 3, 0, 38, 38, 123, 123, 125, 125, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 46, 48, 57, 161, 191, 768, 879, 8255, 8256, 1, 0, 41, 41, 1, 0, 126, 126, 1, 0, 58, 58, 2, 0, 40, 40, 58, 58, 5, 0, 9, 10, 13, 13, 32, 57, 59, 55295, 57344, 65533, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 8, 0, 9, 10, 13, 13, 32, 92, 94, 95, 97, 122, 124, 55295, 57344, 65533, 65536, 1114111, 4, 0, 34, 34, 38, 38, 123, 123, 125, 125, 3, 0, 38, 39, 123, 123, 125, 125, 6886, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 0, 108, 1, 0, 0, 0, 0, 110, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 0, 134, 1, 0, 0, 0, 0, 136, 1, 0, 0, 0, 0, 138, 1, 0, 0, 0, 0, 140, 1, 0, 0, 0, 0, 142, 1, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 146, 1, 0, 0, 0, 0, 148, 1, 0, 0, 0, 0, 150, 1, 0, 0, 0, 0, 152, 1, 0, 0, 0, 0, 154, 1, 0, 0, 0, 0, 156, 1, 0, 0, 0, 0, 158, 1, 0, 0, 0, 0, 160, 1, 0, 0, 0, 0, 162, 1, 0, 0, 0, 0, 164, 1, 0, 0, 0, 0, 166, 1, 0, 0, 0, 0, 168, 1, 0, 0, 0, 0, 170, 1, 0, 0, 0, 0, 172, 1, 0, 0, 0, 0, 174, 1, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 178, 1, 0, 0, 0, 0, 180, 1, 0, 0, 0, 0, 182, 1, 0, 0, 0, 0, 184, 1, 0, 0, 0, 0, 186, 1, 0, 0, 0, 0, 188, 1, 0, 0, 0, 0, 190, 1, 0, 0, 0, 0, 192, 1, 0, 0, 0, 0, 194, 1, 0, 0, 0, 0, 196, 1, 0, 0, 0, 0, 198, 1, 0, 0, 0, 0, 200, 1, 0, 0, 0, 0, 202, 1, 0, 0, 0, 0, 204, 1, 0, 0, 0, 0, 206, 1, 0, 0, 0, 0, 208, 1, 0, 0, 0, 0, 210, 1, 0, 0, 0, 0, 212, 1, 0, 0, 0, 0, 214, 1, 0, 0, 0, 0, 216, 1, 0, 0, 0, 0, 218, 1, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 222, 1, 0, 0, 0, 0, 224, 1, 0, 0, 0, 0, 226, 1, 0, 0, 0, 0, 228, 1, 0, 0, 0, 0, 230, 1, 0, 0, 0, 0, 232, 1, 0, 0, 0, 0, 234, 1, 0, 0, 0, 0, 236, 1, 0, 0, 0, 0, 238, 1, 0, 0, 0, 0, 240, 1, 0, 0, 0, 0, 242, 1, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 246, 1, 0, 0, 0, 0, 248, 1, 0, 0, 0, 0, 250, 1, 0, 0, 0, 0, 252, 1, 0, 0, 0, 0, 254, 1, 0, 0, 0, 0, 256, 1, 0, 0, 0, 0, 258, 1, 0, 0, 0, 0, 260, 1, 0, 0, 0, 0, 262, 1, 0, 0, 0, 0, 264, 1, 0, 0, 0, 0, 266, 1, 0, 0, 0, 0, 268, 1, 0, 0, 0, 0, 270, 1, 0, 0, 0, 0, 272, 1, 0, 0, 0, 0, 274, 1, 0, 0, 0, 0, 276, 1, 0, 0, 0, 0, 278, 1, 0, 0, 0, 0, 280, 1, 0, 0, 0, 0, 282, 1, 0, 0, 0, 0, 284, 1, 0, 0, 0, 0, 286, 1, 0, 0, 0, 0, 288, 1, 0, 0, 0, 0, 290, 1, 0, 0, 0, 0, 292, 1, 0, 0, 0, 0, 294, 1, 0, 0, 0, 0, 296, 1, 0, 0, 0, 0, 298, 1, 0, 0, 0, 0, 300, 1, 0, 0, 0, 0, 302, 1, 0, 0, 0, 0, 304, 1, 0, 0, 0, 0, 306, 1, 0, 0, 0, 0, 308, 1, 0, 0, 0, 0, 310, 1, 0, 0, 0, 0, 312, 1, 0, 0, 0, 0, 314, 1, 0, 0, 0, 0, 316, 1, 0, 0, 0, 0, 318, 1, 0, 0, 0, 0, 320, 1, 0, 0, 0, 0, 322, 1, 0, 0, 0, 0, 324, 1, 0, 0, 0, 0, 326, 1, 0, 0, 0, 0, 328, 1, 0, 0, 0, 0, 330, 1, 0, 0, 0, 0, 332, 1, 0, 0, 0, 0, 334, 1, 0, 0, 0, 0, 336, 1, 0, 0, 0, 0, 338, 1, 0, 0, 0, 0, 340, 1, 0, 0, 0, 0, 342, 1, 0, 0, 0, 0, 344, 1, 0, 0, 0, 0, 346, 1, 0, 0, 0, 0, 348, 1, 0, 0, 0, 0, 350, 1, 0, 0, 0, 0, 352, 1, 0, 0, 0, 0, 354, 1, 0, 0, 0, 0, 356, 1, 0, 0, 0, 0, 358, 1, 0, 0, 0, 0, 360, 1, 0, 0, 0, 0, 362, 1, 0, 0, 0, 0, 364, 1, 0, 0, 0, 0, 366, 1, 0, 0, 0, 0, 368, 1, 0, 0, 0, 0, 370, 1, 0, 0, 0, 0, 372, 1, 0, 0, 0, 0, 374, 1, 0, 0, 0, 0, 380, 1, 0, 0, 0, 0, 382, 1, 0, 0, 0, 0, 384, 1, 0, 0, 0, 0, 386, 1, 0, 0, 0, 0, 388, 1, 0, 0, 0, 0, 390, 1, 0, 0, 0, 0, 392, 1, 0, 0, 0, 0, 394, 1, 0, 0, 0, 1, 396, 1, 0, 0, 0, 1, 398, 1, 0, 0, 0, 1, 400, 1, 0, 0, 0, 1, 402, 1, 0, 0, 0, 1, 404, 1, 0, 0, 0, 1, 406, 1, 0, 0, 0, 2, 408, 1, 0, 0, 0, 2, 410, 1, 0, 0, 0, 2, 412, 1, 0, 0, 0, 2, 414, 1, 0, 0, 0, 2, 416, 1, 0, 0, 0, 2, 418, 1, 0, 0, 0, 2, 420, 1, 0, 0, 0, 2, 422, 1, 0, 0, 0, 2, 424, 1, 0, 0, 0, 3, 426, 1, 0, 0, 0, 3, 428, 1, 0, 0, 0, 3, 430, 1, 0, 0, 0, 3, 432, 1, 0, 0, 0, 3, 434, 1, 0, 0, 0, 3, 436, 1, 0, 0, 0, 3, 438, 1, 0, 0, 0, 3, 440, 1, 0, 0, 0, 3, 442, 1, 0, 0, 0, 4, 444, 1, 0, 0, 0, 4, 446, 1, 0, 0, 0, 4, 448, 1, 0, 0, 0, 4, 450, 1, 0, 0, 0, 4, 452, 1, 0, 0, 0, 4, 454, 1, 0, 0, 0, 4, 456, 1, 0, 0, 0, 4, 458, 1, 0, 0, 0, 4, 460, 1, 0, 0, 0, 4, 462, 1, 0, 0, 0, 4, 464, 1, 0, 0, 0, 4, 466, 1, 0, 0, 0, 4, 468, 1, 0, 0, 0, 4, 470, 1, 0, 0, 0, 4, 472, 1, 0, 0, 0, 4, 474, 1, 0, 0, 0, 4, 476, 1, 0, 0, 0, 4, 478, 1, 0, 0, 0, 4, 480, 1, 0, 0, 0, 4, 482, 1, 0, 0, 0, 4, 484, 1, 0, 0, 0, 4, 486, 1, 0, 0, 0, 4, 488, 1, 0, 0, 0, 4, 490, 1, 0, 0, 0, 4, 492, 1, 0, 0, 0, 4, 494, 1, 0, 0, 0, 4, 496, 1, 0, 0, 0, 4, 498, 1, 0, 0, 0, 4, 500, 1, 0, 0, 0, 4, 502, 1, 0, 0, 0, 4, 504, 1, 0, 0, 0, 4, 506, 1, 0, 0, 0, 4, 508, 1, 0, 0, 0, 4, 510, 1, 0, 0, 0, 4, 512, 1, 0, 0, 0, 4, 514, 1, 0, 0, 0, 4, 516, 1, 0, 0, 0, 4, 518, 1, 0, 0, 0, 4, 520, 1, 0, 0, 0, 4, 522, 1, 0, 0, 0, 4, 524, 1, 0, 0, 0, 4, 526, 1, 0, 0, 0, 4, 528, 1, 0, 0, 0, 4, 530, 1, 0, 0, 0, 4, 532, 1, 0, 0, 0, 4, 534, 1, 0, 0, 0, 4, 536, 1, 0, 0, 0, 4, 538, 1, 0, 0, 0, 4, 540, 1, 0, 0, 0, 4, 542, 1, 0, 0, 0, 4, 544, 1, 0, 0, 0, 4, 546, 1, 0, 0, 0, 4, 548, 1, 0, 0, 0, 4, 550, 1, 0, 0, 0, 4, 552, 1, 0, 0, 0, 4, 554, 1, 0, 0, 0, 4, 556, 1, 0, 0, 0, 4, 558, 1, 0, 0, 0, 4, 560, 1, 0, 0, 0, 4, 562, 1, 0, 0, 0, 4, 564, 1, 0, 0, 0, 4, 566, 1, 0, 0, 0, 4, 568, 1, 0, 0, 0, 4, 570, 1, 0, 0, 0, 4, 572, 1, 0, 0, 0, 4, 574, 1, 0, 0, 0, 4, 576, 1, 0, 0, 0, 4, 578, 1, 0, 0, 0, 4, 580, 1, 0, 0, 0, 4, 582, 1, 0, 0, 0, 4, 584, 1, 0, 0, 0, 4, 586, 1, 0, 0, 0, 4, 588, 1, 0, 0, 0, 4, 590, 1, 0, 0, 0, 4, 592, 1, 0, 0, 0, 4, 594, 1, 0, 0, 0, 4, 596, 1, 0, 0, 0, 4, 598, 1, 0, 0, 0, 4, 600, 1, 0, 0, 0, 4, 602, 1, 0, 0, 0, 4, 604, 1, 0, 0, 0, 4, 606, 1, 0, 0, 0, 4, 608, 1, 0, 0, 0, 4, 610, 1, 0, 0, 0, 4, 612, 1, 0, 0, 0, 4, 614, 1, 0, 0, 0, 4, 616, 1, 0, 0, 0, 4, 618, 1, 0, 0, 0, 4, 620, 1, 0, 0, 0, 4, 622, 1, 0, 0, 0, 4, 624, 1, 0, 0, 0, 4, 626, 1, 0, 0, 0, 4, 628, 1, 0, 0, 0, 4, 630, 1, 0, 0, 0, 4, 632, 1, 0, 0, 0, 4, 634, 1, 0, 0, 0, 4, 636, 1, 0, 0, 0, 4, 638, 1, 0, 0, 0, 4, 640, 1, 0, 0, 0, 4, 642, 1, 0, 0, 0, 4, 644, 1, 0, 0, 0, 4, 646, 1, 0, 0, 0, 4, 648, 1, 0, 0, 0, 4, 650, 1, 0, 0, 0, 4, 652, 1, 0, 0, 0, 4, 654, 1, 0, 0, 0, 4, 656, 1, 0, 0, 0, 4, 658, 1, 0, 0, 0, 4, 660, 1, 0, 0, 0, 4, 662, 1, 0, 0, 0, 4, 664, 1, 0, 0, 0, 4, 666, 1, 0, 0, 0, 4, 668, 1, 0, 0, 0, 4, 670, 1, 0, 0, 0, 4, 672, 1, 0, 0, 0, 4, 674, 1, 0, 0, 0, 4, 676, 1, 0, 0, 0, 4, 678, 1, 0, 0, 0, 4, 680, 1, 0, 0, 0, 4, 682, 1, 0, 0, 0, 4, 684, 1, 0, 0, 0, 4, 686, 1, 0, 0, 0, 4, 688, 1, 0, 0, 0, 4, 690, 1, 0, 0, 0, 4, 692, 1, 0, 0, 0, 4, 694, 1, 0, 0, 0, 4, 696, 1, 0, 0, 0, 4, 698, 1, 0, 0, 0, 4, 700, 1, 0, 0, 0, 4, 702, 1, 0, 0, 0, 4, 704, 1, 0, 0, 0, 4, 706, 1, 0, 0, 0, 4, 708, 1, 0, 0, 0, 4, 710, 1, 0, 0, 0, 4, 712, 1, 0, 0, 0, 4, 714, 1, 0, 0, 0, 4, 716, 1, 0, 0, 0, 4, 718, 1, 0, 0, 0, 4, 720, 1, 0, 0, 0, 4, 722, 1, 0, 0, 0, 4, 724, 1, 0, 0, 0, 4, 726, 1, 0, 0, 0, 4, 728, 1, 0, 0, 0, 4, 730, 1, 0, 0, 0, 4, 732, 1, 0, 0, 0, 4, 734, 1, 0, 0, 0, 4, 736, 1, 0, 0, 0, 4, 738, 1, 0, 0, 0, 4, 740, 1, 0, 0, 0, 4, 742, 1, 0, 0, 0, 4, 744, 1, 0, 0, 0, 4, 746, 1, 0, 0, 0, 4, 748, 1, 0, 0, 0, 4, 750, 1, 0, 0, 0, 4, 752, 1, 0, 0, 0, 4, 754, 1, 0, 0, 0, 4, 756, 1, 0, 0, 0, 4, 758, 1, 0, 0, 0, 4, 760, 1, 0, 0, 0, 4, 762, 1, 0, 0, 0, 4, 764, 1, 0, 0, 0, 4, 766, 1, 0, 0, 0, 4, 768, 1, 0, 0, 0, 4, 770, 1, 0, 0, 0, 4, 772, 1, 0, 0, 0, 4, 774, 1, 0, 0, 0, 4, 776, 1, 0, 0, 0, 4, 778, 1, 0, 0, 0, 4, 780, 1, 0, 0, 0, 4, 782, 1, 0, 0, 0, 4, 784, 1, 0, 0, 0, 4, 786, 1, 0, 0, 0, 4, 788, 1, 0, 0, 0, 4, 790, 1, 0, 0, 0, 4, 792, 1, 0, 0, 0, 4, 794, 1, 0, 0, 0, 4, 796, 1, 0, 0, 0, 4, 798, 1, 0, 0, 0, 4, 800, 1, 0, 0, 0, 4, 802, 1, 0, 0, 0, 4, 804, 1, 0, 0, 0, 4, 806, 1, 0, 0, 0, 4, 808, 1, 0, 0, 0, 4, 810, 1, 0, 0, 0, 4, 812, 1, 0, 0, 0, 4, 814, 1, 0, 0, 0, 4, 816, 1, 0, 0, 0, 4, 818, 1, 0, 0, 0, 4, 820, 1, 0, 0, 0, 4, 822, 1, 0, 0, 0, 4, 824, 1, 0, 0, 0, 4, 826, 1, 0, 0, 0, 4, 828, 1, 0, 0, 0, 4, 830, 1, 0, 0, 0, 5, 832, 1, 0, 0, 0, 5, 834, 1, 0, 0, 0, 5, 836, 1, 0, 0, 0, 5, 838, 1, 0, 0, 0, 5, 840, 1, 0, 0, 0, 5, 842, 1, 0, 0, 0, 5, 844, 1, 0, 0, 0, 5, 846, 1, 0, 0, 0, 5, 848, 1, 0, 0, 0, 5, 850, 1, 0, 0, 0, 5, 852, 1, 0, 0, 0, 5, 854, 1, 0, 0, 0, 5, 856, 1, 0, 0, 0, 5, 858, 1, 0, 0, 0, 5, 860, 1, 0, 0, 0, 5, 862, 1, 0, 0, 0, 5, 864, 1, 0, 0, 0, 5, 866, 1, 0, 0, 0, 5, 868, 1, 0, 0, 0, 5, 870, 1, 0, 0, 0, 5, 872, 1, 0, 0, 0, 5, 874, 1, 0, 0, 0, 5, 876, 1, 0, 0, 0, 5, 878, 1, 0, 0, 0, 5, 880, 1, 0, 0, 0, 5, 882, 1, 0, 0, 0, 5, 884, 1, 0, 0, 0, 5, 886, 1, 0, 0, 0, 5, 888, 1, 0, 0, 0, 5, 890, 1, 0, 0, 0, 5, 892, 1, 0, 0, 0, 5, 894, 1, 0, 0, 0, 5, 896, 1, 0, 0, 0, 5, 898, 1, 0, 0, 0, 5, 900, 1, 0, 0, 0, 5, 902, 1, 0, 0, 0, 5, 904, 1, 0, 0, 0, 5, 906, 1, 0, 0, 0, 5, 908, 1, 0, 0, 0, 5, 910, 1, 0, 0, 0, 5, 912, 1, 0, 0, 0, 5, 914, 1, 0, 0, 0, 5, 916, 1, 0, 0, 0, 5, 918, 1, 0, 0, 0, 5, 920, 1, 0, 0, 0, 5, 922, 1, 0, 0, 0, 5, 924, 1, 0, 0, 0, 5, 926, 1, 0, 0, 0, 5, 928, 1, 0, 0, 0, 5, 930, 1, 0, 0, 0, 5, 932, 1, 0, 0, 0, 5, 934, 1, 0, 0, 0, 5, 936, 1, 0, 0, 0, 5, 938, 1, 0, 0, 0, 5, 940, 1, 0, 0, 0, 5, 942, 1, 0, 0, 0, 5, 944, 1, 0, 0, 0, 5, 946, 1, 0, 0, 0, 5, 948, 1, 0, 0, 0, 5, 950, 1, 0, 0, 0, 5, 952, 1, 0, 0, 0, 5, 954, 1, 0, 0, 0, 5, 956, 1, 0, 0, 0, 5, 958, 1, 0, 0, 0, 5, 960, 1, 0, 0, 0, 5, 962, 1, 0, 0, 0, 5, 964, 1, 0, 0, 0, 5, 966, 1, 0, 0, 0, 5, 968, 1, 0, 0, 0, 5, 970, 1, 0, 0, 0, 5, 972, 1, 0, 0, 0, 5, 974, 1, 0, 0, 0, 5, 976, 1, 0, 0, 0, 5, 978, 1, 0, 0, 0, 5, 980, 1, 0, 0, 0, 5, 982, 1, 0, 0, 0, 5, 984, 1, 0, 0, 0, 5, 986, 1, 0, 0, 0, 5, 988, 1, 0, 0, 0, 5, 990, 1, 0, 0, 0, 5, 992, 1, 0, 0, 0, 5, 994, 1, 0, 0, 0, 5, 996, 1, 0, 0, 0, 5, 998, 1, 0, 0, 0, 5, 1000, 1, 0, 0, 0, 5, 1002, 1, 0, 0, 0, 5, 1004, 1, 0, 0, 0, 5, 1006, 1, 0, 0, 0, 5, 1008, 1, 0, 0, 0, 5, 1010, 1, 0, 0, 0, 5, 1012, 1, 0, 0, 0, 5, 1014, 1, 0, 0, 0, 5, 1016, 1, 0, 0, 0, 5, 1018, 1, 0, 0, 0, 5, 1020, 1, 0, 0, 0, 5, 1022, 1, 0, 0, 0, 5, 1024, 1, 0, 0, 0, 5, 1026, 1, 0, 0, 0, 5, 1028, 1, 0, 0, 0, 5, 1030, 1, 0, 0, 0, 5, 1032, 1, 0, 0, 0, 5, 1034, 1, 0, 0, 0, 5, 1036, 1, 0, 0, 0, 5, 1038, 1, 0, 0, 0, 5, 1040, 1, 0, 0, 0, 5, 1042, 1, 0, 0, 0, 5, 1044, 1, 0, 0, 0, 5, 1046, 1, 0, 0, 0, 5, 1048, 1, 0, 0, 0, 5, 1050, 1, 0, 0, 0, 5, 1052, 1, 0, 0, 0, 5, 1054, 1, 0, 0, 0, 5, 1056, 1, 0, 0, 0, 5, 1058, 1, 0, 0, 0, 5, 1060, 1, 0, 0, 0, 5, 1062, 1, 0, 0, 0, 5, 1064, 1, 0, 0, 0, 5, 1066, 1, 0, 0, 0, 5, 1068, 1, 0, 0, 0, 5, 1070, 1, 0, 0, 0, 5, 1072, 1, 0, 0, 0, 5, 1074, 1, 0, 0, 0, 5, 1076, 1, 0, 0, 0, 5, 1078, 1, 0, 0, 0, 5, 1080, 1, 0, 0, 0, 5, 1082, 1, 0, 0, 0, 5, 1084, 1, 0, 0, 0, 5, 1086, 1, 0, 0, 0, 5, 1088, 1, 0, 0, 0, 5, 1090, 1, 0, 0, 0, 5, 1092, 1, 0, 0, 0, 5, 1094, 1, 0, 0, 0, 5, 1096, 1, 0, 0, 0, 5, 1098, 1, 0, 0, 0, 5, 1100, 1, 0, 0, 0, 5, 1102, 1, 0, 0, 0, 5, 1104, 1, 0, 0, 0, 5, 1106, 1, 0, 0, 0, 5, 1108, 1, 0, 0, 0, 5, 1110, 1, 0, 0, 0, 5, 1112, 1, 0, 0, 0, 5, 1114, 1, 0, 0, 0, 5, 1116, 1, 0, 0, 0, 5, 1118, 1, 0, 0, 0, 5, 1120, 1, 0, 0, 0, 5, 1122, 1, 0, 0, 0, 5, 1124, 1, 0, 0, 0, 5, 1126, 1, 0, 0, 0, 5, 1128, 1, 0, 0, 0, 5, 1130, 1, 0, 0, 0, 5, 1132, 1, 0, 0, 0, 5, 1134, 1, 0, 0, 0, 5, 1136, 1, 0, 0, 0, 5, 1138, 1, 0, 0, 0, 5, 1140, 1, 0, 0, 0, 5, 1142, 1, 0, 0, 0, 5, 1144, 1, 0, 0, 0, 5, 1146, 1, 0, 0, 0, 5, 1148, 1, 0, 0, 0, 5, 1150, 1, 0, 0, 0, 5, 1152, 1, 0, 0, 0, 5, 1154, 1, 0, 0, 0, 5, 1156, 1, 0, 0, 0, 5, 1158, 1, 0, 0, 0, 5, 1160, 1, 0, 0, 0, 5, 1162, 1, 0, 0, 0, 5, 1164, 1, 0, 0, 0, 5, 1166, 1, 0, 0, 0, 5, 1168, 1, 0, 0, 0, 5, 1170, 1, 0, 0, 0, 5, 1172, 1, 0, 0, 0, 5, 1174, 1, 0, 0, 0, 5, 1176, 1, 0, 0, 0, 5, 1178, 1, 0, 0, 0, 5, 1180, 1, 0, 0, 0, 5, 1182, 1, 0, 0, 0, 5, 1184, 1, 0, 0, 0, 5, 1186, 1, 0, 0, 0, 5, 1188, 1, 0, 0, 0, 5, 1190, 1, 0, 0, 0, 5, 1192, 1, 0, 0, 0, 5, 1194, 1, 0, 0, 0, 5, 1196, 1, 0, 0, 0, 5, 1198, 1, 0, 0, 0, 5, 1200, 1, 0, 0, 0, 5, 1202, 1, 0, 0, 0, 5, 1204, 1, 0, 0, 0, 5, 1206, 1, 0, 0, 0, 5, 1208, 1, 0, 0, 0, 5, 1210, 1, 0, 0, 0, 5, 1212, 1, 0, 0, 0, 5, 1214, 1, 0, 0, 0, 5, 1216, 1, 0, 0, 0, 5, 1218, 1, 0, 0, 0, 6, 1220, 1, 0, 0, 0, 8, 1232, 1, 0, 0, 0, 10, 1246, 1, 0, 0, 0, 12, 1376, 1, 0, 0, 0, 14, 1379, 1, 0, 0, 0, 16, 1383, 1, 0, 0, 0, 18, 1422, 1, 0, 0, 0, 20, 1424, 1, 0, 0, 0, 22, 1428, 1, 0, 0, 0, 24, 1432, 1, 0, 0, 0, 26, 1449, 1, 0, 0, 0, 28, 1467, 1, 0, 0, 0, 30, 1483, 1, 0, 0, 0, 32, 1503, 1, 0, 0, 0, 34, 1528, 1, 0, 0, 0, 36, 1534, 1, 0, 0, 0, 38, 1536, 1, 0, 0, 0, 40, 1539, 1, 0, 0, 0, 42, 1541, 1, 0, 0, 0, 44, 1543, 1, 0, 0, 0, 46, 1545, 1, 0, 0, 0, 48, 1547, 1, 0, 0, 0, 50, 1549, 1, 0, 0, 0, 52, 1551, 1, 0, 0, 0, 54, 1553, 1, 0, 0, 0, 56, 1555, 1, 0, 0, 0, 58, 1557, 1, 0, 0, 0, 60, 1559, 1, 0, 0, 0, 62, 1561, 1, 0, 0, 0, 64, 1564, 1, 0, 0, 0, 66, 1566, 1, 0, 0, 0, 68, 1569, 1, 0, 0, 0, 70, 1571, 1, 0, 0, 0, 72, 1573, 1, 0, 0, 0, 74, 1576, 1, 0, 0, 0, 76, 1578, 1, 0, 0, 0, 78, 1580, 1, 0, 0, 0, 80, 1582, 1, 0, 0, 0, 82, 1584, 1, 0, 0, 0, 84, 1586, 1, 0, 0, 0, 86, 1588, 1, 0, 0, 0, 88, 1590, 1, 0, 0, 0, 90, 1592, 1, 0, 0, 0, 92, 1594, 1, 0, 0, 0, 94, 1596, 1, 0, 0, 0, 96, 1598, 1, 0, 0, 0, 98, 1601, 1, 0, 0, 0, 100, 1603, 1, 0, 0, 0, 102, 1606, 1, 0, 0, 0, 104, 1608, 1, 0, 0, 0, 106, 1617, 1, 0, 0, 0, 108, 1626, 1, 0, 0, 0, 110, 1643, 1, 0, 0, 0, 112, 1647, 1, 0, 0, 0, 114, 1653, 1, 0, 0, 0, 116, 1656, 1, 0, 0, 0, 118, 1666, 1, 0, 0, 0, 120, 1669, 1, 0, 0, 0, 122, 1679, 1, 0, 0, 0, 124, 1688, 1, 0, 0, 0, 126, 1703, 1, 0, 0, 0, 128, 1710, 1, 0, 0, 0, 130, 1713, 1, 0, 0, 0, 132, 1718, 1, 0, 0, 0, 134, 1723, 1, 0, 0, 0, 136, 1732, 1, 0, 0, 0, 138, 1738, 1, 0, 0, 0, 140, 1744, 1, 0, 0, 0, 142, 1754, 1, 0, 0, 0, 144, 1762, 1, 0, 0, 0, 146, 1775, 1, 0, 0, 0, 148, 1783, 1, 0, 0, 0, 150, 1799, 1, 0, 0, 0, 152, 1805, 1, 0, 0, 0, 154, 1813, 1, 0, 0, 0, 156, 1821, 1, 0, 0, 0, 158, 1832, 1, 0, 0, 0, 160, 1851, 1, 0, 0, 0, 162, 1862, 1, 0, 0, 0, 164, 1877, 1, 0, 0, 0, 166, 1881, 1, 0, 0, 0, 168, 1890, 1, 0, 0, 0, 170, 1904, 1, 0, 0, 0, 172, 1912, 1, 0, 0, 0, 174, 1917, 1, 0, 0, 0, 176, 1923, 1, 0, 0, 0, 178, 1938, 1, 0, 0, 0, 180, 1947, 1, 0, 0, 0, 182, 1951, 1, 0, 0, 0, 184, 1954, 1, 0, 0, 0, 186, 1960, 1, 0, 0, 0, 188, 1967, 1, 0, 0, 0, 190, 1976, 1, 0, 0, 0, 192, 1986, 1, 0, 0, 0, 194, 2004, 1, 0, 0, 0, 196, 2008, 1, 0, 0, 0, 198, 2017, 1, 0, 0, 0, 200, 2020, 1, 0, 0, 0, 202, 2029, 1, 0, 0, 0, 204, 2035, 1, 0, 0, 0, 206, 2038, 1, 0, 0, 0, 208, 2043, 1, 0, 0, 0, 210, 2046, 1, 0, 0, 0, 212, 2053, 1, 0, 0, 0, 214, 2056, 1, 0, 0, 0, 216, 2064, 1, 0, 0, 0, 218, 2073, 1, 0, 0, 0, 220, 2083, 1, 0, 0, 0, 222, 2086, 1, 0, 0, 0, 224, 2091, 1, 0, 0, 0, 226, 2095, 1, 0, 0, 0, 228, 2098, 1, 0, 0, 0, 230, 2104, 1, 0, 0, 0, 232, 2108, 1, 0, 0, 0, 234, 2111, 1, 0, 0, 0, 236, 2115, 1, 0, 0, 0, 238, 2119, 1, 0, 0, 0, 240, 2126, 1, 0, 0, 0, 242, 2136, 1, 0, 0, 0, 244, 2139, 1, 0, 0, 0, 246, 2144, 1, 0, 0, 0, 248, 2159, 1, 0, 0, 0, 250, 2170, 1, 0, 0, 0, 252, 2182, 1, 0, 0, 0, 254, 2187, 1, 0, 0, 0, 256, 2190, 1, 0, 0, 0, 258, 2195, 1, 0, 0, 0, 260, 2202, 1, 0, 0, 0, 262, 2205, 1, 0, 0, 0, 264, 2211, 1, 0, 0, 0, 266, 2219, 1, 0, 0, 0, 268, 2228, 1, 0, 0, 0, 270, 2235, 1, 0, 0, 0, 272, 2245, 1, 0, 0, 0, 274, 2263, 1, 0, 0, 0, 276, 2272, 1, 0, 0, 0, 278, 2281, 1, 0, 0, 0, 280, 2304, 1, 0, 0, 0, 282, 2311, 1, 0, 0, 0, 284, 2321, 1, 0, 0, 0, 286, 2328, 1, 0, 0, 0, 288, 2345, 1, 0, 0, 0, 290, 2360, 1, 0, 0, 0, 292, 2365, 1, 0, 0, 0, 294, 2373, 1, 0, 0, 0, 296, 2378, 1, 0, 0, 0, 298, 2385, 1, 0, 0, 0, 300, 2391, 1, 0, 0, 0, 302, 2398, 1, 0, 0, 0, 304, 2404, 1, 0, 0, 0, 306, 2411, 1, 0, 0, 0, 308, 2416, 1, 0, 0, 0, 310, 2421, 1, 0, 0, 0, 312, 2424, 1, 0, 0, 0, 314, 2430, 1, 0, 0, 0, 316, 2434, 1, 0, 0, 0, 318, 2443, 1, 0, 0, 0, 320, 2448, 1, 0, 0, 0, 322, 2459, 1, 0, 0, 0, 324, 2465, 1, 0, 0, 0, 326, 2475, 1, 0, 0, 0, 328, 2482, 1, 0, 0, 0, 330, 2491, 1, 0, 0, 0, 332, 2500, 1, 0, 0, 0, 334, 2508, 1, 0, 0, 0, 336, 2513, 1, 0, 0, 0, 338, 2519, 1, 0, 0, 0, 340, 2526, 1, 0, 0, 0, 342, 2533, 1, 0, 0, 0, 344, 2544, 1, 0, 0, 0, 346, 2557, 1, 0, 0, 0, 348, 2567, 1, 0, 0, 0, 350, 2579, 1, 0, 0, 0, 352, 2591, 1, 0, 0, 0, 354, 2599, 1, 0, 0, 0, 356, 2604, 1, 0, 0, 0, 358, 2610, 1, 0, 0, 0, 360, 2617, 1, 0, 0, 0, 362, 2622, 1, 0, 0, 0, 364, 2629, 1, 0, 0, 0, 366, 2636, 1, 0, 0, 0, 368, 2649, 1, 0, 0, 0, 370, 2653, 1, 0, 0, 0, 372, 2657, 1, 0, 0, 0, 374, 2661, 1, 0, 0, 0, 376, 2669, 1, 0, 0, 0, 378, 2673, 1, 0, 0, 0, 380, 2675, 1, 0, 0, 0, 382, 2680, 1, 0, 0, 0, 384, 2686, 1, 0, 0, 0, 386, 2700, 1, 0, 0, 0, 388, 2729, 1, 0, 0, 0, 390, 2731, 1, 0, 0, 0, 392, 2737, 1, 0, 0, 0, 394, 2742, 1, 0, 0, 0, 396, 2744, 1, 0, 0, 0, 398, 2746, 1, 0, 0, 0, 400, 2750, 1, 0, 0, 0, 402, 2754, 1, 0, 0, 0, 404, 2758, 1, 0, 0, 0, 406, 2763, 1, 0, 0, 0, 408, 2769, 1, 0, 0, 0, 410, 2774, 1, 0, 0, 0, 412, 2779, 1, 0, 0, 0, 414, 2784, 1, 0, 0, 0, 416, 2789, 1, 0, 0, 0, 418, 2794, 1, 0, 0, 0, 420, 2798, 1, 0, 0, 0, 422, 2839, 1, 0, 0, 0, 424, 2843, 1, 0, 0, 0, 426, 2847, 1, 0, 0, 0, 428, 2852, 1, 0, 0, 0, 430, 2857, 1, 0, 0, 0, 432, 2862, 1, 0, 0, 0, 434, 2867, 1, 0, 0, 0, 436, 2872, 1, 0, 0, 0, 438, 2876, 1, 0, 0, 0, 440, 2917, 1, 0, 0, 0, 442, 2921, 1, 0, 0, 0, 444, 2925, 1, 0, 0, 0, 446, 2939, 1, 0, 0, 0, 448, 2955, 1, 0, 0, 0, 450, 3087, 1, 0, 0, 0, 452, 3091, 1, 0, 0, 0, 454, 3132, 1, 0, 0, 0, 456, 3136, 1, 0, 0, 0, 458, 3141, 1, 0, 0, 0, 460, 3146, 1, 0, 0, 0, 462, 3152, 1, 0, 0, 0, 464, 3171, 1, 0, 0, 0, 466, 3191, 1, 0, 0, 0, 468, 3209, 1, 0, 0, 0, 470, 3231, 1, 0, 0, 0, 472, 3258, 1, 0, 0, 0, 474, 3265, 1, 0, 0, 0, 476, 3269, 1, 0, 0, 0, 478, 3274, 1, 0, 0, 0, 480, 3278, 1, 0, 0, 0, 482, 3282, 1, 0, 0, 0, 484, 3286, 1, 0, 0, 0, 486, 3290, 1, 0, 0, 0, 488, 3295, 1, 0, 0, 0, 490, 3301, 1, 0, 0, 0, 492, 3307, 1, 0, 0, 0, 494, 3311, 1, 0, 0, 0, 496, 3315, 1, 0, 0, 0, 498, 3319, 1, 0, 0, 0, 500, 3323, 1, 0, 0, 0, 502, 3327, 1, 0, 0, 0, 504, 3332, 1, 0, 0, 0, 506, 3336, 1, 0, 0, 0, 508, 3341, 1, 0, 0, 0, 510, 3345, 1, 0, 0, 0, 512, 3349, 1, 0, 0, 0, 514, 3354, 1, 0, 0, 0, 516, 3358, 1, 0, 0, 0, 518, 3362, 1, 0, 0, 0, 520, 3366, 1, 0, 0, 0, 522, 3370, 1, 0, 0, 0, 524, 3374, 1, 0, 0, 0, 526, 3378, 1, 0, 0, 0, 528, 3382, 1, 0, 0, 0, 530, 3386, 1, 0, 0, 0, 532, 3390, 1, 0, 0, 0, 534, 3394, 1, 0, 0, 0, 536, 3398, 1, 0, 0, 0, 538, 3403, 1, 0, 0, 0, 540, 3407, 1, 0, 0, 0, 542, 3412, 1, 0, 0, 0, 544, 3416, 1, 0, 0, 0, 546, 3427, 1, 0, 0, 0, 548, 3438, 1, 0, 0, 0, 550, 3457, 1, 0, 0, 0, 552, 3463, 1, 0, 0, 0, 554, 3471, 1, 0, 0, 0, 556, 3476, 1, 0, 0, 0, 558, 3488, 1, 0, 0, 0, 560, 3493, 1, 0, 0, 0, 562, 3505, 1, 0, 0, 0, 564, 3516, 1, 0, 0, 0, 566, 3533, 1, 0, 0, 0, 568, 3542, 1, 0, 0, 0, 570, 3547, 1, 0, 0, 0, 572, 3554, 1, 0, 0, 0, 574, 3561, 1, 0, 0, 0, 576, 3572, 1, 0, 0, 0, 578, 3580, 1, 0, 0, 0, 580, 3588, 1, 0, 0, 0, 582, 3600, 1, 0, 0, 0, 584, 3610, 1, 0, 0, 0, 586, 3625, 1, 0, 0, 0, 588, 3635, 1, 0, 0, 0, 590, 3653, 1, 0, 0, 0, 592, 3661, 1, 0, 0, 0, 594, 3671, 1, 0, 0, 0, 596, 3681, 1, 0, 0, 0, 598, 3694, 1, 0, 0, 0, 600, 3715, 1, 0, 0, 0, 602, 3728, 1, 0, 0, 0, 604, 3745, 1, 0, 0, 0, 606, 3751, 1, 0, 0, 0, 608, 3762, 1, 0, 0, 0, 610, 3778, 1, 0, 0, 0, 612, 3788, 1, 0, 0, 0, 614, 3795, 1, 0, 0, 0, 616, 3803, 1, 0, 0, 0, 618, 3820, 1, 0, 0, 0, 620, 3831, 1, 0, 0, 0, 622, 3837, 1, 0, 0, 0, 624, 3842, 1, 0, 0, 0, 626, 3850, 1, 0, 0, 0, 628, 3859, 1, 0, 0, 0, 630, 3870, 1, 0, 0, 0, 632, 3882, 1, 0, 0, 0, 634, 3902, 1, 0, 0, 0, 636, 3908, 1, 0, 0, 0, 638, 3919, 1, 0, 0, 0, 640, 3924, 1, 0, 0, 0, 642, 3935, 1, 0, 0, 0, 644, 3943, 1, 0, 0, 0, 646, 3948, 1, 0, 0, 0, 648, 3955, 1, 0, 0, 0, 650, 3960, 1, 0, 0, 0, 652, 3969, 1, 0, 0, 0, 654, 3974, 1, 0, 0, 0, 656, 3984, 1, 0, 0, 0, 658, 3995, 1, 0, 0, 0, 660, 4007, 1, 0, 0, 0, 662, 4012, 1, 0, 0, 0, 664, 4019, 1, 0, 0, 0, 666, 4025, 1, 0, 0, 0, 668, 4030, 1, 0, 0, 0, 670, 4038, 1, 0, 0, 0, 672, 4044, 1, 0, 0, 0, 674, 4049, 1, 0, 0, 0, 676, 4055, 1, 0, 0, 0, 678, 4061, 1, 0, 0, 0, 680, 4070, 1, 0, 0, 0, 682, 4082, 1, 0, 0, 0, 684, 4087, 1, 0, 0, 0, 686, 4094, 1, 0, 0, 0, 688, 4111, 1, 0, 0, 0, 690, 4124, 1, 0, 0, 0, 692, 4138, 1, 0, 0, 0, 694, 4145, 1, 0, 0, 0, 696, 4150, 1, 0, 0, 0, 698, 4157, 1, 0, 0, 0, 700, 4166, 1, 0, 0, 0, 702, 4171, 1, 0, 0, 0, 704, 4179, 1, 0, 0, 0, 706, 4189, 1, 0, 0, 0, 708, 4200, 1, 0, 0, 0, 710, 4209, 1, 0, 0, 0, 712, 4221, 1, 0, 0, 0, 714, 4241, 1, 0, 0, 0, 716, 4252, 1, 0, 0, 0, 718, 4263, 1, 0, 0, 0, 720, 4288, 1, 0, 0, 0, 722, 4297, 1, 0, 0, 0, 724, 4309, 1, 0, 0, 0, 726, 4318, 1, 0, 0, 0, 728, 4337, 1, 0, 0, 0, 730, 4354, 1, 0, 0, 0, 732, 4361, 1, 0, 0, 0, 734, 4371, 1, 0, 0, 0, 736, 4378, 1, 0, 0, 0, 738, 4387, 1, 0, 0, 0, 740, 4395, 1, 0, 0, 0, 742, 4404, 1, 0, 0, 0, 744, 4412, 1, 0, 0, 0, 746, 4421, 1, 0, 0, 0, 748, 4428, 1, 0, 0, 0, 750, 4435, 1, 0, 0, 0, 752, 4440, 1, 0, 0, 0, 754, 4448, 1, 0, 0, 0, 756, 4454, 1, 0, 0, 0, 758, 4465, 1, 0, 0, 0, 760, 4472, 1, 0, 0, 0, 762, 4485, 1, 0, 0, 0, 764, 4493, 1, 0, 0, 0, 766, 4505, 1, 0, 0, 0, 768, 4514, 1, 0, 0, 0, 770, 4525, 1, 0, 0, 0, 772, 4536, 1, 0, 0, 0, 774, 4546, 1, 0, 0, 0, 776, 4553, 1, 0, 0, 0, 778, 4561, 1, 0, 0, 0, 780, 4570, 1, 0, 0, 0, 782, 4579, 1, 0, 0, 0, 784, 4592, 1, 0, 0, 0, 786, 4607, 1, 0, 0, 0, 788, 4619, 1, 0, 0, 0, 790, 4633, 1, 0, 0, 0, 792, 4647, 1, 0, 0, 0, 794, 4657, 1, 0, 0, 0, 796, 4664, 1, 0, 0, 0, 798, 4672, 1, 0, 0, 0, 800, 4681, 1, 0, 0, 0, 802, 4688, 1, 0, 0, 0, 804, 4697, 1, 0, 0, 0, 806, 4706, 1, 0, 0, 0, 808, 4721, 1, 0, 0, 0, 810, 4727, 1, 0, 0, 0, 812, 4733, 1, 0, 0, 0, 814, 4739, 1, 0, 0, 0, 816, 4748, 1, 0, 0, 0, 818, 4755, 1, 0, 0, 0, 820, 4763, 1, 0, 0, 0, 822, 4779, 1, 0, 0, 0, 824, 4809, 1, 0, 0, 0, 826, 4813, 1, 0, 0, 0, 828, 4820, 1, 0, 0, 0, 830, 4826, 1, 0, 0, 0, 832, 4830, 1, 0, 0, 0, 834, 4844, 1, 0, 0, 0, 836, 4860, 1, 0, 0, 0, 838, 4992, 1, 0, 0, 0, 840, 4996, 1, 0, 0, 0, 842, 5037, 1, 0, 0, 0, 844, 5041, 1, 0, 0, 0, 846, 5046, 1, 0, 0, 0, 848, 5051, 1, 0, 0, 0, 850, 5057, 1, 0, 0, 0, 852, 5076, 1, 0, 0, 0, 854, 5096, 1, 0, 0, 0, 856, 5114, 1, 0, 0, 0, 858, 5136, 1, 0, 0, 0, 860, 5163, 1, 0, 0, 0, 862, 5170, 1, 0, 0, 0, 864, 5174, 1, 0, 0, 0, 866, 5179, 1, 0, 0, 0, 868, 5183, 1, 0, 0, 0, 870, 5187, 1, 0, 0, 0, 872, 5191, 1, 0, 0, 0, 874, 5195, 1, 0, 0, 0, 876, 5200, 1, 0, 0, 0, 878, 5206, 1, 0, 0, 0, 880, 5212, 1, 0, 0, 0, 882, 5216, 1, 0, 0, 0, 884, 5220, 1, 0, 0, 0, 886, 5224, 1, 0, 0, 0, 888, 5228, 1, 0, 0, 0, 890, 5232, 1, 0, 0, 0, 892, 5237, 1, 0, 0, 0, 894, 5241, 1, 0, 0, 0, 896, 5246, 1, 0, 0, 0, 898, 5250, 1, 0, 0, 0, 900, 5254, 1, 0, 0, 0, 902, 5259, 1, 0, 0, 0, 904, 5263, 1, 0, 0, 0, 906, 5267, 1, 0, 0, 0, 908, 5271, 1, 0, 0, 0, 910, 5275, 1, 0, 0, 0, 912, 5279, 1, 0, 0, 0, 914, 5283, 1, 0, 0, 0, 916, 5287, 1, 0, 0, 0, 918, 5291, 1, 0, 0, 0, 920, 5295, 1, 0, 0, 0, 922, 5299, 1, 0, 0, 0, 924, 5303, 1, 0, 0, 0, 926, 5308, 1, 0, 0, 0, 928, 5312, 1, 0, 0, 0, 930, 5317, 1, 0, 0, 0, 932, 5321, 1, 0, 0, 0, 934, 5332, 1, 0, 0, 0, 936, 5343, 1, 0, 0, 0, 938, 5362, 1, 0, 0, 0, 940, 5368, 1, 0, 0, 0, 942, 5376, 1, 0, 0, 0, 944, 5381, 1, 0, 0, 0, 946, 5393, 1, 0, 0, 0, 948, 5398, 1, 0, 0, 0, 950, 5410, 1, 0, 0, 0, 952, 5421, 1, 0, 0, 0, 954, 5438, 1, 0, 0, 0, 956, 5447, 1, 0, 0, 0, 958, 5452, 1, 0, 0, 0, 960, 5459, 1, 0, 0, 0, 962, 5466, 1, 0, 0, 0, 964, 5477, 1, 0, 0, 0, 966, 5485, 1, 0, 0, 0, 968, 5493, 1, 0, 0, 0, 970, 5505, 1, 0, 0, 0, 972, 5515, 1, 0, 0, 0, 974, 5530, 1, 0, 0, 0, 976, 5540, 1, 0, 0, 0, 978, 5558, 1, 0, 0, 0, 980, 5566, 1, 0, 0, 0, 982, 5576, 1, 0, 0, 0, 984, 5586, 1, 0, 0, 0, 986, 5599, 1, 0, 0, 0, 988, 5620, 1, 0, 0, 0, 990, 5633, 1, 0, 0, 0, 992, 5650, 1, 0, 0, 0, 994, 5656, 1, 0, 0, 0, 996, 5667, 1, 0, 0, 0, 998, 5683, 1, 0, 0, 0, 1000, 5693, 1, 0, 0, 0, 1002, 5700, 1, 0, 0, 0, 1004, 5708, 1, 0, 0, 0, 1006, 5725, 1, 0, 0, 0, 1008, 5736, 1, 0, 0, 0, 1010, 5742, 1, 0, 0, 0, 1012, 5747, 1, 0, 0, 0, 1014, 5755, 1, 0, 0, 0, 1016, 5764, 1, 0, 0, 0, 1018, 5775, 1, 0, 0, 0, 1020, 5787, 1, 0, 0, 0, 1022, 5807, 1, 0, 0, 0, 1024, 5813, 1, 0, 0, 0, 1026, 5824, 1, 0, 0, 0, 1028, 5829, 1, 0, 0, 0, 1030, 5840, 1, 0, 0, 0, 1032, 5848, 1, 0, 0, 0, 1034, 5853, 1, 0, 0, 0, 1036, 5860, 1, 0, 0, 0, 1038, 5865, 1, 0, 0, 0, 1040, 5874, 1, 0, 0, 0, 1042, 5879, 1, 0, 0, 0, 1044, 5889, 1, 0, 0, 0, 1046, 5900, 1, 0, 0, 0, 1048, 5912, 1, 0, 0, 0, 1050, 5917, 1, 0, 0, 0, 1052, 5924, 1, 0, 0, 0, 1054, 5930, 1, 0, 0, 0, 1056, 5935, 1, 0, 0, 0, 1058, 5943, 1, 0, 0, 0, 1060, 5949, 1, 0, 0, 0, 1062, 5954, 1, 0, 0, 0, 1064, 5960, 1, 0, 0, 0, 1066, 5966, 1, 0, 0, 0, 1068, 5975, 1, 0, 0, 0, 1070, 5987, 1, 0, 0, 0, 1072, 5992, 1, 0, 0, 0, 1074, 5999, 1, 0, 0, 0, 1076, 6016, 1, 0, 0, 0, 1078, 6029, 1, 0, 0, 0, 1080, 6043, 1, 0, 0, 0, 1082, 6050, 1, 0, 0, 0, 1084, 6055, 1, 0, 0, 0, 1086, 6062, 1, 0, 0, 0, 1088, 6071, 1, 0, 0, 0, 1090, 6076, 1, 0, 0, 0, 1092, 6084, 1, 0, 0, 0, 1094, 6094, 1, 0, 0, 0, 1096, 6105, 1, 0, 0, 0, 1098, 6114, 1, 0, 0, 0, 1100, 6126, 1, 0, 0, 0, 1102, 6146, 1, 0, 0, 0, 1104, 6157, 1, 0, 0, 0, 1106, 6168, 1, 0, 0, 0, 1108, 6193, 1, 0, 0, 0, 1110, 6202, 1, 0, 0, 0, 1112, 6214, 1, 0, 0, 0, 1114, 6223, 1, 0, 0, 0, 1116, 6242, 1, 0, 0, 0, 1118, 6259, 1, 0, 0, 0, 1120, 6266, 1, 0, 0, 0, 1122, 6276, 1, 0, 0, 0, 1124, 6283, 1, 0, 0, 0, 1126, 6292, 1, 0, 0, 0, 1128, 6300, 1, 0, 0, 0, 1130, 6309, 1, 0, 0, 0, 1132, 6317, 1, 0, 0, 0, 1134, 6326, 1, 0, 0, 0, 1136, 6333, 1, 0, 0, 0, 1138, 6340, 1, 0, 0, 0, 1140, 6345, 1, 0, 0, 0, 1142, 6353, 1, 0, 0, 0, 1144, 6359, 1, 0, 0, 0, 1146, 6370, 1, 0, 0, 0, 1148, 6377, 1, 0, 0, 0, 1150, 6390, 1, 0, 0, 0, 1152, 6398, 1, 0, 0, 0, 1154, 6410, 1, 0, 0, 0, 1156, 6419, 1, 0, 0, 0, 1158, 6430, 1, 0, 0, 0, 1160, 6441, 1, 0, 0, 0, 1162, 6451, 1, 0, 0, 0, 1164, 6458, 1, 0, 0, 0, 1166, 6466, 1, 0, 0, 0, 1168, 6475, 1, 0, 0, 0, 1170, 6484, 1, 0, 0, 0, 1172, 6497, 1, 0, 0, 0, 1174, 6512, 1, 0, 0, 0, 1176, 6524, 1, 0, 0, 0, 1178, 6538, 1, 0, 0, 0, 1180, 6552, 1, 0, 0, 0, 1182, 6562, 1, 0, 0, 0, 1184, 6569, 1, 0, 0, 0, 1186, 6577, 1, 0, 0, 0, 1188, 6586, 1, 0, 0, 0, 1190, 6593, 1, 0, 0, 0, 1192, 6602, 1, 0, 0, 0, 1194, 6611, 1, 0, 0, 0, 1196, 6626, 1, 0, 0, 0, 1198, 6632, 1, 0, 0, 0, 1200, 6638, 1, 0, 0, 0, 1202, 6644, 1, 0, 0, 0, 1204, 6653, 1, 0, 0, 0, 1206, 6660, 1, 0, 0, 0, 1208, 6668, 1, 0, 0, 0, 1210, 6684, 1, 0, 0, 0, 1212, 6714, 1, 0, 0, 0, 1214, 6718, 1, 0, 0, 0, 1216, 6725, 1, 0, 0, 0, 1218, 6731, 1, 0, 0, 0, 1220, 1221, 3, 14, 4, 0, 1221, 7, 1, 0, 0, 0, 1222, 1223, 5, 46, 0, 0, 1223, 1233, 3, 14, 4, 0, 1224, 1225, 3, 14, 4, 0, 1225, 1229, 5, 46, 0, 0, 1226, 1228, 7, 0, 0, 0, 1227, 1226, 1, 0, 0, 0, 1228, 1231, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1233, 1, 0, 0, 0, 1231, 1229, 1, 0, 0, 0, 1232, 1222, 1, 0, 0, 0, 1232, 1224, 1, 0, 0, 0, 1233, 9, 1, 0, 0, 0, 1234, 1235, 5, 46, 0, 0, 1235, 1247, 3, 14, 4, 0, 1236, 1244, 3, 14, 4, 0, 1237, 1241, 5, 46, 0, 0, 1238, 1240, 7, 0, 0, 0, 1239, 1238, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1245, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1237, 1, 0, 0, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1247, 1, 0, 0, 0, 1246, 1234, 1, 0, 0, 0, 1246, 1236, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1250, 7, 1, 0, 0, 1249, 1251, 7, 2, 0, 0, 1250, 1249, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 1, 0, 0, 0, 1252, 1253, 3, 14, 4, 0, 1253, 11, 1, 0, 0, 0, 1254, 1255, 5, 100, 0, 0, 1255, 1256, 5, 101, 0, 0, 1256, 1257, 5, 99, 0, 0, 1257, 1258, 5, 105, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 97, 0, 0, 1260, 1261, 5, 108, 0, 0, 1261, 1262, 5, 45, 0, 0, 1262, 1263, 5, 115, 0, 0, 1263, 1264, 5, 101, 0, 0, 1264, 1265, 5, 112, 0, 0, 1265, 1266, 5, 97, 0, 0, 1266, 1267, 5, 114, 0, 0, 1267, 1268, 5, 97, 0, 0, 1268, 1269, 5, 116, 0, 0, 1269, 1270, 5, 111, 0, 0, 1270, 1377, 5, 114, 0, 0, 1271, 1272, 5, 103, 0, 0, 1272, 1273, 5, 114, 0, 0, 1273, 1274, 5, 111, 0, 0, 1274, 1275, 5, 117, 0, 0, 1275, 1276, 5, 112, 0, 0, 1276, 1277, 5, 105, 0, 0, 1277, 1278, 5, 110, 0, 0, 1278, 1279, 5, 103, 0, 0, 1279, 1280, 5, 45, 0, 0, 1280, 1281, 5, 115, 0, 0, 1281, 1282, 5, 101, 0, 0, 1282, 1283, 5, 112, 0, 0, 1283, 1284, 5, 97, 0, 0, 1284, 1285, 5, 114, 0, 0, 1285, 1286, 5, 97, 0, 0, 1286, 1287, 5, 116, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1377, 5, 114, 0, 0, 1289, 1290, 5, 105, 0, 0, 1290, 1291, 5, 110, 0, 0, 1291, 1292, 5, 102, 0, 0, 1292, 1293, 5, 105, 0, 0, 1293, 1294, 5, 110, 0, 0, 1294, 1295, 5, 105, 0, 0, 1295, 1296, 5, 116, 0, 0, 1296, 1377, 5, 121, 0, 0, 1297, 1298, 5, 109, 0, 0, 1298, 1299, 5, 105, 0, 0, 1299, 1300, 5, 110, 0, 0, 1300, 1301, 5, 117, 0, 0, 1301, 1302, 5, 115, 0, 0, 1302, 1303, 5, 45, 0, 0, 1303, 1304, 5, 115, 0, 0, 1304, 1305, 5, 105, 0, 0, 1305, 1306, 5, 103, 0, 0, 1306, 1377, 5, 110, 0, 0, 1307, 1308, 5, 78, 0, 0, 1308, 1309, 5, 97, 0, 0, 1309, 1377, 5, 78, 0, 0, 1310, 1311, 5, 112, 0, 0, 1311, 1312, 5, 101, 0, 0, 1312, 1313, 5, 114, 0, 0, 1313, 1314, 5, 99, 0, 0, 1314, 1315, 5, 101, 0, 0, 1315, 1316, 5, 110, 0, 0, 1316, 1377, 5, 116, 0, 0, 1317, 1318, 5, 112, 0, 0, 1318, 1319, 5, 101, 0, 0, 1319, 1320, 5, 114, 0, 0, 1320, 1321, 5, 45, 0, 0, 1321, 1322, 5, 109, 0, 0, 1322, 1323, 5, 105, 0, 0, 1323, 1324, 5, 108, 0, 0, 1324, 1325, 5, 108, 0, 0, 1325, 1377, 5, 101, 0, 0, 1326, 1327, 5, 122, 0, 0, 1327, 1328, 5, 101, 0, 0, 1328, 1329, 5, 114, 0, 0, 1329, 1330, 5, 111, 0, 0, 1330, 1331, 5, 45, 0, 0, 1331, 1332, 5, 100, 0, 0, 1332, 1333, 5, 105, 0, 0, 1333, 1334, 5, 103, 0, 0, 1334, 1335, 5, 105, 0, 0, 1335, 1377, 5, 116, 0, 0, 1336, 1337, 5, 100, 0, 0, 1337, 1338, 5, 105, 0, 0, 1338, 1339, 5, 103, 0, 0, 1339, 1340, 5, 105, 0, 0, 1340, 1377, 5, 116, 0, 0, 1341, 1342, 5, 112, 0, 0, 1342, 1343, 5, 97, 0, 0, 1343, 1344, 5, 116, 0, 0, 1344, 1345, 5, 116, 0, 0, 1345, 1346, 5, 101, 0, 0, 1346, 1347, 5, 114, 0, 0, 1347, 1348, 5, 110, 0, 0, 1348, 1349, 5, 45, 0, 0, 1349, 1350, 5, 115, 0, 0, 1350, 1351, 5, 101, 0, 0, 1351, 1352, 5, 112, 0, 0, 1352, 1353, 5, 97, 0, 0, 1353, 1354, 5, 114, 0, 0, 1354, 1355, 5, 97, 0, 0, 1355, 1356, 5, 116, 0, 0, 1356, 1357, 5, 111, 0, 0, 1357, 1377, 5, 114, 0, 0, 1358, 1359, 5, 101, 0, 0, 1359, 1360, 5, 120, 0, 0, 1360, 1361, 5, 112, 0, 0, 1361, 1362, 5, 111, 0, 0, 1362, 1363, 5, 110, 0, 0, 1363, 1364, 5, 101, 0, 0, 1364, 1365, 5, 110, 0, 0, 1365, 1366, 5, 116, 0, 0, 1366, 1367, 5, 45, 0, 0, 1367, 1368, 5, 115, 0, 0, 1368, 1369, 5, 101, 0, 0, 1369, 1370, 5, 112, 0, 0, 1370, 1371, 5, 97, 0, 0, 1371, 1372, 5, 114, 0, 0, 1372, 1373, 5, 97, 0, 0, 1373, 1374, 5, 116, 0, 0, 1374, 1375, 5, 111, 0, 0, 1375, 1377, 5, 114, 0, 0, 1376, 1254, 1, 0, 0, 0, 1376, 1271, 1, 0, 0, 0, 1376, 1289, 1, 0, 0, 0, 1376, 1297, 1, 0, 0, 0, 1376, 1307, 1, 0, 0, 0, 1376, 1310, 1, 0, 0, 0, 1376, 1317, 1, 0, 0, 0, 1376, 1326, 1, 0, 0, 0, 1376, 1336, 1, 0, 0, 0, 1376, 1341, 1, 0, 0, 0, 1376, 1358, 1, 0, 0, 0, 1377, 13, 1, 0, 0, 0, 1378, 1380, 7, 0, 0, 0, 1379, 1378, 1, 0, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 15, 1, 0, 0, 0, 1383, 1399, 5, 38, 0, 0, 1384, 1385, 5, 108, 0, 0, 1385, 1400, 5, 116, 0, 0, 1386, 1387, 5, 103, 0, 0, 1387, 1400, 5, 116, 0, 0, 1388, 1389, 5, 97, 0, 0, 1389, 1390, 5, 109, 0, 0, 1390, 1400, 5, 112, 0, 0, 1391, 1392, 5, 113, 0, 0, 1392, 1393, 5, 117, 0, 0, 1393, 1394, 5, 111, 0, 0, 1394, 1400, 5, 116, 0, 0, 1395, 1396, 5, 97, 0, 0, 1396, 1397, 5, 112, 0, 0, 1397, 1398, 5, 111, 0, 0, 1398, 1400, 5, 115, 0, 0, 1399, 1384, 1, 0, 0, 0, 1399, 1386, 1, 0, 0, 0, 1399, 1388, 1, 0, 0, 0, 1399, 1391, 1, 0, 0, 0, 1399, 1395, 1, 0, 0, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 5, 59, 0, 0, 1402, 17, 1, 0, 0, 0, 1403, 1404, 5, 38, 0, 0, 1404, 1405, 5, 35, 0, 0, 1405, 1407, 1, 0, 0, 0, 1406, 1408, 7, 0, 0, 0, 1407, 1406, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1407, 1, 0, 0, 0, 1409, 1410, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1423, 5, 59, 0, 0, 1412, 1413, 5, 38, 0, 0, 1413, 1414, 5, 35, 0, 0, 1414, 1415, 5, 120, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1418, 7, 3, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 1419, 1, 0, 0, 0, 1419, 1417, 1, 0, 0, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 5, 59, 0, 0, 1422, 1403, 1, 0, 0, 0, 1422, 1412, 1, 0, 0, 0, 1423, 19, 1, 0, 0, 0, 1424, 1425, 5, 34, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 6, 7, 0, 0, 1427, 21, 1, 0, 0, 0, 1428, 1429, 5, 39, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1431, 6, 8, 1, 0, 1431, 23, 1, 0, 0, 0, 1432, 1433, 5, 60, 0, 0, 1433, 1434, 5, 33, 0, 0, 1434, 1435, 5, 45, 0, 0, 1435, 1436, 5, 45, 0, 0, 1436, 1442, 1, 0, 0, 0, 1437, 1438, 5, 45, 0, 0, 1438, 1441, 8, 4, 0, 0, 1439, 1441, 8, 4, 0, 0, 1440, 1437, 1, 0, 0, 0, 1440, 1439, 1, 0, 0, 0, 1441, 1444, 1, 0, 0, 0, 1442, 1440, 1, 0, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1445, 1, 0, 0, 0, 1444, 1442, 1, 0, 0, 0, 1445, 1446, 5, 45, 0, 0, 1446, 1447, 5, 45, 0, 0, 1447, 1448, 5, 62, 0, 0, 1448, 25, 1, 0, 0, 0, 1449, 1450, 5, 60, 0, 0, 1450, 1451, 5, 63, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1453, 7, 5, 0, 0, 1453, 1454, 7, 6, 0, 0, 1454, 1462, 7, 7, 0, 0, 1455, 1459, 7, 8, 0, 0, 1456, 1458, 9, 0, 0, 0, 1457, 1456, 1, 0, 0, 0, 1458, 1461, 1, 0, 0, 0, 1459, 1460, 1, 0, 0, 0, 1459, 1457, 1, 0, 0, 0, 1460, 1463, 1, 0, 0, 0, 1461, 1459, 1, 0, 0, 0, 1462, 1455, 1, 0, 0, 0, 1462, 1463, 1, 0, 0, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 5, 63, 0, 0, 1465, 1466, 5, 62, 0, 0, 1466, 27, 1, 0, 0, 0, 1467, 1468, 5, 60, 0, 0, 1468, 1469, 5, 63, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1478, 3, 374, 184, 0, 1471, 1475, 7, 8, 0, 0, 1472, 1474, 9, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 1477, 1, 0, 0, 0, 1475, 1476, 1, 0, 0, 0, 1475, 1473, 1, 0, 0, 0, 1476, 1479, 1, 0, 0, 0, 1477, 1475, 1, 0, 0, 0, 1478, 1471, 1, 0, 0, 0, 1478, 1479, 1, 0, 0, 0, 1479, 1480, 1, 0, 0, 0, 1480, 1481, 5, 63, 0, 0, 1481, 1482, 5, 62, 0, 0, 1482, 29, 1, 0, 0, 0, 1483, 1484, 5, 60, 0, 0, 1484, 1485, 5, 33, 0, 0, 1485, 1486, 5, 91, 0, 0, 1486, 1487, 5, 67, 0, 0, 1487, 1488, 5, 68, 0, 0, 1488, 1489, 5, 65, 0, 0, 1489, 1490, 5, 84, 0, 0, 1490, 1491, 5, 65, 0, 0, 1491, 1492, 5, 91, 0, 0, 1492, 1496, 1, 0, 0, 0, 1493, 1495, 9, 0, 0, 0, 1494, 1493, 1, 0, 0, 0, 1495, 1498, 1, 0, 0, 0, 1496, 1497, 1, 0, 0, 0, 1496, 1494, 1, 0, 0, 0, 1497, 1499, 1, 0, 0, 0, 1498, 1496, 1, 0, 0, 0, 1499, 1500, 5, 93, 0, 0, 1500, 1501, 5, 93, 0, 0, 1501, 1502, 5, 62, 0, 0, 1502, 31, 1, 0, 0, 0, 1503, 1504, 5, 40, 0, 0, 1504, 1505, 5, 35, 0, 0, 1505, 1507, 1, 0, 0, 0, 1506, 1508, 3, 34, 14, 0, 1507, 1506, 1, 0, 0, 0, 1507, 1508, 1, 0, 0, 0, 1508, 1512, 1, 0, 0, 0, 1509, 1510, 3, 374, 184, 0, 1510, 1511, 5, 58, 0, 0, 1511, 1513, 1, 0, 0, 0, 1512, 1509, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1514, 1, 0, 0, 0, 1514, 1522, 3, 374, 184, 0, 1515, 1519, 3, 34, 14, 0, 1516, 1518, 9, 0, 0, 0, 1517, 1516, 1, 0, 0, 0, 1518, 1521, 1, 0, 0, 0, 1519, 1520, 1, 0, 0, 0, 1519, 1517, 1, 0, 0, 0, 1520, 1523, 1, 0, 0, 0, 1521, 1519, 1, 0, 0, 0, 1522, 1515, 1, 0, 0, 0, 1522, 1523, 1, 0, 0, 0, 1523, 1524, 1, 0, 0, 0, 1524, 1525, 5, 35, 0, 0, 1525, 1526, 5, 41, 0, 0, 1526, 33, 1, 0, 0, 0, 1527, 1529, 7, 8, 0, 0, 1528, 1527, 1, 0, 0, 0, 1529, 1530, 1, 0, 0, 0, 1530, 1528, 1, 0, 0, 0, 1530, 1531, 1, 0, 0, 0, 1531, 1532, 1, 0, 0, 0, 1532, 1533, 6, 14, 2, 0, 1533, 35, 1, 0, 0, 0, 1534, 1535, 5, 61, 0, 0, 1535, 37, 1, 0, 0, 0, 1536, 1537, 5, 33, 0, 0, 1537, 1538, 5, 61, 0, 0, 1538, 39, 1, 0, 0, 0, 1539, 1540, 5, 40, 0, 0, 1540, 41, 1, 0, 0, 0, 1541, 1542, 5, 41, 0, 0, 1542, 43, 1, 0, 0, 0, 1543, 1544, 5, 91, 0, 0, 1544, 45, 1, 0, 0, 0, 1545, 1546, 5, 93, 0, 0, 1546, 47, 1, 0, 0, 0, 1547, 1548, 5, 123, 0, 0, 1548, 49, 1, 0, 0, 0, 1549, 1550, 5, 125, 0, 0, 1550, 51, 1, 0, 0, 0, 1551, 1552, 5, 42, 0, 0, 1552, 53, 1, 0, 0, 0, 1553, 1554, 5, 43, 0, 0, 1554, 55, 1, 0, 0, 0, 1555, 1556, 5, 45, 0, 0, 1556, 57, 1, 0, 0, 0, 1557, 1558, 5, 44, 0, 0, 1558, 59, 1, 0, 0, 0, 1559, 1560, 5, 46, 0, 0, 1560, 61, 1, 0, 0, 0, 1561, 1562, 5, 46, 0, 0, 1562, 1563, 5, 46, 0, 0, 1563, 63, 1, 0, 0, 0, 1564, 1565, 5, 58, 0, 0, 1565, 65, 1, 0, 0, 0, 1566, 1567, 5, 58, 0, 0, 1567, 1568, 5, 61, 0, 0, 1568, 67, 1, 0, 0, 0, 1569, 1570, 5, 59, 0, 0, 1570, 69, 1, 0, 0, 0, 1571, 1572, 5, 47, 0, 0, 1572, 71, 1, 0, 0, 0, 1573, 1574, 5, 47, 0, 0, 1574, 1575, 5, 47, 0, 0, 1575, 73, 1, 0, 0, 0, 1576, 1577, 5, 92, 0, 0, 1577, 75, 1, 0, 0, 0, 1578, 1579, 5, 124, 0, 0, 1579, 77, 1, 0, 0, 0, 1580, 1581, 5, 60, 0, 0, 1581, 79, 1, 0, 0, 0, 1582, 1583, 5, 62, 0, 0, 1583, 81, 1, 0, 0, 0, 1584, 1585, 5, 63, 0, 0, 1585, 83, 1, 0, 0, 0, 1586, 1587, 5, 64, 0, 0, 1587, 85, 1, 0, 0, 0, 1588, 1589, 5, 36, 0, 0, 1589, 87, 1, 0, 0, 0, 1590, 1591, 5, 37, 0, 0, 1591, 89, 1, 0, 0, 0, 1592, 1593, 5, 33, 0, 0, 1593, 91, 1, 0, 0, 0, 1594, 1595, 5, 35, 0, 0, 1595, 93, 1, 0, 0, 0, 1596, 1597, 5, 94, 0, 0, 1597, 95, 1, 0, 0, 0, 1598, 1599, 5, 61, 0, 0, 1599, 1600, 5, 62, 0, 0, 1600, 97, 1, 0, 0, 0, 1601, 1602, 5, 96, 0, 0, 1602, 99, 1, 0, 0, 0, 1603, 1604, 5, 124, 0, 0, 1604, 1605, 5, 124, 0, 0, 1605, 101, 1, 0, 0, 0, 1606, 1607, 5, 126, 0, 0, 1607, 103, 1, 0, 0, 0, 1608, 1609, 5, 97, 0, 0, 1609, 1610, 5, 108, 0, 0, 1610, 1611, 5, 108, 0, 0, 1611, 1612, 5, 111, 0, 0, 1612, 1613, 5, 119, 0, 0, 1613, 1614, 5, 105, 0, 0, 1614, 1615, 5, 110, 0, 0, 1615, 1616, 5, 103, 0, 0, 1616, 105, 1, 0, 0, 0, 1617, 1618, 5, 97, 0, 0, 1618, 1619, 5, 110, 0, 0, 1619, 1620, 5, 99, 0, 0, 1620, 1621, 5, 101, 0, 0, 1621, 1622, 5, 115, 0, 0, 1622, 1623, 5, 116, 0, 0, 1623, 1624, 5, 111, 0, 0, 1624, 1625, 5, 114, 0, 0, 1625, 107, 1, 0, 0, 0, 1626, 1627, 5, 97, 0, 0, 1627, 1628, 5, 110, 0, 0, 1628, 1629, 5, 99, 0, 0, 1629, 1630, 5, 101, 0, 0, 1630, 1631, 5, 115, 0, 0, 1631, 1632, 5, 116, 0, 0, 1632, 1633, 5, 111, 0, 0, 1633, 1634, 5, 114, 0, 0, 1634, 1635, 5, 45, 0, 0, 1635, 1636, 5, 111, 0, 0, 1636, 1637, 5, 114, 0, 0, 1637, 1638, 5, 45, 0, 0, 1638, 1639, 5, 115, 0, 0, 1639, 1640, 5, 101, 0, 0, 1640, 1641, 5, 108, 0, 0, 1641, 1642, 5, 102, 0, 0, 1642, 109, 1, 0, 0, 0, 1643, 1644, 5, 97, 0, 0, 1644, 1645, 5, 110, 0, 0, 1645, 1646, 5, 100, 0, 0, 1646, 111, 1, 0, 0, 0, 1647, 1648, 5, 97, 0, 0, 1648, 1649, 5, 114, 0, 0, 1649, 1650, 5, 114, 0, 0, 1650, 1651, 5, 97, 0, 0, 1651, 1652, 5, 121, 0, 0, 1652, 113, 1, 0, 0, 0, 1653, 1654, 5, 97, 0, 0, 1654, 1655, 5, 115, 0, 0, 1655, 115, 1, 0, 0, 0, 1656, 1657, 5, 97, 0, 0, 1657, 1658, 5, 115, 0, 0, 1658, 1659, 5, 99, 0, 0, 1659, 1660, 5, 101, 0, 0, 1660, 1661, 5, 110, 0, 0, 1661, 1662, 5, 100, 0, 0, 1662, 1663, 5, 105, 0, 0, 1663, 1664, 5, 110, 0, 0, 1664, 1665, 5, 103, 0, 0, 1665, 117, 1, 0, 0, 0, 1666, 1667, 5, 97, 0, 0, 1667, 1668, 5, 116, 0, 0, 1668, 119, 1, 0, 0, 0, 1669, 1670, 5, 97, 0, 0, 1670, 1671, 5, 116, 0, 0, 1671, 1672, 5, 116, 0, 0, 1672, 1673, 5, 114, 0, 0, 1673, 1674, 5, 105, 0, 0, 1674, 1675, 5, 98, 0, 0, 1675, 1676, 5, 117, 0, 0, 1676, 1677, 5, 116, 0, 0, 1677, 1678, 5, 101, 0, 0, 1678, 121, 1, 0, 0, 0, 1679, 1680, 5, 98, 0, 0, 1680, 1681, 5, 97, 0, 0, 1681, 1682, 5, 115, 0, 0, 1682, 1683, 5, 101, 0, 0, 1683, 1684, 5, 45, 0, 0, 1684, 1685, 5, 117, 0, 0, 1685, 1686, 5, 114, 0, 0, 1686, 1687, 5, 105, 0, 0, 1687, 123, 1, 0, 0, 0, 1688, 1689, 5, 98, 0, 0, 1689, 1690, 5, 111, 0, 0, 1690, 1691, 5, 117, 0, 0, 1691, 1692, 5, 110, 0, 0, 1692, 1693, 5, 100, 0, 0, 1693, 1694, 5, 97, 0, 0, 1694, 1695, 5, 114, 0, 0, 1695, 1696, 5, 121, 0, 0, 1696, 1697, 5, 45, 0, 0, 1697, 1698, 5, 115, 0, 0, 1698, 1699, 5, 112, 0, 0, 1699, 1700, 5, 97, 0, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1702, 5, 101, 0, 0, 1702, 125, 1, 0, 0, 0, 1703, 1704, 5, 98, 0, 0, 1704, 1705, 5, 105, 0, 0, 1705, 1706, 5, 110, 0, 0, 1706, 1707, 5, 97, 0, 0, 1707, 1708, 5, 114, 0, 0, 1708, 1709, 5, 121, 0, 0, 1709, 127, 1, 0, 0, 0, 1710, 1711, 5, 98, 0, 0, 1711, 1712, 5, 121, 0, 0, 1712, 129, 1, 0, 0, 0, 1713, 1714, 5, 99, 0, 0, 1714, 1715, 5, 97, 0, 0, 1715, 1716, 5, 115, 0, 0, 1716, 1717, 5, 101, 0, 0, 1717, 131, 1, 0, 0, 0, 1718, 1719, 5, 99, 0, 0, 1719, 1720, 5, 97, 0, 0, 1720, 1721, 5, 115, 0, 0, 1721, 1722, 5, 116, 0, 0, 1722, 133, 1, 0, 0, 0, 1723, 1724, 5, 99, 0, 0, 1724, 1725, 5, 97, 0, 0, 1725, 1726, 5, 115, 0, 0, 1726, 1727, 5, 116, 0, 0, 1727, 1728, 5, 97, 0, 0, 1728, 1729, 5, 98, 0, 0, 1729, 1730, 5, 108, 0, 0, 1730, 1731, 5, 101, 0, 0, 1731, 135, 1, 0, 0, 0, 1732, 1733, 5, 99, 0, 0, 1733, 1734, 5, 97, 0, 0, 1734, 1735, 5, 116, 0, 0, 1735, 1736, 5, 99, 0, 0, 1736, 1737, 5, 104, 0, 0, 1737, 137, 1, 0, 0, 0, 1738, 1739, 5, 99, 0, 0, 1739, 1740, 5, 104, 0, 0, 1740, 1741, 5, 105, 0, 0, 1741, 1742, 5, 108, 0, 0, 1742, 1743, 5, 100, 0, 0, 1743, 139, 1, 0, 0, 0, 1744, 1745, 5, 99, 0, 0, 1745, 1746, 5, 111, 0, 0, 1746, 1747, 5, 108, 0, 0, 1747, 1748, 5, 108, 0, 0, 1748, 1749, 5, 97, 0, 0, 1749, 1750, 5, 116, 0, 0, 1750, 1751, 5, 105, 0, 0, 1751, 1752, 5, 111, 0, 0, 1752, 1753, 5, 110, 0, 0, 1753, 141, 1, 0, 0, 0, 1754, 1755, 5, 99, 0, 0, 1755, 1756, 5, 111, 0, 0, 1756, 1757, 5, 109, 0, 0, 1757, 1758, 5, 109, 0, 0, 1758, 1759, 5, 101, 0, 0, 1759, 1760, 5, 110, 0, 0, 1760, 1761, 5, 116, 0, 0, 1761, 143, 1, 0, 0, 0, 1762, 1763, 5, 99, 0, 0, 1763, 1764, 5, 111, 0, 0, 1764, 1765, 5, 110, 0, 0, 1765, 1766, 5, 115, 0, 0, 1766, 1767, 5, 116, 0, 0, 1767, 1768, 5, 114, 0, 0, 1768, 1769, 5, 117, 0, 0, 1769, 1770, 5, 99, 0, 0, 1770, 1771, 5, 116, 0, 0, 1771, 1772, 5, 105, 0, 0, 1772, 1773, 5, 111, 0, 0, 1773, 1774, 5, 110, 0, 0, 1774, 145, 1, 0, 0, 0, 1775, 1776, 5, 99, 0, 0, 1776, 1777, 5, 111, 0, 0, 1777, 1778, 5, 110, 0, 0, 1778, 1779, 5, 116, 0, 0, 1779, 1780, 5, 101, 0, 0, 1780, 1781, 5, 120, 0, 0, 1781, 1782, 5, 116, 0, 0, 1782, 147, 1, 0, 0, 0, 1783, 1784, 5, 99, 0, 0, 1784, 1785, 5, 111, 0, 0, 1785, 1786, 5, 112, 0, 0, 1786, 1787, 5, 121, 0, 0, 1787, 1788, 5, 45, 0, 0, 1788, 1789, 5, 110, 0, 0, 1789, 1790, 5, 97, 0, 0, 1790, 1791, 5, 109, 0, 0, 1791, 1792, 5, 101, 0, 0, 1792, 1793, 5, 115, 0, 0, 1793, 1794, 5, 112, 0, 0, 1794, 1795, 5, 97, 0, 0, 1795, 1796, 5, 99, 0, 0, 1796, 1797, 5, 101, 0, 0, 1797, 1798, 5, 115, 0, 0, 1798, 149, 1, 0, 0, 0, 1799, 1800, 5, 99, 0, 0, 1800, 1801, 5, 111, 0, 0, 1801, 1802, 5, 117, 0, 0, 1802, 1803, 5, 110, 0, 0, 1803, 1804, 5, 116, 0, 0, 1804, 151, 1, 0, 0, 0, 1805, 1806, 5, 100, 0, 0, 1806, 1807, 5, 101, 0, 0, 1807, 1808, 5, 99, 0, 0, 1808, 1809, 5, 108, 0, 0, 1809, 1810, 5, 97, 0, 0, 1810, 1811, 5, 114, 0, 0, 1811, 1812, 5, 101, 0, 0, 1812, 153, 1, 0, 0, 0, 1813, 1814, 5, 100, 0, 0, 1814, 1815, 5, 101, 0, 0, 1815, 1816, 5, 102, 0, 0, 1816, 1817, 5, 97, 0, 0, 1817, 1818, 5, 117, 0, 0, 1818, 1819, 5, 108, 0, 0, 1819, 1820, 5, 116, 0, 0, 1820, 155, 1, 0, 0, 0, 1821, 1822, 5, 100, 0, 0, 1822, 1823, 5, 101, 0, 0, 1823, 1824, 5, 115, 0, 0, 1824, 1825, 5, 99, 0, 0, 1825, 1826, 5, 101, 0, 0, 1826, 1827, 5, 110, 0, 0, 1827, 1828, 5, 100, 0, 0, 1828, 1829, 5, 97, 0, 0, 1829, 1830, 5, 110, 0, 0, 1830, 1831, 5, 116, 0, 0, 1831, 157, 1, 0, 0, 0, 1832, 1833, 5, 100, 0, 0, 1833, 1834, 5, 101, 0, 0, 1834, 1835, 5, 115, 0, 0, 1835, 1836, 5, 99, 0, 0, 1836, 1837, 5, 101, 0, 0, 1837, 1838, 5, 110, 0, 0, 1838, 1839, 5, 100, 0, 0, 1839, 1840, 5, 97, 0, 0, 1840, 1841, 5, 110, 0, 0, 1841, 1842, 5, 116, 0, 0, 1842, 1843, 5, 45, 0, 0, 1843, 1844, 5, 111, 0, 0, 1844, 1845, 5, 114, 0, 0, 1845, 1846, 5, 45, 0, 0, 1846, 1847, 5, 115, 0, 0, 1847, 1848, 5, 101, 0, 0, 1848, 1849, 5, 108, 0, 0, 1849, 1850, 5, 102, 0, 0, 1850, 159, 1, 0, 0, 0, 1851, 1852, 5, 100, 0, 0, 1852, 1853, 5, 101, 0, 0, 1853, 1854, 5, 115, 0, 0, 1854, 1855, 5, 99, 0, 0, 1855, 1856, 5, 101, 0, 0, 1856, 1857, 5, 110, 0, 0, 1857, 1858, 5, 100, 0, 0, 1858, 1859, 5, 105, 0, 0, 1859, 1860, 5, 110, 0, 0, 1860, 1861, 5, 103, 0, 0, 1861, 161, 1, 0, 0, 0, 1862, 1863, 5, 100, 0, 0, 1863, 1864, 5, 101, 0, 0, 1864, 1865, 5, 99, 0, 0, 1865, 1866, 5, 105, 0, 0, 1866, 1867, 5, 109, 0, 0, 1867, 1868, 5, 97, 0, 0, 1868, 1869, 5, 108, 0, 0, 1869, 1870, 5, 45, 0, 0, 1870, 1871, 5, 102, 0, 0, 1871, 1872, 5, 111, 0, 0, 1872, 1873, 5, 114, 0, 0, 1873, 1874, 5, 109, 0, 0, 1874, 1875, 5, 97, 0, 0, 1875, 1876, 5, 116, 0, 0, 1876, 163, 1, 0, 0, 0, 1877, 1878, 5, 100, 0, 0, 1878, 1879, 5, 105, 0, 0, 1879, 1880, 5, 118, 0, 0, 1880, 165, 1, 0, 0, 0, 1881, 1882, 5, 100, 0, 0, 1882, 1883, 5, 111, 0, 0, 1883, 1884, 5, 99, 0, 0, 1884, 1885, 5, 117, 0, 0, 1885, 1886, 5, 109, 0, 0, 1886, 1887, 5, 101, 0, 0, 1887, 1888, 5, 110, 0, 0, 1888, 1889, 5, 116, 0, 0, 1889, 167, 1, 0, 0, 0, 1890, 1891, 5, 100, 0, 0, 1891, 1892, 5, 111, 0, 0, 1892, 1893, 5, 99, 0, 0, 1893, 1894, 5, 117, 0, 0, 1894, 1895, 5, 109, 0, 0, 1895, 1896, 5, 101, 0, 0, 1896, 1897, 5, 110, 0, 0, 1897, 1898, 5, 116, 0, 0, 1898, 1899, 5, 45, 0, 0, 1899, 1900, 5, 110, 0, 0, 1900, 1901, 5, 111, 0, 0, 1901, 1902, 5, 100, 0, 0, 1902, 1903, 5, 101, 0, 0, 1903, 169, 1, 0, 0, 0, 1904, 1905, 5, 101, 0, 0, 1905, 1906, 5, 108, 0, 0, 1906, 1907, 5, 101, 0, 0, 1907, 1908, 5, 109, 0, 0, 1908, 1909, 5, 101, 0, 0, 1909, 1910, 5, 110, 0, 0, 1910, 1911, 5, 116, 0, 0, 1911, 171, 1, 0, 0, 0, 1912, 1913, 5, 101, 0, 0, 1913, 1914, 5, 108, 0, 0, 1914, 1915, 5, 115, 0, 0, 1915, 1916, 5, 101, 0, 0, 1916, 173, 1, 0, 0, 0, 1917, 1918, 5, 101, 0, 0, 1918, 1919, 5, 109, 0, 0, 1919, 1920, 5, 112, 0, 0, 1920, 1921, 5, 116, 0, 0, 1921, 1922, 5, 121, 0, 0, 1922, 175, 1, 0, 0, 0, 1923, 1924, 5, 101, 0, 0, 1924, 1925, 5, 109, 0, 0, 1925, 1926, 5, 112, 0, 0, 1926, 1927, 5, 116, 0, 0, 1927, 1928, 5, 121, 0, 0, 1928, 1929, 5, 45, 0, 0, 1929, 1930, 5, 115, 0, 0, 1930, 1931, 5, 101, 0, 0, 1931, 1932, 5, 113, 0, 0, 1932, 1933, 5, 117, 0, 0, 1933, 1934, 5, 101, 0, 0, 1934, 1935, 5, 110, 0, 0, 1935, 1936, 5, 99, 0, 0, 1936, 1937, 5, 101, 0, 0, 1937, 177, 1, 0, 0, 0, 1938, 1939, 5, 101, 0, 0, 1939, 1940, 5, 110, 0, 0, 1940, 1941, 5, 99, 0, 0, 1941, 1942, 5, 111, 0, 0, 1942, 1943, 5, 100, 0, 0, 1943, 1944, 5, 105, 0, 0, 1944, 1945, 5, 110, 0, 0, 1945, 1946, 5, 103, 0, 0, 1946, 179, 1, 0, 0, 0, 1947, 1948, 5, 101, 0, 0, 1948, 1949, 5, 110, 0, 0, 1949, 1950, 5, 100, 0, 0, 1950, 181, 1, 0, 0, 0, 1951, 1952, 5, 101, 0, 0, 1952, 1953, 5, 113, 0, 0, 1953, 183, 1, 0, 0, 0, 1954, 1955, 5, 101, 0, 0, 1955, 1956, 5, 118, 0, 0, 1956, 1957, 5, 101, 0, 0, 1957, 1958, 5, 114, 0, 0, 1958, 1959, 5, 121, 0, 0, 1959, 185, 1, 0, 0, 0, 1960, 1961, 5, 101, 0, 0, 1961, 1962, 5, 120, 0, 0, 1962, 1963, 5, 99, 0, 0, 1963, 1964, 5, 101, 0, 0, 1964, 1965, 5, 112, 0, 0, 1965, 1966, 5, 116, 0, 0, 1966, 187, 1, 0, 0, 0, 1967, 1968, 5, 101, 0, 0, 1968, 1969, 5, 120, 0, 0, 1969, 1970, 5, 116, 0, 0, 1970, 1971, 5, 101, 0, 0, 1971, 1972, 5, 114, 0, 0, 1972, 1973, 5, 110, 0, 0, 1973, 1974, 5, 97, 0, 0, 1974, 1975, 5, 108, 0, 0, 1975, 189, 1, 0, 0, 0, 1976, 1977, 5, 102, 0, 0, 1977, 1978, 5, 111, 0, 0, 1978, 1979, 5, 108, 0, 0, 1979, 1980, 5, 108, 0, 0, 1980, 1981, 5, 111, 0, 0, 1981, 1982, 5, 119, 0, 0, 1982, 1983, 5, 105, 0, 0, 1983, 1984, 5, 110, 0, 0, 1984, 1985, 5, 103, 0, 0, 1985, 191, 1, 0, 0, 0, 1986, 1987, 5, 102, 0, 0, 1987, 1988, 5, 111, 0, 0, 1988, 1989, 5, 108, 0, 0, 1989, 1990, 5, 108, 0, 0, 1990, 1991, 5, 111, 0, 0, 1991, 1992, 5, 119, 0, 0, 1992, 1993, 5, 105, 0, 0, 1993, 1994, 5, 110, 0, 0, 1994, 1995, 5, 103, 0, 0, 1995, 1996, 5, 45, 0, 0, 1996, 1997, 5, 115, 0, 0, 1997, 1998, 5, 105, 0, 0, 1998, 1999, 5, 98, 0, 0, 1999, 2000, 5, 108, 0, 0, 2000, 2001, 5, 105, 0, 0, 2001, 2002, 5, 110, 0, 0, 2002, 2003, 5, 103, 0, 0, 2003, 193, 1, 0, 0, 0, 2004, 2005, 5, 102, 0, 0, 2005, 2006, 5, 111, 0, 0, 2006, 2007, 5, 114, 0, 0, 2007, 195, 1, 0, 0, 0, 2008, 2009, 5, 102, 0, 0, 2009, 2010, 5, 117, 0, 0, 2010, 2011, 5, 110, 0, 0, 2011, 2012, 5, 99, 0, 0, 2012, 2013, 5, 116, 0, 0, 2013, 2014, 5, 105, 0, 0, 2014, 2015, 5, 111, 0, 0, 2015, 2016, 5, 110, 0, 0, 2016, 197, 1, 0, 0, 0, 2017, 2018, 5, 103, 0, 0, 2018, 2019, 5, 101, 0, 0, 2019, 199, 1, 0, 0, 0, 2020, 2021, 5, 103, 0, 0, 2021, 2022, 5, 114, 0, 0, 2022, 2023, 5, 101, 0, 0, 2023, 2024, 5, 97, 0, 0, 2024, 2025, 5, 116, 0, 0, 2025, 2026, 5, 101, 0, 0, 2026, 2027, 5, 115, 0, 0, 2027, 2028, 5, 116, 0, 0, 2028, 201, 1, 0, 0, 0, 2029, 2030, 5, 103, 0, 0, 2030, 2031, 5, 114, 0, 0, 2031, 2032, 5, 111, 0, 0, 2032, 2033, 5, 117, 0, 0, 2033, 2034, 5, 112, 0, 0, 2034, 203, 1, 0, 0, 0, 2035, 2036, 5, 103, 0, 0, 2036, 2037, 5, 116, 0, 0, 2037, 205, 1, 0, 0, 0, 2038, 2039, 5, 105, 0, 0, 2039, 2040, 5, 100, 0, 0, 2040, 2041, 5, 105, 0, 0, 2041, 2042, 5, 118, 0, 0, 2042, 207, 1, 0, 0, 0, 2043, 2044, 5, 105, 0, 0, 2044, 2045, 5, 102, 0, 0, 2045, 209, 1, 0, 0, 0, 2046, 2047, 5, 105, 0, 0, 2047, 2048, 5, 109, 0, 0, 2048, 2049, 5, 112, 0, 0, 2049, 2050, 5, 111, 0, 0, 2050, 2051, 5, 114, 0, 0, 2051, 2052, 5, 116, 0, 0, 2052, 211, 1, 0, 0, 0, 2053, 2054, 5, 105, 0, 0, 2054, 2055, 5, 110, 0, 0, 2055, 213, 1, 0, 0, 0, 2056, 2057, 5, 105, 0, 0, 2057, 2058, 5, 110, 0, 0, 2058, 2059, 5, 104, 0, 0, 2059, 2060, 5, 101, 0, 0, 2060, 2061, 5, 114, 0, 0, 2061, 2062, 5, 105, 0, 0, 2062, 2063, 5, 116, 0, 0, 2063, 215, 1, 0, 0, 0, 2064, 2065, 5, 105, 0, 0, 2065, 2066, 5, 110, 0, 0, 2066, 2067, 5, 115, 0, 0, 2067, 2068, 5, 116, 0, 0, 2068, 2069, 5, 97, 0, 0, 2069, 2070, 5, 110, 0, 0, 2070, 2071, 5, 99, 0, 0, 2071, 2072, 5, 101, 0, 0, 2072, 217, 1, 0, 0, 0, 2073, 2074, 5, 105, 0, 0, 2074, 2075, 5, 110, 0, 0, 2075, 2076, 5, 116, 0, 0, 2076, 2077, 5, 101, 0, 0, 2077, 2078, 5, 114, 0, 0, 2078, 2079, 5, 115, 0, 0, 2079, 2080, 5, 101, 0, 0, 2080, 2081, 5, 99, 0, 0, 2081, 2082, 5, 116, 0, 0, 2082, 219, 1, 0, 0, 0, 2083, 2084, 5, 105, 0, 0, 2084, 2085, 5, 115, 0, 0, 2085, 221, 1, 0, 0, 0, 2086, 2087, 5, 105, 0, 0, 2087, 2088, 5, 116, 0, 0, 2088, 2089, 5, 101, 0, 0, 2089, 2090, 5, 109, 0, 0, 2090, 223, 1, 0, 0, 0, 2091, 2092, 5, 108, 0, 0, 2092, 2093, 5, 97, 0, 0, 2093, 2094, 5, 120, 0, 0, 2094, 225, 1, 0, 0, 0, 2095, 2096, 5, 108, 0, 0, 2096, 2097, 5, 101, 0, 0, 2097, 227, 1, 0, 0, 0, 2098, 2099, 5, 108, 0, 0, 2099, 2100, 5, 101, 0, 0, 2100, 2101, 5, 97, 0, 0, 2101, 2102, 5, 115, 0, 0, 2102, 2103, 5, 116, 0, 0, 2103, 229, 1, 0, 0, 0, 2104, 2105, 5, 108, 0, 0, 2105, 2106, 5, 101, 0, 0, 2106, 2107, 5, 116, 0, 0, 2107, 231, 1, 0, 0, 0, 2108, 2109, 5, 108, 0, 0, 2109, 2110, 5, 116, 0, 0, 2110, 233, 1, 0, 0, 0, 2111, 2112, 5, 109, 0, 0, 2112, 2113, 5, 97, 0, 0, 2113, 2114, 5, 112, 0, 0, 2114, 235, 1, 0, 0, 0, 2115, 2116, 5, 109, 0, 0, 2116, 2117, 5, 111, 0, 0, 2117, 2118, 5, 100, 0, 0, 2118, 237, 1, 0, 0, 0, 2119, 2120, 5, 109, 0, 0, 2120, 2121, 5, 111, 0, 0, 2121, 2122, 5, 100, 0, 0, 2122, 2123, 5, 117, 0, 0, 2123, 2124, 5, 108, 0, 0, 2124, 2125, 5, 101, 0, 0, 2125, 239, 1, 0, 0, 0, 2126, 2127, 5, 110, 0, 0, 2127, 2128, 5, 97, 0, 0, 2128, 2129, 5, 109, 0, 0, 2129, 2130, 5, 101, 0, 0, 2130, 2131, 5, 115, 0, 0, 2131, 2132, 5, 112, 0, 0, 2132, 2133, 5, 97, 0, 0, 2133, 2134, 5, 99, 0, 0, 2134, 2135, 5, 101, 0, 0, 2135, 241, 1, 0, 0, 0, 2136, 2137, 5, 110, 0, 0, 2137, 2138, 5, 101, 0, 0, 2138, 243, 1, 0, 0, 0, 2139, 2140, 5, 110, 0, 0, 2140, 2141, 5, 101, 0, 0, 2141, 2142, 5, 120, 0, 0, 2142, 2143, 5, 116, 0, 0, 2143, 245, 1, 0, 0, 0, 2144, 2145, 5, 110, 0, 0, 2145, 2146, 5, 97, 0, 0, 2146, 2147, 5, 109, 0, 0, 2147, 2148, 5, 101, 0, 0, 2148, 2149, 5, 115, 0, 0, 2149, 2150, 5, 112, 0, 0, 2150, 2151, 5, 97, 0, 0, 2151, 2152, 5, 99, 0, 0, 2152, 2153, 5, 101, 0, 0, 2153, 2154, 5, 45, 0, 0, 2154, 2155, 5, 110, 0, 0, 2155, 2156, 5, 111, 0, 0, 2156, 2157, 5, 100, 0, 0, 2157, 2158, 5, 101, 0, 0, 2158, 247, 1, 0, 0, 0, 2159, 2160, 5, 110, 0, 0, 2160, 2161, 5, 111, 0, 0, 2161, 2162, 5, 45, 0, 0, 2162, 2163, 5, 105, 0, 0, 2163, 2164, 5, 110, 0, 0, 2164, 2165, 5, 104, 0, 0, 2165, 2166, 5, 101, 0, 0, 2166, 2167, 5, 114, 0, 0, 2167, 2168, 5, 105, 0, 0, 2168, 2169, 5, 116, 0, 0, 2169, 249, 1, 0, 0, 0, 2170, 2171, 5, 110, 0, 0, 2171, 2172, 5, 111, 0, 0, 2172, 2173, 5, 45, 0, 0, 2173, 2174, 5, 112, 0, 0, 2174, 2175, 5, 114, 0, 0, 2175, 2176, 5, 101, 0, 0, 2176, 2177, 5, 115, 0, 0, 2177, 2178, 5, 101, 0, 0, 2178, 2179, 5, 114, 0, 0, 2179, 2180, 5, 118, 0, 0, 2180, 2181, 5, 101, 0, 0, 2181, 251, 1, 0, 0, 0, 2182, 2183, 5, 110, 0, 0, 2183, 2184, 5, 111, 0, 0, 2184, 2185, 5, 100, 0, 0, 2185, 2186, 5, 101, 0, 0, 2186, 253, 1, 0, 0, 0, 2187, 2188, 5, 111, 0, 0, 2188, 2189, 5, 102, 0, 0, 2189, 255, 1, 0, 0, 0, 2190, 2191, 5, 111, 0, 0, 2191, 2192, 5, 110, 0, 0, 2192, 2193, 5, 108, 0, 0, 2193, 2194, 5, 121, 0, 0, 2194, 257, 1, 0, 0, 0, 2195, 2196, 5, 111, 0, 0, 2196, 2197, 5, 112, 0, 0, 2197, 2198, 5, 116, 0, 0, 2198, 2199, 5, 105, 0, 0, 2199, 2200, 5, 111, 0, 0, 2200, 2201, 5, 110, 0, 0, 2201, 259, 1, 0, 0, 0, 2202, 2203, 5, 111, 0, 0, 2203, 2204, 5, 114, 0, 0, 2204, 261, 1, 0, 0, 0, 2205, 2206, 5, 111, 0, 0, 2206, 2207, 5, 114, 0, 0, 2207, 2208, 5, 100, 0, 0, 2208, 2209, 5, 101, 0, 0, 2209, 2210, 5, 114, 0, 0, 2210, 263, 1, 0, 0, 0, 2211, 2212, 5, 111, 0, 0, 2212, 2213, 5, 114, 0, 0, 2213, 2214, 5, 100, 0, 0, 2214, 2215, 5, 101, 0, 0, 2215, 2216, 5, 114, 0, 0, 2216, 2217, 5, 101, 0, 0, 2217, 2218, 5, 100, 0, 0, 2218, 265, 1, 0, 0, 0, 2219, 2220, 5, 111, 0, 0, 2220, 2221, 5, 114, 0, 0, 2221, 2222, 5, 100, 0, 0, 2222, 2223, 5, 101, 0, 0, 2223, 2224, 5, 114, 0, 0, 2224, 2225, 5, 105, 0, 0, 2225, 2226, 5, 110, 0, 0, 2226, 2227, 5, 103, 0, 0, 2227, 267, 1, 0, 0, 0, 2228, 2229, 5, 112, 0, 0, 2229, 2230, 5, 97, 0, 0, 2230, 2231, 5, 114, 0, 0, 2231, 2232, 5, 101, 0, 0, 2232, 2233, 5, 110, 0, 0, 2233, 2234, 5, 116, 0, 0, 2234, 269, 1, 0, 0, 0, 2235, 2236, 5, 112, 0, 0, 2236, 2237, 5, 114, 0, 0, 2237, 2238, 5, 101, 0, 0, 2238, 2239, 5, 99, 0, 0, 2239, 2240, 5, 101, 0, 0, 2240, 2241, 5, 100, 0, 0, 2241, 2242, 5, 105, 0, 0, 2242, 2243, 5, 110, 0, 0, 2243, 2244, 5, 103, 0, 0, 2244, 271, 1, 0, 0, 0, 2245, 2246, 5, 112, 0, 0, 2246, 2247, 5, 114, 0, 0, 2247, 2248, 5, 101, 0, 0, 2248, 2249, 5, 99, 0, 0, 2249, 2250, 5, 101, 0, 0, 2250, 2251, 5, 100, 0, 0, 2251, 2252, 5, 105, 0, 0, 2252, 2253, 5, 110, 0, 0, 2253, 2254, 5, 103, 0, 0, 2254, 2255, 5, 45, 0, 0, 2255, 2256, 5, 115, 0, 0, 2256, 2257, 5, 105, 0, 0, 2257, 2258, 5, 98, 0, 0, 2258, 2259, 5, 108, 0, 0, 2259, 2260, 5, 105, 0, 0, 2260, 2261, 5, 110, 0, 0, 2261, 2262, 5, 103, 0, 0, 2262, 273, 1, 0, 0, 0, 2263, 2264, 5, 112, 0, 0, 2264, 2265, 5, 114, 0, 0, 2265, 2266, 5, 101, 0, 0, 2266, 2267, 5, 115, 0, 0, 2267, 2268, 5, 101, 0, 0, 2268, 2269, 5, 114, 0, 0, 2269, 2270, 5, 118, 0, 0, 2270, 2271, 5, 101, 0, 0, 2271, 275, 1, 0, 0, 0, 2272, 2273, 5, 112, 0, 0, 2273, 2274, 5, 114, 0, 0, 2274, 2275, 5, 101, 0, 0, 2275, 2276, 5, 118, 0, 0, 2276, 2277, 5, 105, 0, 0, 2277, 2278, 5, 111, 0, 0, 2278, 2279, 5, 117, 0, 0, 2279, 2280, 5, 115, 0, 0, 2280, 277, 1, 0, 0, 0, 2281, 2282, 5, 112, 0, 0, 2282, 2283, 5, 114, 0, 0, 2283, 2284, 5, 111, 0, 0, 2284, 2285, 5, 99, 0, 0, 2285, 2286, 5, 101, 0, 0, 2286, 2287, 5, 115, 0, 0, 2287, 2288, 5, 115, 0, 0, 2288, 2289, 5, 105, 0, 0, 2289, 2290, 5, 110, 0, 0, 2290, 2291, 5, 103, 0, 0, 2291, 2292, 5, 45, 0, 0, 2292, 2293, 5, 105, 0, 0, 2293, 2294, 5, 110, 0, 0, 2294, 2295, 5, 115, 0, 0, 2295, 2296, 5, 116, 0, 0, 2296, 2297, 5, 114, 0, 0, 2297, 2298, 5, 117, 0, 0, 2298, 2299, 5, 99, 0, 0, 2299, 2300, 5, 116, 0, 0, 2300, 2301, 5, 105, 0, 0, 2301, 2302, 5, 111, 0, 0, 2302, 2303, 5, 110, 0, 0, 2303, 279, 1, 0, 0, 0, 2304, 2305, 5, 114, 0, 0, 2305, 2306, 5, 101, 0, 0, 2306, 2307, 5, 116, 0, 0, 2307, 2308, 5, 117, 0, 0, 2308, 2309, 5, 114, 0, 0, 2309, 2310, 5, 110, 0, 0, 2310, 281, 1, 0, 0, 0, 2311, 2312, 5, 115, 0, 0, 2312, 2313, 5, 97, 0, 0, 2313, 2314, 5, 116, 0, 0, 2314, 2315, 5, 105, 0, 0, 2315, 2316, 5, 115, 0, 0, 2316, 2317, 5, 102, 0, 0, 2317, 2318, 5, 105, 0, 0, 2318, 2319, 5, 101, 0, 0, 2319, 2320, 5, 115, 0, 0, 2320, 283, 1, 0, 0, 0, 2321, 2322, 5, 115, 0, 0, 2322, 2323, 5, 99, 0, 0, 2323, 2324, 5, 104, 0, 0, 2324, 2325, 5, 101, 0, 0, 2325, 2326, 5, 109, 0, 0, 2326, 2327, 5, 97, 0, 0, 2327, 285, 1, 0, 0, 0, 2328, 2329, 5, 115, 0, 0, 2329, 2330, 5, 99, 0, 0, 2330, 2331, 5, 104, 0, 0, 2331, 2332, 5, 101, 0, 0, 2332, 2333, 5, 109, 0, 0, 2333, 2334, 5, 97, 0, 0, 2334, 2335, 5, 45, 0, 0, 2335, 2336, 5, 97, 0, 0, 2336, 2337, 5, 116, 0, 0, 2337, 2338, 5, 116, 0, 0, 2338, 2339, 5, 114, 0, 0, 2339, 2340, 5, 105, 0, 0, 2340, 2341, 5, 98, 0, 0, 2341, 2342, 5, 117, 0, 0, 2342, 2343, 5, 116, 0, 0, 2343, 2344, 5, 101, 0, 0, 2344, 287, 1, 0, 0, 0, 2345, 2346, 5, 115, 0, 0, 2346, 2347, 5, 99, 0, 0, 2347, 2348, 5, 104, 0, 0, 2348, 2349, 5, 101, 0, 0, 2349, 2350, 5, 109, 0, 0, 2350, 2351, 5, 97, 0, 0, 2351, 2352, 5, 45, 0, 0, 2352, 2353, 5, 101, 0, 0, 2353, 2354, 5, 108, 0, 0, 2354, 2355, 5, 101, 0, 0, 2355, 2356, 5, 109, 0, 0, 2356, 2357, 5, 101, 0, 0, 2357, 2358, 5, 110, 0, 0, 2358, 2359, 5, 116, 0, 0, 2359, 289, 1, 0, 0, 0, 2360, 2361, 5, 115, 0, 0, 2361, 2362, 5, 101, 0, 0, 2362, 2363, 5, 108, 0, 0, 2363, 2364, 5, 102, 0, 0, 2364, 291, 1, 0, 0, 0, 2365, 2366, 5, 115, 0, 0, 2366, 2367, 5, 108, 0, 0, 2367, 2368, 5, 105, 0, 0, 2368, 2369, 5, 100, 0, 0, 2369, 2370, 5, 105, 0, 0, 2370, 2371, 5, 110, 0, 0, 2371, 2372, 5, 103, 0, 0, 2372, 293, 1, 0, 0, 0, 2373, 2374, 5, 115, 0, 0, 2374, 2375, 5, 111, 0, 0, 2375, 2376, 5, 109, 0, 0, 2376, 2377, 5, 101, 0, 0, 2377, 295, 1, 0, 0, 0, 2378, 2379, 5, 115, 0, 0, 2379, 2380, 5, 116, 0, 0, 2380, 2381, 5, 97, 0, 0, 2381, 2382, 5, 98, 0, 0, 2382, 2383, 5, 108, 0, 0, 2383, 2384, 5, 101, 0, 0, 2384, 297, 1, 0, 0, 0, 2385, 2386, 5, 115, 0, 0, 2386, 2387, 5, 116, 0, 0, 2387, 2388, 5, 97, 0, 0, 2388, 2389, 5, 114, 0, 0, 2389, 2390, 5, 116, 0, 0, 2390, 299, 1, 0, 0, 0, 2391, 2392, 5, 115, 0, 0, 2392, 2393, 5, 116, 0, 0, 2393, 2394, 5, 114, 0, 0, 2394, 2395, 5, 105, 0, 0, 2395, 2396, 5, 99, 0, 0, 2396, 2397, 5, 116, 0, 0, 2397, 301, 1, 0, 0, 0, 2398, 2399, 5, 115, 0, 0, 2399, 2400, 5, 116, 0, 0, 2400, 2401, 5, 114, 0, 0, 2401, 2402, 5, 105, 0, 0, 2402, 2403, 5, 112, 0, 0, 2403, 303, 1, 0, 0, 0, 2404, 2405, 5, 115, 0, 0, 2405, 2406, 5, 119, 0, 0, 2406, 2407, 5, 105, 0, 0, 2407, 2408, 5, 116, 0, 0, 2408, 2409, 5, 99, 0, 0, 2409, 2410, 5, 104, 0, 0, 2410, 305, 1, 0, 0, 0, 2411, 2412, 5, 116, 0, 0, 2412, 2413, 5, 101, 0, 0, 2413, 2414, 5, 120, 0, 0, 2414, 2415, 5, 116, 0, 0, 2415, 307, 1, 0, 0, 0, 2416, 2417, 5, 116, 0, 0, 2417, 2418, 5, 104, 0, 0, 2418, 2419, 5, 101, 0, 0, 2419, 2420, 5, 110, 0, 0, 2420, 309, 1, 0, 0, 0, 2421, 2422, 5, 116, 0, 0, 2422, 2423, 5, 111, 0, 0, 2423, 311, 1, 0, 0, 0, 2424, 2425, 5, 116, 0, 0, 2425, 2426, 5, 114, 0, 0, 2426, 2427, 5, 101, 0, 0, 2427, 2428, 5, 97, 0, 0, 2428, 2429, 5, 116, 0, 0, 2429, 313, 1, 0, 0, 0, 2430, 2431, 5, 116, 0, 0, 2431, 2432, 5, 114, 0, 0, 2432, 2433, 5, 121, 0, 0, 2433, 315, 1, 0, 0, 0, 2434, 2435, 5, 116, 0, 0, 2435, 2436, 5, 117, 0, 0, 2436, 2437, 5, 109, 0, 0, 2437, 2438, 5, 98, 0, 0, 2438, 2439, 5, 108, 0, 0, 2439, 2440, 5, 105, 0, 0, 2440, 2441, 5, 110, 0, 0, 2441, 2442, 5, 103, 0, 0, 2442, 317, 1, 0, 0, 0, 2443, 2444, 5, 116, 0, 0, 2444, 2445, 5, 121, 0, 0, 2445, 2446, 5, 112, 0, 0, 2446, 2447, 5, 101, 0, 0, 2447, 319, 1, 0, 0, 0, 2448, 2449, 5, 116, 0, 0, 2449, 2450, 5, 121, 0, 0, 2450, 2451, 5, 112, 0, 0, 2451, 2452, 5, 101, 0, 0, 2452, 2453, 5, 115, 0, 0, 2453, 2454, 5, 119, 0, 0, 2454, 2455, 5, 105, 0, 0, 2455, 2456, 5, 116, 0, 0, 2456, 2457, 5, 99, 0, 0, 2457, 2458, 5, 104, 0, 0, 2458, 321, 1, 0, 0, 0, 2459, 2460, 5, 117, 0, 0, 2460, 2461, 5, 110, 0, 0, 2461, 2462, 5, 105, 0, 0, 2462, 2463, 5, 111, 0, 0, 2463, 2464, 5, 110, 0, 0, 2464, 323, 1, 0, 0, 0, 2465, 2466, 5, 117, 0, 0, 2466, 2467, 5, 110, 0, 0, 2467, 2468, 5, 111, 0, 0, 2468, 2469, 5, 114, 0, 0, 2469, 2470, 5, 100, 0, 0, 2470, 2471, 5, 101, 0, 0, 2471, 2472, 5, 114, 0, 0, 2472, 2473, 5, 101, 0, 0, 2473, 2474, 5, 100, 0, 0, 2474, 325, 1, 0, 0, 0, 2475, 2476, 5, 117, 0, 0, 2476, 2477, 5, 112, 0, 0, 2477, 2478, 5, 100, 0, 0, 2478, 2479, 5, 97, 0, 0, 2479, 2480, 5, 116, 0, 0, 2480, 2481, 5, 101, 0, 0, 2481, 327, 1, 0, 0, 0, 2482, 2483, 5, 118, 0, 0, 2483, 2484, 5, 97, 0, 0, 2484, 2485, 5, 108, 0, 0, 2485, 2486, 5, 105, 0, 0, 2486, 2487, 5, 100, 0, 0, 2487, 2488, 5, 97, 0, 0, 2488, 2489, 5, 116, 0, 0, 2489, 2490, 5, 101, 0, 0, 2490, 329, 1, 0, 0, 0, 2491, 2492, 5, 118, 0, 0, 2492, 2493, 5, 97, 0, 0, 2493, 2494, 5, 114, 0, 0, 2494, 2495, 5, 105, 0, 0, 2495, 2496, 5, 97, 0, 0, 2496, 2497, 5, 98, 0, 0, 2497, 2498, 5, 108, 0, 0, 2498, 2499, 5, 101, 0, 0, 2499, 331, 1, 0, 0, 0, 2500, 2501, 5, 118, 0, 0, 2501, 2502, 5, 101, 0, 0, 2502, 2503, 5, 114, 0, 0, 2503, 2504, 5, 115, 0, 0, 2504, 2505, 5, 105, 0, 0, 2505, 2506, 5, 111, 0, 0, 2506, 2507, 5, 110, 0, 0, 2507, 333, 1, 0, 0, 0, 2508, 2509, 5, 119, 0, 0, 2509, 2510, 5, 104, 0, 0, 2510, 2511, 5, 101, 0, 0, 2511, 2512, 5, 110, 0, 0, 2512, 335, 1, 0, 0, 0, 2513, 2514, 5, 119, 0, 0, 2514, 2515, 5, 104, 0, 0, 2515, 2516, 5, 101, 0, 0, 2516, 2517, 5, 114, 0, 0, 2517, 2518, 5, 101, 0, 0, 2518, 337, 1, 0, 0, 0, 2519, 2520, 5, 119, 0, 0, 2520, 2521, 5, 105, 0, 0, 2521, 2522, 5, 110, 0, 0, 2522, 2523, 5, 100, 0, 0, 2523, 2524, 5, 111, 0, 0, 2524, 2525, 5, 119, 0, 0, 2525, 339, 1, 0, 0, 0, 2526, 2527, 5, 120, 0, 0, 2527, 2528, 5, 113, 0, 0, 2528, 2529, 5, 117, 0, 0, 2529, 2530, 5, 101, 0, 0, 2530, 2531, 5, 114, 0, 0, 2531, 2532, 5, 121, 0, 0, 2532, 341, 1, 0, 0, 0, 2533, 2534, 5, 97, 0, 0, 2534, 2535, 5, 114, 0, 0, 2535, 2536, 5, 114, 0, 0, 2536, 2537, 5, 97, 0, 0, 2537, 2538, 5, 121, 0, 0, 2538, 2539, 5, 45, 0, 0, 2539, 2540, 5, 110, 0, 0, 2540, 2541, 5, 111, 0, 0, 2541, 2542, 5, 100, 0, 0, 2542, 2543, 5, 101, 0, 0, 2543, 343, 1, 0, 0, 0, 2544, 2545, 5, 98, 0, 0, 2545, 2546, 5, 111, 0, 0, 2546, 2547, 5, 111, 0, 0, 2547, 2548, 5, 108, 0, 0, 2548, 2549, 5, 101, 0, 0, 2549, 2550, 5, 97, 0, 0, 2550, 2551, 5, 110, 0, 0, 2551, 2552, 5, 45, 0, 0, 2552, 2553, 5, 110, 0, 0, 2553, 2554, 5, 111, 0, 0, 2554, 2555, 5, 100, 0, 0, 2555, 2556, 5, 101, 0, 0, 2556, 345, 1, 0, 0, 0, 2557, 2558, 5, 110, 0, 0, 2558, 2559, 5, 117, 0, 0, 2559, 2560, 5, 108, 0, 0, 2560, 2561, 5, 108, 0, 0, 2561, 2562, 5, 45, 0, 0, 2562, 2563, 5, 110, 0, 0, 2563, 2564, 5, 111, 0, 0, 2564, 2565, 5, 100, 0, 0, 2565, 2566, 5, 101, 0, 0, 2566, 347, 1, 0, 0, 0, 2567, 2568, 5, 110, 0, 0, 2568, 2569, 5, 117, 0, 0, 2569, 2570, 5, 109, 0, 0, 2570, 2571, 5, 98, 0, 0, 2571, 2572, 5, 101, 0, 0, 2572, 2573, 5, 114, 0, 0, 2573, 2574, 5, 45, 0, 0, 2574, 2575, 5, 110, 0, 0, 2575, 2576, 5, 111, 0, 0, 2576, 2577, 5, 100, 0, 0, 2577, 2578, 5, 101, 0, 0, 2578, 349, 1, 0, 0, 0, 2579, 2580, 5, 111, 0, 0, 2580, 2581, 5, 98, 0, 0, 2581, 2582, 5, 106, 0, 0, 2582, 2583, 5, 101, 0, 0, 2583, 2584, 5, 99, 0, 0, 2584, 2585, 5, 116, 0, 0, 2585, 2586, 5, 45, 0, 0, 2586, 2587, 5, 110, 0, 0, 2587, 2588, 5, 111, 0, 0, 2588, 2589, 5, 100, 0, 0, 2589, 2590, 5, 101, 0, 0, 2590, 351, 1, 0, 0, 0, 2591, 2592, 5, 114, 0, 0, 2592, 2593, 5, 101, 0, 0, 2593, 2594, 5, 112, 0, 0, 2594, 2595, 5, 108, 0, 0, 2595, 2596, 5, 97, 0, 0, 2596, 2597, 5, 99, 0, 0, 2597, 2598, 5, 101, 0, 0, 2598, 353, 1, 0, 0, 0, 2599, 2600, 5, 119, 0, 0, 2600, 2601, 5, 105, 0, 0, 2601, 2602, 5, 116, 0, 0, 2602, 2603, 5, 104, 0, 0, 2603, 355, 1, 0, 0, 0, 2604, 2605, 5, 118, 0, 0, 2605, 2606, 5, 97, 0, 0, 2606, 2607, 5, 108, 0, 0, 2607, 2608, 5, 117, 0, 0, 2608, 2609, 5, 101, 0, 0, 2609, 357, 1, 0, 0, 0, 2610, 2611, 5, 105, 0, 0, 2611, 2612, 5, 110, 0, 0, 2612, 2613, 5, 115, 0, 0, 2613, 2614, 5, 101, 0, 0, 2614, 2615, 5, 114, 0, 0, 2615, 2616, 5, 116, 0, 0, 2616, 359, 1, 0, 0, 0, 2617, 2618, 5, 105, 0, 0, 2618, 2619, 5, 110, 0, 0, 2619, 2620, 5, 116, 0, 0, 2620, 2621, 5, 111, 0, 0, 2621, 361, 1, 0, 0, 0, 2622, 2623, 5, 100, 0, 0, 2623, 2624, 5, 101, 0, 0, 2624, 2625, 5, 108, 0, 0, 2625, 2626, 5, 101, 0, 0, 2626, 2627, 5, 116, 0, 0, 2627, 2628, 5, 101, 0, 0, 2628, 363, 1, 0, 0, 0, 2629, 2630, 5, 114, 0, 0, 2630, 2631, 5, 101, 0, 0, 2631, 2632, 5, 110, 0, 0, 2632, 2633, 5, 97, 0, 0, 2633, 2634, 5, 109, 0, 0, 2634, 2635, 5, 101, 0, 0, 2635, 365, 1, 0, 0, 0, 2636, 2637, 5, 81, 0, 0, 2637, 2643, 5, 123, 0, 0, 2638, 2642, 3, 16, 5, 0, 2639, 2642, 3, 18, 6, 0, 2640, 2642, 8, 9, 0, 0, 2641, 2638, 1, 0, 0, 0, 2641, 2639, 1, 0, 0, 0, 2641, 2640, 1, 0, 0, 0, 2642, 2645, 1, 0, 0, 0, 2643, 2641, 1, 0, 0, 0, 2643, 2644, 1, 0, 0, 0, 2644, 2646, 1, 0, 0, 0, 2645, 2643, 1, 0, 0, 0, 2646, 2647, 5, 125, 0, 0, 2647, 2648, 3, 374, 184, 0, 2648, 367, 1, 0, 0, 0, 2649, 2650, 3, 374, 184, 0, 2650, 2651, 5, 58, 0, 0, 2651, 2652, 3, 374, 184, 0, 2652, 369, 1, 0, 0, 0, 2653, 2654, 3, 374, 184, 0, 2654, 2655, 5, 58, 0, 0, 2655, 2656, 5, 42, 0, 0, 2656, 371, 1, 0, 0, 0, 2657, 2658, 5, 42, 0, 0, 2658, 2659, 5, 58, 0, 0, 2659, 2660, 3, 374, 184, 0, 2660, 373, 1, 0, 0, 0, 2661, 2665, 3, 376, 185, 0, 2662, 2664, 3, 378, 186, 0, 2663, 2662, 1, 0, 0, 0, 2664, 2667, 1, 0, 0, 0, 2665, 2663, 1, 0, 0, 0, 2665, 2666, 1, 0, 0, 0, 2666, 375, 1, 0, 0, 0, 2667, 2665, 1, 0, 0, 0, 2668, 2670, 7, 10, 0, 0, 2669, 2668, 1, 0, 0, 0, 2670, 377, 1, 0, 0, 0, 2671, 2674, 3, 376, 185, 0, 2672, 2674, 7, 11, 0, 0, 2673, 2671, 1, 0, 0, 0, 2673, 2672, 1, 0, 0, 0, 2674, 379, 1, 0, 0, 0, 2675, 2676, 5, 40, 0, 0, 2676, 2677, 5, 58, 0, 0, 2677, 2678, 5, 126, 0, 0, 2678, 381, 1, 0, 0, 0, 2679, 2681, 5, 58, 0, 0, 2680, 2679, 1, 0, 0, 0, 2681, 2682, 1, 0, 0, 0, 2682, 2680, 1, 0, 0, 0, 2682, 2683, 1, 0, 0, 0, 2683, 2684, 1, 0, 0, 0, 2684, 2685, 5, 41, 0, 0, 2685, 383, 1, 0, 0, 0, 2686, 2687, 5, 40, 0, 0, 2687, 2688, 5, 58, 0, 0, 2688, 2694, 5, 126, 0, 0, 2689, 2693, 3, 388, 191, 0, 2690, 2691, 5, 58, 0, 0, 2691, 2693, 8, 12, 0, 0, 2692, 2689, 1, 0, 0, 0, 2692, 2690, 1, 0, 0, 0, 2693, 2696, 1, 0, 0, 0, 2694, 2692, 1, 0, 0, 0, 2694, 2695, 1, 0, 0, 0, 2695, 2697, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2697, 2698, 5, 58, 0, 0, 2698, 2699, 5, 41, 0, 0, 2699, 385, 1, 0, 0, 0, 2700, 2701, 5, 40, 0, 0, 2701, 2702, 5, 58, 0, 0, 2702, 2711, 8, 13, 0, 0, 2703, 2710, 3, 386, 190, 0, 2704, 2705, 5, 40, 0, 0, 2705, 2710, 8, 14, 0, 0, 2706, 2707, 5, 58, 0, 0, 2707, 2710, 8, 12, 0, 0, 2708, 2710, 8, 15, 0, 0, 2709, 2703, 1, 0, 0, 0, 2709, 2704, 1, 0, 0, 0, 2709, 2706, 1, 0, 0, 0, 2709, 2708, 1, 0, 0, 0, 2710, 2713, 1, 0, 0, 0, 2711, 2709, 1, 0, 0, 0, 2711, 2712, 1, 0, 0, 0, 2712, 2717, 1, 0, 0, 0, 2713, 2711, 1, 0, 0, 0, 2714, 2716, 5, 58, 0, 0, 2715, 2714, 1, 0, 0, 0, 2716, 2719, 1, 0, 0, 0, 2717, 2715, 1, 0, 0, 0, 2717, 2718, 1, 0, 0, 0, 2718, 2721, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2720, 2722, 5, 58, 0, 0, 2721, 2720, 1, 0, 0, 0, 2722, 2723, 1, 0, 0, 0, 2723, 2721, 1, 0, 0, 0, 2723, 2724, 1, 0, 0, 0, 2724, 2725, 1, 0, 0, 0, 2725, 2726, 5, 41, 0, 0, 2726, 2727, 1, 0, 0, 0, 2727, 2728, 6, 190, 2, 0, 2728, 387, 1, 0, 0, 0, 2729, 2730, 7, 16, 0, 0, 2730, 389, 1, 0, 0, 0, 2731, 2732, 3, 98, 46, 0, 2732, 2733, 3, 98, 46, 0, 2733, 2734, 3, 44, 19, 0, 2734, 2735, 1, 0, 0, 0, 2735, 2736, 6, 192, 3, 0, 2736, 391, 1, 0, 0, 0, 2737, 2738, 3, 50, 22, 0, 2738, 2739, 3, 98, 46, 0, 2739, 2740, 1, 0, 0, 0, 2740, 2741, 6, 193, 4, 0, 2741, 393, 1, 0, 0, 0, 2742, 2743, 8, 17, 0, 0, 2743, 395, 1, 0, 0, 0, 2744, 2745, 7, 18, 0, 0, 2745, 397, 1, 0, 0, 0, 2746, 2747, 5, 96, 0, 0, 2747, 2748, 1, 0, 0, 0, 2748, 2749, 6, 196, 5, 0, 2749, 399, 1, 0, 0, 0, 2750, 2751, 5, 93, 0, 0, 2751, 2752, 1, 0, 0, 0, 2752, 2753, 6, 197, 6, 0, 2753, 401, 1, 0, 0, 0, 2754, 2755, 5, 123, 0, 0, 2755, 2756, 1, 0, 0, 0, 2756, 2757, 6, 198, 7, 0, 2757, 403, 1, 0, 0, 0, 2758, 2759, 3, 98, 46, 0, 2759, 2760, 3, 48, 21, 0, 2760, 2761, 1, 0, 0, 0, 2761, 2762, 6, 199, 8, 0, 2762, 405, 1, 0, 0, 0, 2763, 2764, 3, 46, 20, 0, 2764, 2765, 3, 98, 46, 0, 2765, 2766, 3, 98, 46, 0, 2766, 2767, 1, 0, 0, 0, 2767, 2768, 6, 200, 4, 0, 2768, 407, 1, 0, 0, 0, 2769, 2770, 5, 34, 0, 0, 2770, 2771, 5, 34, 0, 0, 2771, 2772, 1, 0, 0, 0, 2772, 2773, 6, 201, 9, 0, 2773, 409, 1, 0, 0, 0, 2774, 2775, 5, 34, 0, 0, 2775, 2776, 1, 0, 0, 0, 2776, 2777, 6, 202, 10, 0, 2777, 2778, 6, 202, 4, 0, 2778, 411, 1, 0, 0, 0, 2779, 2780, 5, 123, 0, 0, 2780, 2781, 5, 123, 0, 0, 2781, 2782, 1, 0, 0, 0, 2782, 2783, 6, 203, 11, 0, 2783, 413, 1, 0, 0, 0, 2784, 2785, 5, 125, 0, 0, 2785, 2786, 5, 125, 0, 0, 2786, 2787, 1, 0, 0, 0, 2787, 2788, 6, 204, 12, 0, 2788, 415, 1, 0, 0, 0, 2789, 2790, 5, 123, 0, 0, 2790, 2791, 1, 0, 0, 0, 2791, 2792, 6, 205, 7, 0, 2792, 2793, 6, 205, 13, 0, 2793, 417, 1, 0, 0, 0, 2794, 2795, 5, 125, 0, 0, 2795, 2796, 1, 0, 0, 0, 2796, 2797, 6, 206, 14, 0, 2797, 419, 1, 0, 0, 0, 2798, 2814, 5, 38, 0, 0, 2799, 2800, 5, 108, 0, 0, 2800, 2815, 5, 116, 0, 0, 2801, 2802, 5, 103, 0, 0, 2802, 2815, 5, 116, 0, 0, 2803, 2804, 5, 97, 0, 0, 2804, 2805, 5, 109, 0, 0, 2805, 2815, 5, 112, 0, 0, 2806, 2807, 5, 113, 0, 0, 2807, 2808, 5, 117, 0, 0, 2808, 2809, 5, 111, 0, 0, 2809, 2815, 5, 116, 0, 0, 2810, 2811, 5, 97, 0, 0, 2811, 2812, 5, 112, 0, 0, 2812, 2813, 5, 111, 0, 0, 2813, 2815, 5, 115, 0, 0, 2814, 2799, 1, 0, 0, 0, 2814, 2801, 1, 0, 0, 0, 2814, 2803, 1, 0, 0, 0, 2814, 2806, 1, 0, 0, 0, 2814, 2810, 1, 0, 0, 0, 2815, 2816, 1, 0, 0, 0, 2816, 2817, 5, 59, 0, 0, 2817, 2818, 1, 0, 0, 0, 2818, 2819, 6, 207, 15, 0, 2819, 421, 1, 0, 0, 0, 2820, 2821, 5, 38, 0, 0, 2821, 2822, 5, 35, 0, 0, 2822, 2824, 1, 0, 0, 0, 2823, 2825, 7, 0, 0, 0, 2824, 2823, 1, 0, 0, 0, 2825, 2826, 1, 0, 0, 0, 2826, 2824, 1, 0, 0, 0, 2826, 2827, 1, 0, 0, 0, 2827, 2828, 1, 0, 0, 0, 2828, 2840, 5, 59, 0, 0, 2829, 2830, 5, 38, 0, 0, 2830, 2831, 5, 35, 0, 0, 2831, 2832, 5, 120, 0, 0, 2832, 2834, 1, 0, 0, 0, 2833, 2835, 7, 3, 0, 0, 2834, 2833, 1, 0, 0, 0, 2835, 2836, 1, 0, 0, 0, 2836, 2834, 1, 0, 0, 0, 2836, 2837, 1, 0, 0, 0, 2837, 2838, 1, 0, 0, 0, 2838, 2840, 5, 59, 0, 0, 2839, 2820, 1, 0, 0, 0, 2839, 2829, 1, 0, 0, 0, 2840, 2841, 1, 0, 0, 0, 2841, 2842, 6, 208, 16, 0, 2842, 423, 1, 0, 0, 0, 2843, 2844, 8, 19, 0, 0, 2844, 2845, 1, 0, 0, 0, 2845, 2846, 6, 209, 17, 0, 2846, 425, 1, 0, 0, 0, 2847, 2848, 5, 39, 0, 0, 2848, 2849, 5, 39, 0, 0, 2849, 2850, 1, 0, 0, 0, 2850, 2851, 6, 210, 18, 0, 2851, 427, 1, 0, 0, 0, 2852, 2853, 5, 39, 0, 0, 2853, 2854, 1, 0, 0, 0, 2854, 2855, 6, 211, 19, 0, 2855, 2856, 6, 211, 4, 0, 2856, 429, 1, 0, 0, 0, 2857, 2858, 5, 123, 0, 0, 2858, 2859, 5, 123, 0, 0, 2859, 2860, 1, 0, 0, 0, 2860, 2861, 6, 212, 11, 0, 2861, 431, 1, 0, 0, 0, 2862, 2863, 5, 125, 0, 0, 2863, 2864, 5, 125, 0, 0, 2864, 2865, 1, 0, 0, 0, 2865, 2866, 6, 213, 12, 0, 2866, 433, 1, 0, 0, 0, 2867, 2868, 5, 123, 0, 0, 2868, 2869, 1, 0, 0, 0, 2869, 2870, 6, 214, 7, 0, 2870, 2871, 6, 214, 20, 0, 2871, 435, 1, 0, 0, 0, 2872, 2873, 5, 125, 0, 0, 2873, 2874, 1, 0, 0, 0, 2874, 2875, 6, 215, 14, 0, 2875, 437, 1, 0, 0, 0, 2876, 2892, 5, 38, 0, 0, 2877, 2878, 5, 108, 0, 0, 2878, 2893, 5, 116, 0, 0, 2879, 2880, 5, 103, 0, 0, 2880, 2893, 5, 116, 0, 0, 2881, 2882, 5, 97, 0, 0, 2882, 2883, 5, 109, 0, 0, 2883, 2893, 5, 112, 0, 0, 2884, 2885, 5, 113, 0, 0, 2885, 2886, 5, 117, 0, 0, 2886, 2887, 5, 111, 0, 0, 2887, 2893, 5, 116, 0, 0, 2888, 2889, 5, 97, 0, 0, 2889, 2890, 5, 112, 0, 0, 2890, 2891, 5, 111, 0, 0, 2891, 2893, 5, 115, 0, 0, 2892, 2877, 1, 0, 0, 0, 2892, 2879, 1, 0, 0, 0, 2892, 2881, 1, 0, 0, 0, 2892, 2884, 1, 0, 0, 0, 2892, 2888, 1, 0, 0, 0, 2893, 2894, 1, 0, 0, 0, 2894, 2895, 5, 59, 0, 0, 2895, 2896, 1, 0, 0, 0, 2896, 2897, 6, 216, 15, 0, 2897, 439, 1, 0, 0, 0, 2898, 2899, 5, 38, 0, 0, 2899, 2900, 5, 35, 0, 0, 2900, 2902, 1, 0, 0, 0, 2901, 2903, 7, 0, 0, 0, 2902, 2901, 1, 0, 0, 0, 2903, 2904, 1, 0, 0, 0, 2904, 2902, 1, 0, 0, 0, 2904, 2905, 1, 0, 0, 0, 2905, 2906, 1, 0, 0, 0, 2906, 2918, 5, 59, 0, 0, 2907, 2908, 5, 38, 0, 0, 2908, 2909, 5, 35, 0, 0, 2909, 2910, 5, 120, 0, 0, 2910, 2912, 1, 0, 0, 0, 2911, 2913, 7, 3, 0, 0, 2912, 2911, 1, 0, 0, 0, 2913, 2914, 1, 0, 0, 0, 2914, 2912, 1, 0, 0, 0, 2914, 2915, 1, 0, 0, 0, 2915, 2916, 1, 0, 0, 0, 2916, 2918, 5, 59, 0, 0, 2917, 2898, 1, 0, 0, 0, 2917, 2907, 1, 0, 0, 0, 2918, 2919, 1, 0, 0, 0, 2919, 2920, 6, 217, 16, 0, 2920, 441, 1, 0, 0, 0, 2921, 2922, 8, 20, 0, 0, 2922, 2923, 1, 0, 0, 0, 2923, 2924, 6, 218, 17, 0, 2924, 443, 1, 0, 0, 0, 2925, 2926, 3, 14, 4, 0, 2926, 2927, 1, 0, 0, 0, 2927, 2928, 6, 219, 21, 0, 2928, 445, 1, 0, 0, 0, 2929, 2930, 5, 46, 0, 0, 2930, 2940, 3, 14, 4, 0, 2931, 2932, 3, 14, 4, 0, 2932, 2936, 5, 46, 0, 0, 2933, 2935, 7, 0, 0, 0, 2934, 2933, 1, 0, 0, 0, 2935, 2938, 1, 0, 0, 0, 2936, 2934, 1, 0, 0, 0, 2936, 2937, 1, 0, 0, 0, 2937, 2940, 1, 0, 0, 0, 2938, 2936, 1, 0, 0, 0, 2939, 2929, 1, 0, 0, 0, 2939, 2931, 1, 0, 0, 0, 2940, 2941, 1, 0, 0, 0, 2941, 2942, 6, 220, 22, 0, 2942, 447, 1, 0, 0, 0, 2943, 2944, 5, 46, 0, 0, 2944, 2956, 3, 14, 4, 0, 2945, 2953, 3, 14, 4, 0, 2946, 2950, 5, 46, 0, 0, 2947, 2949, 7, 0, 0, 0, 2948, 2947, 1, 0, 0, 0, 2949, 2952, 1, 0, 0, 0, 2950, 2948, 1, 0, 0, 0, 2950, 2951, 1, 0, 0, 0, 2951, 2954, 1, 0, 0, 0, 2952, 2950, 1, 0, 0, 0, 2953, 2946, 1, 0, 0, 0, 2953, 2954, 1, 0, 0, 0, 2954, 2956, 1, 0, 0, 0, 2955, 2943, 1, 0, 0, 0, 2955, 2945, 1, 0, 0, 0, 2956, 2957, 1, 0, 0, 0, 2957, 2959, 7, 1, 0, 0, 2958, 2960, 7, 2, 0, 0, 2959, 2958, 1, 0, 0, 0, 2959, 2960, 1, 0, 0, 0, 2960, 2961, 1, 0, 0, 0, 2961, 2962, 3, 14, 4, 0, 2962, 2963, 1, 0, 0, 0, 2963, 2964, 6, 221, 23, 0, 2964, 449, 1, 0, 0, 0, 2965, 2966, 5, 100, 0, 0, 2966, 2967, 5, 101, 0, 0, 2967, 2968, 5, 99, 0, 0, 2968, 2969, 5, 105, 0, 0, 2969, 2970, 5, 109, 0, 0, 2970, 2971, 5, 97, 0, 0, 2971, 2972, 5, 108, 0, 0, 2972, 2973, 5, 45, 0, 0, 2973, 2974, 5, 115, 0, 0, 2974, 2975, 5, 101, 0, 0, 2975, 2976, 5, 112, 0, 0, 2976, 2977, 5, 97, 0, 0, 2977, 2978, 5, 114, 0, 0, 2978, 2979, 5, 97, 0, 0, 2979, 2980, 5, 116, 0, 0, 2980, 2981, 5, 111, 0, 0, 2981, 3088, 5, 114, 0, 0, 2982, 2983, 5, 103, 0, 0, 2983, 2984, 5, 114, 0, 0, 2984, 2985, 5, 111, 0, 0, 2985, 2986, 5, 117, 0, 0, 2986, 2987, 5, 112, 0, 0, 2987, 2988, 5, 105, 0, 0, 2988, 2989, 5, 110, 0, 0, 2989, 2990, 5, 103, 0, 0, 2990, 2991, 5, 45, 0, 0, 2991, 2992, 5, 115, 0, 0, 2992, 2993, 5, 101, 0, 0, 2993, 2994, 5, 112, 0, 0, 2994, 2995, 5, 97, 0, 0, 2995, 2996, 5, 114, 0, 0, 2996, 2997, 5, 97, 0, 0, 2997, 2998, 5, 116, 0, 0, 2998, 2999, 5, 111, 0, 0, 2999, 3088, 5, 114, 0, 0, 3000, 3001, 5, 105, 0, 0, 3001, 3002, 5, 110, 0, 0, 3002, 3003, 5, 102, 0, 0, 3003, 3004, 5, 105, 0, 0, 3004, 3005, 5, 110, 0, 0, 3005, 3006, 5, 105, 0, 0, 3006, 3007, 5, 116, 0, 0, 3007, 3088, 5, 121, 0, 0, 3008, 3009, 5, 109, 0, 0, 3009, 3010, 5, 105, 0, 0, 3010, 3011, 5, 110, 0, 0, 3011, 3012, 5, 117, 0, 0, 3012, 3013, 5, 115, 0, 0, 3013, 3014, 5, 45, 0, 0, 3014, 3015, 5, 115, 0, 0, 3015, 3016, 5, 105, 0, 0, 3016, 3017, 5, 103, 0, 0, 3017, 3088, 5, 110, 0, 0, 3018, 3019, 5, 78, 0, 0, 3019, 3020, 5, 97, 0, 0, 3020, 3088, 5, 78, 0, 0, 3021, 3022, 5, 112, 0, 0, 3022, 3023, 5, 101, 0, 0, 3023, 3024, 5, 114, 0, 0, 3024, 3025, 5, 99, 0, 0, 3025, 3026, 5, 101, 0, 0, 3026, 3027, 5, 110, 0, 0, 3027, 3088, 5, 116, 0, 0, 3028, 3029, 5, 112, 0, 0, 3029, 3030, 5, 101, 0, 0, 3030, 3031, 5, 114, 0, 0, 3031, 3032, 5, 45, 0, 0, 3032, 3033, 5, 109, 0, 0, 3033, 3034, 5, 105, 0, 0, 3034, 3035, 5, 108, 0, 0, 3035, 3036, 5, 108, 0, 0, 3036, 3088, 5, 101, 0, 0, 3037, 3038, 5, 122, 0, 0, 3038, 3039, 5, 101, 0, 0, 3039, 3040, 5, 114, 0, 0, 3040, 3041, 5, 111, 0, 0, 3041, 3042, 5, 45, 0, 0, 3042, 3043, 5, 100, 0, 0, 3043, 3044, 5, 105, 0, 0, 3044, 3045, 5, 103, 0, 0, 3045, 3046, 5, 105, 0, 0, 3046, 3088, 5, 116, 0, 0, 3047, 3048, 5, 100, 0, 0, 3048, 3049, 5, 105, 0, 0, 3049, 3050, 5, 103, 0, 0, 3050, 3051, 5, 105, 0, 0, 3051, 3088, 5, 116, 0, 0, 3052, 3053, 5, 112, 0, 0, 3053, 3054, 5, 97, 0, 0, 3054, 3055, 5, 116, 0, 0, 3055, 3056, 5, 116, 0, 0, 3056, 3057, 5, 101, 0, 0, 3057, 3058, 5, 114, 0, 0, 3058, 3059, 5, 110, 0, 0, 3059, 3060, 5, 45, 0, 0, 3060, 3061, 5, 115, 0, 0, 3061, 3062, 5, 101, 0, 0, 3062, 3063, 5, 112, 0, 0, 3063, 3064, 5, 97, 0, 0, 3064, 3065, 5, 114, 0, 0, 3065, 3066, 5, 97, 0, 0, 3066, 3067, 5, 116, 0, 0, 3067, 3068, 5, 111, 0, 0, 3068, 3088, 5, 114, 0, 0, 3069, 3070, 5, 101, 0, 0, 3070, 3071, 5, 120, 0, 0, 3071, 3072, 5, 112, 0, 0, 3072, 3073, 5, 111, 0, 0, 3073, 3074, 5, 110, 0, 0, 3074, 3075, 5, 101, 0, 0, 3075, 3076, 5, 110, 0, 0, 3076, 3077, 5, 116, 0, 0, 3077, 3078, 5, 45, 0, 0, 3078, 3079, 5, 115, 0, 0, 3079, 3080, 5, 101, 0, 0, 3080, 3081, 5, 112, 0, 0, 3081, 3082, 5, 97, 0, 0, 3082, 3083, 5, 114, 0, 0, 3083, 3084, 5, 97, 0, 0, 3084, 3085, 5, 116, 0, 0, 3085, 3086, 5, 111, 0, 0, 3086, 3088, 5, 114, 0, 0, 3087, 2965, 1, 0, 0, 0, 3087, 2982, 1, 0, 0, 0, 3087, 3000, 1, 0, 0, 0, 3087, 3008, 1, 0, 0, 0, 3087, 3018, 1, 0, 0, 0, 3087, 3021, 1, 0, 0, 0, 3087, 3028, 1, 0, 0, 0, 3087, 3037, 1, 0, 0, 0, 3087, 3047, 1, 0, 0, 0, 3087, 3052, 1, 0, 0, 0, 3087, 3069, 1, 0, 0, 0, 3088, 3089, 1, 0, 0, 0, 3089, 3090, 6, 222, 24, 0, 3090, 451, 1, 0, 0, 0, 3091, 3107, 5, 38, 0, 0, 3092, 3093, 5, 108, 0, 0, 3093, 3108, 5, 116, 0, 0, 3094, 3095, 5, 103, 0, 0, 3095, 3108, 5, 116, 0, 0, 3096, 3097, 5, 97, 0, 0, 3097, 3098, 5, 109, 0, 0, 3098, 3108, 5, 112, 0, 0, 3099, 3100, 5, 113, 0, 0, 3100, 3101, 5, 117, 0, 0, 3101, 3102, 5, 111, 0, 0, 3102, 3108, 5, 116, 0, 0, 3103, 3104, 5, 97, 0, 0, 3104, 3105, 5, 112, 0, 0, 3105, 3106, 5, 111, 0, 0, 3106, 3108, 5, 115, 0, 0, 3107, 3092, 1, 0, 0, 0, 3107, 3094, 1, 0, 0, 0, 3107, 3096, 1, 0, 0, 0, 3107, 3099, 1, 0, 0, 0, 3107, 3103, 1, 0, 0, 0, 3108, 3109, 1, 0, 0, 0, 3109, 3110, 5, 59, 0, 0, 3110, 3111, 1, 0, 0, 0, 3111, 3112, 6, 223, 15, 0, 3112, 453, 1, 0, 0, 0, 3113, 3114, 5, 38, 0, 0, 3114, 3115, 5, 35, 0, 0, 3115, 3117, 1, 0, 0, 0, 3116, 3118, 7, 0, 0, 0, 3117, 3116, 1, 0, 0, 0, 3118, 3119, 1, 0, 0, 0, 3119, 3117, 1, 0, 0, 0, 3119, 3120, 1, 0, 0, 0, 3120, 3121, 1, 0, 0, 0, 3121, 3133, 5, 59, 0, 0, 3122, 3123, 5, 38, 0, 0, 3123, 3124, 5, 35, 0, 0, 3124, 3125, 5, 120, 0, 0, 3125, 3127, 1, 0, 0, 0, 3126, 3128, 7, 3, 0, 0, 3127, 3126, 1, 0, 0, 0, 3128, 3129, 1, 0, 0, 0, 3129, 3127, 1, 0, 0, 0, 3129, 3130, 1, 0, 0, 0, 3130, 3131, 1, 0, 0, 0, 3131, 3133, 5, 59, 0, 0, 3132, 3113, 1, 0, 0, 0, 3132, 3122, 1, 0, 0, 0, 3133, 3134, 1, 0, 0, 0, 3134, 3135, 6, 224, 16, 0, 3135, 455, 1, 0, 0, 0, 3136, 3137, 5, 34, 0, 0, 3137, 3138, 5, 34, 0, 0, 3138, 3139, 1, 0, 0, 0, 3139, 3140, 6, 225, 9, 0, 3140, 457, 1, 0, 0, 0, 3141, 3142, 5, 39, 0, 0, 3142, 3143, 1, 0, 0, 0, 3143, 3144, 6, 226, 1, 0, 3144, 3145, 6, 226, 19, 0, 3145, 459, 1, 0, 0, 0, 3146, 3147, 5, 34, 0, 0, 3147, 3148, 1, 0, 0, 0, 3148, 3149, 6, 227, 10, 0, 3149, 3150, 6, 227, 4, 0, 3150, 3151, 6, 227, 4, 0, 3151, 461, 1, 0, 0, 0, 3152, 3153, 5, 60, 0, 0, 3153, 3154, 5, 33, 0, 0, 3154, 3155, 5, 45, 0, 0, 3155, 3156, 5, 45, 0, 0, 3156, 3162, 1, 0, 0, 0, 3157, 3158, 5, 45, 0, 0, 3158, 3161, 8, 4, 0, 0, 3159, 3161, 8, 4, 0, 0, 3160, 3157, 1, 0, 0, 0, 3160, 3159, 1, 0, 0, 0, 3161, 3164, 1, 0, 0, 0, 3162, 3160, 1, 0, 0, 0, 3162, 3163, 1, 0, 0, 0, 3163, 3165, 1, 0, 0, 0, 3164, 3162, 1, 0, 0, 0, 3165, 3166, 5, 45, 0, 0, 3166, 3167, 5, 45, 0, 0, 3167, 3168, 5, 62, 0, 0, 3168, 3169, 1, 0, 0, 0, 3169, 3170, 6, 228, 25, 0, 3170, 463, 1, 0, 0, 0, 3171, 3172, 5, 60, 0, 0, 3172, 3173, 5, 63, 0, 0, 3173, 3174, 1, 0, 0, 0, 3174, 3175, 7, 5, 0, 0, 3175, 3176, 7, 6, 0, 0, 3176, 3184, 7, 7, 0, 0, 3177, 3181, 7, 8, 0, 0, 3178, 3180, 9, 0, 0, 0, 3179, 3178, 1, 0, 0, 0, 3180, 3183, 1, 0, 0, 0, 3181, 3182, 1, 0, 0, 0, 3181, 3179, 1, 0, 0, 0, 3182, 3185, 1, 0, 0, 0, 3183, 3181, 1, 0, 0, 0, 3184, 3177, 1, 0, 0, 0, 3184, 3185, 1, 0, 0, 0, 3185, 3186, 1, 0, 0, 0, 3186, 3187, 5, 63, 0, 0, 3187, 3188, 5, 62, 0, 0, 3188, 3189, 1, 0, 0, 0, 3189, 3190, 6, 229, 26, 0, 3190, 465, 1, 0, 0, 0, 3191, 3192, 5, 60, 0, 0, 3192, 3193, 5, 63, 0, 0, 3193, 3194, 1, 0, 0, 0, 3194, 3202, 3, 374, 184, 0, 3195, 3199, 7, 8, 0, 0, 3196, 3198, 9, 0, 0, 0, 3197, 3196, 1, 0, 0, 0, 3198, 3201, 1, 0, 0, 0, 3199, 3200, 1, 0, 0, 0, 3199, 3197, 1, 0, 0, 0, 3200, 3203, 1, 0, 0, 0, 3201, 3199, 1, 0, 0, 0, 3202, 3195, 1, 0, 0, 0, 3202, 3203, 1, 0, 0, 0, 3203, 3204, 1, 0, 0, 0, 3204, 3205, 5, 63, 0, 0, 3205, 3206, 5, 62, 0, 0, 3206, 3207, 1, 0, 0, 0, 3207, 3208, 6, 230, 27, 0, 3208, 467, 1, 0, 0, 0, 3209, 3210, 5, 60, 0, 0, 3210, 3211, 5, 33, 0, 0, 3211, 3212, 5, 91, 0, 0, 3212, 3213, 5, 67, 0, 0, 3213, 3214, 5, 68, 0, 0, 3214, 3215, 5, 65, 0, 0, 3215, 3216, 5, 84, 0, 0, 3216, 3217, 5, 65, 0, 0, 3217, 3218, 5, 91, 0, 0, 3218, 3222, 1, 0, 0, 0, 3219, 3221, 9, 0, 0, 0, 3220, 3219, 1, 0, 0, 0, 3221, 3224, 1, 0, 0, 0, 3222, 3223, 1, 0, 0, 0, 3222, 3220, 1, 0, 0, 0, 3223, 3225, 1, 0, 0, 0, 3224, 3222, 1, 0, 0, 0, 3225, 3226, 5, 93, 0, 0, 3226, 3227, 5, 93, 0, 0, 3227, 3228, 5, 62, 0, 0, 3228, 3229, 1, 0, 0, 0, 3229, 3230, 6, 231, 28, 0, 3230, 469, 1, 0, 0, 0, 3231, 3232, 5, 40, 0, 0, 3232, 3233, 5, 35, 0, 0, 3233, 3235, 1, 0, 0, 0, 3234, 3236, 3, 34, 14, 0, 3235, 3234, 1, 0, 0, 0, 3235, 3236, 1, 0, 0, 0, 3236, 3240, 1, 0, 0, 0, 3237, 3238, 3, 374, 184, 0, 3238, 3239, 5, 58, 0, 0, 3239, 3241, 1, 0, 0, 0, 3240, 3237, 1, 0, 0, 0, 3240, 3241, 1, 0, 0, 0, 3241, 3242, 1, 0, 0, 0, 3242, 3250, 3, 374, 184, 0, 3243, 3247, 3, 34, 14, 0, 3244, 3246, 9, 0, 0, 0, 3245, 3244, 1, 0, 0, 0, 3246, 3249, 1, 0, 0, 0, 3247, 3248, 1, 0, 0, 0, 3247, 3245, 1, 0, 0, 0, 3248, 3251, 1, 0, 0, 0, 3249, 3247, 1, 0, 0, 0, 3250, 3243, 1, 0, 0, 0, 3250, 3251, 1, 0, 0, 0, 3251, 3252, 1, 0, 0, 0, 3252, 3253, 5, 35, 0, 0, 3253, 3254, 5, 41, 0, 0, 3254, 3255, 1, 0, 0, 0, 3255, 3256, 6, 232, 29, 0, 3256, 471, 1, 0, 0, 0, 3257, 3259, 7, 8, 0, 0, 3258, 3257, 1, 0, 0, 0, 3259, 3260, 1, 0, 0, 0, 3260, 3258, 1, 0, 0, 0, 3260, 3261, 1, 0, 0, 0, 3261, 3262, 1, 0, 0, 0, 3262, 3263, 6, 233, 2, 0, 3263, 3264, 6, 233, 30, 0, 3264, 473, 1, 0, 0, 0, 3265, 3266, 5, 61, 0, 0, 3266, 3267, 1, 0, 0, 0, 3267, 3268, 6, 234, 31, 0, 3268, 475, 1, 0, 0, 0, 3269, 3270, 5, 33, 0, 0, 3270, 3271, 5, 61, 0, 0, 3271, 3272, 1, 0, 0, 0, 3272, 3273, 6, 235, 32, 0, 3273, 477, 1, 0, 0, 0, 3274, 3275, 5, 40, 0, 0, 3275, 3276, 1, 0, 0, 0, 3276, 3277, 6, 236, 33, 0, 3277, 479, 1, 0, 0, 0, 3278, 3279, 5, 41, 0, 0, 3279, 3280, 1, 0, 0, 0, 3280, 3281, 6, 237, 34, 0, 3281, 481, 1, 0, 0, 0, 3282, 3283, 5, 91, 0, 0, 3283, 3284, 1, 0, 0, 0, 3284, 3285, 6, 238, 35, 0, 3285, 483, 1, 0, 0, 0, 3286, 3287, 5, 93, 0, 0, 3287, 3288, 1, 0, 0, 0, 3288, 3289, 6, 239, 6, 0, 3289, 485, 1, 0, 0, 0, 3290, 3291, 5, 123, 0, 0, 3291, 3292, 6, 240, 36, 0, 3292, 3293, 1, 0, 0, 0, 3293, 3294, 6, 240, 7, 0, 3294, 487, 1, 0, 0, 0, 3295, 3296, 4, 241, 0, 0, 3296, 3297, 5, 125, 0, 0, 3297, 3298, 1, 0, 0, 0, 3298, 3299, 6, 241, 14, 0, 3299, 3300, 6, 241, 4, 0, 3300, 489, 1, 0, 0, 0, 3301, 3302, 4, 242, 1, 0, 3302, 3303, 5, 125, 0, 0, 3303, 3304, 6, 242, 37, 0, 3304, 3305, 1, 0, 0, 0, 3305, 3306, 6, 242, 14, 0, 3306, 491, 1, 0, 0, 0, 3307, 3308, 5, 42, 0, 0, 3308, 3309, 1, 0, 0, 0, 3309, 3310, 6, 243, 38, 0, 3310, 493, 1, 0, 0, 0, 3311, 3312, 5, 43, 0, 0, 3312, 3313, 1, 0, 0, 0, 3313, 3314, 6, 244, 39, 0, 3314, 495, 1, 0, 0, 0, 3315, 3316, 5, 45, 0, 0, 3316, 3317, 1, 0, 0, 0, 3317, 3318, 6, 245, 40, 0, 3318, 497, 1, 0, 0, 0, 3319, 3320, 5, 44, 0, 0, 3320, 3321, 1, 0, 0, 0, 3321, 3322, 6, 246, 41, 0, 3322, 499, 1, 0, 0, 0, 3323, 3324, 5, 46, 0, 0, 3324, 3325, 1, 0, 0, 0, 3325, 3326, 6, 247, 42, 0, 3326, 501, 1, 0, 0, 0, 3327, 3328, 5, 46, 0, 0, 3328, 3329, 5, 46, 0, 0, 3329, 3330, 1, 0, 0, 0, 3330, 3331, 6, 248, 43, 0, 3331, 503, 1, 0, 0, 0, 3332, 3333, 5, 58, 0, 0, 3333, 3334, 1, 0, 0, 0, 3334, 3335, 6, 249, 44, 0, 3335, 505, 1, 0, 0, 0, 3336, 3337, 5, 58, 0, 0, 3337, 3338, 5, 61, 0, 0, 3338, 3339, 1, 0, 0, 0, 3339, 3340, 6, 250, 45, 0, 3340, 507, 1, 0, 0, 0, 3341, 3342, 5, 59, 0, 0, 3342, 3343, 1, 0, 0, 0, 3343, 3344, 6, 251, 46, 0, 3344, 509, 1, 0, 0, 0, 3345, 3346, 5, 47, 0, 0, 3346, 3347, 1, 0, 0, 0, 3347, 3348, 6, 252, 47, 0, 3348, 511, 1, 0, 0, 0, 3349, 3350, 5, 47, 0, 0, 3350, 3351, 5, 47, 0, 0, 3351, 3352, 1, 0, 0, 0, 3352, 3353, 6, 253, 48, 0, 3353, 513, 1, 0, 0, 0, 3354, 3355, 5, 92, 0, 0, 3355, 3356, 1, 0, 0, 0, 3356, 3357, 6, 254, 49, 0, 3357, 515, 1, 0, 0, 0, 3358, 3359, 5, 124, 0, 0, 3359, 3360, 1, 0, 0, 0, 3360, 3361, 6, 255, 50, 0, 3361, 517, 1, 0, 0, 0, 3362, 3363, 5, 60, 0, 0, 3363, 3364, 1, 0, 0, 0, 3364, 3365, 6, 256, 51, 0, 3365, 519, 1, 0, 0, 0, 3366, 3367, 5, 62, 0, 0, 3367, 3368, 1, 0, 0, 0, 3368, 3369, 6, 257, 52, 0, 3369, 521, 1, 0, 0, 0, 3370, 3371, 5, 63, 0, 0, 3371, 3372, 1, 0, 0, 0, 3372, 3373, 6, 258, 53, 0, 3373, 523, 1, 0, 0, 0, 3374, 3375, 5, 64, 0, 0, 3375, 3376, 1, 0, 0, 0, 3376, 3377, 6, 259, 54, 0, 3377, 525, 1, 0, 0, 0, 3378, 3379, 5, 36, 0, 0, 3379, 3380, 1, 0, 0, 0, 3380, 3381, 6, 260, 55, 0, 3381, 527, 1, 0, 0, 0, 3382, 3383, 5, 37, 0, 0, 3383, 3384, 1, 0, 0, 0, 3384, 3385, 6, 261, 56, 0, 3385, 529, 1, 0, 0, 0, 3386, 3387, 5, 33, 0, 0, 3387, 3388, 1, 0, 0, 0, 3388, 3389, 6, 262, 57, 0, 3389, 531, 1, 0, 0, 0, 3390, 3391, 5, 35, 0, 0, 3391, 3392, 1, 0, 0, 0, 3392, 3393, 6, 263, 58, 0, 3393, 533, 1, 0, 0, 0, 3394, 3395, 5, 94, 0, 0, 3395, 3396, 1, 0, 0, 0, 3396, 3397, 6, 264, 59, 0, 3397, 535, 1, 0, 0, 0, 3398, 3399, 5, 61, 0, 0, 3399, 3400, 5, 62, 0, 0, 3400, 3401, 1, 0, 0, 0, 3401, 3402, 6, 265, 60, 0, 3402, 537, 1, 0, 0, 0, 3403, 3404, 5, 96, 0, 0, 3404, 3405, 1, 0, 0, 0, 3405, 3406, 6, 266, 5, 0, 3406, 539, 1, 0, 0, 0, 3407, 3408, 5, 124, 0, 0, 3408, 3409, 5, 124, 0, 0, 3409, 3410, 1, 0, 0, 0, 3410, 3411, 6, 267, 61, 0, 3411, 541, 1, 0, 0, 0, 3412, 3413, 5, 126, 0, 0, 3413, 3414, 1, 0, 0, 0, 3414, 3415, 6, 268, 62, 0, 3415, 543, 1, 0, 0, 0, 3416, 3417, 5, 97, 0, 0, 3417, 3418, 5, 108, 0, 0, 3418, 3419, 5, 108, 0, 0, 3419, 3420, 5, 111, 0, 0, 3420, 3421, 5, 119, 0, 0, 3421, 3422, 5, 105, 0, 0, 3422, 3423, 5, 110, 0, 0, 3423, 3424, 5, 103, 0, 0, 3424, 3425, 1, 0, 0, 0, 3425, 3426, 6, 269, 63, 0, 3426, 545, 1, 0, 0, 0, 3427, 3428, 5, 97, 0, 0, 3428, 3429, 5, 110, 0, 0, 3429, 3430, 5, 99, 0, 0, 3430, 3431, 5, 101, 0, 0, 3431, 3432, 5, 115, 0, 0, 3432, 3433, 5, 116, 0, 0, 3433, 3434, 5, 111, 0, 0, 3434, 3435, 5, 114, 0, 0, 3435, 3436, 1, 0, 0, 0, 3436, 3437, 6, 270, 64, 0, 3437, 547, 1, 0, 0, 0, 3438, 3439, 5, 97, 0, 0, 3439, 3440, 5, 110, 0, 0, 3440, 3441, 5, 99, 0, 0, 3441, 3442, 5, 101, 0, 0, 3442, 3443, 5, 115, 0, 0, 3443, 3444, 5, 116, 0, 0, 3444, 3445, 5, 111, 0, 0, 3445, 3446, 5, 114, 0, 0, 3446, 3447, 5, 45, 0, 0, 3447, 3448, 5, 111, 0, 0, 3448, 3449, 5, 114, 0, 0, 3449, 3450, 5, 45, 0, 0, 3450, 3451, 5, 115, 0, 0, 3451, 3452, 5, 101, 0, 0, 3452, 3453, 5, 108, 0, 0, 3453, 3454, 5, 102, 0, 0, 3454, 3455, 1, 0, 0, 0, 3455, 3456, 6, 271, 65, 0, 3456, 549, 1, 0, 0, 0, 3457, 3458, 5, 97, 0, 0, 3458, 3459, 5, 110, 0, 0, 3459, 3460, 5, 100, 0, 0, 3460, 3461, 1, 0, 0, 0, 3461, 3462, 6, 272, 66, 0, 3462, 551, 1, 0, 0, 0, 3463, 3464, 5, 97, 0, 0, 3464, 3465, 5, 114, 0, 0, 3465, 3466, 5, 114, 0, 0, 3466, 3467, 5, 97, 0, 0, 3467, 3468, 5, 121, 0, 0, 3468, 3469, 1, 0, 0, 0, 3469, 3470, 6, 273, 67, 0, 3470, 553, 1, 0, 0, 0, 3471, 3472, 5, 97, 0, 0, 3472, 3473, 5, 115, 0, 0, 3473, 3474, 1, 0, 0, 0, 3474, 3475, 6, 274, 68, 0, 3475, 555, 1, 0, 0, 0, 3476, 3477, 5, 97, 0, 0, 3477, 3478, 5, 115, 0, 0, 3478, 3479, 5, 99, 0, 0, 3479, 3480, 5, 101, 0, 0, 3480, 3481, 5, 110, 0, 0, 3481, 3482, 5, 100, 0, 0, 3482, 3483, 5, 105, 0, 0, 3483, 3484, 5, 110, 0, 0, 3484, 3485, 5, 103, 0, 0, 3485, 3486, 1, 0, 0, 0, 3486, 3487, 6, 275, 69, 0, 3487, 557, 1, 0, 0, 0, 3488, 3489, 5, 97, 0, 0, 3489, 3490, 5, 116, 0, 0, 3490, 3491, 1, 0, 0, 0, 3491, 3492, 6, 276, 70, 0, 3492, 559, 1, 0, 0, 0, 3493, 3494, 5, 97, 0, 0, 3494, 3495, 5, 116, 0, 0, 3495, 3496, 5, 116, 0, 0, 3496, 3497, 5, 114, 0, 0, 3497, 3498, 5, 105, 0, 0, 3498, 3499, 5, 98, 0, 0, 3499, 3500, 5, 117, 0, 0, 3500, 3501, 5, 116, 0, 0, 3501, 3502, 5, 101, 0, 0, 3502, 3503, 1, 0, 0, 0, 3503, 3504, 6, 277, 71, 0, 3504, 561, 1, 0, 0, 0, 3505, 3506, 5, 98, 0, 0, 3506, 3507, 5, 97, 0, 0, 3507, 3508, 5, 115, 0, 0, 3508, 3509, 5, 101, 0, 0, 3509, 3510, 5, 45, 0, 0, 3510, 3511, 5, 117, 0, 0, 3511, 3512, 5, 114, 0, 0, 3512, 3513, 5, 105, 0, 0, 3513, 3514, 1, 0, 0, 0, 3514, 3515, 6, 278, 72, 0, 3515, 563, 1, 0, 0, 0, 3516, 3517, 5, 98, 0, 0, 3517, 3518, 5, 111, 0, 0, 3518, 3519, 5, 117, 0, 0, 3519, 3520, 5, 110, 0, 0, 3520, 3521, 5, 100, 0, 0, 3521, 3522, 5, 97, 0, 0, 3522, 3523, 5, 114, 0, 0, 3523, 3524, 5, 121, 0, 0, 3524, 3525, 5, 45, 0, 0, 3525, 3526, 5, 115, 0, 0, 3526, 3527, 5, 112, 0, 0, 3527, 3528, 5, 97, 0, 0, 3528, 3529, 5, 99, 0, 0, 3529, 3530, 5, 101, 0, 0, 3530, 3531, 1, 0, 0, 0, 3531, 3532, 6, 279, 73, 0, 3532, 565, 1, 0, 0, 0, 3533, 3534, 5, 98, 0, 0, 3534, 3535, 5, 105, 0, 0, 3535, 3536, 5, 110, 0, 0, 3536, 3537, 5, 97, 0, 0, 3537, 3538, 5, 114, 0, 0, 3538, 3539, 5, 121, 0, 0, 3539, 3540, 1, 0, 0, 0, 3540, 3541, 6, 280, 74, 0, 3541, 567, 1, 0, 0, 0, 3542, 3543, 5, 98, 0, 0, 3543, 3544, 5, 121, 0, 0, 3544, 3545, 1, 0, 0, 0, 3545, 3546, 6, 281, 75, 0, 3546, 569, 1, 0, 0, 0, 3547, 3548, 5, 99, 0, 0, 3548, 3549, 5, 97, 0, 0, 3549, 3550, 5, 115, 0, 0, 3550, 3551, 5, 101, 0, 0, 3551, 3552, 1, 0, 0, 0, 3552, 3553, 6, 282, 76, 0, 3553, 571, 1, 0, 0, 0, 3554, 3555, 5, 99, 0, 0, 3555, 3556, 5, 97, 0, 0, 3556, 3557, 5, 115, 0, 0, 3557, 3558, 5, 116, 0, 0, 3558, 3559, 1, 0, 0, 0, 3559, 3560, 6, 283, 77, 0, 3560, 573, 1, 0, 0, 0, 3561, 3562, 5, 99, 0, 0, 3562, 3563, 5, 97, 0, 0, 3563, 3564, 5, 115, 0, 0, 3564, 3565, 5, 116, 0, 0, 3565, 3566, 5, 97, 0, 0, 3566, 3567, 5, 98, 0, 0, 3567, 3568, 5, 108, 0, 0, 3568, 3569, 5, 101, 0, 0, 3569, 3570, 1, 0, 0, 0, 3570, 3571, 6, 284, 78, 0, 3571, 575, 1, 0, 0, 0, 3572, 3573, 5, 99, 0, 0, 3573, 3574, 5, 97, 0, 0, 3574, 3575, 5, 116, 0, 0, 3575, 3576, 5, 99, 0, 0, 3576, 3577, 5, 104, 0, 0, 3577, 3578, 1, 0, 0, 0, 3578, 3579, 6, 285, 79, 0, 3579, 577, 1, 0, 0, 0, 3580, 3581, 5, 99, 0, 0, 3581, 3582, 5, 104, 0, 0, 3582, 3583, 5, 105, 0, 0, 3583, 3584, 5, 108, 0, 0, 3584, 3585, 5, 100, 0, 0, 3585, 3586, 1, 0, 0, 0, 3586, 3587, 6, 286, 80, 0, 3587, 579, 1, 0, 0, 0, 3588, 3589, 5, 99, 0, 0, 3589, 3590, 5, 111, 0, 0, 3590, 3591, 5, 108, 0, 0, 3591, 3592, 5, 108, 0, 0, 3592, 3593, 5, 97, 0, 0, 3593, 3594, 5, 116, 0, 0, 3594, 3595, 5, 105, 0, 0, 3595, 3596, 5, 111, 0, 0, 3596, 3597, 5, 110, 0, 0, 3597, 3598, 1, 0, 0, 0, 3598, 3599, 6, 287, 81, 0, 3599, 581, 1, 0, 0, 0, 3600, 3601, 5, 99, 0, 0, 3601, 3602, 5, 111, 0, 0, 3602, 3603, 5, 109, 0, 0, 3603, 3604, 5, 109, 0, 0, 3604, 3605, 5, 101, 0, 0, 3605, 3606, 5, 110, 0, 0, 3606, 3607, 5, 116, 0, 0, 3607, 3608, 1, 0, 0, 0, 3608, 3609, 6, 288, 82, 0, 3609, 583, 1, 0, 0, 0, 3610, 3611, 5, 99, 0, 0, 3611, 3612, 5, 111, 0, 0, 3612, 3613, 5, 110, 0, 0, 3613, 3614, 5, 115, 0, 0, 3614, 3615, 5, 116, 0, 0, 3615, 3616, 5, 114, 0, 0, 3616, 3617, 5, 117, 0, 0, 3617, 3618, 5, 99, 0, 0, 3618, 3619, 5, 116, 0, 0, 3619, 3620, 5, 105, 0, 0, 3620, 3621, 5, 111, 0, 0, 3621, 3622, 5, 110, 0, 0, 3622, 3623, 1, 0, 0, 0, 3623, 3624, 6, 289, 83, 0, 3624, 585, 1, 0, 0, 0, 3625, 3626, 5, 99, 0, 0, 3626, 3627, 5, 111, 0, 0, 3627, 3628, 5, 110, 0, 0, 3628, 3629, 5, 116, 0, 0, 3629, 3630, 5, 101, 0, 0, 3630, 3631, 5, 120, 0, 0, 3631, 3632, 5, 116, 0, 0, 3632, 3633, 1, 0, 0, 0, 3633, 3634, 6, 290, 84, 0, 3634, 587, 1, 0, 0, 0, 3635, 3636, 5, 99, 0, 0, 3636, 3637, 5, 111, 0, 0, 3637, 3638, 5, 112, 0, 0, 3638, 3639, 5, 121, 0, 0, 3639, 3640, 5, 45, 0, 0, 3640, 3641, 5, 110, 0, 0, 3641, 3642, 5, 97, 0, 0, 3642, 3643, 5, 109, 0, 0, 3643, 3644, 5, 101, 0, 0, 3644, 3645, 5, 115, 0, 0, 3645, 3646, 5, 112, 0, 0, 3646, 3647, 5, 97, 0, 0, 3647, 3648, 5, 99, 0, 0, 3648, 3649, 5, 101, 0, 0, 3649, 3650, 5, 115, 0, 0, 3650, 3651, 1, 0, 0, 0, 3651, 3652, 6, 291, 85, 0, 3652, 589, 1, 0, 0, 0, 3653, 3654, 5, 99, 0, 0, 3654, 3655, 5, 111, 0, 0, 3655, 3656, 5, 117, 0, 0, 3656, 3657, 5, 110, 0, 0, 3657, 3658, 5, 116, 0, 0, 3658, 3659, 1, 0, 0, 0, 3659, 3660, 6, 292, 86, 0, 3660, 591, 1, 0, 0, 0, 3661, 3662, 5, 100, 0, 0, 3662, 3663, 5, 101, 0, 0, 3663, 3664, 5, 99, 0, 0, 3664, 3665, 5, 108, 0, 0, 3665, 3666, 5, 97, 0, 0, 3666, 3667, 5, 114, 0, 0, 3667, 3668, 5, 101, 0, 0, 3668, 3669, 1, 0, 0, 0, 3669, 3670, 6, 293, 87, 0, 3670, 593, 1, 0, 0, 0, 3671, 3672, 5, 100, 0, 0, 3672, 3673, 5, 101, 0, 0, 3673, 3674, 5, 102, 0, 0, 3674, 3675, 5, 97, 0, 0, 3675, 3676, 5, 117, 0, 0, 3676, 3677, 5, 108, 0, 0, 3677, 3678, 5, 116, 0, 0, 3678, 3679, 1, 0, 0, 0, 3679, 3680, 6, 294, 88, 0, 3680, 595, 1, 0, 0, 0, 3681, 3682, 5, 100, 0, 0, 3682, 3683, 5, 101, 0, 0, 3683, 3684, 5, 115, 0, 0, 3684, 3685, 5, 99, 0, 0, 3685, 3686, 5, 101, 0, 0, 3686, 3687, 5, 110, 0, 0, 3687, 3688, 5, 100, 0, 0, 3688, 3689, 5, 97, 0, 0, 3689, 3690, 5, 110, 0, 0, 3690, 3691, 5, 116, 0, 0, 3691, 3692, 1, 0, 0, 0, 3692, 3693, 6, 295, 89, 0, 3693, 597, 1, 0, 0, 0, 3694, 3695, 5, 100, 0, 0, 3695, 3696, 5, 101, 0, 0, 3696, 3697, 5, 115, 0, 0, 3697, 3698, 5, 99, 0, 0, 3698, 3699, 5, 101, 0, 0, 3699, 3700, 5, 110, 0, 0, 3700, 3701, 5, 100, 0, 0, 3701, 3702, 5, 97, 0, 0, 3702, 3703, 5, 110, 0, 0, 3703, 3704, 5, 116, 0, 0, 3704, 3705, 5, 45, 0, 0, 3705, 3706, 5, 111, 0, 0, 3706, 3707, 5, 114, 0, 0, 3707, 3708, 5, 45, 0, 0, 3708, 3709, 5, 115, 0, 0, 3709, 3710, 5, 101, 0, 0, 3710, 3711, 5, 108, 0, 0, 3711, 3712, 5, 102, 0, 0, 3712, 3713, 1, 0, 0, 0, 3713, 3714, 6, 296, 90, 0, 3714, 599, 1, 0, 0, 0, 3715, 3716, 5, 100, 0, 0, 3716, 3717, 5, 101, 0, 0, 3717, 3718, 5, 115, 0, 0, 3718, 3719, 5, 99, 0, 0, 3719, 3720, 5, 101, 0, 0, 3720, 3721, 5, 110, 0, 0, 3721, 3722, 5, 100, 0, 0, 3722, 3723, 5, 105, 0, 0, 3723, 3724, 5, 110, 0, 0, 3724, 3725, 5, 103, 0, 0, 3725, 3726, 1, 0, 0, 0, 3726, 3727, 6, 297, 91, 0, 3727, 601, 1, 0, 0, 0, 3728, 3729, 5, 100, 0, 0, 3729, 3730, 5, 101, 0, 0, 3730, 3731, 5, 99, 0, 0, 3731, 3732, 5, 105, 0, 0, 3732, 3733, 5, 109, 0, 0, 3733, 3734, 5, 97, 0, 0, 3734, 3735, 5, 108, 0, 0, 3735, 3736, 5, 45, 0, 0, 3736, 3737, 5, 102, 0, 0, 3737, 3738, 5, 111, 0, 0, 3738, 3739, 5, 114, 0, 0, 3739, 3740, 5, 109, 0, 0, 3740, 3741, 5, 97, 0, 0, 3741, 3742, 5, 116, 0, 0, 3742, 3743, 1, 0, 0, 0, 3743, 3744, 6, 298, 92, 0, 3744, 603, 1, 0, 0, 0, 3745, 3746, 5, 100, 0, 0, 3746, 3747, 5, 105, 0, 0, 3747, 3748, 5, 118, 0, 0, 3748, 3749, 1, 0, 0, 0, 3749, 3750, 6, 299, 93, 0, 3750, 605, 1, 0, 0, 0, 3751, 3752, 5, 100, 0, 0, 3752, 3753, 5, 111, 0, 0, 3753, 3754, 5, 99, 0, 0, 3754, 3755, 5, 117, 0, 0, 3755, 3756, 5, 109, 0, 0, 3756, 3757, 5, 101, 0, 0, 3757, 3758, 5, 110, 0, 0, 3758, 3759, 5, 116, 0, 0, 3759, 3760, 1, 0, 0, 0, 3760, 3761, 6, 300, 94, 0, 3761, 607, 1, 0, 0, 0, 3762, 3763, 5, 100, 0, 0, 3763, 3764, 5, 111, 0, 0, 3764, 3765, 5, 99, 0, 0, 3765, 3766, 5, 117, 0, 0, 3766, 3767, 5, 109, 0, 0, 3767, 3768, 5, 101, 0, 0, 3768, 3769, 5, 110, 0, 0, 3769, 3770, 5, 116, 0, 0, 3770, 3771, 5, 45, 0, 0, 3771, 3772, 5, 110, 0, 0, 3772, 3773, 5, 111, 0, 0, 3773, 3774, 5, 100, 0, 0, 3774, 3775, 5, 101, 0, 0, 3775, 3776, 1, 0, 0, 0, 3776, 3777, 6, 301, 95, 0, 3777, 609, 1, 0, 0, 0, 3778, 3779, 5, 101, 0, 0, 3779, 3780, 5, 108, 0, 0, 3780, 3781, 5, 101, 0, 0, 3781, 3782, 5, 109, 0, 0, 3782, 3783, 5, 101, 0, 0, 3783, 3784, 5, 110, 0, 0, 3784, 3785, 5, 116, 0, 0, 3785, 3786, 1, 0, 0, 0, 3786, 3787, 6, 302, 96, 0, 3787, 611, 1, 0, 0, 0, 3788, 3789, 5, 101, 0, 0, 3789, 3790, 5, 108, 0, 0, 3790, 3791, 5, 115, 0, 0, 3791, 3792, 5, 101, 0, 0, 3792, 3793, 1, 0, 0, 0, 3793, 3794, 6, 303, 97, 0, 3794, 613, 1, 0, 0, 0, 3795, 3796, 5, 101, 0, 0, 3796, 3797, 5, 109, 0, 0, 3797, 3798, 5, 112, 0, 0, 3798, 3799, 5, 116, 0, 0, 3799, 3800, 5, 121, 0, 0, 3800, 3801, 1, 0, 0, 0, 3801, 3802, 6, 304, 98, 0, 3802, 615, 1, 0, 0, 0, 3803, 3804, 5, 101, 0, 0, 3804, 3805, 5, 109, 0, 0, 3805, 3806, 5, 112, 0, 0, 3806, 3807, 5, 116, 0, 0, 3807, 3808, 5, 121, 0, 0, 3808, 3809, 5, 45, 0, 0, 3809, 3810, 5, 115, 0, 0, 3810, 3811, 5, 101, 0, 0, 3811, 3812, 5, 113, 0, 0, 3812, 3813, 5, 117, 0, 0, 3813, 3814, 5, 101, 0, 0, 3814, 3815, 5, 110, 0, 0, 3815, 3816, 5, 99, 0, 0, 3816, 3817, 5, 101, 0, 0, 3817, 3818, 1, 0, 0, 0, 3818, 3819, 6, 305, 99, 0, 3819, 617, 1, 0, 0, 0, 3820, 3821, 5, 101, 0, 0, 3821, 3822, 5, 110, 0, 0, 3822, 3823, 5, 99, 0, 0, 3823, 3824, 5, 111, 0, 0, 3824, 3825, 5, 100, 0, 0, 3825, 3826, 5, 105, 0, 0, 3826, 3827, 5, 110, 0, 0, 3827, 3828, 5, 103, 0, 0, 3828, 3829, 1, 0, 0, 0, 3829, 3830, 6, 306, 100, 0, 3830, 619, 1, 0, 0, 0, 3831, 3832, 5, 101, 0, 0, 3832, 3833, 5, 110, 0, 0, 3833, 3834, 5, 100, 0, 0, 3834, 3835, 1, 0, 0, 0, 3835, 3836, 6, 307, 101, 0, 3836, 621, 1, 0, 0, 0, 3837, 3838, 5, 101, 0, 0, 3838, 3839, 5, 113, 0, 0, 3839, 3840, 1, 0, 0, 0, 3840, 3841, 6, 308, 102, 0, 3841, 623, 1, 0, 0, 0, 3842, 3843, 5, 101, 0, 0, 3843, 3844, 5, 118, 0, 0, 3844, 3845, 5, 101, 0, 0, 3845, 3846, 5, 114, 0, 0, 3846, 3847, 5, 121, 0, 0, 3847, 3848, 1, 0, 0, 0, 3848, 3849, 6, 309, 103, 0, 3849, 625, 1, 0, 0, 0, 3850, 3851, 5, 101, 0, 0, 3851, 3852, 5, 120, 0, 0, 3852, 3853, 5, 99, 0, 0, 3853, 3854, 5, 101, 0, 0, 3854, 3855, 5, 112, 0, 0, 3855, 3856, 5, 116, 0, 0, 3856, 3857, 1, 0, 0, 0, 3857, 3858, 6, 310, 104, 0, 3858, 627, 1, 0, 0, 0, 3859, 3860, 5, 101, 0, 0, 3860, 3861, 5, 120, 0, 0, 3861, 3862, 5, 116, 0, 0, 3862, 3863, 5, 101, 0, 0, 3863, 3864, 5, 114, 0, 0, 3864, 3865, 5, 110, 0, 0, 3865, 3866, 5, 97, 0, 0, 3866, 3867, 5, 108, 0, 0, 3867, 3868, 1, 0, 0, 0, 3868, 3869, 6, 311, 105, 0, 3869, 629, 1, 0, 0, 0, 3870, 3871, 5, 102, 0, 0, 3871, 3872, 5, 111, 0, 0, 3872, 3873, 5, 108, 0, 0, 3873, 3874, 5, 108, 0, 0, 3874, 3875, 5, 111, 0, 0, 3875, 3876, 5, 119, 0, 0, 3876, 3877, 5, 105, 0, 0, 3877, 3878, 5, 110, 0, 0, 3878, 3879, 5, 103, 0, 0, 3879, 3880, 1, 0, 0, 0, 3880, 3881, 6, 312, 106, 0, 3881, 631, 1, 0, 0, 0, 3882, 3883, 5, 102, 0, 0, 3883, 3884, 5, 111, 0, 0, 3884, 3885, 5, 108, 0, 0, 3885, 3886, 5, 108, 0, 0, 3886, 3887, 5, 111, 0, 0, 3887, 3888, 5, 119, 0, 0, 3888, 3889, 5, 105, 0, 0, 3889, 3890, 5, 110, 0, 0, 3890, 3891, 5, 103, 0, 0, 3891, 3892, 5, 45, 0, 0, 3892, 3893, 5, 115, 0, 0, 3893, 3894, 5, 105, 0, 0, 3894, 3895, 5, 98, 0, 0, 3895, 3896, 5, 108, 0, 0, 3896, 3897, 5, 105, 0, 0, 3897, 3898, 5, 110, 0, 0, 3898, 3899, 5, 103, 0, 0, 3899, 3900, 1, 0, 0, 0, 3900, 3901, 6, 313, 107, 0, 3901, 633, 1, 0, 0, 0, 3902, 3903, 5, 102, 0, 0, 3903, 3904, 5, 111, 0, 0, 3904, 3905, 5, 114, 0, 0, 3905, 3906, 1, 0, 0, 0, 3906, 3907, 6, 314, 108, 0, 3907, 635, 1, 0, 0, 0, 3908, 3909, 5, 102, 0, 0, 3909, 3910, 5, 117, 0, 0, 3910, 3911, 5, 110, 0, 0, 3911, 3912, 5, 99, 0, 0, 3912, 3913, 5, 116, 0, 0, 3913, 3914, 5, 105, 0, 0, 3914, 3915, 5, 111, 0, 0, 3915, 3916, 5, 110, 0, 0, 3916, 3917, 1, 0, 0, 0, 3917, 3918, 6, 315, 109, 0, 3918, 637, 1, 0, 0, 0, 3919, 3920, 5, 103, 0, 0, 3920, 3921, 5, 101, 0, 0, 3921, 3922, 1, 0, 0, 0, 3922, 3923, 6, 316, 110, 0, 3923, 639, 1, 0, 0, 0, 3924, 3925, 5, 103, 0, 0, 3925, 3926, 5, 114, 0, 0, 3926, 3927, 5, 101, 0, 0, 3927, 3928, 5, 97, 0, 0, 3928, 3929, 5, 116, 0, 0, 3929, 3930, 5, 101, 0, 0, 3930, 3931, 5, 115, 0, 0, 3931, 3932, 5, 116, 0, 0, 3932, 3933, 1, 0, 0, 0, 3933, 3934, 6, 317, 111, 0, 3934, 641, 1, 0, 0, 0, 3935, 3936, 5, 103, 0, 0, 3936, 3937, 5, 114, 0, 0, 3937, 3938, 5, 111, 0, 0, 3938, 3939, 5, 117, 0, 0, 3939, 3940, 5, 112, 0, 0, 3940, 3941, 1, 0, 0, 0, 3941, 3942, 6, 318, 112, 0, 3942, 643, 1, 0, 0, 0, 3943, 3944, 5, 103, 0, 0, 3944, 3945, 5, 116, 0, 0, 3945, 3946, 1, 0, 0, 0, 3946, 3947, 6, 319, 113, 0, 3947, 645, 1, 0, 0, 0, 3948, 3949, 5, 105, 0, 0, 3949, 3950, 5, 100, 0, 0, 3950, 3951, 5, 105, 0, 0, 3951, 3952, 5, 118, 0, 0, 3952, 3953, 1, 0, 0, 0, 3953, 3954, 6, 320, 114, 0, 3954, 647, 1, 0, 0, 0, 3955, 3956, 5, 105, 0, 0, 3956, 3957, 5, 102, 0, 0, 3957, 3958, 1, 0, 0, 0, 3958, 3959, 6, 321, 115, 0, 3959, 649, 1, 0, 0, 0, 3960, 3961, 5, 105, 0, 0, 3961, 3962, 5, 109, 0, 0, 3962, 3963, 5, 112, 0, 0, 3963, 3964, 5, 111, 0, 0, 3964, 3965, 5, 114, 0, 0, 3965, 3966, 5, 116, 0, 0, 3966, 3967, 1, 0, 0, 0, 3967, 3968, 6, 322, 116, 0, 3968, 651, 1, 0, 0, 0, 3969, 3970, 5, 105, 0, 0, 3970, 3971, 5, 110, 0, 0, 3971, 3972, 1, 0, 0, 0, 3972, 3973, 6, 323, 117, 0, 3973, 653, 1, 0, 0, 0, 3974, 3975, 5, 105, 0, 0, 3975, 3976, 5, 110, 0, 0, 3976, 3977, 5, 104, 0, 0, 3977, 3978, 5, 101, 0, 0, 3978, 3979, 5, 114, 0, 0, 3979, 3980, 5, 105, 0, 0, 3980, 3981, 5, 116, 0, 0, 3981, 3982, 1, 0, 0, 0, 3982, 3983, 6, 324, 118, 0, 3983, 655, 1, 0, 0, 0, 3984, 3985, 5, 105, 0, 0, 3985, 3986, 5, 110, 0, 0, 3986, 3987, 5, 115, 0, 0, 3987, 3988, 5, 116, 0, 0, 3988, 3989, 5, 97, 0, 0, 3989, 3990, 5, 110, 0, 0, 3990, 3991, 5, 99, 0, 0, 3991, 3992, 5, 101, 0, 0, 3992, 3993, 1, 0, 0, 0, 3993, 3994, 6, 325, 119, 0, 3994, 657, 1, 0, 0, 0, 3995, 3996, 5, 105, 0, 0, 3996, 3997, 5, 110, 0, 0, 3997, 3998, 5, 116, 0, 0, 3998, 3999, 5, 101, 0, 0, 3999, 4000, 5, 114, 0, 0, 4000, 4001, 5, 115, 0, 0, 4001, 4002, 5, 101, 0, 0, 4002, 4003, 5, 99, 0, 0, 4003, 4004, 5, 116, 0, 0, 4004, 4005, 1, 0, 0, 0, 4005, 4006, 6, 326, 120, 0, 4006, 659, 1, 0, 0, 0, 4007, 4008, 5, 105, 0, 0, 4008, 4009, 5, 115, 0, 0, 4009, 4010, 1, 0, 0, 0, 4010, 4011, 6, 327, 121, 0, 4011, 661, 1, 0, 0, 0, 4012, 4013, 5, 105, 0, 0, 4013, 4014, 5, 116, 0, 0, 4014, 4015, 5, 101, 0, 0, 4015, 4016, 5, 109, 0, 0, 4016, 4017, 1, 0, 0, 0, 4017, 4018, 6, 328, 122, 0, 4018, 663, 1, 0, 0, 0, 4019, 4020, 5, 108, 0, 0, 4020, 4021, 5, 97, 0, 0, 4021, 4022, 5, 120, 0, 0, 4022, 4023, 1, 0, 0, 0, 4023, 4024, 6, 329, 123, 0, 4024, 665, 1, 0, 0, 0, 4025, 4026, 5, 108, 0, 0, 4026, 4027, 5, 101, 0, 0, 4027, 4028, 1, 0, 0, 0, 4028, 4029, 6, 330, 124, 0, 4029, 667, 1, 0, 0, 0, 4030, 4031, 5, 108, 0, 0, 4031, 4032, 5, 101, 0, 0, 4032, 4033, 5, 97, 0, 0, 4033, 4034, 5, 115, 0, 0, 4034, 4035, 5, 116, 0, 0, 4035, 4036, 1, 0, 0, 0, 4036, 4037, 6, 331, 125, 0, 4037, 669, 1, 0, 0, 0, 4038, 4039, 5, 108, 0, 0, 4039, 4040, 5, 101, 0, 0, 4040, 4041, 5, 116, 0, 0, 4041, 4042, 1, 0, 0, 0, 4042, 4043, 6, 332, 126, 0, 4043, 671, 1, 0, 0, 0, 4044, 4045, 5, 108, 0, 0, 4045, 4046, 5, 116, 0, 0, 4046, 4047, 1, 0, 0, 0, 4047, 4048, 6, 333, 127, 0, 4048, 673, 1, 0, 0, 0, 4049, 4050, 5, 109, 0, 0, 4050, 4051, 5, 97, 0, 0, 4051, 4052, 5, 112, 0, 0, 4052, 4053, 1, 0, 0, 0, 4053, 4054, 6, 334, 128, 0, 4054, 675, 1, 0, 0, 0, 4055, 4056, 5, 109, 0, 0, 4056, 4057, 5, 111, 0, 0, 4057, 4058, 5, 100, 0, 0, 4058, 4059, 1, 0, 0, 0, 4059, 4060, 6, 335, 129, 0, 4060, 677, 1, 0, 0, 0, 4061, 4062, 5, 109, 0, 0, 4062, 4063, 5, 111, 0, 0, 4063, 4064, 5, 100, 0, 0, 4064, 4065, 5, 117, 0, 0, 4065, 4066, 5, 108, 0, 0, 4066, 4067, 5, 101, 0, 0, 4067, 4068, 1, 0, 0, 0, 4068, 4069, 6, 336, 130, 0, 4069, 679, 1, 0, 0, 0, 4070, 4071, 5, 110, 0, 0, 4071, 4072, 5, 97, 0, 0, 4072, 4073, 5, 109, 0, 0, 4073, 4074, 5, 101, 0, 0, 4074, 4075, 5, 115, 0, 0, 4075, 4076, 5, 112, 0, 0, 4076, 4077, 5, 97, 0, 0, 4077, 4078, 5, 99, 0, 0, 4078, 4079, 5, 101, 0, 0, 4079, 4080, 1, 0, 0, 0, 4080, 4081, 6, 337, 131, 0, 4081, 681, 1, 0, 0, 0, 4082, 4083, 5, 110, 0, 0, 4083, 4084, 5, 101, 0, 0, 4084, 4085, 1, 0, 0, 0, 4085, 4086, 6, 338, 132, 0, 4086, 683, 1, 0, 0, 0, 4087, 4088, 5, 110, 0, 0, 4088, 4089, 5, 101, 0, 0, 4089, 4090, 5, 120, 0, 0, 4090, 4091, 5, 116, 0, 0, 4091, 4092, 1, 0, 0, 0, 4092, 4093, 6, 339, 133, 0, 4093, 685, 1, 0, 0, 0, 4094, 4095, 5, 110, 0, 0, 4095, 4096, 5, 97, 0, 0, 4096, 4097, 5, 109, 0, 0, 4097, 4098, 5, 101, 0, 0, 4098, 4099, 5, 115, 0, 0, 4099, 4100, 5, 112, 0, 0, 4100, 4101, 5, 97, 0, 0, 4101, 4102, 5, 99, 0, 0, 4102, 4103, 5, 101, 0, 0, 4103, 4104, 5, 45, 0, 0, 4104, 4105, 5, 110, 0, 0, 4105, 4106, 5, 111, 0, 0, 4106, 4107, 5, 100, 0, 0, 4107, 4108, 5, 101, 0, 0, 4108, 4109, 1, 0, 0, 0, 4109, 4110, 6, 340, 134, 0, 4110, 687, 1, 0, 0, 0, 4111, 4112, 5, 110, 0, 0, 4112, 4113, 5, 111, 0, 0, 4113, 4114, 5, 45, 0, 0, 4114, 4115, 5, 105, 0, 0, 4115, 4116, 5, 110, 0, 0, 4116, 4117, 5, 104, 0, 0, 4117, 4118, 5, 101, 0, 0, 4118, 4119, 5, 114, 0, 0, 4119, 4120, 5, 105, 0, 0, 4120, 4121, 5, 116, 0, 0, 4121, 4122, 1, 0, 0, 0, 4122, 4123, 6, 341, 135, 0, 4123, 689, 1, 0, 0, 0, 4124, 4125, 5, 110, 0, 0, 4125, 4126, 5, 111, 0, 0, 4126, 4127, 5, 45, 0, 0, 4127, 4128, 5, 112, 0, 0, 4128, 4129, 5, 114, 0, 0, 4129, 4130, 5, 101, 0, 0, 4130, 4131, 5, 115, 0, 0, 4131, 4132, 5, 101, 0, 0, 4132, 4133, 5, 114, 0, 0, 4133, 4134, 5, 118, 0, 0, 4134, 4135, 5, 101, 0, 0, 4135, 4136, 1, 0, 0, 0, 4136, 4137, 6, 342, 136, 0, 4137, 691, 1, 0, 0, 0, 4138, 4139, 5, 110, 0, 0, 4139, 4140, 5, 111, 0, 0, 4140, 4141, 5, 100, 0, 0, 4141, 4142, 5, 101, 0, 0, 4142, 4143, 1, 0, 0, 0, 4143, 4144, 6, 343, 137, 0, 4144, 693, 1, 0, 0, 0, 4145, 4146, 5, 111, 0, 0, 4146, 4147, 5, 102, 0, 0, 4147, 4148, 1, 0, 0, 0, 4148, 4149, 6, 344, 138, 0, 4149, 695, 1, 0, 0, 0, 4150, 4151, 5, 111, 0, 0, 4151, 4152, 5, 110, 0, 0, 4152, 4153, 5, 108, 0, 0, 4153, 4154, 5, 121, 0, 0, 4154, 4155, 1, 0, 0, 0, 4155, 4156, 6, 345, 139, 0, 4156, 697, 1, 0, 0, 0, 4157, 4158, 5, 111, 0, 0, 4158, 4159, 5, 112, 0, 0, 4159, 4160, 5, 116, 0, 0, 4160, 4161, 5, 105, 0, 0, 4161, 4162, 5, 111, 0, 0, 4162, 4163, 5, 110, 0, 0, 4163, 4164, 1, 0, 0, 0, 4164, 4165, 6, 346, 140, 0, 4165, 699, 1, 0, 0, 0, 4166, 4167, 5, 111, 0, 0, 4167, 4168, 5, 114, 0, 0, 4168, 4169, 1, 0, 0, 0, 4169, 4170, 6, 347, 141, 0, 4170, 701, 1, 0, 0, 0, 4171, 4172, 5, 111, 0, 0, 4172, 4173, 5, 114, 0, 0, 4173, 4174, 5, 100, 0, 0, 4174, 4175, 5, 101, 0, 0, 4175, 4176, 5, 114, 0, 0, 4176, 4177, 1, 0, 0, 0, 4177, 4178, 6, 348, 142, 0, 4178, 703, 1, 0, 0, 0, 4179, 4180, 5, 111, 0, 0, 4180, 4181, 5, 114, 0, 0, 4181, 4182, 5, 100, 0, 0, 4182, 4183, 5, 101, 0, 0, 4183, 4184, 5, 114, 0, 0, 4184, 4185, 5, 101, 0, 0, 4185, 4186, 5, 100, 0, 0, 4186, 4187, 1, 0, 0, 0, 4187, 4188, 6, 349, 143, 0, 4188, 705, 1, 0, 0, 0, 4189, 4190, 5, 111, 0, 0, 4190, 4191, 5, 114, 0, 0, 4191, 4192, 5, 100, 0, 0, 4192, 4193, 5, 101, 0, 0, 4193, 4194, 5, 114, 0, 0, 4194, 4195, 5, 105, 0, 0, 4195, 4196, 5, 110, 0, 0, 4196, 4197, 5, 103, 0, 0, 4197, 4198, 1, 0, 0, 0, 4198, 4199, 6, 350, 144, 0, 4199, 707, 1, 0, 0, 0, 4200, 4201, 5, 112, 0, 0, 4201, 4202, 5, 97, 0, 0, 4202, 4203, 5, 114, 0, 0, 4203, 4204, 5, 101, 0, 0, 4204, 4205, 5, 110, 0, 0, 4205, 4206, 5, 116, 0, 0, 4206, 4207, 1, 0, 0, 0, 4207, 4208, 6, 351, 145, 0, 4208, 709, 1, 0, 0, 0, 4209, 4210, 5, 112, 0, 0, 4210, 4211, 5, 114, 0, 0, 4211, 4212, 5, 101, 0, 0, 4212, 4213, 5, 99, 0, 0, 4213, 4214, 5, 101, 0, 0, 4214, 4215, 5, 100, 0, 0, 4215, 4216, 5, 105, 0, 0, 4216, 4217, 5, 110, 0, 0, 4217, 4218, 5, 103, 0, 0, 4218, 4219, 1, 0, 0, 0, 4219, 4220, 6, 352, 146, 0, 4220, 711, 1, 0, 0, 0, 4221, 4222, 5, 112, 0, 0, 4222, 4223, 5, 114, 0, 0, 4223, 4224, 5, 101, 0, 0, 4224, 4225, 5, 99, 0, 0, 4225, 4226, 5, 101, 0, 0, 4226, 4227, 5, 100, 0, 0, 4227, 4228, 5, 105, 0, 0, 4228, 4229, 5, 110, 0, 0, 4229, 4230, 5, 103, 0, 0, 4230, 4231, 5, 45, 0, 0, 4231, 4232, 5, 115, 0, 0, 4232, 4233, 5, 105, 0, 0, 4233, 4234, 5, 98, 0, 0, 4234, 4235, 5, 108, 0, 0, 4235, 4236, 5, 105, 0, 0, 4236, 4237, 5, 110, 0, 0, 4237, 4238, 5, 103, 0, 0, 4238, 4239, 1, 0, 0, 0, 4239, 4240, 6, 353, 147, 0, 4240, 713, 1, 0, 0, 0, 4241, 4242, 5, 112, 0, 0, 4242, 4243, 5, 114, 0, 0, 4243, 4244, 5, 101, 0, 0, 4244, 4245, 5, 115, 0, 0, 4245, 4246, 5, 101, 0, 0, 4246, 4247, 5, 114, 0, 0, 4247, 4248, 5, 118, 0, 0, 4248, 4249, 5, 101, 0, 0, 4249, 4250, 1, 0, 0, 0, 4250, 4251, 6, 354, 148, 0, 4251, 715, 1, 0, 0, 0, 4252, 4253, 5, 112, 0, 0, 4253, 4254, 5, 114, 0, 0, 4254, 4255, 5, 101, 0, 0, 4255, 4256, 5, 118, 0, 0, 4256, 4257, 5, 105, 0, 0, 4257, 4258, 5, 111, 0, 0, 4258, 4259, 5, 117, 0, 0, 4259, 4260, 5, 115, 0, 0, 4260, 4261, 1, 0, 0, 0, 4261, 4262, 6, 355, 149, 0, 4262, 717, 1, 0, 0, 0, 4263, 4264, 5, 112, 0, 0, 4264, 4265, 5, 114, 0, 0, 4265, 4266, 5, 111, 0, 0, 4266, 4267, 5, 99, 0, 0, 4267, 4268, 5, 101, 0, 0, 4268, 4269, 5, 115, 0, 0, 4269, 4270, 5, 115, 0, 0, 4270, 4271, 5, 105, 0, 0, 4271, 4272, 5, 110, 0, 0, 4272, 4273, 5, 103, 0, 0, 4273, 4274, 5, 45, 0, 0, 4274, 4275, 5, 105, 0, 0, 4275, 4276, 5, 110, 0, 0, 4276, 4277, 5, 115, 0, 0, 4277, 4278, 5, 116, 0, 0, 4278, 4279, 5, 114, 0, 0, 4279, 4280, 5, 117, 0, 0, 4280, 4281, 5, 99, 0, 0, 4281, 4282, 5, 116, 0, 0, 4282, 4283, 5, 105, 0, 0, 4283, 4284, 5, 111, 0, 0, 4284, 4285, 5, 110, 0, 0, 4285, 4286, 1, 0, 0, 0, 4286, 4287, 6, 356, 150, 0, 4287, 719, 1, 0, 0, 0, 4288, 4289, 5, 114, 0, 0, 4289, 4290, 5, 101, 0, 0, 4290, 4291, 5, 116, 0, 0, 4291, 4292, 5, 117, 0, 0, 4292, 4293, 5, 114, 0, 0, 4293, 4294, 5, 110, 0, 0, 4294, 4295, 1, 0, 0, 0, 4295, 4296, 6, 357, 151, 0, 4296, 721, 1, 0, 0, 0, 4297, 4298, 5, 115, 0, 0, 4298, 4299, 5, 97, 0, 0, 4299, 4300, 5, 116, 0, 0, 4300, 4301, 5, 105, 0, 0, 4301, 4302, 5, 115, 0, 0, 4302, 4303, 5, 102, 0, 0, 4303, 4304, 5, 105, 0, 0, 4304, 4305, 5, 101, 0, 0, 4305, 4306, 5, 115, 0, 0, 4306, 4307, 1, 0, 0, 0, 4307, 4308, 6, 358, 152, 0, 4308, 723, 1, 0, 0, 0, 4309, 4310, 5, 115, 0, 0, 4310, 4311, 5, 99, 0, 0, 4311, 4312, 5, 104, 0, 0, 4312, 4313, 5, 101, 0, 0, 4313, 4314, 5, 109, 0, 0, 4314, 4315, 5, 97, 0, 0, 4315, 4316, 1, 0, 0, 0, 4316, 4317, 6, 359, 153, 0, 4317, 725, 1, 0, 0, 0, 4318, 4319, 5, 115, 0, 0, 4319, 4320, 5, 99, 0, 0, 4320, 4321, 5, 104, 0, 0, 4321, 4322, 5, 101, 0, 0, 4322, 4323, 5, 109, 0, 0, 4323, 4324, 5, 97, 0, 0, 4324, 4325, 5, 45, 0, 0, 4325, 4326, 5, 97, 0, 0, 4326, 4327, 5, 116, 0, 0, 4327, 4328, 5, 116, 0, 0, 4328, 4329, 5, 114, 0, 0, 4329, 4330, 5, 105, 0, 0, 4330, 4331, 5, 98, 0, 0, 4331, 4332, 5, 117, 0, 0, 4332, 4333, 5, 116, 0, 0, 4333, 4334, 5, 101, 0, 0, 4334, 4335, 1, 0, 0, 0, 4335, 4336, 6, 360, 154, 0, 4336, 727, 1, 0, 0, 0, 4337, 4338, 5, 115, 0, 0, 4338, 4339, 5, 99, 0, 0, 4339, 4340, 5, 104, 0, 0, 4340, 4341, 5, 101, 0, 0, 4341, 4342, 5, 109, 0, 0, 4342, 4343, 5, 97, 0, 0, 4343, 4344, 5, 45, 0, 0, 4344, 4345, 5, 101, 0, 0, 4345, 4346, 5, 108, 0, 0, 4346, 4347, 5, 101, 0, 0, 4347, 4348, 5, 109, 0, 0, 4348, 4349, 5, 101, 0, 0, 4349, 4350, 5, 110, 0, 0, 4350, 4351, 5, 116, 0, 0, 4351, 4352, 1, 0, 0, 0, 4352, 4353, 6, 361, 155, 0, 4353, 729, 1, 0, 0, 0, 4354, 4355, 5, 115, 0, 0, 4355, 4356, 5, 101, 0, 0, 4356, 4357, 5, 108, 0, 0, 4357, 4358, 5, 102, 0, 0, 4358, 4359, 1, 0, 0, 0, 4359, 4360, 6, 362, 156, 0, 4360, 731, 1, 0, 0, 0, 4361, 4362, 5, 115, 0, 0, 4362, 4363, 5, 108, 0, 0, 4363, 4364, 5, 105, 0, 0, 4364, 4365, 5, 100, 0, 0, 4365, 4366, 5, 105, 0, 0, 4366, 4367, 5, 110, 0, 0, 4367, 4368, 5, 103, 0, 0, 4368, 4369, 1, 0, 0, 0, 4369, 4370, 6, 363, 157, 0, 4370, 733, 1, 0, 0, 0, 4371, 4372, 5, 115, 0, 0, 4372, 4373, 5, 111, 0, 0, 4373, 4374, 5, 109, 0, 0, 4374, 4375, 5, 101, 0, 0, 4375, 4376, 1, 0, 0, 0, 4376, 4377, 6, 364, 158, 0, 4377, 735, 1, 0, 0, 0, 4378, 4379, 5, 115, 0, 0, 4379, 4380, 5, 116, 0, 0, 4380, 4381, 5, 97, 0, 0, 4381, 4382, 5, 98, 0, 0, 4382, 4383, 5, 108, 0, 0, 4383, 4384, 5, 101, 0, 0, 4384, 4385, 1, 0, 0, 0, 4385, 4386, 6, 365, 159, 0, 4386, 737, 1, 0, 0, 0, 4387, 4388, 5, 115, 0, 0, 4388, 4389, 5, 116, 0, 0, 4389, 4390, 5, 97, 0, 0, 4390, 4391, 5, 114, 0, 0, 4391, 4392, 5, 116, 0, 0, 4392, 4393, 1, 0, 0, 0, 4393, 4394, 6, 366, 160, 0, 4394, 739, 1, 0, 0, 0, 4395, 4396, 5, 115, 0, 0, 4396, 4397, 5, 116, 0, 0, 4397, 4398, 5, 114, 0, 0, 4398, 4399, 5, 105, 0, 0, 4399, 4400, 5, 99, 0, 0, 4400, 4401, 5, 116, 0, 0, 4401, 4402, 1, 0, 0, 0, 4402, 4403, 6, 367, 161, 0, 4403, 741, 1, 0, 0, 0, 4404, 4405, 5, 115, 0, 0, 4405, 4406, 5, 116, 0, 0, 4406, 4407, 5, 114, 0, 0, 4407, 4408, 5, 105, 0, 0, 4408, 4409, 5, 112, 0, 0, 4409, 4410, 1, 0, 0, 0, 4410, 4411, 6, 368, 162, 0, 4411, 743, 1, 0, 0, 0, 4412, 4413, 5, 115, 0, 0, 4413, 4414, 5, 119, 0, 0, 4414, 4415, 5, 105, 0, 0, 4415, 4416, 5, 116, 0, 0, 4416, 4417, 5, 99, 0, 0, 4417, 4418, 5, 104, 0, 0, 4418, 4419, 1, 0, 0, 0, 4419, 4420, 6, 369, 163, 0, 4420, 745, 1, 0, 0, 0, 4421, 4422, 5, 116, 0, 0, 4422, 4423, 5, 101, 0, 0, 4423, 4424, 5, 120, 0, 0, 4424, 4425, 5, 116, 0, 0, 4425, 4426, 1, 0, 0, 0, 4426, 4427, 6, 370, 164, 0, 4427, 747, 1, 0, 0, 0, 4428, 4429, 5, 116, 0, 0, 4429, 4430, 5, 104, 0, 0, 4430, 4431, 5, 101, 0, 0, 4431, 4432, 5, 110, 0, 0, 4432, 4433, 1, 0, 0, 0, 4433, 4434, 6, 371, 165, 0, 4434, 749, 1, 0, 0, 0, 4435, 4436, 5, 116, 0, 0, 4436, 4437, 5, 111, 0, 0, 4437, 4438, 1, 0, 0, 0, 4438, 4439, 6, 372, 166, 0, 4439, 751, 1, 0, 0, 0, 4440, 4441, 5, 116, 0, 0, 4441, 4442, 5, 114, 0, 0, 4442, 4443, 5, 101, 0, 0, 4443, 4444, 5, 97, 0, 0, 4444, 4445, 5, 116, 0, 0, 4445, 4446, 1, 0, 0, 0, 4446, 4447, 6, 373, 167, 0, 4447, 753, 1, 0, 0, 0, 4448, 4449, 5, 116, 0, 0, 4449, 4450, 5, 114, 0, 0, 4450, 4451, 5, 121, 0, 0, 4451, 4452, 1, 0, 0, 0, 4452, 4453, 6, 374, 168, 0, 4453, 755, 1, 0, 0, 0, 4454, 4455, 5, 116, 0, 0, 4455, 4456, 5, 117, 0, 0, 4456, 4457, 5, 109, 0, 0, 4457, 4458, 5, 98, 0, 0, 4458, 4459, 5, 108, 0, 0, 4459, 4460, 5, 105, 0, 0, 4460, 4461, 5, 110, 0, 0, 4461, 4462, 5, 103, 0, 0, 4462, 4463, 1, 0, 0, 0, 4463, 4464, 6, 375, 169, 0, 4464, 757, 1, 0, 0, 0, 4465, 4466, 5, 116, 0, 0, 4466, 4467, 5, 121, 0, 0, 4467, 4468, 5, 112, 0, 0, 4468, 4469, 5, 101, 0, 0, 4469, 4470, 1, 0, 0, 0, 4470, 4471, 6, 376, 170, 0, 4471, 759, 1, 0, 0, 0, 4472, 4473, 5, 116, 0, 0, 4473, 4474, 5, 121, 0, 0, 4474, 4475, 5, 112, 0, 0, 4475, 4476, 5, 101, 0, 0, 4476, 4477, 5, 115, 0, 0, 4477, 4478, 5, 119, 0, 0, 4478, 4479, 5, 105, 0, 0, 4479, 4480, 5, 116, 0, 0, 4480, 4481, 5, 99, 0, 0, 4481, 4482, 5, 104, 0, 0, 4482, 4483, 1, 0, 0, 0, 4483, 4484, 6, 377, 171, 0, 4484, 761, 1, 0, 0, 0, 4485, 4486, 5, 117, 0, 0, 4486, 4487, 5, 110, 0, 0, 4487, 4488, 5, 105, 0, 0, 4488, 4489, 5, 111, 0, 0, 4489, 4490, 5, 110, 0, 0, 4490, 4491, 1, 0, 0, 0, 4491, 4492, 6, 378, 172, 0, 4492, 763, 1, 0, 0, 0, 4493, 4494, 5, 117, 0, 0, 4494, 4495, 5, 110, 0, 0, 4495, 4496, 5, 111, 0, 0, 4496, 4497, 5, 114, 0, 0, 4497, 4498, 5, 100, 0, 0, 4498, 4499, 5, 101, 0, 0, 4499, 4500, 5, 114, 0, 0, 4500, 4501, 5, 101, 0, 0, 4501, 4502, 5, 100, 0, 0, 4502, 4503, 1, 0, 0, 0, 4503, 4504, 6, 379, 173, 0, 4504, 765, 1, 0, 0, 0, 4505, 4506, 5, 117, 0, 0, 4506, 4507, 5, 112, 0, 0, 4507, 4508, 5, 100, 0, 0, 4508, 4509, 5, 97, 0, 0, 4509, 4510, 5, 116, 0, 0, 4510, 4511, 5, 101, 0, 0, 4511, 4512, 1, 0, 0, 0, 4512, 4513, 6, 380, 174, 0, 4513, 767, 1, 0, 0, 0, 4514, 4515, 5, 118, 0, 0, 4515, 4516, 5, 97, 0, 0, 4516, 4517, 5, 108, 0, 0, 4517, 4518, 5, 105, 0, 0, 4518, 4519, 5, 100, 0, 0, 4519, 4520, 5, 97, 0, 0, 4520, 4521, 5, 116, 0, 0, 4521, 4522, 5, 101, 0, 0, 4522, 4523, 1, 0, 0, 0, 4523, 4524, 6, 381, 175, 0, 4524, 769, 1, 0, 0, 0, 4525, 4526, 5, 118, 0, 0, 4526, 4527, 5, 97, 0, 0, 4527, 4528, 5, 114, 0, 0, 4528, 4529, 5, 105, 0, 0, 4529, 4530, 5, 97, 0, 0, 4530, 4531, 5, 98, 0, 0, 4531, 4532, 5, 108, 0, 0, 4532, 4533, 5, 101, 0, 0, 4533, 4534, 1, 0, 0, 0, 4534, 4535, 6, 382, 176, 0, 4535, 771, 1, 0, 0, 0, 4536, 4537, 5, 118, 0, 0, 4537, 4538, 5, 101, 0, 0, 4538, 4539, 5, 114, 0, 0, 4539, 4540, 5, 115, 0, 0, 4540, 4541, 5, 105, 0, 0, 4541, 4542, 5, 111, 0, 0, 4542, 4543, 5, 110, 0, 0, 4543, 4544, 1, 0, 0, 0, 4544, 4545, 6, 383, 177, 0, 4545, 773, 1, 0, 0, 0, 4546, 4547, 5, 119, 0, 0, 4547, 4548, 5, 104, 0, 0, 4548, 4549, 5, 101, 0, 0, 4549, 4550, 5, 110, 0, 0, 4550, 4551, 1, 0, 0, 0, 4551, 4552, 6, 384, 178, 0, 4552, 775, 1, 0, 0, 0, 4553, 4554, 5, 119, 0, 0, 4554, 4555, 5, 104, 0, 0, 4555, 4556, 5, 101, 0, 0, 4556, 4557, 5, 114, 0, 0, 4557, 4558, 5, 101, 0, 0, 4558, 4559, 1, 0, 0, 0, 4559, 4560, 6, 385, 179, 0, 4560, 777, 1, 0, 0, 0, 4561, 4562, 5, 119, 0, 0, 4562, 4563, 5, 105, 0, 0, 4563, 4564, 5, 110, 0, 0, 4564, 4565, 5, 100, 0, 0, 4565, 4566, 5, 111, 0, 0, 4566, 4567, 5, 119, 0, 0, 4567, 4568, 1, 0, 0, 0, 4568, 4569, 6, 386, 180, 0, 4569, 779, 1, 0, 0, 0, 4570, 4571, 5, 120, 0, 0, 4571, 4572, 5, 113, 0, 0, 4572, 4573, 5, 117, 0, 0, 4573, 4574, 5, 101, 0, 0, 4574, 4575, 5, 114, 0, 0, 4575, 4576, 5, 121, 0, 0, 4576, 4577, 1, 0, 0, 0, 4577, 4578, 6, 387, 181, 0, 4578, 781, 1, 0, 0, 0, 4579, 4580, 5, 97, 0, 0, 4580, 4581, 5, 114, 0, 0, 4581, 4582, 5, 114, 0, 0, 4582, 4583, 5, 97, 0, 0, 4583, 4584, 5, 121, 0, 0, 4584, 4585, 5, 45, 0, 0, 4585, 4586, 5, 110, 0, 0, 4586, 4587, 5, 111, 0, 0, 4587, 4588, 5, 100, 0, 0, 4588, 4589, 5, 101, 0, 0, 4589, 4590, 1, 0, 0, 0, 4590, 4591, 6, 388, 182, 0, 4591, 783, 1, 0, 0, 0, 4592, 4593, 5, 98, 0, 0, 4593, 4594, 5, 111, 0, 0, 4594, 4595, 5, 111, 0, 0, 4595, 4596, 5, 108, 0, 0, 4596, 4597, 5, 101, 0, 0, 4597, 4598, 5, 97, 0, 0, 4598, 4599, 5, 110, 0, 0, 4599, 4600, 5, 45, 0, 0, 4600, 4601, 5, 110, 0, 0, 4601, 4602, 5, 111, 0, 0, 4602, 4603, 5, 100, 0, 0, 4603, 4604, 5, 101, 0, 0, 4604, 4605, 1, 0, 0, 0, 4605, 4606, 6, 389, 183, 0, 4606, 785, 1, 0, 0, 0, 4607, 4608, 5, 110, 0, 0, 4608, 4609, 5, 117, 0, 0, 4609, 4610, 5, 108, 0, 0, 4610, 4611, 5, 108, 0, 0, 4611, 4612, 5, 45, 0, 0, 4612, 4613, 5, 110, 0, 0, 4613, 4614, 5, 111, 0, 0, 4614, 4615, 5, 100, 0, 0, 4615, 4616, 5, 101, 0, 0, 4616, 4617, 1, 0, 0, 0, 4617, 4618, 6, 390, 184, 0, 4618, 787, 1, 0, 0, 0, 4619, 4620, 5, 110, 0, 0, 4620, 4621, 5, 117, 0, 0, 4621, 4622, 5, 109, 0, 0, 4622, 4623, 5, 98, 0, 0, 4623, 4624, 5, 101, 0, 0, 4624, 4625, 5, 114, 0, 0, 4625, 4626, 5, 45, 0, 0, 4626, 4627, 5, 110, 0, 0, 4627, 4628, 5, 111, 0, 0, 4628, 4629, 5, 100, 0, 0, 4629, 4630, 5, 101, 0, 0, 4630, 4631, 1, 0, 0, 0, 4631, 4632, 6, 391, 185, 0, 4632, 789, 1, 0, 0, 0, 4633, 4634, 5, 111, 0, 0, 4634, 4635, 5, 98, 0, 0, 4635, 4636, 5, 106, 0, 0, 4636, 4637, 5, 101, 0, 0, 4637, 4638, 5, 99, 0, 0, 4638, 4639, 5, 116, 0, 0, 4639, 4640, 5, 45, 0, 0, 4640, 4641, 5, 110, 0, 0, 4641, 4642, 5, 111, 0, 0, 4642, 4643, 5, 100, 0, 0, 4643, 4644, 5, 101, 0, 0, 4644, 4645, 1, 0, 0, 0, 4645, 4646, 6, 392, 186, 0, 4646, 791, 1, 0, 0, 0, 4647, 4648, 5, 114, 0, 0, 4648, 4649, 5, 101, 0, 0, 4649, 4650, 5, 112, 0, 0, 4650, 4651, 5, 108, 0, 0, 4651, 4652, 5, 97, 0, 0, 4652, 4653, 5, 99, 0, 0, 4653, 4654, 5, 101, 0, 0, 4654, 4655, 1, 0, 0, 0, 4655, 4656, 6, 393, 187, 0, 4656, 793, 1, 0, 0, 0, 4657, 4658, 5, 119, 0, 0, 4658, 4659, 5, 105, 0, 0, 4659, 4660, 5, 116, 0, 0, 4660, 4661, 5, 104, 0, 0, 4661, 4662, 1, 0, 0, 0, 4662, 4663, 6, 394, 188, 0, 4663, 795, 1, 0, 0, 0, 4664, 4665, 5, 118, 0, 0, 4665, 4666, 5, 97, 0, 0, 4666, 4667, 5, 108, 0, 0, 4667, 4668, 5, 117, 0, 0, 4668, 4669, 5, 101, 0, 0, 4669, 4670, 1, 0, 0, 0, 4670, 4671, 6, 395, 189, 0, 4671, 797, 1, 0, 0, 0, 4672, 4673, 5, 105, 0, 0, 4673, 4674, 5, 110, 0, 0, 4674, 4675, 5, 115, 0, 0, 4675, 4676, 5, 101, 0, 0, 4676, 4677, 5, 114, 0, 0, 4677, 4678, 5, 116, 0, 0, 4678, 4679, 1, 0, 0, 0, 4679, 4680, 6, 396, 190, 0, 4680, 799, 1, 0, 0, 0, 4681, 4682, 5, 105, 0, 0, 4682, 4683, 5, 110, 0, 0, 4683, 4684, 5, 116, 0, 0, 4684, 4685, 5, 111, 0, 0, 4685, 4686, 1, 0, 0, 0, 4686, 4687, 6, 397, 191, 0, 4687, 801, 1, 0, 0, 0, 4688, 4689, 5, 100, 0, 0, 4689, 4690, 5, 101, 0, 0, 4690, 4691, 5, 108, 0, 0, 4691, 4692, 5, 101, 0, 0, 4692, 4693, 5, 116, 0, 0, 4693, 4694, 5, 101, 0, 0, 4694, 4695, 1, 0, 0, 0, 4695, 4696, 6, 398, 192, 0, 4696, 803, 1, 0, 0, 0, 4697, 4698, 5, 114, 0, 0, 4698, 4699, 5, 101, 0, 0, 4699, 4700, 5, 110, 0, 0, 4700, 4701, 5, 97, 0, 0, 4701, 4702, 5, 109, 0, 0, 4702, 4703, 5, 101, 0, 0, 4703, 4704, 1, 0, 0, 0, 4704, 4705, 6, 399, 193, 0, 4705, 805, 1, 0, 0, 0, 4706, 4707, 5, 81, 0, 0, 4707, 4713, 5, 123, 0, 0, 4708, 4712, 3, 16, 5, 0, 4709, 4712, 3, 18, 6, 0, 4710, 4712, 8, 9, 0, 0, 4711, 4708, 1, 0, 0, 0, 4711, 4709, 1, 0, 0, 0, 4711, 4710, 1, 0, 0, 0, 4712, 4715, 1, 0, 0, 0, 4713, 4711, 1, 0, 0, 0, 4713, 4714, 1, 0, 0, 0, 4714, 4716, 1, 0, 0, 0, 4715, 4713, 1, 0, 0, 0, 4716, 4717, 5, 125, 0, 0, 4717, 4718, 3, 374, 184, 0, 4718, 4719, 1, 0, 0, 0, 4719, 4720, 6, 400, 194, 0, 4720, 807, 1, 0, 0, 0, 4721, 4722, 3, 374, 184, 0, 4722, 4723, 5, 58, 0, 0, 4723, 4724, 3, 374, 184, 0, 4724, 4725, 1, 0, 0, 0, 4725, 4726, 6, 401, 195, 0, 4726, 809, 1, 0, 0, 0, 4727, 4728, 3, 374, 184, 0, 4728, 4729, 5, 58, 0, 0, 4729, 4730, 5, 42, 0, 0, 4730, 4731, 1, 0, 0, 0, 4731, 4732, 6, 402, 196, 0, 4732, 811, 1, 0, 0, 0, 4733, 4734, 5, 42, 0, 0, 4734, 4735, 5, 58, 0, 0, 4735, 4736, 3, 374, 184, 0, 4736, 4737, 1, 0, 0, 0, 4737, 4738, 6, 403, 197, 0, 4738, 813, 1, 0, 0, 0, 4739, 4743, 3, 376, 185, 0, 4740, 4742, 3, 378, 186, 0, 4741, 4740, 1, 0, 0, 0, 4742, 4745, 1, 0, 0, 0, 4743, 4741, 1, 0, 0, 0, 4743, 4744, 1, 0, 0, 0, 4744, 4746, 1, 0, 0, 0, 4745, 4743, 1, 0, 0, 0, 4746, 4747, 6, 404, 198, 0, 4747, 815, 1, 0, 0, 0, 4748, 4749, 5, 40, 0, 0, 4749, 4750, 5, 58, 0, 0, 4750, 4751, 5, 126, 0, 0, 4751, 4752, 1, 0, 0, 0, 4752, 4753, 6, 405, 199, 0, 4753, 817, 1, 0, 0, 0, 4754, 4756, 5, 58, 0, 0, 4755, 4754, 1, 0, 0, 0, 4756, 4757, 1, 0, 0, 0, 4757, 4755, 1, 0, 0, 0, 4757, 4758, 1, 0, 0, 0, 4758, 4759, 1, 0, 0, 0, 4759, 4760, 5, 41, 0, 0, 4760, 4761, 1, 0, 0, 0, 4761, 4762, 6, 406, 200, 0, 4762, 819, 1, 0, 0, 0, 4763, 4764, 5, 40, 0, 0, 4764, 4765, 5, 58, 0, 0, 4765, 4771, 5, 126, 0, 0, 4766, 4770, 3, 388, 191, 0, 4767, 4768, 5, 58, 0, 0, 4768, 4770, 8, 12, 0, 0, 4769, 4766, 1, 0, 0, 0, 4769, 4767, 1, 0, 0, 0, 4770, 4773, 1, 0, 0, 0, 4771, 4769, 1, 0, 0, 0, 4771, 4772, 1, 0, 0, 0, 4772, 4774, 1, 0, 0, 0, 4773, 4771, 1, 0, 0, 0, 4774, 4775, 5, 58, 0, 0, 4775, 4776, 5, 41, 0, 0, 4776, 4777, 1, 0, 0, 0, 4777, 4778, 6, 407, 201, 0, 4778, 821, 1, 0, 0, 0, 4779, 4780, 5, 40, 0, 0, 4780, 4781, 5, 58, 0, 0, 4781, 4790, 8, 13, 0, 0, 4782, 4789, 3, 386, 190, 0, 4783, 4784, 5, 40, 0, 0, 4784, 4789, 8, 14, 0, 0, 4785, 4786, 5, 58, 0, 0, 4786, 4789, 8, 12, 0, 0, 4787, 4789, 8, 15, 0, 0, 4788, 4782, 1, 0, 0, 0, 4788, 4783, 1, 0, 0, 0, 4788, 4785, 1, 0, 0, 0, 4788, 4787, 1, 0, 0, 0, 4789, 4792, 1, 0, 0, 0, 4790, 4788, 1, 0, 0, 0, 4790, 4791, 1, 0, 0, 0, 4791, 4796, 1, 0, 0, 0, 4792, 4790, 1, 0, 0, 0, 4793, 4795, 5, 58, 0, 0, 4794, 4793, 1, 0, 0, 0, 4795, 4798, 1, 0, 0, 0, 4796, 4794, 1, 0, 0, 0, 4796, 4797, 1, 0, 0, 0, 4797, 4800, 1, 0, 0, 0, 4798, 4796, 1, 0, 0, 0, 4799, 4801, 5, 58, 0, 0, 4800, 4799, 1, 0, 0, 0, 4801, 4802, 1, 0, 0, 0, 4802, 4800, 1, 0, 0, 0, 4802, 4803, 1, 0, 0, 0, 4803, 4804, 1, 0, 0, 0, 4804, 4805, 5, 41, 0, 0, 4805, 4806, 1, 0, 0, 0, 4806, 4807, 6, 408, 2, 0, 4807, 4808, 6, 408, 202, 0, 4808, 823, 1, 0, 0, 0, 4809, 4810, 7, 16, 0, 0, 4810, 4811, 1, 0, 0, 0, 4811, 4812, 6, 409, 203, 0, 4812, 825, 1, 0, 0, 0, 4813, 4814, 3, 98, 46, 0, 4814, 4815, 3, 98, 46, 0, 4815, 4816, 3, 44, 19, 0, 4816, 4817, 1, 0, 0, 0, 4817, 4818, 6, 410, 3, 0, 4818, 4819, 6, 410, 204, 0, 4819, 827, 1, 0, 0, 0, 4820, 4821, 3, 50, 22, 0, 4821, 4822, 3, 98, 46, 0, 4822, 4823, 1, 0, 0, 0, 4823, 4824, 6, 411, 4, 0, 4824, 4825, 6, 411, 205, 0, 4825, 829, 1, 0, 0, 0, 4826, 4827, 8, 17, 0, 0, 4827, 4828, 1, 0, 0, 0, 4828, 4829, 6, 412, 17, 0, 4829, 831, 1, 0, 0, 0, 4830, 4831, 3, 14, 4, 0, 4831, 4832, 1, 0, 0, 0, 4832, 4833, 6, 413, 21, 0, 4833, 833, 1, 0, 0, 0, 4834, 4835, 5, 46, 0, 0, 4835, 4845, 3, 14, 4, 0, 4836, 4837, 3, 14, 4, 0, 4837, 4841, 5, 46, 0, 0, 4838, 4840, 7, 0, 0, 0, 4839, 4838, 1, 0, 0, 0, 4840, 4843, 1, 0, 0, 0, 4841, 4839, 1, 0, 0, 0, 4841, 4842, 1, 0, 0, 0, 4842, 4845, 1, 0, 0, 0, 4843, 4841, 1, 0, 0, 0, 4844, 4834, 1, 0, 0, 0, 4844, 4836, 1, 0, 0, 0, 4845, 4846, 1, 0, 0, 0, 4846, 4847, 6, 414, 22, 0, 4847, 835, 1, 0, 0, 0, 4848, 4849, 5, 46, 0, 0, 4849, 4861, 3, 14, 4, 0, 4850, 4858, 3, 14, 4, 0, 4851, 4855, 5, 46, 0, 0, 4852, 4854, 7, 0, 0, 0, 4853, 4852, 1, 0, 0, 0, 4854, 4857, 1, 0, 0, 0, 4855, 4853, 1, 0, 0, 0, 4855, 4856, 1, 0, 0, 0, 4856, 4859, 1, 0, 0, 0, 4857, 4855, 1, 0, 0, 0, 4858, 4851, 1, 0, 0, 0, 4858, 4859, 1, 0, 0, 0, 4859, 4861, 1, 0, 0, 0, 4860, 4848, 1, 0, 0, 0, 4860, 4850, 1, 0, 0, 0, 4861, 4862, 1, 0, 0, 0, 4862, 4864, 7, 1, 0, 0, 4863, 4865, 7, 2, 0, 0, 4864, 4863, 1, 0, 0, 0, 4864, 4865, 1, 0, 0, 0, 4865, 4866, 1, 0, 0, 0, 4866, 4867, 3, 14, 4, 0, 4867, 4868, 1, 0, 0, 0, 4868, 4869, 6, 415, 23, 0, 4869, 837, 1, 0, 0, 0, 4870, 4871, 5, 100, 0, 0, 4871, 4872, 5, 101, 0, 0, 4872, 4873, 5, 99, 0, 0, 4873, 4874, 5, 105, 0, 0, 4874, 4875, 5, 109, 0, 0, 4875, 4876, 5, 97, 0, 0, 4876, 4877, 5, 108, 0, 0, 4877, 4878, 5, 45, 0, 0, 4878, 4879, 5, 115, 0, 0, 4879, 4880, 5, 101, 0, 0, 4880, 4881, 5, 112, 0, 0, 4881, 4882, 5, 97, 0, 0, 4882, 4883, 5, 114, 0, 0, 4883, 4884, 5, 97, 0, 0, 4884, 4885, 5, 116, 0, 0, 4885, 4886, 5, 111, 0, 0, 4886, 4993, 5, 114, 0, 0, 4887, 4888, 5, 103, 0, 0, 4888, 4889, 5, 114, 0, 0, 4889, 4890, 5, 111, 0, 0, 4890, 4891, 5, 117, 0, 0, 4891, 4892, 5, 112, 0, 0, 4892, 4893, 5, 105, 0, 0, 4893, 4894, 5, 110, 0, 0, 4894, 4895, 5, 103, 0, 0, 4895, 4896, 5, 45, 0, 0, 4896, 4897, 5, 115, 0, 0, 4897, 4898, 5, 101, 0, 0, 4898, 4899, 5, 112, 0, 0, 4899, 4900, 5, 97, 0, 0, 4900, 4901, 5, 114, 0, 0, 4901, 4902, 5, 97, 0, 0, 4902, 4903, 5, 116, 0, 0, 4903, 4904, 5, 111, 0, 0, 4904, 4993, 5, 114, 0, 0, 4905, 4906, 5, 105, 0, 0, 4906, 4907, 5, 110, 0, 0, 4907, 4908, 5, 102, 0, 0, 4908, 4909, 5, 105, 0, 0, 4909, 4910, 5, 110, 0, 0, 4910, 4911, 5, 105, 0, 0, 4911, 4912, 5, 116, 0, 0, 4912, 4993, 5, 121, 0, 0, 4913, 4914, 5, 109, 0, 0, 4914, 4915, 5, 105, 0, 0, 4915, 4916, 5, 110, 0, 0, 4916, 4917, 5, 117, 0, 0, 4917, 4918, 5, 115, 0, 0, 4918, 4919, 5, 45, 0, 0, 4919, 4920, 5, 115, 0, 0, 4920, 4921, 5, 105, 0, 0, 4921, 4922, 5, 103, 0, 0, 4922, 4993, 5, 110, 0, 0, 4923, 4924, 5, 78, 0, 0, 4924, 4925, 5, 97, 0, 0, 4925, 4993, 5, 78, 0, 0, 4926, 4927, 5, 112, 0, 0, 4927, 4928, 5, 101, 0, 0, 4928, 4929, 5, 114, 0, 0, 4929, 4930, 5, 99, 0, 0, 4930, 4931, 5, 101, 0, 0, 4931, 4932, 5, 110, 0, 0, 4932, 4993, 5, 116, 0, 0, 4933, 4934, 5, 112, 0, 0, 4934, 4935, 5, 101, 0, 0, 4935, 4936, 5, 114, 0, 0, 4936, 4937, 5, 45, 0, 0, 4937, 4938, 5, 109, 0, 0, 4938, 4939, 5, 105, 0, 0, 4939, 4940, 5, 108, 0, 0, 4940, 4941, 5, 108, 0, 0, 4941, 4993, 5, 101, 0, 0, 4942, 4943, 5, 122, 0, 0, 4943, 4944, 5, 101, 0, 0, 4944, 4945, 5, 114, 0, 0, 4945, 4946, 5, 111, 0, 0, 4946, 4947, 5, 45, 0, 0, 4947, 4948, 5, 100, 0, 0, 4948, 4949, 5, 105, 0, 0, 4949, 4950, 5, 103, 0, 0, 4950, 4951, 5, 105, 0, 0, 4951, 4993, 5, 116, 0, 0, 4952, 4953, 5, 100, 0, 0, 4953, 4954, 5, 105, 0, 0, 4954, 4955, 5, 103, 0, 0, 4955, 4956, 5, 105, 0, 0, 4956, 4993, 5, 116, 0, 0, 4957, 4958, 5, 112, 0, 0, 4958, 4959, 5, 97, 0, 0, 4959, 4960, 5, 116, 0, 0, 4960, 4961, 5, 116, 0, 0, 4961, 4962, 5, 101, 0, 0, 4962, 4963, 5, 114, 0, 0, 4963, 4964, 5, 110, 0, 0, 4964, 4965, 5, 45, 0, 0, 4965, 4966, 5, 115, 0, 0, 4966, 4967, 5, 101, 0, 0, 4967, 4968, 5, 112, 0, 0, 4968, 4969, 5, 97, 0, 0, 4969, 4970, 5, 114, 0, 0, 4970, 4971, 5, 97, 0, 0, 4971, 4972, 5, 116, 0, 0, 4972, 4973, 5, 111, 0, 0, 4973, 4993, 5, 114, 0, 0, 4974, 4975, 5, 101, 0, 0, 4975, 4976, 5, 120, 0, 0, 4976, 4977, 5, 112, 0, 0, 4977, 4978, 5, 111, 0, 0, 4978, 4979, 5, 110, 0, 0, 4979, 4980, 5, 101, 0, 0, 4980, 4981, 5, 110, 0, 0, 4981, 4982, 5, 116, 0, 0, 4982, 4983, 5, 45, 0, 0, 4983, 4984, 5, 115, 0, 0, 4984, 4985, 5, 101, 0, 0, 4985, 4986, 5, 112, 0, 0, 4986, 4987, 5, 97, 0, 0, 4987, 4988, 5, 114, 0, 0, 4988, 4989, 5, 97, 0, 0, 4989, 4990, 5, 116, 0, 0, 4990, 4991, 5, 111, 0, 0, 4991, 4993, 5, 114, 0, 0, 4992, 4870, 1, 0, 0, 0, 4992, 4887, 1, 0, 0, 0, 4992, 4905, 1, 0, 0, 0, 4992, 4913, 1, 0, 0, 0, 4992, 4923, 1, 0, 0, 0, 4992, 4926, 1, 0, 0, 0, 4992, 4933, 1, 0, 0, 0, 4992, 4942, 1, 0, 0, 0, 4992, 4952, 1, 0, 0, 0, 4992, 4957, 1, 0, 0, 0, 4992, 4974, 1, 0, 0, 0, 4993, 4994, 1, 0, 0, 0, 4994, 4995, 6, 416, 24, 0, 4995, 839, 1, 0, 0, 0, 4996, 5012, 5, 38, 0, 0, 4997, 4998, 5, 108, 0, 0, 4998, 5013, 5, 116, 0, 0, 4999, 5000, 5, 103, 0, 0, 5000, 5013, 5, 116, 0, 0, 5001, 5002, 5, 97, 0, 0, 5002, 5003, 5, 109, 0, 0, 5003, 5013, 5, 112, 0, 0, 5004, 5005, 5, 113, 0, 0, 5005, 5006, 5, 117, 0, 0, 5006, 5007, 5, 111, 0, 0, 5007, 5013, 5, 116, 0, 0, 5008, 5009, 5, 97, 0, 0, 5009, 5010, 5, 112, 0, 0, 5010, 5011, 5, 111, 0, 0, 5011, 5013, 5, 115, 0, 0, 5012, 4997, 1, 0, 0, 0, 5012, 4999, 1, 0, 0, 0, 5012, 5001, 1, 0, 0, 0, 5012, 5004, 1, 0, 0, 0, 5012, 5008, 1, 0, 0, 0, 5013, 5014, 1, 0, 0, 0, 5014, 5015, 5, 59, 0, 0, 5015, 5016, 1, 0, 0, 0, 5016, 5017, 6, 417, 15, 0, 5017, 841, 1, 0, 0, 0, 5018, 5019, 5, 38, 0, 0, 5019, 5020, 5, 35, 0, 0, 5020, 5022, 1, 0, 0, 0, 5021, 5023, 7, 0, 0, 0, 5022, 5021, 1, 0, 0, 0, 5023, 5024, 1, 0, 0, 0, 5024, 5022, 1, 0, 0, 0, 5024, 5025, 1, 0, 0, 0, 5025, 5026, 1, 0, 0, 0, 5026, 5038, 5, 59, 0, 0, 5027, 5028, 5, 38, 0, 0, 5028, 5029, 5, 35, 0, 0, 5029, 5030, 5, 120, 0, 0, 5030, 5032, 1, 0, 0, 0, 5031, 5033, 7, 3, 0, 0, 5032, 5031, 1, 0, 0, 0, 5033, 5034, 1, 0, 0, 0, 5034, 5032, 1, 0, 0, 0, 5034, 5035, 1, 0, 0, 0, 5035, 5036, 1, 0, 0, 0, 5036, 5038, 5, 59, 0, 0, 5037, 5018, 1, 0, 0, 0, 5037, 5027, 1, 0, 0, 0, 5038, 5039, 1, 0, 0, 0, 5039, 5040, 6, 418, 16, 0, 5040, 843, 1, 0, 0, 0, 5041, 5042, 5, 39, 0, 0, 5042, 5043, 5, 39, 0, 0, 5043, 5044, 1, 0, 0, 0, 5044, 5045, 6, 419, 18, 0, 5045, 845, 1, 0, 0, 0, 5046, 5047, 5, 34, 0, 0, 5047, 5048, 1, 0, 0, 0, 5048, 5049, 6, 420, 0, 0, 5049, 5050, 6, 420, 10, 0, 5050, 847, 1, 0, 0, 0, 5051, 5052, 5, 39, 0, 0, 5052, 5053, 1, 0, 0, 0, 5053, 5054, 6, 421, 19, 0, 5054, 5055, 6, 421, 4, 0, 5055, 5056, 6, 421, 4, 0, 5056, 849, 1, 0, 0, 0, 5057, 5058, 5, 60, 0, 0, 5058, 5059, 5, 33, 0, 0, 5059, 5060, 5, 45, 0, 0, 5060, 5061, 5, 45, 0, 0, 5061, 5067, 1, 0, 0, 0, 5062, 5063, 5, 45, 0, 0, 5063, 5066, 8, 4, 0, 0, 5064, 5066, 8, 4, 0, 0, 5065, 5062, 1, 0, 0, 0, 5065, 5064, 1, 0, 0, 0, 5066, 5069, 1, 0, 0, 0, 5067, 5065, 1, 0, 0, 0, 5067, 5068, 1, 0, 0, 0, 5068, 5070, 1, 0, 0, 0, 5069, 5067, 1, 0, 0, 0, 5070, 5071, 5, 45, 0, 0, 5071, 5072, 5, 45, 0, 0, 5072, 5073, 5, 62, 0, 0, 5073, 5074, 1, 0, 0, 0, 5074, 5075, 6, 422, 25, 0, 5075, 851, 1, 0, 0, 0, 5076, 5077, 5, 60, 0, 0, 5077, 5078, 5, 63, 0, 0, 5078, 5079, 1, 0, 0, 0, 5079, 5080, 7, 5, 0, 0, 5080, 5081, 7, 6, 0, 0, 5081, 5089, 7, 7, 0, 0, 5082, 5086, 7, 8, 0, 0, 5083, 5085, 9, 0, 0, 0, 5084, 5083, 1, 0, 0, 0, 5085, 5088, 1, 0, 0, 0, 5086, 5087, 1, 0, 0, 0, 5086, 5084, 1, 0, 0, 0, 5087, 5090, 1, 0, 0, 0, 5088, 5086, 1, 0, 0, 0, 5089, 5082, 1, 0, 0, 0, 5089, 5090, 1, 0, 0, 0, 5090, 5091, 1, 0, 0, 0, 5091, 5092, 5, 63, 0, 0, 5092, 5093, 5, 62, 0, 0, 5093, 5094, 1, 0, 0, 0, 5094, 5095, 6, 423, 26, 0, 5095, 853, 1, 0, 0, 0, 5096, 5097, 5, 60, 0, 0, 5097, 5098, 5, 63, 0, 0, 5098, 5099, 1, 0, 0, 0, 5099, 5107, 3, 374, 184, 0, 5100, 5104, 7, 8, 0, 0, 5101, 5103, 9, 0, 0, 0, 5102, 5101, 1, 0, 0, 0, 5103, 5106, 1, 0, 0, 0, 5104, 5105, 1, 0, 0, 0, 5104, 5102, 1, 0, 0, 0, 5105, 5108, 1, 0, 0, 0, 5106, 5104, 1, 0, 0, 0, 5107, 5100, 1, 0, 0, 0, 5107, 5108, 1, 0, 0, 0, 5108, 5109, 1, 0, 0, 0, 5109, 5110, 5, 63, 0, 0, 5110, 5111, 5, 62, 0, 0, 5111, 5112, 1, 0, 0, 0, 5112, 5113, 6, 424, 27, 0, 5113, 855, 1, 0, 0, 0, 5114, 5115, 5, 60, 0, 0, 5115, 5116, 5, 33, 0, 0, 5116, 5117, 5, 91, 0, 0, 5117, 5118, 5, 67, 0, 0, 5118, 5119, 5, 68, 0, 0, 5119, 5120, 5, 65, 0, 0, 5120, 5121, 5, 84, 0, 0, 5121, 5122, 5, 65, 0, 0, 5122, 5123, 5, 91, 0, 0, 5123, 5127, 1, 0, 0, 0, 5124, 5126, 9, 0, 0, 0, 5125, 5124, 1, 0, 0, 0, 5126, 5129, 1, 0, 0, 0, 5127, 5128, 1, 0, 0, 0, 5127, 5125, 1, 0, 0, 0, 5128, 5130, 1, 0, 0, 0, 5129, 5127, 1, 0, 0, 0, 5130, 5131, 5, 93, 0, 0, 5131, 5132, 5, 93, 0, 0, 5132, 5133, 5, 62, 0, 0, 5133, 5134, 1, 0, 0, 0, 5134, 5135, 6, 425, 28, 0, 5135, 857, 1, 0, 0, 0, 5136, 5137, 5, 40, 0, 0, 5137, 5138, 5, 35, 0, 0, 5138, 5140, 1, 0, 0, 0, 5139, 5141, 3, 34, 14, 0, 5140, 5139, 1, 0, 0, 0, 5140, 5141, 1, 0, 0, 0, 5141, 5145, 1, 0, 0, 0, 5142, 5143, 3, 374, 184, 0, 5143, 5144, 5, 58, 0, 0, 5144, 5146, 1, 0, 0, 0, 5145, 5142, 1, 0, 0, 0, 5145, 5146, 1, 0, 0, 0, 5146, 5147, 1, 0, 0, 0, 5147, 5155, 3, 374, 184, 0, 5148, 5152, 3, 34, 14, 0, 5149, 5151, 9, 0, 0, 0, 5150, 5149, 1, 0, 0, 0, 5151, 5154, 1, 0, 0, 0, 5152, 5153, 1, 0, 0, 0, 5152, 5150, 1, 0, 0, 0, 5153, 5156, 1, 0, 0, 0, 5154, 5152, 1, 0, 0, 0, 5155, 5148, 1, 0, 0, 0, 5155, 5156, 1, 0, 0, 0, 5156, 5157, 1, 0, 0, 0, 5157, 5158, 5, 35, 0, 0, 5158, 5159, 5, 41, 0, 0, 5159, 5160, 1, 0, 0, 0, 5160, 5161, 6, 426, 29, 0, 5161, 859, 1, 0, 0, 0, 5162, 5164, 7, 8, 0, 0, 5163, 5162, 1, 0, 0, 0, 5164, 5165, 1, 0, 0, 0, 5165, 5163, 1, 0, 0, 0, 5165, 5166, 1, 0, 0, 0, 5166, 5167, 1, 0, 0, 0, 5167, 5168, 6, 427, 2, 0, 5168, 5169, 6, 427, 30, 0, 5169, 861, 1, 0, 0, 0, 5170, 5171, 5, 61, 0, 0, 5171, 5172, 1, 0, 0, 0, 5172, 5173, 6, 428, 31, 0, 5173, 863, 1, 0, 0, 0, 5174, 5175, 5, 33, 0, 0, 5175, 5176, 5, 61, 0, 0, 5176, 5177, 1, 0, 0, 0, 5177, 5178, 6, 429, 32, 0, 5178, 865, 1, 0, 0, 0, 5179, 5180, 5, 40, 0, 0, 5180, 5181, 1, 0, 0, 0, 5181, 5182, 6, 430, 33, 0, 5182, 867, 1, 0, 0, 0, 5183, 5184, 5, 41, 0, 0, 5184, 5185, 1, 0, 0, 0, 5185, 5186, 6, 431, 34, 0, 5186, 869, 1, 0, 0, 0, 5187, 5188, 5, 91, 0, 0, 5188, 5189, 1, 0, 0, 0, 5189, 5190, 6, 432, 35, 0, 5190, 871, 1, 0, 0, 0, 5191, 5192, 5, 93, 0, 0, 5192, 5193, 1, 0, 0, 0, 5193, 5194, 6, 433, 6, 0, 5194, 873, 1, 0, 0, 0, 5195, 5196, 5, 123, 0, 0, 5196, 5197, 6, 434, 206, 0, 5197, 5198, 1, 0, 0, 0, 5198, 5199, 6, 434, 7, 0, 5199, 875, 1, 0, 0, 0, 5200, 5201, 4, 435, 2, 0, 5201, 5202, 5, 125, 0, 0, 5202, 5203, 1, 0, 0, 0, 5203, 5204, 6, 435, 14, 0, 5204, 5205, 6, 435, 4, 0, 5205, 877, 1, 0, 0, 0, 5206, 5207, 4, 436, 3, 0, 5207, 5208, 5, 125, 0, 0, 5208, 5209, 6, 436, 207, 0, 5209, 5210, 1, 0, 0, 0, 5210, 5211, 6, 436, 14, 0, 5211, 879, 1, 0, 0, 0, 5212, 5213, 5, 42, 0, 0, 5213, 5214, 1, 0, 0, 0, 5214, 5215, 6, 437, 38, 0, 5215, 881, 1, 0, 0, 0, 5216, 5217, 5, 43, 0, 0, 5217, 5218, 1, 0, 0, 0, 5218, 5219, 6, 438, 39, 0, 5219, 883, 1, 0, 0, 0, 5220, 5221, 5, 45, 0, 0, 5221, 5222, 1, 0, 0, 0, 5222, 5223, 6, 439, 40, 0, 5223, 885, 1, 0, 0, 0, 5224, 5225, 5, 44, 0, 0, 5225, 5226, 1, 0, 0, 0, 5226, 5227, 6, 440, 41, 0, 5227, 887, 1, 0, 0, 0, 5228, 5229, 5, 46, 0, 0, 5229, 5230, 1, 0, 0, 0, 5230, 5231, 6, 441, 42, 0, 5231, 889, 1, 0, 0, 0, 5232, 5233, 5, 46, 0, 0, 5233, 5234, 5, 46, 0, 0, 5234, 5235, 1, 0, 0, 0, 5235, 5236, 6, 442, 43, 0, 5236, 891, 1, 0, 0, 0, 5237, 5238, 5, 58, 0, 0, 5238, 5239, 1, 0, 0, 0, 5239, 5240, 6, 443, 44, 0, 5240, 893, 1, 0, 0, 0, 5241, 5242, 5, 58, 0, 0, 5242, 5243, 5, 61, 0, 0, 5243, 5244, 1, 0, 0, 0, 5244, 5245, 6, 444, 45, 0, 5245, 895, 1, 0, 0, 0, 5246, 5247, 5, 59, 0, 0, 5247, 5248, 1, 0, 0, 0, 5248, 5249, 6, 445, 46, 0, 5249, 897, 1, 0, 0, 0, 5250, 5251, 5, 47, 0, 0, 5251, 5252, 1, 0, 0, 0, 5252, 5253, 6, 446, 47, 0, 5253, 899, 1, 0, 0, 0, 5254, 5255, 5, 47, 0, 0, 5255, 5256, 5, 47, 0, 0, 5256, 5257, 1, 0, 0, 0, 5257, 5258, 6, 447, 48, 0, 5258, 901, 1, 0, 0, 0, 5259, 5260, 5, 92, 0, 0, 5260, 5261, 1, 0, 0, 0, 5261, 5262, 6, 448, 49, 0, 5262, 903, 1, 0, 0, 0, 5263, 5264, 5, 124, 0, 0, 5264, 5265, 1, 0, 0, 0, 5265, 5266, 6, 449, 50, 0, 5266, 905, 1, 0, 0, 0, 5267, 5268, 5, 60, 0, 0, 5268, 5269, 1, 0, 0, 0, 5269, 5270, 6, 450, 51, 0, 5270, 907, 1, 0, 0, 0, 5271, 5272, 5, 62, 0, 0, 5272, 5273, 1, 0, 0, 0, 5273, 5274, 6, 451, 52, 0, 5274, 909, 1, 0, 0, 0, 5275, 5276, 5, 63, 0, 0, 5276, 5277, 1, 0, 0, 0, 5277, 5278, 6, 452, 53, 0, 5278, 911, 1, 0, 0, 0, 5279, 5280, 5, 64, 0, 0, 5280, 5281, 1, 0, 0, 0, 5281, 5282, 6, 453, 54, 0, 5282, 913, 1, 0, 0, 0, 5283, 5284, 5, 36, 0, 0, 5284, 5285, 1, 0, 0, 0, 5285, 5286, 6, 454, 55, 0, 5286, 915, 1, 0, 0, 0, 5287, 5288, 5, 37, 0, 0, 5288, 5289, 1, 0, 0, 0, 5289, 5290, 6, 455, 56, 0, 5290, 917, 1, 0, 0, 0, 5291, 5292, 5, 33, 0, 0, 5292, 5293, 1, 0, 0, 0, 5293, 5294, 6, 456, 57, 0, 5294, 919, 1, 0, 0, 0, 5295, 5296, 5, 35, 0, 0, 5296, 5297, 1, 0, 0, 0, 5297, 5298, 6, 457, 58, 0, 5298, 921, 1, 0, 0, 0, 5299, 5300, 5, 94, 0, 0, 5300, 5301, 1, 0, 0, 0, 5301, 5302, 6, 458, 59, 0, 5302, 923, 1, 0, 0, 0, 5303, 5304, 5, 61, 0, 0, 5304, 5305, 5, 62, 0, 0, 5305, 5306, 1, 0, 0, 0, 5306, 5307, 6, 459, 60, 0, 5307, 925, 1, 0, 0, 0, 5308, 5309, 5, 96, 0, 0, 5309, 5310, 1, 0, 0, 0, 5310, 5311, 6, 460, 5, 0, 5311, 927, 1, 0, 0, 0, 5312, 5313, 5, 124, 0, 0, 5313, 5314, 5, 124, 0, 0, 5314, 5315, 1, 0, 0, 0, 5315, 5316, 6, 461, 61, 0, 5316, 929, 1, 0, 0, 0, 5317, 5318, 5, 126, 0, 0, 5318, 5319, 1, 0, 0, 0, 5319, 5320, 6, 462, 62, 0, 5320, 931, 1, 0, 0, 0, 5321, 5322, 5, 97, 0, 0, 5322, 5323, 5, 108, 0, 0, 5323, 5324, 5, 108, 0, 0, 5324, 5325, 5, 111, 0, 0, 5325, 5326, 5, 119, 0, 0, 5326, 5327, 5, 105, 0, 0, 5327, 5328, 5, 110, 0, 0, 5328, 5329, 5, 103, 0, 0, 5329, 5330, 1, 0, 0, 0, 5330, 5331, 6, 463, 63, 0, 5331, 933, 1, 0, 0, 0, 5332, 5333, 5, 97, 0, 0, 5333, 5334, 5, 110, 0, 0, 5334, 5335, 5, 99, 0, 0, 5335, 5336, 5, 101, 0, 0, 5336, 5337, 5, 115, 0, 0, 5337, 5338, 5, 116, 0, 0, 5338, 5339, 5, 111, 0, 0, 5339, 5340, 5, 114, 0, 0, 5340, 5341, 1, 0, 0, 0, 5341, 5342, 6, 464, 64, 0, 5342, 935, 1, 0, 0, 0, 5343, 5344, 5, 97, 0, 0, 5344, 5345, 5, 110, 0, 0, 5345, 5346, 5, 99, 0, 0, 5346, 5347, 5, 101, 0, 0, 5347, 5348, 5, 115, 0, 0, 5348, 5349, 5, 116, 0, 0, 5349, 5350, 5, 111, 0, 0, 5350, 5351, 5, 114, 0, 0, 5351, 5352, 5, 45, 0, 0, 5352, 5353, 5, 111, 0, 0, 5353, 5354, 5, 114, 0, 0, 5354, 5355, 5, 45, 0, 0, 5355, 5356, 5, 115, 0, 0, 5356, 5357, 5, 101, 0, 0, 5357, 5358, 5, 108, 0, 0, 5358, 5359, 5, 102, 0, 0, 5359, 5360, 1, 0, 0, 0, 5360, 5361, 6, 465, 65, 0, 5361, 937, 1, 0, 0, 0, 5362, 5363, 5, 97, 0, 0, 5363, 5364, 5, 110, 0, 0, 5364, 5365, 5, 100, 0, 0, 5365, 5366, 1, 0, 0, 0, 5366, 5367, 6, 466, 66, 0, 5367, 939, 1, 0, 0, 0, 5368, 5369, 5, 97, 0, 0, 5369, 5370, 5, 114, 0, 0, 5370, 5371, 5, 114, 0, 0, 5371, 5372, 5, 97, 0, 0, 5372, 5373, 5, 121, 0, 0, 5373, 5374, 1, 0, 0, 0, 5374, 5375, 6, 467, 67, 0, 5375, 941, 1, 0, 0, 0, 5376, 5377, 5, 97, 0, 0, 5377, 5378, 5, 115, 0, 0, 5378, 5379, 1, 0, 0, 0, 5379, 5380, 6, 468, 68, 0, 5380, 943, 1, 0, 0, 0, 5381, 5382, 5, 97, 0, 0, 5382, 5383, 5, 115, 0, 0, 5383, 5384, 5, 99, 0, 0, 5384, 5385, 5, 101, 0, 0, 5385, 5386, 5, 110, 0, 0, 5386, 5387, 5, 100, 0, 0, 5387, 5388, 5, 105, 0, 0, 5388, 5389, 5, 110, 0, 0, 5389, 5390, 5, 103, 0, 0, 5390, 5391, 1, 0, 0, 0, 5391, 5392, 6, 469, 69, 0, 5392, 945, 1, 0, 0, 0, 5393, 5394, 5, 97, 0, 0, 5394, 5395, 5, 116, 0, 0, 5395, 5396, 1, 0, 0, 0, 5396, 5397, 6, 470, 70, 0, 5397, 947, 1, 0, 0, 0, 5398, 5399, 5, 97, 0, 0, 5399, 5400, 5, 116, 0, 0, 5400, 5401, 5, 116, 0, 0, 5401, 5402, 5, 114, 0, 0, 5402, 5403, 5, 105, 0, 0, 5403, 5404, 5, 98, 0, 0, 5404, 5405, 5, 117, 0, 0, 5405, 5406, 5, 116, 0, 0, 5406, 5407, 5, 101, 0, 0, 5407, 5408, 1, 0, 0, 0, 5408, 5409, 6, 471, 71, 0, 5409, 949, 1, 0, 0, 0, 5410, 5411, 5, 98, 0, 0, 5411, 5412, 5, 97, 0, 0, 5412, 5413, 5, 115, 0, 0, 5413, 5414, 5, 101, 0, 0, 5414, 5415, 5, 45, 0, 0, 5415, 5416, 5, 117, 0, 0, 5416, 5417, 5, 114, 0, 0, 5417, 5418, 5, 105, 0, 0, 5418, 5419, 1, 0, 0, 0, 5419, 5420, 6, 472, 72, 0, 5420, 951, 1, 0, 0, 0, 5421, 5422, 5, 98, 0, 0, 5422, 5423, 5, 111, 0, 0, 5423, 5424, 5, 117, 0, 0, 5424, 5425, 5, 110, 0, 0, 5425, 5426, 5, 100, 0, 0, 5426, 5427, 5, 97, 0, 0, 5427, 5428, 5, 114, 0, 0, 5428, 5429, 5, 121, 0, 0, 5429, 5430, 5, 45, 0, 0, 5430, 5431, 5, 115, 0, 0, 5431, 5432, 5, 112, 0, 0, 5432, 5433, 5, 97, 0, 0, 5433, 5434, 5, 99, 0, 0, 5434, 5435, 5, 101, 0, 0, 5435, 5436, 1, 0, 0, 0, 5436, 5437, 6, 473, 73, 0, 5437, 953, 1, 0, 0, 0, 5438, 5439, 5, 98, 0, 0, 5439, 5440, 5, 105, 0, 0, 5440, 5441, 5, 110, 0, 0, 5441, 5442, 5, 97, 0, 0, 5442, 5443, 5, 114, 0, 0, 5443, 5444, 5, 121, 0, 0, 5444, 5445, 1, 0, 0, 0, 5445, 5446, 6, 474, 74, 0, 5446, 955, 1, 0, 0, 0, 5447, 5448, 5, 98, 0, 0, 5448, 5449, 5, 121, 0, 0, 5449, 5450, 1, 0, 0, 0, 5450, 5451, 6, 475, 75, 0, 5451, 957, 1, 0, 0, 0, 5452, 5453, 5, 99, 0, 0, 5453, 5454, 5, 97, 0, 0, 5454, 5455, 5, 115, 0, 0, 5455, 5456, 5, 101, 0, 0, 5456, 5457, 1, 0, 0, 0, 5457, 5458, 6, 476, 76, 0, 5458, 959, 1, 0, 0, 0, 5459, 5460, 5, 99, 0, 0, 5460, 5461, 5, 97, 0, 0, 5461, 5462, 5, 115, 0, 0, 5462, 5463, 5, 116, 0, 0, 5463, 5464, 1, 0, 0, 0, 5464, 5465, 6, 477, 77, 0, 5465, 961, 1, 0, 0, 0, 5466, 5467, 5, 99, 0, 0, 5467, 5468, 5, 97, 0, 0, 5468, 5469, 5, 115, 0, 0, 5469, 5470, 5, 116, 0, 0, 5470, 5471, 5, 97, 0, 0, 5471, 5472, 5, 98, 0, 0, 5472, 5473, 5, 108, 0, 0, 5473, 5474, 5, 101, 0, 0, 5474, 5475, 1, 0, 0, 0, 5475, 5476, 6, 478, 78, 0, 5476, 963, 1, 0, 0, 0, 5477, 5478, 5, 99, 0, 0, 5478, 5479, 5, 97, 0, 0, 5479, 5480, 5, 116, 0, 0, 5480, 5481, 5, 99, 0, 0, 5481, 5482, 5, 104, 0, 0, 5482, 5483, 1, 0, 0, 0, 5483, 5484, 6, 479, 79, 0, 5484, 965, 1, 0, 0, 0, 5485, 5486, 5, 99, 0, 0, 5486, 5487, 5, 104, 0, 0, 5487, 5488, 5, 105, 0, 0, 5488, 5489, 5, 108, 0, 0, 5489, 5490, 5, 100, 0, 0, 5490, 5491, 1, 0, 0, 0, 5491, 5492, 6, 480, 80, 0, 5492, 967, 1, 0, 0, 0, 5493, 5494, 5, 99, 0, 0, 5494, 5495, 5, 111, 0, 0, 5495, 5496, 5, 108, 0, 0, 5496, 5497, 5, 108, 0, 0, 5497, 5498, 5, 97, 0, 0, 5498, 5499, 5, 116, 0, 0, 5499, 5500, 5, 105, 0, 0, 5500, 5501, 5, 111, 0, 0, 5501, 5502, 5, 110, 0, 0, 5502, 5503, 1, 0, 0, 0, 5503, 5504, 6, 481, 81, 0, 5504, 969, 1, 0, 0, 0, 5505, 5506, 5, 99, 0, 0, 5506, 5507, 5, 111, 0, 0, 5507, 5508, 5, 109, 0, 0, 5508, 5509, 5, 109, 0, 0, 5509, 5510, 5, 101, 0, 0, 5510, 5511, 5, 110, 0, 0, 5511, 5512, 5, 116, 0, 0, 5512, 5513, 1, 0, 0, 0, 5513, 5514, 6, 482, 82, 0, 5514, 971, 1, 0, 0, 0, 5515, 5516, 5, 99, 0, 0, 5516, 5517, 5, 111, 0, 0, 5517, 5518, 5, 110, 0, 0, 5518, 5519, 5, 115, 0, 0, 5519, 5520, 5, 116, 0, 0, 5520, 5521, 5, 114, 0, 0, 5521, 5522, 5, 117, 0, 0, 5522, 5523, 5, 99, 0, 0, 5523, 5524, 5, 116, 0, 0, 5524, 5525, 5, 105, 0, 0, 5525, 5526, 5, 111, 0, 0, 5526, 5527, 5, 110, 0, 0, 5527, 5528, 1, 0, 0, 0, 5528, 5529, 6, 483, 83, 0, 5529, 973, 1, 0, 0, 0, 5530, 5531, 5, 99, 0, 0, 5531, 5532, 5, 111, 0, 0, 5532, 5533, 5, 110, 0, 0, 5533, 5534, 5, 116, 0, 0, 5534, 5535, 5, 101, 0, 0, 5535, 5536, 5, 120, 0, 0, 5536, 5537, 5, 116, 0, 0, 5537, 5538, 1, 0, 0, 0, 5538, 5539, 6, 484, 84, 0, 5539, 975, 1, 0, 0, 0, 5540, 5541, 5, 99, 0, 0, 5541, 5542, 5, 111, 0, 0, 5542, 5543, 5, 112, 0, 0, 5543, 5544, 5, 121, 0, 0, 5544, 5545, 5, 45, 0, 0, 5545, 5546, 5, 110, 0, 0, 5546, 5547, 5, 97, 0, 0, 5547, 5548, 5, 109, 0, 0, 5548, 5549, 5, 101, 0, 0, 5549, 5550, 5, 115, 0, 0, 5550, 5551, 5, 112, 0, 0, 5551, 5552, 5, 97, 0, 0, 5552, 5553, 5, 99, 0, 0, 5553, 5554, 5, 101, 0, 0, 5554, 5555, 5, 115, 0, 0, 5555, 5556, 1, 0, 0, 0, 5556, 5557, 6, 485, 85, 0, 5557, 977, 1, 0, 0, 0, 5558, 5559, 5, 99, 0, 0, 5559, 5560, 5, 111, 0, 0, 5560, 5561, 5, 117, 0, 0, 5561, 5562, 5, 110, 0, 0, 5562, 5563, 5, 116, 0, 0, 5563, 5564, 1, 0, 0, 0, 5564, 5565, 6, 486, 86, 0, 5565, 979, 1, 0, 0, 0, 5566, 5567, 5, 100, 0, 0, 5567, 5568, 5, 101, 0, 0, 5568, 5569, 5, 99, 0, 0, 5569, 5570, 5, 108, 0, 0, 5570, 5571, 5, 97, 0, 0, 5571, 5572, 5, 114, 0, 0, 5572, 5573, 5, 101, 0, 0, 5573, 5574, 1, 0, 0, 0, 5574, 5575, 6, 487, 87, 0, 5575, 981, 1, 0, 0, 0, 5576, 5577, 5, 100, 0, 0, 5577, 5578, 5, 101, 0, 0, 5578, 5579, 5, 102, 0, 0, 5579, 5580, 5, 97, 0, 0, 5580, 5581, 5, 117, 0, 0, 5581, 5582, 5, 108, 0, 0, 5582, 5583, 5, 116, 0, 0, 5583, 5584, 1, 0, 0, 0, 5584, 5585, 6, 488, 88, 0, 5585, 983, 1, 0, 0, 0, 5586, 5587, 5, 100, 0, 0, 5587, 5588, 5, 101, 0, 0, 5588, 5589, 5, 115, 0, 0, 5589, 5590, 5, 99, 0, 0, 5590, 5591, 5, 101, 0, 0, 5591, 5592, 5, 110, 0, 0, 5592, 5593, 5, 100, 0, 0, 5593, 5594, 5, 97, 0, 0, 5594, 5595, 5, 110, 0, 0, 5595, 5596, 5, 116, 0, 0, 5596, 5597, 1, 0, 0, 0, 5597, 5598, 6, 489, 89, 0, 5598, 985, 1, 0, 0, 0, 5599, 5600, 5, 100, 0, 0, 5600, 5601, 5, 101, 0, 0, 5601, 5602, 5, 115, 0, 0, 5602, 5603, 5, 99, 0, 0, 5603, 5604, 5, 101, 0, 0, 5604, 5605, 5, 110, 0, 0, 5605, 5606, 5, 100, 0, 0, 5606, 5607, 5, 97, 0, 0, 5607, 5608, 5, 110, 0, 0, 5608, 5609, 5, 116, 0, 0, 5609, 5610, 5, 45, 0, 0, 5610, 5611, 5, 111, 0, 0, 5611, 5612, 5, 114, 0, 0, 5612, 5613, 5, 45, 0, 0, 5613, 5614, 5, 115, 0, 0, 5614, 5615, 5, 101, 0, 0, 5615, 5616, 5, 108, 0, 0, 5616, 5617, 5, 102, 0, 0, 5617, 5618, 1, 0, 0, 0, 5618, 5619, 6, 490, 90, 0, 5619, 987, 1, 0, 0, 0, 5620, 5621, 5, 100, 0, 0, 5621, 5622, 5, 101, 0, 0, 5622, 5623, 5, 115, 0, 0, 5623, 5624, 5, 99, 0, 0, 5624, 5625, 5, 101, 0, 0, 5625, 5626, 5, 110, 0, 0, 5626, 5627, 5, 100, 0, 0, 5627, 5628, 5, 105, 0, 0, 5628, 5629, 5, 110, 0, 0, 5629, 5630, 5, 103, 0, 0, 5630, 5631, 1, 0, 0, 0, 5631, 5632, 6, 491, 91, 0, 5632, 989, 1, 0, 0, 0, 5633, 5634, 5, 100, 0, 0, 5634, 5635, 5, 101, 0, 0, 5635, 5636, 5, 99, 0, 0, 5636, 5637, 5, 105, 0, 0, 5637, 5638, 5, 109, 0, 0, 5638, 5639, 5, 97, 0, 0, 5639, 5640, 5, 108, 0, 0, 5640, 5641, 5, 45, 0, 0, 5641, 5642, 5, 102, 0, 0, 5642, 5643, 5, 111, 0, 0, 5643, 5644, 5, 114, 0, 0, 5644, 5645, 5, 109, 0, 0, 5645, 5646, 5, 97, 0, 0, 5646, 5647, 5, 116, 0, 0, 5647, 5648, 1, 0, 0, 0, 5648, 5649, 6, 492, 92, 0, 5649, 991, 1, 0, 0, 0, 5650, 5651, 5, 100, 0, 0, 5651, 5652, 5, 105, 0, 0, 5652, 5653, 5, 118, 0, 0, 5653, 5654, 1, 0, 0, 0, 5654, 5655, 6, 493, 93, 0, 5655, 993, 1, 0, 0, 0, 5656, 5657, 5, 100, 0, 0, 5657, 5658, 5, 111, 0, 0, 5658, 5659, 5, 99, 0, 0, 5659, 5660, 5, 117, 0, 0, 5660, 5661, 5, 109, 0, 0, 5661, 5662, 5, 101, 0, 0, 5662, 5663, 5, 110, 0, 0, 5663, 5664, 5, 116, 0, 0, 5664, 5665, 1, 0, 0, 0, 5665, 5666, 6, 494, 94, 0, 5666, 995, 1, 0, 0, 0, 5667, 5668, 5, 100, 0, 0, 5668, 5669, 5, 111, 0, 0, 5669, 5670, 5, 99, 0, 0, 5670, 5671, 5, 117, 0, 0, 5671, 5672, 5, 109, 0, 0, 5672, 5673, 5, 101, 0, 0, 5673, 5674, 5, 110, 0, 0, 5674, 5675, 5, 116, 0, 0, 5675, 5676, 5, 45, 0, 0, 5676, 5677, 5, 110, 0, 0, 5677, 5678, 5, 111, 0, 0, 5678, 5679, 5, 100, 0, 0, 5679, 5680, 5, 101, 0, 0, 5680, 5681, 1, 0, 0, 0, 5681, 5682, 6, 495, 95, 0, 5682, 997, 1, 0, 0, 0, 5683, 5684, 5, 101, 0, 0, 5684, 5685, 5, 108, 0, 0, 5685, 5686, 5, 101, 0, 0, 5686, 5687, 5, 109, 0, 0, 5687, 5688, 5, 101, 0, 0, 5688, 5689, 5, 110, 0, 0, 5689, 5690, 5, 116, 0, 0, 5690, 5691, 1, 0, 0, 0, 5691, 5692, 6, 496, 96, 0, 5692, 999, 1, 0, 0, 0, 5693, 5694, 5, 101, 0, 0, 5694, 5695, 5, 108, 0, 0, 5695, 5696, 5, 115, 0, 0, 5696, 5697, 5, 101, 0, 0, 5697, 5698, 1, 0, 0, 0, 5698, 5699, 6, 497, 97, 0, 5699, 1001, 1, 0, 0, 0, 5700, 5701, 5, 101, 0, 0, 5701, 5702, 5, 109, 0, 0, 5702, 5703, 5, 112, 0, 0, 5703, 5704, 5, 116, 0, 0, 5704, 5705, 5, 121, 0, 0, 5705, 5706, 1, 0, 0, 0, 5706, 5707, 6, 498, 98, 0, 5707, 1003, 1, 0, 0, 0, 5708, 5709, 5, 101, 0, 0, 5709, 5710, 5, 109, 0, 0, 5710, 5711, 5, 112, 0, 0, 5711, 5712, 5, 116, 0, 0, 5712, 5713, 5, 121, 0, 0, 5713, 5714, 5, 45, 0, 0, 5714, 5715, 5, 115, 0, 0, 5715, 5716, 5, 101, 0, 0, 5716, 5717, 5, 113, 0, 0, 5717, 5718, 5, 117, 0, 0, 5718, 5719, 5, 101, 0, 0, 5719, 5720, 5, 110, 0, 0, 5720, 5721, 5, 99, 0, 0, 5721, 5722, 5, 101, 0, 0, 5722, 5723, 1, 0, 0, 0, 5723, 5724, 6, 499, 99, 0, 5724, 1005, 1, 0, 0, 0, 5725, 5726, 5, 101, 0, 0, 5726, 5727, 5, 110, 0, 0, 5727, 5728, 5, 99, 0, 0, 5728, 5729, 5, 111, 0, 0, 5729, 5730, 5, 100, 0, 0, 5730, 5731, 5, 105, 0, 0, 5731, 5732, 5, 110, 0, 0, 5732, 5733, 5, 103, 0, 0, 5733, 5734, 1, 0, 0, 0, 5734, 5735, 6, 500, 100, 0, 5735, 1007, 1, 0, 0, 0, 5736, 5737, 5, 101, 0, 0, 5737, 5738, 5, 110, 0, 0, 5738, 5739, 5, 100, 0, 0, 5739, 5740, 1, 0, 0, 0, 5740, 5741, 6, 501, 101, 0, 5741, 1009, 1, 0, 0, 0, 5742, 5743, 5, 101, 0, 0, 5743, 5744, 5, 113, 0, 0, 5744, 5745, 1, 0, 0, 0, 5745, 5746, 6, 502, 102, 0, 5746, 1011, 1, 0, 0, 0, 5747, 5748, 5, 101, 0, 0, 5748, 5749, 5, 118, 0, 0, 5749, 5750, 5, 101, 0, 0, 5750, 5751, 5, 114, 0, 0, 5751, 5752, 5, 121, 0, 0, 5752, 5753, 1, 0, 0, 0, 5753, 5754, 6, 503, 103, 0, 5754, 1013, 1, 0, 0, 0, 5755, 5756, 5, 101, 0, 0, 5756, 5757, 5, 120, 0, 0, 5757, 5758, 5, 99, 0, 0, 5758, 5759, 5, 101, 0, 0, 5759, 5760, 5, 112, 0, 0, 5760, 5761, 5, 116, 0, 0, 5761, 5762, 1, 0, 0, 0, 5762, 5763, 6, 504, 104, 0, 5763, 1015, 1, 0, 0, 0, 5764, 5765, 5, 101, 0, 0, 5765, 5766, 5, 120, 0, 0, 5766, 5767, 5, 116, 0, 0, 5767, 5768, 5, 101, 0, 0, 5768, 5769, 5, 114, 0, 0, 5769, 5770, 5, 110, 0, 0, 5770, 5771, 5, 97, 0, 0, 5771, 5772, 5, 108, 0, 0, 5772, 5773, 1, 0, 0, 0, 5773, 5774, 6, 505, 105, 0, 5774, 1017, 1, 0, 0, 0, 5775, 5776, 5, 102, 0, 0, 5776, 5777, 5, 111, 0, 0, 5777, 5778, 5, 108, 0, 0, 5778, 5779, 5, 108, 0, 0, 5779, 5780, 5, 111, 0, 0, 5780, 5781, 5, 119, 0, 0, 5781, 5782, 5, 105, 0, 0, 5782, 5783, 5, 110, 0, 0, 5783, 5784, 5, 103, 0, 0, 5784, 5785, 1, 0, 0, 0, 5785, 5786, 6, 506, 106, 0, 5786, 1019, 1, 0, 0, 0, 5787, 5788, 5, 102, 0, 0, 5788, 5789, 5, 111, 0, 0, 5789, 5790, 5, 108, 0, 0, 5790, 5791, 5, 108, 0, 0, 5791, 5792, 5, 111, 0, 0, 5792, 5793, 5, 119, 0, 0, 5793, 5794, 5, 105, 0, 0, 5794, 5795, 5, 110, 0, 0, 5795, 5796, 5, 103, 0, 0, 5796, 5797, 5, 45, 0, 0, 5797, 5798, 5, 115, 0, 0, 5798, 5799, 5, 105, 0, 0, 5799, 5800, 5, 98, 0, 0, 5800, 5801, 5, 108, 0, 0, 5801, 5802, 5, 105, 0, 0, 5802, 5803, 5, 110, 0, 0, 5803, 5804, 5, 103, 0, 0, 5804, 5805, 1, 0, 0, 0, 5805, 5806, 6, 507, 107, 0, 5806, 1021, 1, 0, 0, 0, 5807, 5808, 5, 102, 0, 0, 5808, 5809, 5, 111, 0, 0, 5809, 5810, 5, 114, 0, 0, 5810, 5811, 1, 0, 0, 0, 5811, 5812, 6, 508, 108, 0, 5812, 1023, 1, 0, 0, 0, 5813, 5814, 5, 102, 0, 0, 5814, 5815, 5, 117, 0, 0, 5815, 5816, 5, 110, 0, 0, 5816, 5817, 5, 99, 0, 0, 5817, 5818, 5, 116, 0, 0, 5818, 5819, 5, 105, 0, 0, 5819, 5820, 5, 111, 0, 0, 5820, 5821, 5, 110, 0, 0, 5821, 5822, 1, 0, 0, 0, 5822, 5823, 6, 509, 109, 0, 5823, 1025, 1, 0, 0, 0, 5824, 5825, 5, 103, 0, 0, 5825, 5826, 5, 101, 0, 0, 5826, 5827, 1, 0, 0, 0, 5827, 5828, 6, 510, 110, 0, 5828, 1027, 1, 0, 0, 0, 5829, 5830, 5, 103, 0, 0, 5830, 5831, 5, 114, 0, 0, 5831, 5832, 5, 101, 0, 0, 5832, 5833, 5, 97, 0, 0, 5833, 5834, 5, 116, 0, 0, 5834, 5835, 5, 101, 0, 0, 5835, 5836, 5, 115, 0, 0, 5836, 5837, 5, 116, 0, 0, 5837, 5838, 1, 0, 0, 0, 5838, 5839, 6, 511, 111, 0, 5839, 1029, 1, 0, 0, 0, 5840, 5841, 5, 103, 0, 0, 5841, 5842, 5, 114, 0, 0, 5842, 5843, 5, 111, 0, 0, 5843, 5844, 5, 117, 0, 0, 5844, 5845, 5, 112, 0, 0, 5845, 5846, 1, 0, 0, 0, 5846, 5847, 6, 512, 112, 0, 5847, 1031, 1, 0, 0, 0, 5848, 5849, 5, 103, 0, 0, 5849, 5850, 5, 116, 0, 0, 5850, 5851, 1, 0, 0, 0, 5851, 5852, 6, 513, 113, 0, 5852, 1033, 1, 0, 0, 0, 5853, 5854, 5, 105, 0, 0, 5854, 5855, 5, 100, 0, 0, 5855, 5856, 5, 105, 0, 0, 5856, 5857, 5, 118, 0, 0, 5857, 5858, 1, 0, 0, 0, 5858, 5859, 6, 514, 114, 0, 5859, 1035, 1, 0, 0, 0, 5860, 5861, 5, 105, 0, 0, 5861, 5862, 5, 102, 0, 0, 5862, 5863, 1, 0, 0, 0, 5863, 5864, 6, 515, 115, 0, 5864, 1037, 1, 0, 0, 0, 5865, 5866, 5, 105, 0, 0, 5866, 5867, 5, 109, 0, 0, 5867, 5868, 5, 112, 0, 0, 5868, 5869, 5, 111, 0, 0, 5869, 5870, 5, 114, 0, 0, 5870, 5871, 5, 116, 0, 0, 5871, 5872, 1, 0, 0, 0, 5872, 5873, 6, 516, 116, 0, 5873, 1039, 1, 0, 0, 0, 5874, 5875, 5, 105, 0, 0, 5875, 5876, 5, 110, 0, 0, 5876, 5877, 1, 0, 0, 0, 5877, 5878, 6, 517, 117, 0, 5878, 1041, 1, 0, 0, 0, 5879, 5880, 5, 105, 0, 0, 5880, 5881, 5, 110, 0, 0, 5881, 5882, 5, 104, 0, 0, 5882, 5883, 5, 101, 0, 0, 5883, 5884, 5, 114, 0, 0, 5884, 5885, 5, 105, 0, 0, 5885, 5886, 5, 116, 0, 0, 5886, 5887, 1, 0, 0, 0, 5887, 5888, 6, 518, 118, 0, 5888, 1043, 1, 0, 0, 0, 5889, 5890, 5, 105, 0, 0, 5890, 5891, 5, 110, 0, 0, 5891, 5892, 5, 115, 0, 0, 5892, 5893, 5, 116, 0, 0, 5893, 5894, 5, 97, 0, 0, 5894, 5895, 5, 110, 0, 0, 5895, 5896, 5, 99, 0, 0, 5896, 5897, 5, 101, 0, 0, 5897, 5898, 1, 0, 0, 0, 5898, 5899, 6, 519, 119, 0, 5899, 1045, 1, 0, 0, 0, 5900, 5901, 5, 105, 0, 0, 5901, 5902, 5, 110, 0, 0, 5902, 5903, 5, 116, 0, 0, 5903, 5904, 5, 101, 0, 0, 5904, 5905, 5, 114, 0, 0, 5905, 5906, 5, 115, 0, 0, 5906, 5907, 5, 101, 0, 0, 5907, 5908, 5, 99, 0, 0, 5908, 5909, 5, 116, 0, 0, 5909, 5910, 1, 0, 0, 0, 5910, 5911, 6, 520, 120, 0, 5911, 1047, 1, 0, 0, 0, 5912, 5913, 5, 105, 0, 0, 5913, 5914, 5, 115, 0, 0, 5914, 5915, 1, 0, 0, 0, 5915, 5916, 6, 521, 121, 0, 5916, 1049, 1, 0, 0, 0, 5917, 5918, 5, 105, 0, 0, 5918, 5919, 5, 116, 0, 0, 5919, 5920, 5, 101, 0, 0, 5920, 5921, 5, 109, 0, 0, 5921, 5922, 1, 0, 0, 0, 5922, 5923, 6, 522, 122, 0, 5923, 1051, 1, 0, 0, 0, 5924, 5925, 5, 108, 0, 0, 5925, 5926, 5, 97, 0, 0, 5926, 5927, 5, 120, 0, 0, 5927, 5928, 1, 0, 0, 0, 5928, 5929, 6, 523, 123, 0, 5929, 1053, 1, 0, 0, 0, 5930, 5931, 5, 108, 0, 0, 5931, 5932, 5, 101, 0, 0, 5932, 5933, 1, 0, 0, 0, 5933, 5934, 6, 524, 124, 0, 5934, 1055, 1, 0, 0, 0, 5935, 5936, 5, 108, 0, 0, 5936, 5937, 5, 101, 0, 0, 5937, 5938, 5, 97, 0, 0, 5938, 5939, 5, 115, 0, 0, 5939, 5940, 5, 116, 0, 0, 5940, 5941, 1, 0, 0, 0, 5941, 5942, 6, 525, 125, 0, 5942, 1057, 1, 0, 0, 0, 5943, 5944, 5, 108, 0, 0, 5944, 5945, 5, 101, 0, 0, 5945, 5946, 5, 116, 0, 0, 5946, 5947, 1, 0, 0, 0, 5947, 5948, 6, 526, 126, 0, 5948, 1059, 1, 0, 0, 0, 5949, 5950, 5, 108, 0, 0, 5950, 5951, 5, 116, 0, 0, 5951, 5952, 1, 0, 0, 0, 5952, 5953, 6, 527, 127, 0, 5953, 1061, 1, 0, 0, 0, 5954, 5955, 5, 109, 0, 0, 5955, 5956, 5, 97, 0, 0, 5956, 5957, 5, 112, 0, 0, 5957, 5958, 1, 0, 0, 0, 5958, 5959, 6, 528, 128, 0, 5959, 1063, 1, 0, 0, 0, 5960, 5961, 5, 109, 0, 0, 5961, 5962, 5, 111, 0, 0, 5962, 5963, 5, 100, 0, 0, 5963, 5964, 1, 0, 0, 0, 5964, 5965, 6, 529, 129, 0, 5965, 1065, 1, 0, 0, 0, 5966, 5967, 5, 109, 0, 0, 5967, 5968, 5, 111, 0, 0, 5968, 5969, 5, 100, 0, 0, 5969, 5970, 5, 117, 0, 0, 5970, 5971, 5, 108, 0, 0, 5971, 5972, 5, 101, 0, 0, 5972, 5973, 1, 0, 0, 0, 5973, 5974, 6, 530, 130, 0, 5974, 1067, 1, 0, 0, 0, 5975, 5976, 5, 110, 0, 0, 5976, 5977, 5, 97, 0, 0, 5977, 5978, 5, 109, 0, 0, 5978, 5979, 5, 101, 0, 0, 5979, 5980, 5, 115, 0, 0, 5980, 5981, 5, 112, 0, 0, 5981, 5982, 5, 97, 0, 0, 5982, 5983, 5, 99, 0, 0, 5983, 5984, 5, 101, 0, 0, 5984, 5985, 1, 0, 0, 0, 5985, 5986, 6, 531, 131, 0, 5986, 1069, 1, 0, 0, 0, 5987, 5988, 5, 110, 0, 0, 5988, 5989, 5, 101, 0, 0, 5989, 5990, 1, 0, 0, 0, 5990, 5991, 6, 532, 132, 0, 5991, 1071, 1, 0, 0, 0, 5992, 5993, 5, 110, 0, 0, 5993, 5994, 5, 101, 0, 0, 5994, 5995, 5, 120, 0, 0, 5995, 5996, 5, 116, 0, 0, 5996, 5997, 1, 0, 0, 0, 5997, 5998, 6, 533, 133, 0, 5998, 1073, 1, 0, 0, 0, 5999, 6000, 5, 110, 0, 0, 6000, 6001, 5, 97, 0, 0, 6001, 6002, 5, 109, 0, 0, 6002, 6003, 5, 101, 0, 0, 6003, 6004, 5, 115, 0, 0, 6004, 6005, 5, 112, 0, 0, 6005, 6006, 5, 97, 0, 0, 6006, 6007, 5, 99, 0, 0, 6007, 6008, 5, 101, 0, 0, 6008, 6009, 5, 45, 0, 0, 6009, 6010, 5, 110, 0, 0, 6010, 6011, 5, 111, 0, 0, 6011, 6012, 5, 100, 0, 0, 6012, 6013, 5, 101, 0, 0, 6013, 6014, 1, 0, 0, 0, 6014, 6015, 6, 534, 134, 0, 6015, 1075, 1, 0, 0, 0, 6016, 6017, 5, 110, 0, 0, 6017, 6018, 5, 111, 0, 0, 6018, 6019, 5, 45, 0, 0, 6019, 6020, 5, 105, 0, 0, 6020, 6021, 5, 110, 0, 0, 6021, 6022, 5, 104, 0, 0, 6022, 6023, 5, 101, 0, 0, 6023, 6024, 5, 114, 0, 0, 6024, 6025, 5, 105, 0, 0, 6025, 6026, 5, 116, 0, 0, 6026, 6027, 1, 0, 0, 0, 6027, 6028, 6, 535, 135, 0, 6028, 1077, 1, 0, 0, 0, 6029, 6030, 5, 110, 0, 0, 6030, 6031, 5, 111, 0, 0, 6031, 6032, 5, 45, 0, 0, 6032, 6033, 5, 112, 0, 0, 6033, 6034, 5, 114, 0, 0, 6034, 6035, 5, 101, 0, 0, 6035, 6036, 5, 115, 0, 0, 6036, 6037, 5, 101, 0, 0, 6037, 6038, 5, 114, 0, 0, 6038, 6039, 5, 118, 0, 0, 6039, 6040, 5, 101, 0, 0, 6040, 6041, 1, 0, 0, 0, 6041, 6042, 6, 536, 136, 0, 6042, 1079, 1, 0, 0, 0, 6043, 6044, 5, 110, 0, 0, 6044, 6045, 5, 111, 0, 0, 6045, 6046, 5, 100, 0, 0, 6046, 6047, 5, 101, 0, 0, 6047, 6048, 1, 0, 0, 0, 6048, 6049, 6, 537, 137, 0, 6049, 1081, 1, 0, 0, 0, 6050, 6051, 5, 111, 0, 0, 6051, 6052, 5, 102, 0, 0, 6052, 6053, 1, 0, 0, 0, 6053, 6054, 6, 538, 138, 0, 6054, 1083, 1, 0, 0, 0, 6055, 6056, 5, 111, 0, 0, 6056, 6057, 5, 110, 0, 0, 6057, 6058, 5, 108, 0, 0, 6058, 6059, 5, 121, 0, 0, 6059, 6060, 1, 0, 0, 0, 6060, 6061, 6, 539, 139, 0, 6061, 1085, 1, 0, 0, 0, 6062, 6063, 5, 111, 0, 0, 6063, 6064, 5, 112, 0, 0, 6064, 6065, 5, 116, 0, 0, 6065, 6066, 5, 105, 0, 0, 6066, 6067, 5, 111, 0, 0, 6067, 6068, 5, 110, 0, 0, 6068, 6069, 1, 0, 0, 0, 6069, 6070, 6, 540, 140, 0, 6070, 1087, 1, 0, 0, 0, 6071, 6072, 5, 111, 0, 0, 6072, 6073, 5, 114, 0, 0, 6073, 6074, 1, 0, 0, 0, 6074, 6075, 6, 541, 141, 0, 6075, 1089, 1, 0, 0, 0, 6076, 6077, 5, 111, 0, 0, 6077, 6078, 5, 114, 0, 0, 6078, 6079, 5, 100, 0, 0, 6079, 6080, 5, 101, 0, 0, 6080, 6081, 5, 114, 0, 0, 6081, 6082, 1, 0, 0, 0, 6082, 6083, 6, 542, 142, 0, 6083, 1091, 1, 0, 0, 0, 6084, 6085, 5, 111, 0, 0, 6085, 6086, 5, 114, 0, 0, 6086, 6087, 5, 100, 0, 0, 6087, 6088, 5, 101, 0, 0, 6088, 6089, 5, 114, 0, 0, 6089, 6090, 5, 101, 0, 0, 6090, 6091, 5, 100, 0, 0, 6091, 6092, 1, 0, 0, 0, 6092, 6093, 6, 543, 143, 0, 6093, 1093, 1, 0, 0, 0, 6094, 6095, 5, 111, 0, 0, 6095, 6096, 5, 114, 0, 0, 6096, 6097, 5, 100, 0, 0, 6097, 6098, 5, 101, 0, 0, 6098, 6099, 5, 114, 0, 0, 6099, 6100, 5, 105, 0, 0, 6100, 6101, 5, 110, 0, 0, 6101, 6102, 5, 103, 0, 0, 6102, 6103, 1, 0, 0, 0, 6103, 6104, 6, 544, 144, 0, 6104, 1095, 1, 0, 0, 0, 6105, 6106, 5, 112, 0, 0, 6106, 6107, 5, 97, 0, 0, 6107, 6108, 5, 114, 0, 0, 6108, 6109, 5, 101, 0, 0, 6109, 6110, 5, 110, 0, 0, 6110, 6111, 5, 116, 0, 0, 6111, 6112, 1, 0, 0, 0, 6112, 6113, 6, 545, 145, 0, 6113, 1097, 1, 0, 0, 0, 6114, 6115, 5, 112, 0, 0, 6115, 6116, 5, 114, 0, 0, 6116, 6117, 5, 101, 0, 0, 6117, 6118, 5, 99, 0, 0, 6118, 6119, 5, 101, 0, 0, 6119, 6120, 5, 100, 0, 0, 6120, 6121, 5, 105, 0, 0, 6121, 6122, 5, 110, 0, 0, 6122, 6123, 5, 103, 0, 0, 6123, 6124, 1, 0, 0, 0, 6124, 6125, 6, 546, 146, 0, 6125, 1099, 1, 0, 0, 0, 6126, 6127, 5, 112, 0, 0, 6127, 6128, 5, 114, 0, 0, 6128, 6129, 5, 101, 0, 0, 6129, 6130, 5, 99, 0, 0, 6130, 6131, 5, 101, 0, 0, 6131, 6132, 5, 100, 0, 0, 6132, 6133, 5, 105, 0, 0, 6133, 6134, 5, 110, 0, 0, 6134, 6135, 5, 103, 0, 0, 6135, 6136, 5, 45, 0, 0, 6136, 6137, 5, 115, 0, 0, 6137, 6138, 5, 105, 0, 0, 6138, 6139, 5, 98, 0, 0, 6139, 6140, 5, 108, 0, 0, 6140, 6141, 5, 105, 0, 0, 6141, 6142, 5, 110, 0, 0, 6142, 6143, 5, 103, 0, 0, 6143, 6144, 1, 0, 0, 0, 6144, 6145, 6, 547, 147, 0, 6145, 1101, 1, 0, 0, 0, 6146, 6147, 5, 112, 0, 0, 6147, 6148, 5, 114, 0, 0, 6148, 6149, 5, 101, 0, 0, 6149, 6150, 5, 115, 0, 0, 6150, 6151, 5, 101, 0, 0, 6151, 6152, 5, 114, 0, 0, 6152, 6153, 5, 118, 0, 0, 6153, 6154, 5, 101, 0, 0, 6154, 6155, 1, 0, 0, 0, 6155, 6156, 6, 548, 148, 0, 6156, 1103, 1, 0, 0, 0, 6157, 6158, 5, 112, 0, 0, 6158, 6159, 5, 114, 0, 0, 6159, 6160, 5, 101, 0, 0, 6160, 6161, 5, 118, 0, 0, 6161, 6162, 5, 105, 0, 0, 6162, 6163, 5, 111, 0, 0, 6163, 6164, 5, 117, 0, 0, 6164, 6165, 5, 115, 0, 0, 6165, 6166, 1, 0, 0, 0, 6166, 6167, 6, 549, 149, 0, 6167, 1105, 1, 0, 0, 0, 6168, 6169, 5, 112, 0, 0, 6169, 6170, 5, 114, 0, 0, 6170, 6171, 5, 111, 0, 0, 6171, 6172, 5, 99, 0, 0, 6172, 6173, 5, 101, 0, 0, 6173, 6174, 5, 115, 0, 0, 6174, 6175, 5, 115, 0, 0, 6175, 6176, 5, 105, 0, 0, 6176, 6177, 5, 110, 0, 0, 6177, 6178, 5, 103, 0, 0, 6178, 6179, 5, 45, 0, 0, 6179, 6180, 5, 105, 0, 0, 6180, 6181, 5, 110, 0, 0, 6181, 6182, 5, 115, 0, 0, 6182, 6183, 5, 116, 0, 0, 6183, 6184, 5, 114, 0, 0, 6184, 6185, 5, 117, 0, 0, 6185, 6186, 5, 99, 0, 0, 6186, 6187, 5, 116, 0, 0, 6187, 6188, 5, 105, 0, 0, 6188, 6189, 5, 111, 0, 0, 6189, 6190, 5, 110, 0, 0, 6190, 6191, 1, 0, 0, 0, 6191, 6192, 6, 550, 150, 0, 6192, 1107, 1, 0, 0, 0, 6193, 6194, 5, 114, 0, 0, 6194, 6195, 5, 101, 0, 0, 6195, 6196, 5, 116, 0, 0, 6196, 6197, 5, 117, 0, 0, 6197, 6198, 5, 114, 0, 0, 6198, 6199, 5, 110, 0, 0, 6199, 6200, 1, 0, 0, 0, 6200, 6201, 6, 551, 151, 0, 6201, 1109, 1, 0, 0, 0, 6202, 6203, 5, 115, 0, 0, 6203, 6204, 5, 97, 0, 0, 6204, 6205, 5, 116, 0, 0, 6205, 6206, 5, 105, 0, 0, 6206, 6207, 5, 115, 0, 0, 6207, 6208, 5, 102, 0, 0, 6208, 6209, 5, 105, 0, 0, 6209, 6210, 5, 101, 0, 0, 6210, 6211, 5, 115, 0, 0, 6211, 6212, 1, 0, 0, 0, 6212, 6213, 6, 552, 152, 0, 6213, 1111, 1, 0, 0, 0, 6214, 6215, 5, 115, 0, 0, 6215, 6216, 5, 99, 0, 0, 6216, 6217, 5, 104, 0, 0, 6217, 6218, 5, 101, 0, 0, 6218, 6219, 5, 109, 0, 0, 6219, 6220, 5, 97, 0, 0, 6220, 6221, 1, 0, 0, 0, 6221, 6222, 6, 553, 153, 0, 6222, 1113, 1, 0, 0, 0, 6223, 6224, 5, 115, 0, 0, 6224, 6225, 5, 99, 0, 0, 6225, 6226, 5, 104, 0, 0, 6226, 6227, 5, 101, 0, 0, 6227, 6228, 5, 109, 0, 0, 6228, 6229, 5, 97, 0, 0, 6229, 6230, 5, 45, 0, 0, 6230, 6231, 5, 97, 0, 0, 6231, 6232, 5, 116, 0, 0, 6232, 6233, 5, 116, 0, 0, 6233, 6234, 5, 114, 0, 0, 6234, 6235, 5, 105, 0, 0, 6235, 6236, 5, 98, 0, 0, 6236, 6237, 5, 117, 0, 0, 6237, 6238, 5, 116, 0, 0, 6238, 6239, 5, 101, 0, 0, 6239, 6240, 1, 0, 0, 0, 6240, 6241, 6, 554, 154, 0, 6241, 1115, 1, 0, 0, 0, 6242, 6243, 5, 115, 0, 0, 6243, 6244, 5, 99, 0, 0, 6244, 6245, 5, 104, 0, 0, 6245, 6246, 5, 101, 0, 0, 6246, 6247, 5, 109, 0, 0, 6247, 6248, 5, 97, 0, 0, 6248, 6249, 5, 45, 0, 0, 6249, 6250, 5, 101, 0, 0, 6250, 6251, 5, 108, 0, 0, 6251, 6252, 5, 101, 0, 0, 6252, 6253, 5, 109, 0, 0, 6253, 6254, 5, 101, 0, 0, 6254, 6255, 5, 110, 0, 0, 6255, 6256, 5, 116, 0, 0, 6256, 6257, 1, 0, 0, 0, 6257, 6258, 6, 555, 155, 0, 6258, 1117, 1, 0, 0, 0, 6259, 6260, 5, 115, 0, 0, 6260, 6261, 5, 101, 0, 0, 6261, 6262, 5, 108, 0, 0, 6262, 6263, 5, 102, 0, 0, 6263, 6264, 1, 0, 0, 0, 6264, 6265, 6, 556, 156, 0, 6265, 1119, 1, 0, 0, 0, 6266, 6267, 5, 115, 0, 0, 6267, 6268, 5, 108, 0, 0, 6268, 6269, 5, 105, 0, 0, 6269, 6270, 5, 100, 0, 0, 6270, 6271, 5, 105, 0, 0, 6271, 6272, 5, 110, 0, 0, 6272, 6273, 5, 103, 0, 0, 6273, 6274, 1, 0, 0, 0, 6274, 6275, 6, 557, 157, 0, 6275, 1121, 1, 0, 0, 0, 6276, 6277, 5, 115, 0, 0, 6277, 6278, 5, 111, 0, 0, 6278, 6279, 5, 109, 0, 0, 6279, 6280, 5, 101, 0, 0, 6280, 6281, 1, 0, 0, 0, 6281, 6282, 6, 558, 158, 0, 6282, 1123, 1, 0, 0, 0, 6283, 6284, 5, 115, 0, 0, 6284, 6285, 5, 116, 0, 0, 6285, 6286, 5, 97, 0, 0, 6286, 6287, 5, 98, 0, 0, 6287, 6288, 5, 108, 0, 0, 6288, 6289, 5, 101, 0, 0, 6289, 6290, 1, 0, 0, 0, 6290, 6291, 6, 559, 159, 0, 6291, 1125, 1, 0, 0, 0, 6292, 6293, 5, 115, 0, 0, 6293, 6294, 5, 116, 0, 0, 6294, 6295, 5, 97, 0, 0, 6295, 6296, 5, 114, 0, 0, 6296, 6297, 5, 116, 0, 0, 6297, 6298, 1, 0, 0, 0, 6298, 6299, 6, 560, 160, 0, 6299, 1127, 1, 0, 0, 0, 6300, 6301, 5, 115, 0, 0, 6301, 6302, 5, 116, 0, 0, 6302, 6303, 5, 114, 0, 0, 6303, 6304, 5, 105, 0, 0, 6304, 6305, 5, 99, 0, 0, 6305, 6306, 5, 116, 0, 0, 6306, 6307, 1, 0, 0, 0, 6307, 6308, 6, 561, 161, 0, 6308, 1129, 1, 0, 0, 0, 6309, 6310, 5, 115, 0, 0, 6310, 6311, 5, 116, 0, 0, 6311, 6312, 5, 114, 0, 0, 6312, 6313, 5, 105, 0, 0, 6313, 6314, 5, 112, 0, 0, 6314, 6315, 1, 0, 0, 0, 6315, 6316, 6, 562, 162, 0, 6316, 1131, 1, 0, 0, 0, 6317, 6318, 5, 115, 0, 0, 6318, 6319, 5, 119, 0, 0, 6319, 6320, 5, 105, 0, 0, 6320, 6321, 5, 116, 0, 0, 6321, 6322, 5, 99, 0, 0, 6322, 6323, 5, 104, 0, 0, 6323, 6324, 1, 0, 0, 0, 6324, 6325, 6, 563, 163, 0, 6325, 1133, 1, 0, 0, 0, 6326, 6327, 5, 116, 0, 0, 6327, 6328, 5, 101, 0, 0, 6328, 6329, 5, 120, 0, 0, 6329, 6330, 5, 116, 0, 0, 6330, 6331, 1, 0, 0, 0, 6331, 6332, 6, 564, 164, 0, 6332, 1135, 1, 0, 0, 0, 6333, 6334, 5, 116, 0, 0, 6334, 6335, 5, 104, 0, 0, 6335, 6336, 5, 101, 0, 0, 6336, 6337, 5, 110, 0, 0, 6337, 6338, 1, 0, 0, 0, 6338, 6339, 6, 565, 165, 0, 6339, 1137, 1, 0, 0, 0, 6340, 6341, 5, 116, 0, 0, 6341, 6342, 5, 111, 0, 0, 6342, 6343, 1, 0, 0, 0, 6343, 6344, 6, 566, 166, 0, 6344, 1139, 1, 0, 0, 0, 6345, 6346, 5, 116, 0, 0, 6346, 6347, 5, 114, 0, 0, 6347, 6348, 5, 101, 0, 0, 6348, 6349, 5, 97, 0, 0, 6349, 6350, 5, 116, 0, 0, 6350, 6351, 1, 0, 0, 0, 6351, 6352, 6, 567, 167, 0, 6352, 1141, 1, 0, 0, 0, 6353, 6354, 5, 116, 0, 0, 6354, 6355, 5, 114, 0, 0, 6355, 6356, 5, 121, 0, 0, 6356, 6357, 1, 0, 0, 0, 6357, 6358, 6, 568, 168, 0, 6358, 1143, 1, 0, 0, 0, 6359, 6360, 5, 116, 0, 0, 6360, 6361, 5, 117, 0, 0, 6361, 6362, 5, 109, 0, 0, 6362, 6363, 5, 98, 0, 0, 6363, 6364, 5, 108, 0, 0, 6364, 6365, 5, 105, 0, 0, 6365, 6366, 5, 110, 0, 0, 6366, 6367, 5, 103, 0, 0, 6367, 6368, 1, 0, 0, 0, 6368, 6369, 6, 569, 169, 0, 6369, 1145, 1, 0, 0, 0, 6370, 6371, 5, 116, 0, 0, 6371, 6372, 5, 121, 0, 0, 6372, 6373, 5, 112, 0, 0, 6373, 6374, 5, 101, 0, 0, 6374, 6375, 1, 0, 0, 0, 6375, 6376, 6, 570, 170, 0, 6376, 1147, 1, 0, 0, 0, 6377, 6378, 5, 116, 0, 0, 6378, 6379, 5, 121, 0, 0, 6379, 6380, 5, 112, 0, 0, 6380, 6381, 5, 101, 0, 0, 6381, 6382, 5, 115, 0, 0, 6382, 6383, 5, 119, 0, 0, 6383, 6384, 5, 105, 0, 0, 6384, 6385, 5, 116, 0, 0, 6385, 6386, 5, 99, 0, 0, 6386, 6387, 5, 104, 0, 0, 6387, 6388, 1, 0, 0, 0, 6388, 6389, 6, 571, 171, 0, 6389, 1149, 1, 0, 0, 0, 6390, 6391, 5, 117, 0, 0, 6391, 6392, 5, 110, 0, 0, 6392, 6393, 5, 105, 0, 0, 6393, 6394, 5, 111, 0, 0, 6394, 6395, 5, 110, 0, 0, 6395, 6396, 1, 0, 0, 0, 6396, 6397, 6, 572, 172, 0, 6397, 1151, 1, 0, 0, 0, 6398, 6399, 5, 117, 0, 0, 6399, 6400, 5, 110, 0, 0, 6400, 6401, 5, 111, 0, 0, 6401, 6402, 5, 114, 0, 0, 6402, 6403, 5, 100, 0, 0, 6403, 6404, 5, 101, 0, 0, 6404, 6405, 5, 114, 0, 0, 6405, 6406, 5, 101, 0, 0, 6406, 6407, 5, 100, 0, 0, 6407, 6408, 1, 0, 0, 0, 6408, 6409, 6, 573, 173, 0, 6409, 1153, 1, 0, 0, 0, 6410, 6411, 5, 117, 0, 0, 6411, 6412, 5, 112, 0, 0, 6412, 6413, 5, 100, 0, 0, 6413, 6414, 5, 97, 0, 0, 6414, 6415, 5, 116, 0, 0, 6415, 6416, 5, 101, 0, 0, 6416, 6417, 1, 0, 0, 0, 6417, 6418, 6, 574, 174, 0, 6418, 1155, 1, 0, 0, 0, 6419, 6420, 5, 118, 0, 0, 6420, 6421, 5, 97, 0, 0, 6421, 6422, 5, 108, 0, 0, 6422, 6423, 5, 105, 0, 0, 6423, 6424, 5, 100, 0, 0, 6424, 6425, 5, 97, 0, 0, 6425, 6426, 5, 116, 0, 0, 6426, 6427, 5, 101, 0, 0, 6427, 6428, 1, 0, 0, 0, 6428, 6429, 6, 575, 175, 0, 6429, 1157, 1, 0, 0, 0, 6430, 6431, 5, 118, 0, 0, 6431, 6432, 5, 97, 0, 0, 6432, 6433, 5, 114, 0, 0, 6433, 6434, 5, 105, 0, 0, 6434, 6435, 5, 97, 0, 0, 6435, 6436, 5, 98, 0, 0, 6436, 6437, 5, 108, 0, 0, 6437, 6438, 5, 101, 0, 0, 6438, 6439, 1, 0, 0, 0, 6439, 6440, 6, 576, 176, 0, 6440, 1159, 1, 0, 0, 0, 6441, 6442, 5, 118, 0, 0, 6442, 6443, 5, 101, 0, 0, 6443, 6444, 5, 114, 0, 0, 6444, 6445, 5, 115, 0, 0, 6445, 6446, 5, 105, 0, 0, 6446, 6447, 5, 111, 0, 0, 6447, 6448, 5, 110, 0, 0, 6448, 6449, 1, 0, 0, 0, 6449, 6450, 6, 577, 177, 0, 6450, 1161, 1, 0, 0, 0, 6451, 6452, 5, 119, 0, 0, 6452, 6453, 5, 104, 0, 0, 6453, 6454, 5, 101, 0, 0, 6454, 6455, 5, 110, 0, 0, 6455, 6456, 1, 0, 0, 0, 6456, 6457, 6, 578, 178, 0, 6457, 1163, 1, 0, 0, 0, 6458, 6459, 5, 119, 0, 0, 6459, 6460, 5, 104, 0, 0, 6460, 6461, 5, 101, 0, 0, 6461, 6462, 5, 114, 0, 0, 6462, 6463, 5, 101, 0, 0, 6463, 6464, 1, 0, 0, 0, 6464, 6465, 6, 579, 179, 0, 6465, 1165, 1, 0, 0, 0, 6466, 6467, 5, 119, 0, 0, 6467, 6468, 5, 105, 0, 0, 6468, 6469, 5, 110, 0, 0, 6469, 6470, 5, 100, 0, 0, 6470, 6471, 5, 111, 0, 0, 6471, 6472, 5, 119, 0, 0, 6472, 6473, 1, 0, 0, 0, 6473, 6474, 6, 580, 180, 0, 6474, 1167, 1, 0, 0, 0, 6475, 6476, 5, 120, 0, 0, 6476, 6477, 5, 113, 0, 0, 6477, 6478, 5, 117, 0, 0, 6478, 6479, 5, 101, 0, 0, 6479, 6480, 5, 114, 0, 0, 6480, 6481, 5, 121, 0, 0, 6481, 6482, 1, 0, 0, 0, 6482, 6483, 6, 581, 181, 0, 6483, 1169, 1, 0, 0, 0, 6484, 6485, 5, 97, 0, 0, 6485, 6486, 5, 114, 0, 0, 6486, 6487, 5, 114, 0, 0, 6487, 6488, 5, 97, 0, 0, 6488, 6489, 5, 121, 0, 0, 6489, 6490, 5, 45, 0, 0, 6490, 6491, 5, 110, 0, 0, 6491, 6492, 5, 111, 0, 0, 6492, 6493, 5, 100, 0, 0, 6493, 6494, 5, 101, 0, 0, 6494, 6495, 1, 0, 0, 0, 6495, 6496, 6, 582, 182, 0, 6496, 1171, 1, 0, 0, 0, 6497, 6498, 5, 98, 0, 0, 6498, 6499, 5, 111, 0, 0, 6499, 6500, 5, 111, 0, 0, 6500, 6501, 5, 108, 0, 0, 6501, 6502, 5, 101, 0, 0, 6502, 6503, 5, 97, 0, 0, 6503, 6504, 5, 110, 0, 0, 6504, 6505, 5, 45, 0, 0, 6505, 6506, 5, 110, 0, 0, 6506, 6507, 5, 111, 0, 0, 6507, 6508, 5, 100, 0, 0, 6508, 6509, 5, 101, 0, 0, 6509, 6510, 1, 0, 0, 0, 6510, 6511, 6, 583, 183, 0, 6511, 1173, 1, 0, 0, 0, 6512, 6513, 5, 110, 0, 0, 6513, 6514, 5, 117, 0, 0, 6514, 6515, 5, 108, 0, 0, 6515, 6516, 5, 108, 0, 0, 6516, 6517, 5, 45, 0, 0, 6517, 6518, 5, 110, 0, 0, 6518, 6519, 5, 111, 0, 0, 6519, 6520, 5, 100, 0, 0, 6520, 6521, 5, 101, 0, 0, 6521, 6522, 1, 0, 0, 0, 6522, 6523, 6, 584, 184, 0, 6523, 1175, 1, 0, 0, 0, 6524, 6525, 5, 110, 0, 0, 6525, 6526, 5, 117, 0, 0, 6526, 6527, 5, 109, 0, 0, 6527, 6528, 5, 98, 0, 0, 6528, 6529, 5, 101, 0, 0, 6529, 6530, 5, 114, 0, 0, 6530, 6531, 5, 45, 0, 0, 6531, 6532, 5, 110, 0, 0, 6532, 6533, 5, 111, 0, 0, 6533, 6534, 5, 100, 0, 0, 6534, 6535, 5, 101, 0, 0, 6535, 6536, 1, 0, 0, 0, 6536, 6537, 6, 585, 185, 0, 6537, 1177, 1, 0, 0, 0, 6538, 6539, 5, 111, 0, 0, 6539, 6540, 5, 98, 0, 0, 6540, 6541, 5, 106, 0, 0, 6541, 6542, 5, 101, 0, 0, 6542, 6543, 5, 99, 0, 0, 6543, 6544, 5, 116, 0, 0, 6544, 6545, 5, 45, 0, 0, 6545, 6546, 5, 110, 0, 0, 6546, 6547, 5, 111, 0, 0, 6547, 6548, 5, 100, 0, 0, 6548, 6549, 5, 101, 0, 0, 6549, 6550, 1, 0, 0, 0, 6550, 6551, 6, 586, 186, 0, 6551, 1179, 1, 0, 0, 0, 6552, 6553, 5, 114, 0, 0, 6553, 6554, 5, 101, 0, 0, 6554, 6555, 5, 112, 0, 0, 6555, 6556, 5, 108, 0, 0, 6556, 6557, 5, 97, 0, 0, 6557, 6558, 5, 99, 0, 0, 6558, 6559, 5, 101, 0, 0, 6559, 6560, 1, 0, 0, 0, 6560, 6561, 6, 587, 187, 0, 6561, 1181, 1, 0, 0, 0, 6562, 6563, 5, 119, 0, 0, 6563, 6564, 5, 105, 0, 0, 6564, 6565, 5, 116, 0, 0, 6565, 6566, 5, 104, 0, 0, 6566, 6567, 1, 0, 0, 0, 6567, 6568, 6, 588, 188, 0, 6568, 1183, 1, 0, 0, 0, 6569, 6570, 5, 118, 0, 0, 6570, 6571, 5, 97, 0, 0, 6571, 6572, 5, 108, 0, 0, 6572, 6573, 5, 117, 0, 0, 6573, 6574, 5, 101, 0, 0, 6574, 6575, 1, 0, 0, 0, 6575, 6576, 6, 589, 189, 0, 6576, 1185, 1, 0, 0, 0, 6577, 6578, 5, 105, 0, 0, 6578, 6579, 5, 110, 0, 0, 6579, 6580, 5, 115, 0, 0, 6580, 6581, 5, 101, 0, 0, 6581, 6582, 5, 114, 0, 0, 6582, 6583, 5, 116, 0, 0, 6583, 6584, 1, 0, 0, 0, 6584, 6585, 6, 590, 190, 0, 6585, 1187, 1, 0, 0, 0, 6586, 6587, 5, 105, 0, 0, 6587, 6588, 5, 110, 0, 0, 6588, 6589, 5, 116, 0, 0, 6589, 6590, 5, 111, 0, 0, 6590, 6591, 1, 0, 0, 0, 6591, 6592, 6, 591, 191, 0, 6592, 1189, 1, 0, 0, 0, 6593, 6594, 5, 100, 0, 0, 6594, 6595, 5, 101, 0, 0, 6595, 6596, 5, 108, 0, 0, 6596, 6597, 5, 101, 0, 0, 6597, 6598, 5, 116, 0, 0, 6598, 6599, 5, 101, 0, 0, 6599, 6600, 1, 0, 0, 0, 6600, 6601, 6, 592, 192, 0, 6601, 1191, 1, 0, 0, 0, 6602, 6603, 5, 114, 0, 0, 6603, 6604, 5, 101, 0, 0, 6604, 6605, 5, 110, 0, 0, 6605, 6606, 5, 97, 0, 0, 6606, 6607, 5, 109, 0, 0, 6607, 6608, 5, 101, 0, 0, 6608, 6609, 1, 0, 0, 0, 6609, 6610, 6, 593, 193, 0, 6610, 1193, 1, 0, 0, 0, 6611, 6612, 5, 81, 0, 0, 6612, 6618, 5, 123, 0, 0, 6613, 6617, 3, 16, 5, 0, 6614, 6617, 3, 18, 6, 0, 6615, 6617, 8, 9, 0, 0, 6616, 6613, 1, 0, 0, 0, 6616, 6614, 1, 0, 0, 0, 6616, 6615, 1, 0, 0, 0, 6617, 6620, 1, 0, 0, 0, 6618, 6616, 1, 0, 0, 0, 6618, 6619, 1, 0, 0, 0, 6619, 6621, 1, 0, 0, 0, 6620, 6618, 1, 0, 0, 0, 6621, 6622, 5, 125, 0, 0, 6622, 6623, 3, 374, 184, 0, 6623, 6624, 1, 0, 0, 0, 6624, 6625, 6, 594, 194, 0, 6625, 1195, 1, 0, 0, 0, 6626, 6627, 3, 374, 184, 0, 6627, 6628, 5, 58, 0, 0, 6628, 6629, 3, 374, 184, 0, 6629, 6630, 1, 0, 0, 0, 6630, 6631, 6, 595, 195, 0, 6631, 1197, 1, 0, 0, 0, 6632, 6633, 3, 374, 184, 0, 6633, 6634, 5, 58, 0, 0, 6634, 6635, 5, 42, 0, 0, 6635, 6636, 1, 0, 0, 0, 6636, 6637, 6, 596, 196, 0, 6637, 1199, 1, 0, 0, 0, 6638, 6639, 5, 42, 0, 0, 6639, 6640, 5, 58, 0, 0, 6640, 6641, 3, 374, 184, 0, 6641, 6642, 1, 0, 0, 0, 6642, 6643, 6, 597, 197, 0, 6643, 1201, 1, 0, 0, 0, 6644, 6648, 3, 376, 185, 0, 6645, 6647, 3, 378, 186, 0, 6646, 6645, 1, 0, 0, 0, 6647, 6650, 1, 0, 0, 0, 6648, 6646, 1, 0, 0, 0, 6648, 6649, 1, 0, 0, 0, 6649, 6651, 1, 0, 0, 0, 6650, 6648, 1, 0, 0, 0, 6651, 6652, 6, 598, 198, 0, 6652, 1203, 1, 0, 0, 0, 6653, 6654, 5, 40, 0, 0, 6654, 6655, 5, 58, 0, 0, 6655, 6656, 5, 126, 0, 0, 6656, 6657, 1, 0, 0, 0, 6657, 6658, 6, 599, 199, 0, 6658, 1205, 1, 0, 0, 0, 6659, 6661, 5, 58, 0, 0, 6660, 6659, 1, 0, 0, 0, 6661, 6662, 1, 0, 0, 0, 6662, 6660, 1, 0, 0, 0, 6662, 6663, 1, 0, 0, 0, 6663, 6664, 1, 0, 0, 0, 6664, 6665, 5, 41, 0, 0, 6665, 6666, 1, 0, 0, 0, 6666, 6667, 6, 600, 200, 0, 6667, 1207, 1, 0, 0, 0, 6668, 6669, 5, 40, 0, 0, 6669, 6670, 5, 58, 0, 0, 6670, 6676, 5, 126, 0, 0, 6671, 6675, 3, 388, 191, 0, 6672, 6673, 5, 58, 0, 0, 6673, 6675, 8, 12, 0, 0, 6674, 6671, 1, 0, 0, 0, 6674, 6672, 1, 0, 0, 0, 6675, 6678, 1, 0, 0, 0, 6676, 6674, 1, 0, 0, 0, 6676, 6677, 1, 0, 0, 0, 6677, 6679, 1, 0, 0, 0, 6678, 6676, 1, 0, 0, 0, 6679, 6680, 5, 58, 0, 0, 6680, 6681, 5, 41, 0, 0, 6681, 6682, 1, 0, 0, 0, 6682, 6683, 6, 601, 201, 0, 6683, 1209, 1, 0, 0, 0, 6684, 6685, 5, 40, 0, 0, 6685, 6686, 5, 58, 0, 0, 6686, 6695, 8, 13, 0, 0, 6687, 6694, 3, 386, 190, 0, 6688, 6689, 5, 40, 0, 0, 6689, 6694, 8, 14, 0, 0, 6690, 6691, 5, 58, 0, 0, 6691, 6694, 8, 12, 0, 0, 6692, 6694, 8, 15, 0, 0, 6693, 6687, 1, 0, 0, 0, 6693, 6688, 1, 0, 0, 0, 6693, 6690, 1, 0, 0, 0, 6693, 6692, 1, 0, 0, 0, 6694, 6697, 1, 0, 0, 0, 6695, 6693, 1, 0, 0, 0, 6695, 6696, 1, 0, 0, 0, 6696, 6701, 1, 0, 0, 0, 6697, 6695, 1, 0, 0, 0, 6698, 6700, 5, 58, 0, 0, 6699, 6698, 1, 0, 0, 0, 6700, 6703, 1, 0, 0, 0, 6701, 6699, 1, 0, 0, 0, 6701, 6702, 1, 0, 0, 0, 6702, 6705, 1, 0, 0, 0, 6703, 6701, 1, 0, 0, 0, 6704, 6706, 5, 58, 0, 0, 6705, 6704, 1, 0, 0, 0, 6706, 6707, 1, 0, 0, 0, 6707, 6705, 1, 0, 0, 0, 6707, 6708, 1, 0, 0, 0, 6708, 6709, 1, 0, 0, 0, 6709, 6710, 5, 41, 0, 0, 6710, 6711, 1, 0, 0, 0, 6711, 6712, 6, 602, 2, 0, 6712, 6713, 6, 602, 202, 0, 6713, 1211, 1, 0, 0, 0, 6714, 6715, 7, 16, 0, 0, 6715, 6716, 1, 0, 0, 0, 6716, 6717, 6, 603, 203, 0, 6717, 1213, 1, 0, 0, 0, 6718, 6719, 3, 98, 46, 0, 6719, 6720, 3, 98, 46, 0, 6720, 6721, 3, 44, 19, 0, 6721, 6722, 1, 0, 0, 0, 6722, 6723, 6, 604, 3, 0, 6723, 6724, 6, 604, 204, 0, 6724, 1215, 1, 0, 0, 0, 6725, 6726, 3, 50, 22, 0, 6726, 6727, 3, 98, 46, 0, 6727, 6728, 1, 0, 0, 0, 6728, 6729, 6, 605, 4, 0, 6729, 6730, 6, 605, 205, 0, 6730, 1217, 1, 0, 0, 0, 6731, 6732, 8, 17, 0, 0, 6732, 6733, 1, 0, 0, 0, 6733, 6734, 6, 606, 17, 0, 6734, 1219, 1, 0, 0, 0, 116, 0, 1, 2, 3, 4, 5, 1229, 1232, 1241, 1244, 1246, 1250, 1376, 1381, 1399, 1409, 1419, 1422, 1440, 1442, 1459, 1462, 1475, 1478, 1496, 1507, 1512, 1519, 1522, 1530, 2641, 2643, 2665, 2669, 2673, 2682, 2692, 2694, 2709, 2711, 2717, 2723, 2814, 2826, 2836, 2839, 2892, 2904, 2914, 2917, 2936, 2939, 2950, 2953, 2955, 2959, 3087, 3107, 3119, 3129, 3132, 3160, 3162, 3181, 3184, 3199, 3202, 3222, 3235, 3240, 3247, 3250, 3260, 4711, 4713, 4743, 4757, 4769, 4771, 4788, 4790, 4796, 4802, 4841, 4844, 4855, 4858, 4860, 4864, 4992, 5012, 5024, 5034, 5037, 5065, 5067, 5086, 5089, 5104, 5107, 5127, 5140, 5145, 5152, 5155, 5165, 6616, 6618, 6648, 6662, 6674, 6676, 6693, 6695, 6701, 6707, 208, 5, 2, 0, 5, 3, 0, 0, 1, 0, 5, 1, 0, 4, 0, 0, 7, 50, 0, 7, 24, 0, 7, 25, 0, 5, 0, 0, 7, 1, 0, 7, 11, 0, 7, 3, 0, 7, 4, 0, 5, 4, 0, 7, 26, 0, 7, 9, 0, 7, 10, 0, 7, 196, 0, 7, 2, 0, 7, 12, 0, 5, 5, 0, 7, 5, 0, 7, 6, 0, 7, 7, 0, 7, 8, 0, 7, 13, 0, 7, 14, 0, 7, 15, 0, 7, 16, 0, 7, 17, 0, 7, 18, 0, 7, 19, 0, 7, 20, 0, 7, 21, 0, 7, 22, 0, 7, 23, 0, 1, 240, 0, 1, 242, 1, 7, 27, 0, 7, 28, 0, 7, 29, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, 7, 33, 0, 7, 34, 0, 7, 35, 0, 7, 36, 0, 7, 37, 0, 7, 38, 0, 7, 39, 0, 7, 40, 0, 7, 41, 0, 7, 42, 0, 7, 43, 0, 7, 44, 0, 7, 45, 0, 7, 46, 0, 7, 47, 0, 7, 48, 0, 7, 49, 0, 7, 51, 0, 7, 52, 0, 7, 53, 0, 7, 54, 0, 7, 55, 0, 7, 56, 0, 7, 57, 0, 7, 58, 0, 7, 59, 0, 7, 60, 0, 7, 61, 0, 7, 62, 0, 7, 63, 0, 7, 64, 0, 7, 65, 0, 7, 66, 0, 7, 67, 0, 7, 68, 0, 7, 69, 0, 7, 70, 0, 7, 71, 0, 7, 72, 0, 7, 73, 0, 7, 74, 0, 7, 75, 0, 7, 76, 0, 7, 77, 0, 7, 78, 0, 7, 79, 0, 7, 80, 0, 7, 81, 0, 7, 82, 0, 7, 83, 0, 7, 84, 0, 7, 85, 0, 7, 86, 0, 7, 87, 0, 7, 88, 0, 7, 89, 0, 7, 90, 0, 7, 91, 0, 7, 92, 0, 7, 93, 0, 7, 94, 0, 7, 95, 0, 7, 96, 0, 7, 97, 0, 7, 98, 0, 7, 99, 0, 7, 100, 0, 7, 101, 0, 7, 102, 0, 7, 103, 0, 7, 104, 0, 7, 105, 0, 7, 106, 0, 7, 107, 0, 7, 108, 0, 7, 109, 0, 7, 110, 0, 7, 111, 0, 7, 112, 0, 7, 113, 0, 7, 114, 0, 7, 115, 0, 7, 116, 0, 7, 117, 0, 7, 118, 0, 7, 119, 0, 7, 120, 0, 7, 121, 0, 7, 122, 0, 7, 123, 0, 7, 124, 0, 7, 125, 0, 7, 126, 0, 7, 127, 0, 7, 128, 0, 7, 129, 0, 7, 130, 0, 7, 131, 0, 7, 132, 0, 7, 133, 0, 7, 134, 0, 7, 135, 0, 7, 136, 0, 7, 137, 0, 7, 138, 0, 7, 139, 0, 7, 140, 0, 7, 141, 0, 7, 142, 0, 7, 143, 0, 7, 144, 0, 7, 145, 0, 7, 146, 0, 7, 147, 0, 7, 148, 0, 7, 149, 0, 7, 150, 0, 7, 151, 0, 7, 152, 0, 7, 153, 0, 7, 154, 0, 7, 155, 0, 7, 156, 0, 7, 157, 0, 7, 158, 0, 7, 159, 0, 7, 160, 0, 7, 161, 0, 7, 162, 0, 7, 163, 0, 7, 164, 0, 7, 165, 0, 7, 166, 0, 7, 167, 0, 7, 168, 0, 7, 169, 0, 7, 170, 0, 7, 171, 0, 7, 172, 0, 7, 173, 0, 7, 174, 0, 7, 175, 0, 7, 176, 0, 7, 177, 0, 7, 178, 0, 7, 179, 0, 7, 180, 0, 7, 181, 0, 7, 182, 0, 7, 183, 0, 7, 184, 0, 7, 185, 0, 7, 186, 0, 7, 187, 0, 7, 188, 0, 7, 189, 0, 7, 190, 0, 7, 191, 0, 7, 192, 0, 7, 193, 0, 7, 194, 0, 7, 198, 0, 1, 434, 2, 1, 436, 3]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/parser/XQueryParser.interp b/src/main/java/org/rumbledb/parser/XQueryParser.interp
new file mode 100644
index 0000000000..265dac8da9
--- /dev/null
+++ b/src/main/java/org/rumbledb/parser/XQueryParser.interp
@@ -0,0 +1,659 @@
+token literal names:
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+
+token symbolic names:
+null
+EscapeQuot
+EscapeApos
+DOUBLE_LBRACE
+DOUBLE_RBRACE
+IntegerLiteral
+DecimalLiteral
+DoubleLiteral
+DFPropertyName
+PredefinedEntityRef
+CharRef
+Quot
+Apos
+COMMENT
+XMLDECL
+PI
+CDATA
+PRAGMA
+WS
+EQUAL
+NOT_EQUAL
+LPAREN
+RPAREN
+LBRACKET
+RBRACKET
+LBRACE
+RBRACE
+STAR
+PLUS
+MINUS
+COMMA
+DOT
+DDOT
+COLON
+COLON_EQ
+SEMICOLON
+SLASH
+DSLASH
+BACKSLASH
+VBAR
+LANGLE
+RANGLE
+QUESTION
+AT
+DOLLAR
+MOD
+BANG
+HASH
+CARAT
+ARROW
+GRAVE
+CONCATENATION
+TILDE
+KW_ALLOWING
+KW_ANCESTOR
+KW_ANCESTOR_OR_SELF
+KW_AND
+KW_ARRAY
+KW_AS
+KW_ASCENDING
+KW_AT
+KW_ATTRIBUTE
+KW_BASE_URI
+KW_BOUNDARY_SPACE
+KW_BINARY
+KW_BY
+KW_CASE
+KW_CAST
+KW_CASTABLE
+KW_CATCH
+KW_CHILD
+KW_COLLATION
+KW_COMMENT
+KW_CONSTRUCTION
+KW_CONTEXT
+KW_COPY_NS
+KW_COUNT
+KW_DECLARE
+KW_DEFAULT
+KW_DESCENDANT
+KW_DESCENDANT_OR_SELF
+KW_DESCENDING
+KW_DECIMAL_FORMAT
+KW_DIV
+KW_DOCUMENT
+KW_DOCUMENT_NODE
+KW_ELEMENT
+KW_ELSE
+KW_EMPTY
+KW_EMPTY_SEQUENCE
+KW_ENCODING
+KW_END
+KW_EQ
+KW_EVERY
+KW_EXCEPT
+KW_EXTERNAL
+KW_FOLLOWING
+KW_FOLLOWING_SIBLING
+KW_FOR
+KW_FUNCTION
+KW_GE
+KW_GREATEST
+KW_GROUP
+KW_GT
+KW_IDIV
+KW_IF
+KW_IMPORT
+KW_IN
+KW_INHERIT
+KW_INSTANCE
+KW_INTERSECT
+KW_IS
+KW_ITEM
+KW_LAX
+KW_LE
+KW_LEAST
+KW_LET
+KW_LT
+KW_MAP
+KW_MOD
+KW_MODULE
+KW_NAMESPACE
+KW_NE
+KW_NEXT
+KW_NAMESPACE_NODE
+KW_NO_INHERIT
+KW_NO_PRESERVE
+KW_NODE
+KW_OF
+KW_ONLY
+KW_OPTION
+KW_OR
+KW_ORDER
+KW_ORDERED
+KW_ORDERING
+KW_PARENT
+KW_PRECEDING
+KW_PRECEDING_SIBLING
+KW_PRESERVE
+KW_PREVIOUS
+KW_PI
+KW_RETURN
+KW_SATISFIES
+KW_SCHEMA
+KW_SCHEMA_ATTR
+KW_SCHEMA_ELEM
+KW_SELF
+KW_SLIDING
+KW_SOME
+KW_STABLE
+KW_START
+KW_STRICT
+KW_STRIP
+KW_SWITCH
+KW_TEXT
+KW_THEN
+KW_TO
+KW_TREAT
+KW_TRY
+KW_TUMBLING
+KW_TYPE
+KW_TYPESWITCH
+KW_UNION
+KW_UNORDERED
+KW_UPDATE
+KW_VALIDATE
+KW_VARIABLE
+KW_VERSION
+KW_WHEN
+KW_WHERE
+KW_WINDOW
+KW_XQUERY
+KW_ARRAY_NODE
+KW_BOOLEAN_NODE
+KW_NULL_NODE
+KW_NUMBER_NODE
+KW_OBJECT_NODE
+KW_REPLACE
+KW_WITH
+KW_VALUE
+KW_INSERT
+KW_INTO
+KW_DELETE
+KW_RENAME
+URIQualifiedName
+FullQName
+NCNameWithLocalWildcard
+NCNameWithPrefixWildcard
+NCName
+XQDOC_COMMENT_START
+XQDOC_COMMENT_END
+XQDocComment
+XQComment
+CHAR
+ENTER_STRING
+EXIT_INTERPOLATION
+ContentChar
+BASIC_CHAR
+ENTER_INTERPOLATION
+EXIT_STRING
+EscapeQuot_QuotString
+DOUBLE_LBRACE_QuotString
+DOUBLE_RBRACE_QuotString
+EscapeApos_AposString
+
+rule names:
+module
+xqDocComment
+versionDecl
+mainModule
+queryBody
+libraryModule
+moduleDecl
+prolog
+annotatedDecl
+defaultNamespaceDecl
+setter
+boundarySpaceDecl
+defaultCollationDecl
+baseURIDecl
+constructionDecl
+orderingModeDecl
+emptyOrderDecl
+copyNamespacesDecl
+preserveMode
+inheritMode
+decimalFormatDecl
+schemaImport
+schemaPrefix
+moduleImport
+namespaceDecl
+varDecl
+varValue
+varDefaultValue
+contextItemDecl
+functionDecl
+functionParams
+functionParam
+annotations
+annotation
+annotList
+annotationParam
+functionReturn
+optionDecl
+expr
+exprSingle
+flworExpr
+initialClause
+intermediateClause
+forClause
+forBinding
+allowingEmpty
+positionalVar
+letClause
+letBinding
+windowClause
+tumblingWindowClause
+slidingWindowClause
+windowStartCondition
+windowEndCondition
+windowVars
+countClause
+whereClause
+groupByClause
+groupingSpecList
+groupingSpec
+orderByClause
+orderSpec
+returnClause
+quantifiedExpr
+quantifiedVar
+switchExpr
+switchCaseClause
+switchCaseOperand
+typeswitchExpr
+caseClause
+sequenceUnionType
+ifExpr
+tryCatchExpr
+tryClause
+enclosedTryTargetExpression
+catchClause
+enclosedExpression
+catchErrorList
+existUpdateExpr
+existReplaceExpr
+existValueExpr
+existInsertExpr
+existDeleteExpr
+existRenameExpr
+orExpr
+andExpr
+comparisonExpr
+stringConcatExpr
+rangeExpr
+additiveExpr
+multiplicativeExpr
+unionExpr
+intersectExceptExpr
+instanceOfExpr
+treatExpr
+castableExpr
+castExpr
+arrowExpr
+complexArrow
+unaryExpr
+valueExpr
+generalComp
+valueComp
+nodeComp
+validateExpr
+validationMode
+extensionExpr
+simpleMapExpr
+pathExpr
+relativePathExpr
+stepExpr
+axisStep
+forwardStep
+forwardAxis
+abbrevForwardStep
+reverseStep
+reverseAxis
+abbrevReverseStep
+nodeTest
+nameTest
+wildcard
+postfixExpr
+argumentList
+predicateList
+predicate
+lookup
+keySpecifier
+arrowFunctionSpecifier
+primaryExpr
+literal
+numericLiteral
+varRef
+varName
+parenthesizedExpr
+contextItemExpr
+orderedExpr
+unorderedExpr
+functionCall
+argument
+nodeConstructor
+directConstructor
+dirElemConstructorOpenClose
+dirElemConstructorSingleTag
+dirAttributeList
+dirAttributeValueApos
+dirAttributeValueQuot
+dirAttributeValue
+dirAttributeContentQuot
+dirAttributeContentApos
+dirElemContent
+commonContent
+computedConstructor
+compMLJSONConstructor
+compMLJSONArrayConstructor
+compMLJSONObjectConstructor
+compMLJSONNumberConstructor
+compMLJSONBooleanConstructor
+compMLJSONNullConstructor
+compBinaryConstructor
+compDocConstructor
+compElemConstructor
+enclosedContentExpr
+compAttrConstructor
+compNamespaceConstructor
+prefix
+enclosedPrefixExpr
+enclosedURIExpr
+compTextConstructor
+compCommentConstructor
+compPIConstructor
+functionItemExpr
+namedFunctionRef
+inlineFunctionRef
+functionBody
+mapConstructor
+mapConstructorEntry
+arrayConstructor
+squareArrayConstructor
+curlyArrayConstructor
+stringConstructor
+stringConstructorContent
+charNoGrave
+charNoLBrace
+charNoRBrack
+stringConstructorChars
+stringConstructorInterpolation
+unaryLookup
+singleType
+typeDeclaration
+sequenceType
+itemType
+atomicOrUnionType
+kindTest
+anyKindTest
+binaryNodeTest
+documentTest
+textTest
+commentTest
+namespaceNodeTest
+piTest
+attributeTest
+attributeNameOrWildcard
+schemaAttributeTest
+elementTest
+elementNameOrWildcard
+schemaElementTest
+elementDeclaration
+attributeName
+elementName
+simpleTypeName
+typeName
+functionTest
+anyFunctionTest
+typedFunctionTest
+mapTest
+anyMapTest
+typedMapTest
+arrayTest
+anyArrayTest
+typedArrayTest
+parenthesizedItemTest
+attributeDeclaration
+mlNodeTest
+mlArrayNodeTest
+mlObjectNodeTest
+mlNumberNodeTest
+mlBooleanNodeTest
+mlNullNodeTest
+eqName
+qName
+ncName
+functionName
+keyword
+keywordNotOKForFunction
+keywordOKForFunction
+uriLiteral
+stringLiteralQuot
+stringLiteralApos
+stringLiteral
+stringContentQuot
+stringContentApos
+noQuotesNoBracesNoAmpNoLAng
+
+
+atn:
+[4, 1, 203, 2133, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 1, 0, 3, 0, 486, 8, 0, 1, 0, 3, 0, 489, 8, 0, 1, 0, 3, 0, 492, 8, 0, 1, 0, 1, 0, 3, 0, 496, 8, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 505, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 529, 8, 7, 1, 7, 1, 7, 5, 7, 533, 8, 7, 10, 7, 12, 7, 536, 9, 7, 1, 7, 3, 7, 539, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 544, 8, 7, 10, 7, 12, 7, 547, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 553, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 569, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 613, 8, 20, 1, 20, 1, 20, 1, 20, 5, 20, 618, 8, 20, 10, 20, 12, 20, 621, 9, 20, 1, 21, 1, 21, 1, 21, 3, 21, 626, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 633, 8, 21, 10, 21, 12, 21, 636, 9, 21, 3, 21, 638, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 647, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 655, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 662, 8, 23, 10, 23, 12, 23, 665, 9, 23, 3, 23, 667, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 681, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 688, 8, 25, 3, 25, 690, 8, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 701, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 708, 8, 28, 3, 28, 710, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 718, 8, 29, 1, 29, 1, 29, 3, 29, 722, 8, 29, 1, 29, 1, 29, 3, 29, 726, 8, 29, 1, 30, 1, 30, 1, 30, 5, 30, 731, 8, 30, 10, 30, 12, 30, 734, 9, 30, 1, 31, 1, 31, 1, 31, 3, 31, 739, 8, 31, 1, 32, 5, 32, 742, 8, 32, 10, 32, 12, 32, 745, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 753, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 758, 8, 34, 10, 34, 12, 34, 761, 9, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 789, 8, 39, 1, 40, 1, 40, 5, 40, 793, 8, 40, 10, 40, 12, 40, 796, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 803, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 810, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 816, 8, 43, 10, 43, 12, 43, 819, 9, 43, 1, 44, 1, 44, 1, 44, 3, 44, 824, 8, 44, 1, 44, 3, 44, 827, 8, 44, 1, 44, 3, 44, 830, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 846, 8, 47, 10, 47, 12, 47, 849, 9, 47, 1, 48, 1, 48, 1, 48, 3, 48, 854, 8, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 3, 49, 862, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 869, 8, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 875, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 882, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 3, 53, 895, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 904, 8, 54, 1, 54, 3, 54, 907, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 912, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 917, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 933, 8, 58, 10, 58, 12, 58, 936, 9, 58, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 3, 59, 945, 8, 59, 1, 59, 1, 59, 3, 59, 949, 8, 59, 1, 60, 3, 60, 952, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 959, 8, 60, 10, 60, 12, 60, 962, 9, 60, 1, 61, 1, 61, 1, 61, 3, 61, 967, 8, 61, 1, 61, 1, 61, 1, 61, 3, 61, 972, 8, 61, 3, 61, 974, 8, 61, 1, 61, 1, 61, 3, 61, 978, 8, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 985, 8, 63, 1, 63, 1, 63, 1, 63, 5, 63, 990, 8, 63, 10, 63, 12, 63, 993, 9, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1001, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 4, 65, 1011, 8, 65, 11, 65, 12, 65, 1012, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 4, 66, 1021, 8, 66, 11, 66, 12, 66, 1022, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 4, 68, 1035, 8, 68, 11, 68, 12, 68, 1036, 1, 68, 1, 68, 1, 68, 3, 68, 1042, 8, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1052, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1061, 8, 70, 10, 70, 12, 70, 1064, 9, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 4, 72, 1077, 8, 72, 11, 72, 12, 72, 1078, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1093, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 3, 76, 1099, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 5, 77, 1106, 8, 77, 10, 77, 12, 77, 1109, 9, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1117, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 5, 84, 1145, 8, 84, 10, 84, 12, 84, 1148, 9, 84, 1, 85, 1, 85, 1, 85, 5, 85, 1153, 8, 85, 10, 85, 12, 85, 1156, 9, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1162, 8, 86, 1, 86, 1, 86, 3, 86, 1166, 8, 86, 1, 87, 1, 87, 1, 87, 5, 87, 1171, 8, 87, 10, 87, 12, 87, 1174, 9, 87, 1, 88, 1, 88, 1, 88, 3, 88, 1179, 8, 88, 1, 89, 1, 89, 1, 89, 5, 89, 1184, 8, 89, 10, 89, 12, 89, 1187, 9, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1192, 8, 90, 10, 90, 12, 90, 1195, 9, 90, 1, 91, 1, 91, 1, 91, 5, 91, 1200, 8, 91, 10, 91, 12, 91, 1203, 9, 91, 1, 92, 1, 92, 1, 92, 5, 92, 1208, 8, 92, 10, 92, 12, 92, 1211, 9, 92, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1217, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1223, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1229, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1235, 8, 96, 1, 97, 1, 97, 1, 97, 5, 97, 1240, 8, 97, 10, 97, 12, 97, 1243, 9, 97, 1, 98, 1, 98, 1, 98, 1, 99, 5, 99, 1249, 8, 99, 10, 99, 12, 99, 1252, 9, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 3, 100, 1259, 8, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 1269, 8, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1278, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1284, 8, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 4, 106, 1291, 8, 106, 11, 106, 12, 106, 1292, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 5, 107, 1302, 8, 107, 10, 107, 12, 107, 1305, 9, 107, 1, 108, 1, 108, 3, 108, 1309, 8, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1314, 8, 108, 1, 109, 1, 109, 1, 109, 5, 109, 1319, 8, 109, 10, 109, 12, 109, 1322, 9, 109, 1, 110, 1, 110, 3, 110, 1326, 8, 110, 1, 111, 1, 111, 3, 111, 1330, 8, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1338, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 3, 114, 1345, 8, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1353, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 3, 118, 1363, 8, 118, 1, 119, 1, 119, 3, 119, 1367, 8, 119, 1, 120, 1, 120, 1, 120, 3, 120, 1372, 8, 120, 1, 121, 1, 121, 1, 121, 1, 121, 5, 121, 1378, 8, 121, 10, 121, 12, 121, 1381, 9, 121, 1, 122, 1, 122, 1, 122, 1, 122, 5, 122, 1387, 8, 122, 10, 122, 12, 122, 1390, 9, 122, 3, 122, 1392, 8, 122, 1, 122, 1, 122, 1, 123, 5, 123, 1397, 8, 123, 10, 123, 12, 123, 1400, 9, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 3, 126, 1413, 8, 126, 1, 127, 1, 127, 1, 127, 3, 127, 1418, 8, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 3, 128, 1433, 8, 128, 1, 129, 1, 129, 3, 129, 1437, 8, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 3, 133, 1448, 8, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 3, 138, 1465, 8, 138, 1, 139, 1, 139, 3, 139, 1469, 8, 139, 1, 140, 1, 140, 1, 140, 3, 140, 1474, 8, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1481, 8, 141, 10, 141, 12, 141, 1484, 9, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1501, 8, 143, 10, 143, 12, 143, 1504, 9, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 5, 144, 1511, 8, 144, 10, 144, 12, 144, 1514, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1523, 8, 145, 10, 145, 12, 145, 1526, 9, 145, 1, 145, 1, 145, 1, 146, 1, 146, 3, 146, 1532, 8, 146, 1, 147, 4, 147, 1535, 8, 147, 11, 147, 12, 147, 1536, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 1544, 8, 147, 1, 147, 3, 147, 1547, 8, 147, 1, 148, 4, 148, 1550, 8, 148, 11, 148, 12, 148, 1551, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 3, 148, 1559, 8, 148, 1, 148, 3, 148, 1562, 8, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 1570, 8, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1581, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 3, 151, 1591, 8, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 1599, 8, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 5, 154, 1614, 8, 154, 10, 154, 12, 154, 1617, 9, 154, 3, 154, 1619, 8, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 3, 160, 1647, 8, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 3, 162, 1659, 8, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 3, 163, 1666, 8, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 1688, 8, 169, 1, 169, 1, 169, 1, 170, 1, 170, 3, 170, 1694, 8, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1704, 8, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1709, 8, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 5, 174, 1720, 8, 174, 10, 174, 12, 174, 1723, 9, 174, 3, 174, 1725, 8, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 3, 176, 1735, 8, 176, 1, 177, 1, 177, 3, 177, 1739, 8, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 1754, 8, 180, 10, 180, 12, 180, 1757, 9, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 5, 184, 1775, 8, 184, 10, 184, 12, 184, 1778, 9, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 3, 187, 1789, 8, 187, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 3, 189, 1801, 8, 189, 3, 189, 1803, 8, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 3, 190, 1814, 8, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 3, 192, 1830, 8, 192, 1, 193, 1, 193, 1, 193, 3, 193, 1835, 8, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 3, 195, 1847, 8, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 3, 199, 1867, 8, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 3, 200, 1876, 8, 200, 3, 200, 1878, 8, 200, 1, 200, 1, 200, 1, 201, 1, 201, 3, 201, 1884, 8, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 3, 203, 1897, 8, 203, 3, 203, 1899, 8, 203, 3, 203, 1901, 8, 203, 1, 203, 1, 203, 1, 204, 1, 204, 3, 204, 1907, 8, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 5, 211, 1925, 8, 211, 10, 211, 12, 211, 1928, 9, 211, 1, 211, 1, 211, 3, 211, 1932, 8, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 5, 213, 1944, 8, 213, 10, 213, 12, 213, 1947, 9, 213, 3, 213, 1949, 8, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 3, 214, 1957, 8, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 3, 217, 1973, 8, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 1996, 8, 222, 1, 223, 1, 223, 1, 223, 3, 223, 2001, 8, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 3, 224, 2008, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 3, 225, 2015, 8, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 3, 226, 2022, 8, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 3, 227, 2029, 8, 227, 1, 227, 1, 227, 1, 228, 1, 228, 3, 228, 2035, 8, 228, 1, 229, 1, 229, 3, 229, 2039, 8, 229, 1, 230, 1, 230, 3, 230, 2043, 8, 230, 1, 231, 1, 231, 1, 231, 1, 231, 3, 231, 2049, 8, 231, 1, 232, 1, 232, 3, 232, 2053, 8, 232, 1, 233, 1, 233, 1, 234, 1, 234, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 5, 236, 2066, 8, 236, 10, 236, 12, 236, 2069, 9, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 5, 237, 2078, 8, 237, 10, 237, 12, 237, 2081, 9, 237, 1, 237, 1, 237, 1, 238, 1, 238, 3, 238, 2087, 8, 238, 1, 239, 4, 239, 2090, 8, 239, 11, 239, 12, 239, 2091, 1, 239, 1, 239, 3, 239, 2096, 8, 239, 1, 239, 3, 239, 2099, 8, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 3, 239, 2106, 8, 239, 1, 240, 4, 240, 2109, 8, 240, 11, 240, 12, 240, 2110, 1, 240, 1, 240, 3, 240, 2115, 8, 240, 1, 240, 3, 240, 2118, 8, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 3, 240, 2125, 8, 240, 1, 241, 1, 241, 4, 241, 2129, 8, 241, 11, 241, 12, 241, 2130, 1, 241, 0, 0, 242, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, 480, 482, 0, 27, 2, 0, 86, 86, 99, 99, 2, 0, 138, 138, 152, 152, 2, 0, 133, 133, 163, 163, 2, 0, 101, 101, 115, 115, 2, 0, 126, 126, 138, 138, 2, 0, 108, 108, 125, 125, 3, 0, 96, 96, 136, 136, 181, 181, 1, 0, 28, 29, 4, 0, 27, 27, 83, 83, 104, 104, 119, 119, 2, 0, 39, 39, 162, 162, 2, 0, 94, 94, 110, 110, 6, 0, 92, 92, 100, 100, 103, 103, 114, 114, 117, 117, 122, 122, 2, 0, 58, 58, 160, 160, 2, 0, 113, 113, 151, 151, 1, 0, 36, 37, 5, 0, 61, 61, 70, 70, 79, 80, 96, 97, 146, 146, 2, 0, 54, 55, 135, 137, 1, 0, 5, 7, 2, 0, 13, 13, 15, 15, 1, 0, 9, 10, 1, 0, 33, 34, 2, 0, 24, 25, 197, 197, 3, 0, 24, 24, 50, 50, 197, 197, 3, 0, 25, 25, 50, 50, 197, 197, 28, 0, 8, 8, 53, 53, 57, 57, 61, 61, 64, 64, 69, 69, 72, 72, 74, 74, 76, 76, 82, 82, 85, 86, 89, 89, 91, 91, 105, 105, 112, 112, 118, 118, 123, 124, 127, 127, 129, 129, 140, 140, 144, 145, 147, 147, 153, 154, 158, 161, 164, 164, 168, 168, 170, 170, 172, 183, 26, 0, 54, 56, 58, 60, 62, 63, 65, 68, 70, 71, 73, 73, 75, 75, 77, 81, 83, 84, 87, 88, 90, 90, 92, 104, 106, 111, 113, 117, 119, 122, 125, 126, 128, 128, 130, 138, 141, 143, 146, 146, 148, 152, 155, 157, 162, 163, 165, 167, 169, 169, 171, 171, 11, 0, 5, 7, 13, 13, 17, 17, 19, 24, 27, 39, 41, 50, 52, 52, 123, 123, 139, 139, 184, 189, 196, 196, 2212, 0, 485, 1, 0, 0, 0, 2, 497, 1, 0, 0, 0, 4, 499, 1, 0, 0, 0, 6, 508, 1, 0, 0, 0, 8, 511, 1, 0, 0, 0, 10, 513, 1, 0, 0, 0, 12, 516, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 16, 552, 1, 0, 0, 0, 18, 554, 1, 0, 0, 0, 20, 568, 1, 0, 0, 0, 22, 570, 1, 0, 0, 0, 24, 574, 1, 0, 0, 0, 26, 579, 1, 0, 0, 0, 28, 583, 1, 0, 0, 0, 30, 587, 1, 0, 0, 0, 32, 591, 1, 0, 0, 0, 34, 597, 1, 0, 0, 0, 36, 603, 1, 0, 0, 0, 38, 605, 1, 0, 0, 0, 40, 607, 1, 0, 0, 0, 42, 622, 1, 0, 0, 0, 44, 646, 1, 0, 0, 0, 46, 648, 1, 0, 0, 0, 48, 668, 1, 0, 0, 0, 50, 674, 1, 0, 0, 0, 52, 691, 1, 0, 0, 0, 54, 693, 1, 0, 0, 0, 56, 695, 1, 0, 0, 0, 58, 711, 1, 0, 0, 0, 60, 727, 1, 0, 0, 0, 62, 735, 1, 0, 0, 0, 64, 743, 1, 0, 0, 0, 66, 746, 1, 0, 0, 0, 68, 754, 1, 0, 0, 0, 70, 762, 1, 0, 0, 0, 72, 764, 1, 0, 0, 0, 74, 767, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 790, 1, 0, 0, 0, 82, 802, 1, 0, 0, 0, 84, 809, 1, 0, 0, 0, 86, 811, 1, 0, 0, 0, 88, 820, 1, 0, 0, 0, 90, 834, 1, 0, 0, 0, 92, 837, 1, 0, 0, 0, 94, 841, 1, 0, 0, 0, 96, 850, 1, 0, 0, 0, 98, 858, 1, 0, 0, 0, 100, 863, 1, 0, 0, 0, 102, 876, 1, 0, 0, 0, 104, 888, 1, 0, 0, 0, 106, 894, 1, 0, 0, 0, 108, 903, 1, 0, 0, 0, 110, 918, 1, 0, 0, 0, 112, 922, 1, 0, 0, 0, 114, 925, 1, 0, 0, 0, 116, 929, 1, 0, 0, 0, 118, 937, 1, 0, 0, 0, 120, 951, 1, 0, 0, 0, 122, 963, 1, 0, 0, 0, 124, 979, 1, 0, 0, 0, 126, 984, 1, 0, 0, 0, 128, 997, 1, 0, 0, 0, 130, 1005, 1, 0, 0, 0, 132, 1020, 1, 0, 0, 0, 134, 1027, 1, 0, 0, 0, 136, 1029, 1, 0, 0, 0, 138, 1046, 1, 0, 0, 0, 140, 1057, 1, 0, 0, 0, 142, 1065, 1, 0, 0, 0, 144, 1074, 1, 0, 0, 0, 146, 1080, 1, 0, 0, 0, 148, 1083, 1, 0, 0, 0, 150, 1085, 1, 0, 0, 0, 152, 1096, 1, 0, 0, 0, 154, 1102, 1, 0, 0, 0, 156, 1110, 1, 0, 0, 0, 158, 1118, 1, 0, 0, 0, 160, 1123, 1, 0, 0, 0, 162, 1128, 1, 0, 0, 0, 164, 1133, 1, 0, 0, 0, 166, 1136, 1, 0, 0, 0, 168, 1141, 1, 0, 0, 0, 170, 1149, 1, 0, 0, 0, 172, 1157, 1, 0, 0, 0, 174, 1167, 1, 0, 0, 0, 176, 1175, 1, 0, 0, 0, 178, 1180, 1, 0, 0, 0, 180, 1188, 1, 0, 0, 0, 182, 1196, 1, 0, 0, 0, 184, 1204, 1, 0, 0, 0, 186, 1212, 1, 0, 0, 0, 188, 1218, 1, 0, 0, 0, 190, 1224, 1, 0, 0, 0, 192, 1230, 1, 0, 0, 0, 194, 1236, 1, 0, 0, 0, 196, 1244, 1, 0, 0, 0, 198, 1250, 1, 0, 0, 0, 200, 1258, 1, 0, 0, 0, 202, 1268, 1, 0, 0, 0, 204, 1270, 1, 0, 0, 0, 206, 1277, 1, 0, 0, 0, 208, 1279, 1, 0, 0, 0, 210, 1287, 1, 0, 0, 0, 212, 1290, 1, 0, 0, 0, 214, 1298, 1, 0, 0, 0, 216, 1313, 1, 0, 0, 0, 218, 1315, 1, 0, 0, 0, 220, 1325, 1, 0, 0, 0, 222, 1329, 1, 0, 0, 0, 224, 1337, 1, 0, 0, 0, 226, 1339, 1, 0, 0, 0, 228, 1344, 1, 0, 0, 0, 230, 1352, 1, 0, 0, 0, 232, 1354, 1, 0, 0, 0, 234, 1358, 1, 0, 0, 0, 236, 1362, 1, 0, 0, 0, 238, 1366, 1, 0, 0, 0, 240, 1371, 1, 0, 0, 0, 242, 1373, 1, 0, 0, 0, 244, 1382, 1, 0, 0, 0, 246, 1398, 1, 0, 0, 0, 248, 1401, 1, 0, 0, 0, 250, 1405, 1, 0, 0, 0, 252, 1412, 1, 0, 0, 0, 254, 1417, 1, 0, 0, 0, 256, 1432, 1, 0, 0, 0, 258, 1436, 1, 0, 0, 0, 260, 1438, 1, 0, 0, 0, 262, 1440, 1, 0, 0, 0, 264, 1443, 1, 0, 0, 0, 266, 1445, 1, 0, 0, 0, 268, 1451, 1, 0, 0, 0, 270, 1453, 1, 0, 0, 0, 272, 1456, 1, 0, 0, 0, 274, 1459, 1, 0, 0, 0, 276, 1464, 1, 0, 0, 0, 278, 1468, 1, 0, 0, 0, 280, 1473, 1, 0, 0, 0, 282, 1475, 1, 0, 0, 0, 284, 1490, 1, 0, 0, 0, 286, 1502, 1, 0, 0, 0, 288, 1505, 1, 0, 0, 0, 290, 1517, 1, 0, 0, 0, 292, 1531, 1, 0, 0, 0, 294, 1546, 1, 0, 0, 0, 296, 1561, 1, 0, 0, 0, 298, 1569, 1, 0, 0, 0, 300, 1580, 1, 0, 0, 0, 302, 1590, 1, 0, 0, 0, 304, 1598, 1, 0, 0, 0, 306, 1600, 1, 0, 0, 0, 308, 1603, 1, 0, 0, 0, 310, 1622, 1, 0, 0, 0, 312, 1625, 1, 0, 0, 0, 314, 1630, 1, 0, 0, 0, 316, 1634, 1, 0, 0, 0, 318, 1637, 1, 0, 0, 0, 320, 1640, 1, 0, 0, 0, 322, 1650, 1, 0, 0, 0, 324, 1652, 1, 0, 0, 0, 326, 1662, 1, 0, 0, 0, 328, 1669, 1, 0, 0, 0, 330, 1671, 1, 0, 0, 0, 332, 1673, 1, 0, 0, 0, 334, 1675, 1, 0, 0, 0, 336, 1678, 1, 0, 0, 0, 338, 1681, 1, 0, 0, 0, 340, 1693, 1, 0, 0, 0, 342, 1695, 1, 0, 0, 0, 344, 1699, 1, 0, 0, 0, 346, 1712, 1, 0, 0, 0, 348, 1714, 1, 0, 0, 0, 350, 1728, 1, 0, 0, 0, 352, 1734, 1, 0, 0, 0, 354, 1736, 1, 0, 0, 0, 356, 1742, 1, 0, 0, 0, 358, 1745, 1, 0, 0, 0, 360, 1749, 1, 0, 0, 0, 362, 1758, 1, 0, 0, 0, 364, 1760, 1, 0, 0, 0, 366, 1762, 1, 0, 0, 0, 368, 1776, 1, 0, 0, 0, 370, 1779, 1, 0, 0, 0, 372, 1783, 1, 0, 0, 0, 374, 1786, 1, 0, 0, 0, 376, 1790, 1, 0, 0, 0, 378, 1802, 1, 0, 0, 0, 380, 1813, 1, 0, 0, 0, 382, 1815, 1, 0, 0, 0, 384, 1829, 1, 0, 0, 0, 386, 1831, 1, 0, 0, 0, 388, 1838, 1, 0, 0, 0, 390, 1842, 1, 0, 0, 0, 392, 1850, 1, 0, 0, 0, 394, 1854, 1, 0, 0, 0, 396, 1858, 1, 0, 0, 0, 398, 1862, 1, 0, 0, 0, 400, 1870, 1, 0, 0, 0, 402, 1883, 1, 0, 0, 0, 404, 1885, 1, 0, 0, 0, 406, 1890, 1, 0, 0, 0, 408, 1906, 1, 0, 0, 0, 410, 1908, 1, 0, 0, 0, 412, 1913, 1, 0, 0, 0, 414, 1915, 1, 0, 0, 0, 416, 1917, 1, 0, 0, 0, 418, 1919, 1, 0, 0, 0, 420, 1921, 1, 0, 0, 0, 422, 1926, 1, 0, 0, 0, 424, 1933, 1, 0, 0, 0, 426, 1938, 1, 0, 0, 0, 428, 1956, 1, 0, 0, 0, 430, 1958, 1, 0, 0, 0, 432, 1963, 1, 0, 0, 0, 434, 1972, 1, 0, 0, 0, 436, 1974, 1, 0, 0, 0, 438, 1979, 1, 0, 0, 0, 440, 1984, 1, 0, 0, 0, 442, 1988, 1, 0, 0, 0, 444, 1995, 1, 0, 0, 0, 446, 1997, 1, 0, 0, 0, 448, 2004, 1, 0, 0, 0, 450, 2011, 1, 0, 0, 0, 452, 2018, 1, 0, 0, 0, 454, 2025, 1, 0, 0, 0, 456, 2034, 1, 0, 0, 0, 458, 2038, 1, 0, 0, 0, 460, 2042, 1, 0, 0, 0, 462, 2048, 1, 0, 0, 0, 464, 2052, 1, 0, 0, 0, 466, 2054, 1, 0, 0, 0, 468, 2056, 1, 0, 0, 0, 470, 2058, 1, 0, 0, 0, 472, 2060, 1, 0, 0, 0, 474, 2072, 1, 0, 0, 0, 476, 2086, 1, 0, 0, 0, 478, 2105, 1, 0, 0, 0, 480, 2124, 1, 0, 0, 0, 482, 2128, 1, 0, 0, 0, 484, 486, 3, 2, 1, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 489, 3, 4, 2, 0, 488, 487, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 491, 1, 0, 0, 0, 490, 492, 3, 2, 1, 0, 491, 490, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 495, 1, 0, 0, 0, 493, 496, 3, 10, 5, 0, 494, 496, 3, 6, 3, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 1, 1, 0, 0, 0, 497, 498, 5, 191, 0, 0, 498, 3, 1, 0, 0, 0, 499, 500, 5, 171, 0, 0, 500, 501, 5, 167, 0, 0, 501, 504, 3, 476, 238, 0, 502, 503, 5, 90, 0, 0, 503, 505, 3, 476, 238, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 5, 35, 0, 0, 507, 5, 1, 0, 0, 0, 508, 509, 3, 14, 7, 0, 509, 510, 3, 8, 4, 0, 510, 7, 1, 0, 0, 0, 511, 512, 3, 76, 38, 0, 512, 9, 1, 0, 0, 0, 513, 514, 3, 12, 6, 0, 514, 515, 3, 14, 7, 0, 515, 11, 1, 0, 0, 0, 516, 517, 5, 120, 0, 0, 517, 518, 5, 121, 0, 0, 518, 519, 3, 460, 230, 0, 519, 520, 5, 19, 0, 0, 520, 521, 3, 470, 235, 0, 521, 522, 5, 35, 0, 0, 522, 13, 1, 0, 0, 0, 523, 529, 3, 18, 9, 0, 524, 529, 3, 20, 10, 0, 525, 529, 3, 48, 24, 0, 526, 529, 3, 42, 21, 0, 527, 529, 3, 46, 23, 0, 528, 523, 1, 0, 0, 0, 528, 524, 1, 0, 0, 0, 528, 525, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 528, 527, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 35, 0, 0, 531, 533, 1, 0, 0, 0, 532, 528, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 545, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 539, 3, 2, 1, 0, 538, 537, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 3, 16, 8, 0, 541, 542, 5, 35, 0, 0, 542, 544, 1, 0, 0, 0, 543, 538, 1, 0, 0, 0, 544, 547, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 15, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 553, 3, 50, 25, 0, 549, 553, 3, 58, 29, 0, 550, 553, 3, 56, 28, 0, 551, 553, 3, 74, 37, 0, 552, 548, 1, 0, 0, 0, 552, 549, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 551, 1, 0, 0, 0, 553, 17, 1, 0, 0, 0, 554, 555, 5, 77, 0, 0, 555, 556, 5, 78, 0, 0, 556, 557, 7, 0, 0, 0, 557, 558, 5, 121, 0, 0, 558, 559, 3, 476, 238, 0, 559, 19, 1, 0, 0, 0, 560, 569, 3, 22, 11, 0, 561, 569, 3, 24, 12, 0, 562, 569, 3, 26, 13, 0, 563, 569, 3, 28, 14, 0, 564, 569, 3, 30, 15, 0, 565, 569, 3, 32, 16, 0, 566, 569, 3, 34, 17, 0, 567, 569, 3, 40, 20, 0, 568, 560, 1, 0, 0, 0, 568, 561, 1, 0, 0, 0, 568, 562, 1, 0, 0, 0, 568, 563, 1, 0, 0, 0, 568, 564, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 568, 567, 1, 0, 0, 0, 569, 21, 1, 0, 0, 0, 570, 571, 5, 77, 0, 0, 571, 572, 5, 63, 0, 0, 572, 573, 7, 1, 0, 0, 573, 23, 1, 0, 0, 0, 574, 575, 5, 77, 0, 0, 575, 576, 5, 78, 0, 0, 576, 577, 5, 71, 0, 0, 577, 578, 3, 470, 235, 0, 578, 25, 1, 0, 0, 0, 579, 580, 5, 77, 0, 0, 580, 581, 5, 62, 0, 0, 581, 582, 3, 470, 235, 0, 582, 27, 1, 0, 0, 0, 583, 584, 5, 77, 0, 0, 584, 585, 5, 73, 0, 0, 585, 586, 7, 1, 0, 0, 586, 29, 1, 0, 0, 0, 587, 588, 5, 77, 0, 0, 588, 589, 5, 134, 0, 0, 589, 590, 7, 2, 0, 0, 590, 31, 1, 0, 0, 0, 591, 592, 5, 77, 0, 0, 592, 593, 5, 78, 0, 0, 593, 594, 5, 132, 0, 0, 594, 595, 5, 88, 0, 0, 595, 596, 7, 3, 0, 0, 596, 33, 1, 0, 0, 0, 597, 598, 5, 77, 0, 0, 598, 599, 5, 75, 0, 0, 599, 600, 3, 36, 18, 0, 600, 601, 5, 30, 0, 0, 601, 602, 3, 38, 19, 0, 602, 35, 1, 0, 0, 0, 603, 604, 7, 4, 0, 0, 604, 37, 1, 0, 0, 0, 605, 606, 7, 5, 0, 0, 606, 39, 1, 0, 0, 0, 607, 612, 5, 77, 0, 0, 608, 609, 5, 82, 0, 0, 609, 613, 3, 456, 228, 0, 610, 611, 5, 78, 0, 0, 611, 613, 5, 82, 0, 0, 612, 608, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 619, 1, 0, 0, 0, 614, 615, 5, 8, 0, 0, 615, 616, 5, 19, 0, 0, 616, 618, 3, 476, 238, 0, 617, 614, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 41, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 623, 5, 106, 0, 0, 623, 625, 5, 143, 0, 0, 624, 626, 3, 44, 22, 0, 625, 624, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 637, 3, 470, 235, 0, 628, 629, 5, 60, 0, 0, 629, 634, 3, 470, 235, 0, 630, 631, 5, 30, 0, 0, 631, 633, 3, 470, 235, 0, 632, 630, 1, 0, 0, 0, 633, 636, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 638, 1, 0, 0, 0, 636, 634, 1, 0, 0, 0, 637, 628, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 43, 1, 0, 0, 0, 639, 640, 5, 121, 0, 0, 640, 641, 3, 460, 230, 0, 641, 642, 5, 19, 0, 0, 642, 647, 1, 0, 0, 0, 643, 644, 5, 78, 0, 0, 644, 645, 5, 86, 0, 0, 645, 647, 5, 121, 0, 0, 646, 639, 1, 0, 0, 0, 646, 643, 1, 0, 0, 0, 647, 45, 1, 0, 0, 0, 648, 649, 5, 106, 0, 0, 649, 654, 5, 120, 0, 0, 650, 651, 5, 121, 0, 0, 651, 652, 3, 460, 230, 0, 652, 653, 5, 19, 0, 0, 653, 655, 1, 0, 0, 0, 654, 650, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 666, 3, 470, 235, 0, 657, 658, 5, 60, 0, 0, 658, 663, 3, 470, 235, 0, 659, 660, 5, 30, 0, 0, 660, 662, 3, 470, 235, 0, 661, 659, 1, 0, 0, 0, 662, 665, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 667, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 47, 1, 0, 0, 0, 668, 669, 5, 77, 0, 0, 669, 670, 5, 121, 0, 0, 670, 671, 3, 460, 230, 0, 671, 672, 5, 19, 0, 0, 672, 673, 3, 470, 235, 0, 673, 49, 1, 0, 0, 0, 674, 675, 5, 77, 0, 0, 675, 676, 3, 64, 32, 0, 676, 677, 5, 166, 0, 0, 677, 678, 5, 44, 0, 0, 678, 680, 3, 264, 132, 0, 679, 681, 3, 376, 188, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 689, 1, 0, 0, 0, 682, 683, 5, 34, 0, 0, 683, 690, 3, 52, 26, 0, 684, 687, 5, 95, 0, 0, 685, 686, 5, 34, 0, 0, 686, 688, 3, 54, 27, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 690, 1, 0, 0, 0, 689, 682, 1, 0, 0, 0, 689, 684, 1, 0, 0, 0, 690, 51, 1, 0, 0, 0, 691, 692, 3, 78, 39, 0, 692, 53, 1, 0, 0, 0, 693, 694, 3, 78, 39, 0, 694, 55, 1, 0, 0, 0, 695, 696, 5, 77, 0, 0, 696, 697, 5, 74, 0, 0, 697, 700, 5, 112, 0, 0, 698, 699, 5, 58, 0, 0, 699, 701, 3, 380, 190, 0, 700, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 709, 1, 0, 0, 0, 702, 703, 5, 34, 0, 0, 703, 710, 3, 78, 39, 0, 704, 707, 5, 95, 0, 0, 705, 706, 5, 34, 0, 0, 706, 708, 3, 78, 39, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 710, 1, 0, 0, 0, 709, 702, 1, 0, 0, 0, 709, 704, 1, 0, 0, 0, 710, 57, 1, 0, 0, 0, 711, 712, 5, 77, 0, 0, 712, 713, 3, 64, 32, 0, 713, 714, 5, 99, 0, 0, 714, 715, 3, 456, 228, 0, 715, 717, 5, 21, 0, 0, 716, 718, 3, 60, 30, 0, 717, 716, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 5, 22, 0, 0, 720, 722, 3, 72, 36, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 726, 3, 346, 173, 0, 724, 726, 5, 95, 0, 0, 725, 723, 1, 0, 0, 0, 725, 724, 1, 0, 0, 0, 726, 59, 1, 0, 0, 0, 727, 732, 3, 62, 31, 0, 728, 729, 5, 30, 0, 0, 729, 731, 3, 62, 31, 0, 730, 728, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 61, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 736, 5, 44, 0, 0, 736, 738, 3, 458, 229, 0, 737, 739, 3, 376, 188, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 63, 1, 0, 0, 0, 740, 742, 3, 66, 33, 0, 741, 740, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 65, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 746, 747, 5, 45, 0, 0, 747, 752, 3, 458, 229, 0, 748, 749, 5, 21, 0, 0, 749, 750, 3, 68, 34, 0, 750, 751, 5, 22, 0, 0, 751, 753, 1, 0, 0, 0, 752, 748, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 67, 1, 0, 0, 0, 754, 759, 3, 70, 35, 0, 755, 756, 5, 30, 0, 0, 756, 758, 3, 70, 35, 0, 757, 755, 1, 0, 0, 0, 758, 761, 1, 0, 0, 0, 759, 757, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 69, 1, 0, 0, 0, 761, 759, 1, 0, 0, 0, 762, 763, 3, 258, 129, 0, 763, 71, 1, 0, 0, 0, 764, 765, 5, 58, 0, 0, 765, 766, 3, 378, 189, 0, 766, 73, 1, 0, 0, 0, 767, 768, 5, 77, 0, 0, 768, 769, 5, 130, 0, 0, 769, 770, 3, 458, 229, 0, 770, 771, 3, 476, 238, 0, 771, 75, 1, 0, 0, 0, 772, 777, 3, 78, 39, 0, 773, 774, 5, 30, 0, 0, 774, 776, 3, 78, 39, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 77, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 789, 3, 80, 40, 0, 781, 789, 3, 126, 63, 0, 782, 789, 3, 130, 65, 0, 783, 789, 3, 136, 68, 0, 784, 789, 3, 156, 78, 0, 785, 789, 3, 142, 71, 0, 786, 789, 3, 144, 72, 0, 787, 789, 3, 168, 84, 0, 788, 780, 1, 0, 0, 0, 788, 781, 1, 0, 0, 0, 788, 782, 1, 0, 0, 0, 788, 783, 1, 0, 0, 0, 788, 784, 1, 0, 0, 0, 788, 785, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 788, 787, 1, 0, 0, 0, 789, 79, 1, 0, 0, 0, 790, 794, 3, 82, 41, 0, 791, 793, 3, 84, 42, 0, 792, 791, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 797, 1, 0, 0, 0, 796, 794, 1, 0, 0, 0, 797, 798, 3, 124, 62, 0, 798, 81, 1, 0, 0, 0, 799, 803, 3, 86, 43, 0, 800, 803, 3, 94, 47, 0, 801, 803, 3, 98, 49, 0, 802, 799, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 801, 1, 0, 0, 0, 803, 83, 1, 0, 0, 0, 804, 810, 3, 82, 41, 0, 805, 810, 3, 112, 56, 0, 806, 810, 3, 114, 57, 0, 807, 810, 3, 120, 60, 0, 808, 810, 3, 110, 55, 0, 809, 804, 1, 0, 0, 0, 809, 805, 1, 0, 0, 0, 809, 806, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 809, 808, 1, 0, 0, 0, 810, 85, 1, 0, 0, 0, 811, 812, 5, 98, 0, 0, 812, 817, 3, 88, 44, 0, 813, 814, 5, 30, 0, 0, 814, 816, 3, 88, 44, 0, 815, 813, 1, 0, 0, 0, 816, 819, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 87, 1, 0, 0, 0, 819, 817, 1, 0, 0, 0, 820, 821, 5, 44, 0, 0, 821, 823, 3, 264, 132, 0, 822, 824, 3, 376, 188, 0, 823, 822, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 826, 1, 0, 0, 0, 825, 827, 3, 90, 45, 0, 826, 825, 1, 0, 0, 0, 826, 827, 1, 0, 0, 0, 827, 829, 1, 0, 0, 0, 828, 830, 3, 92, 46, 0, 829, 828, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 5, 107, 0, 0, 832, 833, 3, 78, 39, 0, 833, 89, 1, 0, 0, 0, 834, 835, 5, 53, 0, 0, 835, 836, 5, 88, 0, 0, 836, 91, 1, 0, 0, 0, 837, 838, 5, 60, 0, 0, 838, 839, 5, 44, 0, 0, 839, 840, 3, 264, 132, 0, 840, 93, 1, 0, 0, 0, 841, 842, 5, 116, 0, 0, 842, 847, 3, 96, 48, 0, 843, 844, 5, 30, 0, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 845, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 95, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 850, 851, 5, 44, 0, 0, 851, 853, 3, 264, 132, 0, 852, 854, 3, 376, 188, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 856, 5, 34, 0, 0, 856, 857, 3, 78, 39, 0, 857, 97, 1, 0, 0, 0, 858, 861, 5, 98, 0, 0, 859, 862, 3, 100, 50, 0, 860, 862, 3, 102, 51, 0, 861, 859, 1, 0, 0, 0, 861, 860, 1, 0, 0, 0, 862, 99, 1, 0, 0, 0, 863, 864, 5, 159, 0, 0, 864, 865, 5, 170, 0, 0, 865, 866, 5, 44, 0, 0, 866, 868, 3, 458, 229, 0, 867, 869, 3, 376, 188, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 5, 107, 0, 0, 871, 872, 3, 78, 39, 0, 872, 874, 3, 104, 52, 0, 873, 875, 3, 106, 53, 0, 874, 873, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 101, 1, 0, 0, 0, 876, 877, 5, 147, 0, 0, 877, 878, 5, 170, 0, 0, 878, 879, 5, 44, 0, 0, 879, 881, 3, 458, 229, 0, 880, 882, 3, 376, 188, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 107, 0, 0, 884, 885, 3, 78, 39, 0, 885, 886, 3, 104, 52, 0, 886, 887, 3, 106, 53, 0, 887, 103, 1, 0, 0, 0, 888, 889, 5, 150, 0, 0, 889, 890, 3, 108, 54, 0, 890, 891, 5, 168, 0, 0, 891, 892, 3, 78, 39, 0, 892, 105, 1, 0, 0, 0, 893, 895, 5, 129, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 5, 91, 0, 0, 897, 898, 3, 108, 54, 0, 898, 899, 5, 168, 0, 0, 899, 900, 3, 78, 39, 0, 900, 107, 1, 0, 0, 0, 901, 902, 5, 44, 0, 0, 902, 904, 3, 456, 228, 0, 903, 901, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 906, 1, 0, 0, 0, 905, 907, 3, 92, 46, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 911, 1, 0, 0, 0, 908, 909, 5, 139, 0, 0, 909, 910, 5, 44, 0, 0, 910, 912, 3, 456, 228, 0, 911, 908, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 916, 1, 0, 0, 0, 913, 914, 5, 123, 0, 0, 914, 915, 5, 44, 0, 0, 915, 917, 3, 456, 228, 0, 916, 913, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 109, 1, 0, 0, 0, 918, 919, 5, 76, 0, 0, 919, 920, 5, 44, 0, 0, 920, 921, 3, 264, 132, 0, 921, 111, 1, 0, 0, 0, 922, 923, 5, 169, 0, 0, 923, 924, 3, 78, 39, 0, 924, 113, 1, 0, 0, 0, 925, 926, 5, 102, 0, 0, 926, 927, 5, 65, 0, 0, 927, 928, 3, 116, 58, 0, 928, 115, 1, 0, 0, 0, 929, 934, 3, 118, 59, 0, 930, 931, 5, 30, 0, 0, 931, 933, 3, 118, 59, 0, 932, 930, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 117, 1, 0, 0, 0, 936, 934, 1, 0, 0, 0, 937, 938, 5, 44, 0, 0, 938, 944, 3, 264, 132, 0, 939, 941, 3, 376, 188, 0, 940, 939, 1, 0, 0, 0, 940, 941, 1, 0, 0, 0, 941, 942, 1, 0, 0, 0, 942, 943, 5, 34, 0, 0, 943, 945, 3, 78, 39, 0, 944, 940, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 947, 5, 71, 0, 0, 947, 949, 3, 470, 235, 0, 948, 946, 1, 0, 0, 0, 948, 949, 1, 0, 0, 0, 949, 119, 1, 0, 0, 0, 950, 952, 5, 149, 0, 0, 951, 950, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 5, 132, 0, 0, 954, 955, 5, 65, 0, 0, 955, 960, 3, 122, 61, 0, 956, 957, 5, 30, 0, 0, 957, 959, 3, 122, 61, 0, 958, 956, 1, 0, 0, 0, 959, 962, 1, 0, 0, 0, 960, 958, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 121, 1, 0, 0, 0, 962, 960, 1, 0, 0, 0, 963, 966, 3, 78, 39, 0, 964, 967, 5, 59, 0, 0, 965, 967, 5, 81, 0, 0, 966, 964, 1, 0, 0, 0, 966, 965, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 973, 1, 0, 0, 0, 968, 971, 5, 88, 0, 0, 969, 972, 5, 101, 0, 0, 970, 972, 5, 115, 0, 0, 971, 969, 1, 0, 0, 0, 971, 970, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 977, 1, 0, 0, 0, 975, 976, 5, 71, 0, 0, 976, 978, 3, 470, 235, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 123, 1, 0, 0, 0, 979, 980, 5, 141, 0, 0, 980, 981, 3, 78, 39, 0, 981, 125, 1, 0, 0, 0, 982, 985, 5, 148, 0, 0, 983, 985, 5, 93, 0, 0, 984, 982, 1, 0, 0, 0, 984, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 991, 3, 128, 64, 0, 987, 988, 5, 30, 0, 0, 988, 990, 3, 128, 64, 0, 989, 987, 1, 0, 0, 0, 990, 993, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 994, 995, 5, 142, 0, 0, 995, 996, 3, 78, 39, 0, 996, 127, 1, 0, 0, 0, 997, 998, 5, 44, 0, 0, 998, 1000, 3, 264, 132, 0, 999, 1001, 3, 376, 188, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 5, 107, 0, 0, 1003, 1004, 3, 78, 39, 0, 1004, 129, 1, 0, 0, 0, 1005, 1006, 5, 153, 0, 0, 1006, 1007, 5, 21, 0, 0, 1007, 1008, 3, 76, 38, 0, 1008, 1010, 5, 22, 0, 0, 1009, 1011, 3, 132, 66, 0, 1010, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 5, 78, 0, 0, 1015, 1016, 5, 141, 0, 0, 1016, 1017, 3, 78, 39, 0, 1017, 131, 1, 0, 0, 0, 1018, 1019, 5, 66, 0, 0, 1019, 1021, 3, 134, 67, 0, 1020, 1018, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1020, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 5, 141, 0, 0, 1025, 1026, 3, 78, 39, 0, 1026, 133, 1, 0, 0, 0, 1027, 1028, 3, 78, 39, 0, 1028, 135, 1, 0, 0, 0, 1029, 1030, 5, 161, 0, 0, 1030, 1031, 5, 21, 0, 0, 1031, 1032, 3, 76, 38, 0, 1032, 1034, 5, 22, 0, 0, 1033, 1035, 3, 138, 69, 0, 1034, 1033, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1041, 5, 78, 0, 0, 1039, 1040, 5, 44, 0, 0, 1040, 1042, 3, 264, 132, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 5, 141, 0, 0, 1044, 1045, 3, 78, 39, 0, 1045, 137, 1, 0, 0, 0, 1046, 1051, 5, 66, 0, 0, 1047, 1048, 5, 44, 0, 0, 1048, 1049, 3, 264, 132, 0, 1049, 1050, 5, 58, 0, 0, 1050, 1052, 1, 0, 0, 0, 1051, 1047, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 3, 140, 70, 0, 1054, 1055, 5, 141, 0, 0, 1055, 1056, 3, 78, 39, 0, 1056, 139, 1, 0, 0, 0, 1057, 1062, 3, 378, 189, 0, 1058, 1059, 5, 39, 0, 0, 1059, 1061, 3, 378, 189, 0, 1060, 1058, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 141, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1066, 5, 105, 0, 0, 1066, 1067, 5, 21, 0, 0, 1067, 1068, 3, 76, 38, 0, 1068, 1069, 5, 22, 0, 0, 1069, 1070, 5, 155, 0, 0, 1070, 1071, 3, 78, 39, 0, 1071, 1072, 5, 87, 0, 0, 1072, 1073, 3, 78, 39, 0, 1073, 143, 1, 0, 0, 0, 1074, 1076, 3, 146, 73, 0, 1075, 1077, 3, 150, 75, 0, 1076, 1075, 1, 0, 0, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 145, 1, 0, 0, 0, 1080, 1081, 5, 158, 0, 0, 1081, 1082, 3, 148, 74, 0, 1082, 147, 1, 0, 0, 0, 1083, 1084, 3, 152, 76, 0, 1084, 149, 1, 0, 0, 0, 1085, 1092, 5, 69, 0, 0, 1086, 1093, 3, 154, 77, 0, 1087, 1088, 5, 21, 0, 0, 1088, 1089, 5, 44, 0, 0, 1089, 1090, 3, 264, 132, 0, 1090, 1091, 5, 22, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1086, 1, 0, 0, 0, 1092, 1087, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 3, 152, 76, 0, 1095, 151, 1, 0, 0, 0, 1096, 1098, 5, 25, 0, 0, 1097, 1099, 3, 76, 38, 0, 1098, 1097, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 5, 26, 0, 0, 1101, 153, 1, 0, 0, 0, 1102, 1107, 3, 238, 119, 0, 1103, 1104, 5, 39, 0, 0, 1104, 1106, 3, 238, 119, 0, 1105, 1103, 1, 0, 0, 0, 1106, 1109, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 155, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1110, 1116, 5, 164, 0, 0, 1111, 1117, 3, 158, 79, 0, 1112, 1117, 3, 160, 80, 0, 1113, 1117, 3, 162, 81, 0, 1114, 1117, 3, 164, 82, 0, 1115, 1117, 3, 166, 83, 0, 1116, 1111, 1, 0, 0, 0, 1116, 1112, 1, 0, 0, 0, 1116, 1113, 1, 0, 0, 0, 1116, 1114, 1, 0, 0, 0, 1116, 1115, 1, 0, 0, 0, 1117, 157, 1, 0, 0, 0, 1118, 1119, 5, 177, 0, 0, 1119, 1120, 3, 76, 38, 0, 1120, 1121, 5, 178, 0, 0, 1121, 1122, 3, 78, 39, 0, 1122, 159, 1, 0, 0, 0, 1123, 1124, 5, 179, 0, 0, 1124, 1125, 3, 76, 38, 0, 1125, 1126, 5, 178, 0, 0, 1126, 1127, 3, 78, 39, 0, 1127, 161, 1, 0, 0, 0, 1128, 1129, 5, 180, 0, 0, 1129, 1130, 3, 78, 39, 0, 1130, 1131, 7, 6, 0, 0, 1131, 1132, 3, 78, 39, 0, 1132, 163, 1, 0, 0, 0, 1133, 1134, 5, 182, 0, 0, 1134, 1135, 3, 78, 39, 0, 1135, 165, 1, 0, 0, 0, 1136, 1137, 5, 183, 0, 0, 1137, 1138, 3, 78, 39, 0, 1138, 1139, 5, 58, 0, 0, 1139, 1140, 3, 78, 39, 0, 1140, 167, 1, 0, 0, 0, 1141, 1146, 3, 170, 85, 0, 1142, 1143, 5, 131, 0, 0, 1143, 1145, 3, 170, 85, 0, 1144, 1142, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 169, 1, 0, 0, 0, 1148, 1146, 1, 0, 0, 0, 1149, 1154, 3, 172, 86, 0, 1150, 1151, 5, 56, 0, 0, 1151, 1153, 3, 172, 86, 0, 1152, 1150, 1, 0, 0, 0, 1153, 1156, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 171, 1, 0, 0, 0, 1156, 1154, 1, 0, 0, 0, 1157, 1165, 3, 174, 87, 0, 1158, 1162, 3, 204, 102, 0, 1159, 1162, 3, 202, 101, 0, 1160, 1162, 3, 206, 103, 0, 1161, 1158, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 3, 174, 87, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1161, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 173, 1, 0, 0, 0, 1167, 1172, 3, 176, 88, 0, 1168, 1169, 5, 51, 0, 0, 1169, 1171, 3, 176, 88, 0, 1170, 1168, 1, 0, 0, 0, 1171, 1174, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 175, 1, 0, 0, 0, 1174, 1172, 1, 0, 0, 0, 1175, 1178, 3, 178, 89, 0, 1176, 1177, 5, 156, 0, 0, 1177, 1179, 3, 178, 89, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 177, 1, 0, 0, 0, 1180, 1185, 3, 180, 90, 0, 1181, 1182, 7, 7, 0, 0, 1182, 1184, 3, 180, 90, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1187, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 179, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1188, 1193, 3, 182, 91, 0, 1189, 1190, 7, 8, 0, 0, 1190, 1192, 3, 182, 91, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1195, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 181, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1196, 1201, 3, 184, 92, 0, 1197, 1198, 7, 9, 0, 0, 1198, 1200, 3, 184, 92, 0, 1199, 1197, 1, 0, 0, 0, 1200, 1203, 1, 0, 0, 0, 1201, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 183, 1, 0, 0, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1209, 3, 186, 93, 0, 1205, 1206, 7, 10, 0, 0, 1206, 1208, 3, 186, 93, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 185, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1216, 3, 188, 94, 0, 1213, 1214, 5, 109, 0, 0, 1214, 1215, 5, 128, 0, 0, 1215, 1217, 3, 378, 189, 0, 1216, 1213, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 187, 1, 0, 0, 0, 1218, 1222, 3, 190, 95, 0, 1219, 1220, 5, 157, 0, 0, 1220, 1221, 5, 58, 0, 0, 1221, 1223, 3, 378, 189, 0, 1222, 1219, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 189, 1, 0, 0, 0, 1224, 1228, 3, 192, 96, 0, 1225, 1226, 5, 68, 0, 0, 1226, 1227, 5, 58, 0, 0, 1227, 1229, 3, 374, 187, 0, 1228, 1225, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 191, 1, 0, 0, 0, 1230, 1234, 3, 194, 97, 0, 1231, 1232, 5, 67, 0, 0, 1232, 1233, 5, 58, 0, 0, 1233, 1235, 3, 374, 187, 0, 1234, 1231, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 193, 1, 0, 0, 0, 1236, 1241, 3, 198, 99, 0, 1237, 1238, 5, 49, 0, 0, 1238, 1240, 3, 196, 98, 0, 1239, 1237, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 195, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1245, 3, 254, 127, 0, 1245, 1246, 3, 244, 122, 0, 1246, 197, 1, 0, 0, 0, 1247, 1249, 7, 7, 0, 0, 1248, 1247, 1, 0, 0, 0, 1249, 1252, 1, 0, 0, 0, 1250, 1248, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1253, 1, 0, 0, 0, 1252, 1250, 1, 0, 0, 0, 1253, 1254, 3, 200, 100, 0, 1254, 199, 1, 0, 0, 0, 1255, 1259, 3, 208, 104, 0, 1256, 1259, 3, 212, 106, 0, 1257, 1259, 3, 214, 107, 0, 1258, 1255, 1, 0, 0, 0, 1258, 1256, 1, 0, 0, 0, 1258, 1257, 1, 0, 0, 0, 1259, 201, 1, 0, 0, 0, 1260, 1269, 5, 19, 0, 0, 1261, 1269, 5, 20, 0, 0, 1262, 1269, 5, 40, 0, 0, 1263, 1264, 5, 40, 0, 0, 1264, 1269, 5, 19, 0, 0, 1265, 1269, 5, 41, 0, 0, 1266, 1267, 5, 41, 0, 0, 1267, 1269, 5, 19, 0, 0, 1268, 1260, 1, 0, 0, 0, 1268, 1261, 1, 0, 0, 0, 1268, 1262, 1, 0, 0, 0, 1268, 1263, 1, 0, 0, 0, 1268, 1265, 1, 0, 0, 0, 1268, 1266, 1, 0, 0, 0, 1269, 203, 1, 0, 0, 0, 1270, 1271, 7, 11, 0, 0, 1271, 205, 1, 0, 0, 0, 1272, 1278, 5, 111, 0, 0, 1273, 1274, 5, 40, 0, 0, 1274, 1278, 5, 40, 0, 0, 1275, 1276, 5, 41, 0, 0, 1276, 1278, 5, 41, 0, 0, 1277, 1272, 1, 0, 0, 0, 1277, 1273, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1278, 207, 1, 0, 0, 0, 1279, 1283, 5, 165, 0, 0, 1280, 1284, 3, 210, 105, 0, 1281, 1282, 7, 12, 0, 0, 1282, 1284, 3, 420, 210, 0, 1283, 1280, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 3, 152, 76, 0, 1286, 209, 1, 0, 0, 0, 1287, 1288, 7, 13, 0, 0, 1288, 211, 1, 0, 0, 0, 1289, 1291, 5, 17, 0, 0, 1290, 1289, 1, 0, 0, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 25, 0, 0, 1295, 1296, 3, 76, 38, 0, 1296, 1297, 5, 26, 0, 0, 1297, 213, 1, 0, 0, 0, 1298, 1303, 3, 216, 108, 0, 1299, 1300, 5, 46, 0, 0, 1300, 1302, 3, 216, 108, 0, 1301, 1299, 1, 0, 0, 0, 1302, 1305, 1, 0, 0, 0, 1303, 1301, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 215, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1306, 1308, 5, 36, 0, 0, 1307, 1309, 3, 218, 109, 0, 1308, 1307, 1, 0, 0, 0, 1308, 1309, 1, 0, 0, 0, 1309, 1314, 1, 0, 0, 0, 1310, 1311, 5, 37, 0, 0, 1311, 1314, 3, 218, 109, 0, 1312, 1314, 3, 218, 109, 0, 1313, 1306, 1, 0, 0, 0, 1313, 1310, 1, 0, 0, 0, 1313, 1312, 1, 0, 0, 0, 1314, 217, 1, 0, 0, 0, 1315, 1320, 3, 220, 110, 0, 1316, 1317, 7, 14, 0, 0, 1317, 1319, 3, 220, 110, 0, 1318, 1316, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 219, 1, 0, 0, 0, 1322, 1320, 1, 0, 0, 0, 1323, 1326, 3, 242, 121, 0, 1324, 1326, 3, 222, 111, 0, 1325, 1323, 1, 0, 0, 0, 1325, 1324, 1, 0, 0, 0, 1326, 221, 1, 0, 0, 0, 1327, 1330, 3, 230, 115, 0, 1328, 1330, 3, 224, 112, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 3, 246, 123, 0, 1332, 223, 1, 0, 0, 0, 1333, 1334, 3, 226, 113, 0, 1334, 1335, 3, 236, 118, 0, 1335, 1338, 1, 0, 0, 0, 1336, 1338, 3, 228, 114, 0, 1337, 1333, 1, 0, 0, 0, 1337, 1336, 1, 0, 0, 0, 1338, 225, 1, 0, 0, 0, 1339, 1340, 7, 15, 0, 0, 1340, 1341, 5, 33, 0, 0, 1341, 1342, 5, 33, 0, 0, 1342, 227, 1, 0, 0, 0, 1343, 1345, 5, 43, 0, 0, 1344, 1343, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 3, 236, 118, 0, 1347, 229, 1, 0, 0, 0, 1348, 1349, 3, 232, 116, 0, 1349, 1350, 3, 236, 118, 0, 1350, 1353, 1, 0, 0, 0, 1351, 1353, 3, 234, 117, 0, 1352, 1348, 1, 0, 0, 0, 1352, 1351, 1, 0, 0, 0, 1353, 231, 1, 0, 0, 0, 1354, 1355, 7, 16, 0, 0, 1355, 1356, 5, 33, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 233, 1, 0, 0, 0, 1358, 1359, 5, 32, 0, 0, 1359, 235, 1, 0, 0, 0, 1360, 1363, 3, 238, 119, 0, 1361, 1363, 3, 384, 192, 0, 1362, 1360, 1, 0, 0, 0, 1362, 1361, 1, 0, 0, 0, 1363, 237, 1, 0, 0, 0, 1364, 1367, 3, 456, 228, 0, 1365, 1367, 3, 240, 120, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1365, 1, 0, 0, 0, 1367, 239, 1, 0, 0, 0, 1368, 1372, 5, 27, 0, 0, 1369, 1372, 5, 186, 0, 0, 1370, 1372, 5, 187, 0, 0, 1371, 1368, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1371, 1370, 1, 0, 0, 0, 1372, 241, 1, 0, 0, 0, 1373, 1379, 3, 256, 128, 0, 1374, 1378, 3, 248, 124, 0, 1375, 1378, 3, 244, 122, 0, 1376, 1378, 3, 250, 125, 0, 1377, 1374, 1, 0, 0, 0, 1377, 1375, 1, 0, 0, 0, 1377, 1376, 1, 0, 0, 0, 1378, 1381, 1, 0, 0, 0, 1379, 1377, 1, 0, 0, 0, 1379, 1380, 1, 0, 0, 0, 1380, 243, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1382, 1391, 5, 21, 0, 0, 1383, 1388, 3, 276, 138, 0, 1384, 1385, 5, 30, 0, 0, 1385, 1387, 3, 276, 138, 0, 1386, 1384, 1, 0, 0, 0, 1387, 1390, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1392, 1, 0, 0, 0, 1390, 1388, 1, 0, 0, 0, 1391, 1383, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 5, 22, 0, 0, 1394, 245, 1, 0, 0, 0, 1395, 1397, 3, 248, 124, 0, 1396, 1395, 1, 0, 0, 0, 1397, 1400, 1, 0, 0, 0, 1398, 1396, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 247, 1, 0, 0, 0, 1400, 1398, 1, 0, 0, 0, 1401, 1402, 5, 23, 0, 0, 1402, 1403, 3, 76, 38, 0, 1403, 1404, 5, 24, 0, 0, 1404, 249, 1, 0, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1407, 3, 252, 126, 0, 1407, 251, 1, 0, 0, 0, 1408, 1413, 3, 460, 230, 0, 1409, 1413, 5, 5, 0, 0, 1410, 1413, 3, 266, 133, 0, 1411, 1413, 5, 27, 0, 0, 1412, 1408, 1, 0, 0, 0, 1412, 1409, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 253, 1, 0, 0, 0, 1414, 1418, 3, 456, 228, 0, 1415, 1418, 3, 262, 131, 0, 1416, 1418, 3, 266, 133, 0, 1417, 1414, 1, 0, 0, 0, 1417, 1415, 1, 0, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 255, 1, 0, 0, 0, 1419, 1433, 3, 258, 129, 0, 1420, 1433, 3, 262, 131, 0, 1421, 1433, 3, 266, 133, 0, 1422, 1433, 3, 268, 134, 0, 1423, 1433, 3, 274, 137, 0, 1424, 1433, 3, 270, 135, 0, 1425, 1433, 3, 272, 136, 0, 1426, 1433, 3, 278, 139, 0, 1427, 1433, 3, 340, 170, 0, 1428, 1433, 3, 348, 174, 0, 1429, 1433, 3, 352, 176, 0, 1430, 1433, 3, 358, 179, 0, 1431, 1433, 3, 372, 186, 0, 1432, 1419, 1, 0, 0, 0, 1432, 1420, 1, 0, 0, 0, 1432, 1421, 1, 0, 0, 0, 1432, 1422, 1, 0, 0, 0, 1432, 1423, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1425, 1, 0, 0, 0, 1432, 1426, 1, 0, 0, 0, 1432, 1427, 1, 0, 0, 0, 1432, 1428, 1, 0, 0, 0, 1432, 1429, 1, 0, 0, 0, 1432, 1430, 1, 0, 0, 0, 1432, 1431, 1, 0, 0, 0, 1433, 257, 1, 0, 0, 0, 1434, 1437, 3, 260, 130, 0, 1435, 1437, 3, 476, 238, 0, 1436, 1434, 1, 0, 0, 0, 1436, 1435, 1, 0, 0, 0, 1437, 259, 1, 0, 0, 0, 1438, 1439, 7, 17, 0, 0, 1439, 261, 1, 0, 0, 0, 1440, 1441, 5, 44, 0, 0, 1441, 1442, 3, 456, 228, 0, 1442, 263, 1, 0, 0, 0, 1443, 1444, 3, 456, 228, 0, 1444, 265, 1, 0, 0, 0, 1445, 1447, 5, 21, 0, 0, 1446, 1448, 3, 76, 38, 0, 1447, 1446, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 5, 22, 0, 0, 1450, 267, 1, 0, 0, 0, 1451, 1452, 5, 31, 0, 0, 1452, 269, 1, 0, 0, 0, 1453, 1454, 5, 133, 0, 0, 1454, 1455, 3, 152, 76, 0, 1455, 271, 1, 0, 0, 0, 1456, 1457, 5, 163, 0, 0, 1457, 1458, 3, 152, 76, 0, 1458, 273, 1, 0, 0, 0, 1459, 1460, 3, 456, 228, 0, 1460, 1461, 3, 244, 122, 0, 1461, 275, 1, 0, 0, 0, 1462, 1465, 3, 78, 39, 0, 1463, 1465, 5, 42, 0, 0, 1464, 1462, 1, 0, 0, 0, 1464, 1463, 1, 0, 0, 0, 1465, 277, 1, 0, 0, 0, 1466, 1469, 3, 280, 140, 0, 1467, 1469, 3, 302, 151, 0, 1468, 1466, 1, 0, 0, 0, 1468, 1467, 1, 0, 0, 0, 1469, 279, 1, 0, 0, 0, 1470, 1474, 3, 282, 141, 0, 1471, 1474, 3, 284, 142, 0, 1472, 1474, 7, 18, 0, 0, 1473, 1470, 1, 0, 0, 0, 1473, 1471, 1, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 281, 1, 0, 0, 0, 1475, 1476, 5, 40, 0, 0, 1476, 1477, 3, 458, 229, 0, 1477, 1478, 3, 286, 143, 0, 1478, 1482, 5, 41, 0, 0, 1479, 1481, 3, 298, 149, 0, 1480, 1479, 1, 0, 0, 0, 1481, 1484, 1, 0, 0, 0, 1482, 1480, 1, 0, 0, 0, 1482, 1483, 1, 0, 0, 0, 1483, 1485, 1, 0, 0, 0, 1484, 1482, 1, 0, 0, 0, 1485, 1486, 5, 40, 0, 0, 1486, 1487, 5, 36, 0, 0, 1487, 1488, 3, 458, 229, 0, 1488, 1489, 5, 41, 0, 0, 1489, 283, 1, 0, 0, 0, 1490, 1491, 5, 40, 0, 0, 1491, 1492, 3, 458, 229, 0, 1492, 1493, 3, 286, 143, 0, 1493, 1494, 5, 36, 0, 0, 1494, 1495, 5, 41, 0, 0, 1495, 285, 1, 0, 0, 0, 1496, 1497, 3, 458, 229, 0, 1497, 1498, 5, 19, 0, 0, 1498, 1499, 3, 292, 146, 0, 1499, 1501, 1, 0, 0, 0, 1500, 1496, 1, 0, 0, 0, 1501, 1504, 1, 0, 0, 0, 1502, 1500, 1, 0, 0, 0, 1502, 1503, 1, 0, 0, 0, 1503, 287, 1, 0, 0, 0, 1504, 1502, 1, 0, 0, 0, 1505, 1512, 5, 11, 0, 0, 1506, 1511, 5, 9, 0, 0, 1507, 1511, 5, 10, 0, 0, 1508, 1511, 5, 1, 0, 0, 1509, 1511, 3, 294, 147, 0, 1510, 1506, 1, 0, 0, 0, 1510, 1507, 1, 0, 0, 0, 1510, 1508, 1, 0, 0, 0, 1510, 1509, 1, 0, 0, 0, 1511, 1514, 1, 0, 0, 0, 1512, 1510, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1515, 1, 0, 0, 0, 1514, 1512, 1, 0, 0, 0, 1515, 1516, 5, 11, 0, 0, 1516, 289, 1, 0, 0, 0, 1517, 1524, 5, 12, 0, 0, 1518, 1523, 5, 9, 0, 0, 1519, 1523, 5, 10, 0, 0, 1520, 1523, 5, 2, 0, 0, 1521, 1523, 3, 296, 148, 0, 1522, 1518, 1, 0, 0, 0, 1522, 1519, 1, 0, 0, 0, 1522, 1520, 1, 0, 0, 0, 1522, 1521, 1, 0, 0, 0, 1523, 1526, 1, 0, 0, 0, 1524, 1522, 1, 0, 0, 0, 1524, 1525, 1, 0, 0, 0, 1525, 1527, 1, 0, 0, 0, 1526, 1524, 1, 0, 0, 0, 1527, 1528, 5, 12, 0, 0, 1528, 291, 1, 0, 0, 0, 1529, 1532, 3, 288, 144, 0, 1530, 1532, 3, 290, 145, 0, 1531, 1529, 1, 0, 0, 0, 1531, 1530, 1, 0, 0, 0, 1532, 293, 1, 0, 0, 0, 1533, 1535, 5, 196, 0, 0, 1534, 1533, 1, 0, 0, 0, 1535, 1536, 1, 0, 0, 0, 1536, 1534, 1, 0, 0, 0, 1536, 1537, 1, 0, 0, 0, 1537, 1547, 1, 0, 0, 0, 1538, 1547, 5, 3, 0, 0, 1539, 1547, 5, 4, 0, 0, 1540, 1547, 3, 288, 144, 0, 1541, 1543, 5, 25, 0, 0, 1542, 1544, 3, 76, 38, 0, 1543, 1542, 1, 0, 0, 0, 1543, 1544, 1, 0, 0, 0, 1544, 1545, 1, 0, 0, 0, 1545, 1547, 5, 26, 0, 0, 1546, 1534, 1, 0, 0, 0, 1546, 1538, 1, 0, 0, 0, 1546, 1539, 1, 0, 0, 0, 1546, 1540, 1, 0, 0, 0, 1546, 1541, 1, 0, 0, 0, 1547, 295, 1, 0, 0, 0, 1548, 1550, 5, 196, 0, 0, 1549, 1548, 1, 0, 0, 0, 1550, 1551, 1, 0, 0, 0, 1551, 1549, 1, 0, 0, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1562, 1, 0, 0, 0, 1553, 1562, 5, 3, 0, 0, 1554, 1562, 5, 4, 0, 0, 1555, 1562, 3, 290, 145, 0, 1556, 1558, 5, 25, 0, 0, 1557, 1559, 3, 76, 38, 0, 1558, 1557, 1, 0, 0, 0, 1558, 1559, 1, 0, 0, 0, 1559, 1560, 1, 0, 0, 0, 1560, 1562, 5, 26, 0, 0, 1561, 1549, 1, 0, 0, 0, 1561, 1553, 1, 0, 0, 0, 1561, 1554, 1, 0, 0, 0, 1561, 1555, 1, 0, 0, 0, 1561, 1556, 1, 0, 0, 0, 1562, 297, 1, 0, 0, 0, 1563, 1570, 3, 280, 140, 0, 1564, 1570, 3, 300, 150, 0, 1565, 1570, 5, 16, 0, 0, 1566, 1570, 5, 11, 0, 0, 1567, 1570, 5, 12, 0, 0, 1568, 1570, 3, 482, 241, 0, 1569, 1563, 1, 0, 0, 0, 1569, 1564, 1, 0, 0, 0, 1569, 1565, 1, 0, 0, 0, 1569, 1566, 1, 0, 0, 0, 1569, 1567, 1, 0, 0, 0, 1569, 1568, 1, 0, 0, 0, 1570, 299, 1, 0, 0, 0, 1571, 1581, 7, 19, 0, 0, 1572, 1573, 5, 25, 0, 0, 1573, 1581, 5, 25, 0, 0, 1574, 1575, 5, 26, 0, 0, 1575, 1581, 5, 26, 0, 0, 1576, 1577, 5, 25, 0, 0, 1577, 1578, 3, 76, 38, 0, 1578, 1579, 5, 26, 0, 0, 1579, 1581, 1, 0, 0, 0, 1580, 1571, 1, 0, 0, 0, 1580, 1572, 1, 0, 0, 0, 1580, 1574, 1, 0, 0, 0, 1580, 1576, 1, 0, 0, 0, 1581, 301, 1, 0, 0, 0, 1582, 1591, 3, 318, 159, 0, 1583, 1591, 3, 320, 160, 0, 1584, 1591, 3, 324, 162, 0, 1585, 1591, 3, 326, 163, 0, 1586, 1591, 3, 334, 167, 0, 1587, 1591, 3, 336, 168, 0, 1588, 1591, 3, 338, 169, 0, 1589, 1591, 3, 304, 152, 0, 1590, 1582, 1, 0, 0, 0, 1590, 1583, 1, 0, 0, 0, 1590, 1584, 1, 0, 0, 0, 1590, 1585, 1, 0, 0, 0, 1590, 1586, 1, 0, 0, 0, 1590, 1587, 1, 0, 0, 0, 1590, 1588, 1, 0, 0, 0, 1590, 1589, 1, 0, 0, 0, 1591, 303, 1, 0, 0, 0, 1592, 1599, 3, 306, 153, 0, 1593, 1599, 3, 308, 154, 0, 1594, 1599, 3, 310, 155, 0, 1595, 1599, 3, 312, 156, 0, 1596, 1599, 3, 314, 157, 0, 1597, 1599, 3, 316, 158, 0, 1598, 1592, 1, 0, 0, 0, 1598, 1593, 1, 0, 0, 0, 1598, 1594, 1, 0, 0, 0, 1598, 1595, 1, 0, 0, 0, 1598, 1596, 1, 0, 0, 0, 1598, 1597, 1, 0, 0, 0, 1599, 305, 1, 0, 0, 0, 1600, 1601, 5, 172, 0, 0, 1601, 1602, 3, 322, 161, 0, 1602, 307, 1, 0, 0, 0, 1603, 1604, 5, 176, 0, 0, 1604, 1618, 5, 25, 0, 0, 1605, 1606, 3, 78, 39, 0, 1606, 1607, 5, 33, 0, 0, 1607, 1615, 3, 78, 39, 0, 1608, 1609, 5, 30, 0, 0, 1609, 1610, 3, 78, 39, 0, 1610, 1611, 5, 33, 0, 0, 1611, 1612, 3, 78, 39, 0, 1612, 1614, 1, 0, 0, 0, 1613, 1608, 1, 0, 0, 0, 1614, 1617, 1, 0, 0, 0, 1615, 1613, 1, 0, 0, 0, 1615, 1616, 1, 0, 0, 0, 1616, 1619, 1, 0, 0, 0, 1617, 1615, 1, 0, 0, 0, 1618, 1605, 1, 0, 0, 0, 1618, 1619, 1, 0, 0, 0, 1619, 1620, 1, 0, 0, 0, 1620, 1621, 5, 26, 0, 0, 1621, 309, 1, 0, 0, 0, 1622, 1623, 5, 175, 0, 0, 1623, 1624, 3, 322, 161, 0, 1624, 311, 1, 0, 0, 0, 1625, 1626, 5, 173, 0, 0, 1626, 1627, 5, 25, 0, 0, 1627, 1628, 3, 78, 39, 0, 1628, 1629, 5, 26, 0, 0, 1629, 313, 1, 0, 0, 0, 1630, 1631, 5, 174, 0, 0, 1631, 1632, 5, 25, 0, 0, 1632, 1633, 5, 26, 0, 0, 1633, 315, 1, 0, 0, 0, 1634, 1635, 5, 64, 0, 0, 1635, 1636, 3, 322, 161, 0, 1636, 317, 1, 0, 0, 0, 1637, 1638, 5, 84, 0, 0, 1638, 1639, 3, 152, 76, 0, 1639, 319, 1, 0, 0, 0, 1640, 1646, 5, 86, 0, 0, 1641, 1647, 3, 456, 228, 0, 1642, 1643, 5, 25, 0, 0, 1643, 1644, 3, 76, 38, 0, 1644, 1645, 5, 26, 0, 0, 1645, 1647, 1, 0, 0, 0, 1646, 1641, 1, 0, 0, 0, 1646, 1642, 1, 0, 0, 0, 1647, 1648, 1, 0, 0, 0, 1648, 1649, 3, 322, 161, 0, 1649, 321, 1, 0, 0, 0, 1650, 1651, 3, 152, 76, 0, 1651, 323, 1, 0, 0, 0, 1652, 1658, 5, 61, 0, 0, 1653, 1659, 3, 456, 228, 0, 1654, 1655, 5, 25, 0, 0, 1655, 1656, 3, 76, 38, 0, 1656, 1657, 5, 26, 0, 0, 1657, 1659, 1, 0, 0, 0, 1658, 1653, 1, 0, 0, 0, 1658, 1654, 1, 0, 0, 0, 1659, 1660, 1, 0, 0, 0, 1660, 1661, 3, 152, 76, 0, 1661, 325, 1, 0, 0, 0, 1662, 1665, 5, 121, 0, 0, 1663, 1666, 3, 328, 164, 0, 1664, 1666, 3, 330, 165, 0, 1665, 1663, 1, 0, 0, 0, 1665, 1664, 1, 0, 0, 0, 1666, 1667, 1, 0, 0, 0, 1667, 1668, 3, 332, 166, 0, 1668, 327, 1, 0, 0, 0, 1669, 1670, 3, 460, 230, 0, 1670, 329, 1, 0, 0, 0, 1671, 1672, 3, 152, 76, 0, 1672, 331, 1, 0, 0, 0, 1673, 1674, 3, 152, 76, 0, 1674, 333, 1, 0, 0, 0, 1675, 1676, 5, 154, 0, 0, 1676, 1677, 3, 152, 76, 0, 1677, 335, 1, 0, 0, 0, 1678, 1679, 5, 72, 0, 0, 1679, 1680, 3, 152, 76, 0, 1680, 337, 1, 0, 0, 0, 1681, 1687, 5, 140, 0, 0, 1682, 1688, 3, 460, 230, 0, 1683, 1684, 5, 25, 0, 0, 1684, 1685, 3, 76, 38, 0, 1685, 1686, 5, 26, 0, 0, 1686, 1688, 1, 0, 0, 0, 1687, 1682, 1, 0, 0, 0, 1687, 1683, 1, 0, 0, 0, 1688, 1689, 1, 0, 0, 0, 1689, 1690, 3, 152, 76, 0, 1690, 339, 1, 0, 0, 0, 1691, 1694, 3, 342, 171, 0, 1692, 1694, 3, 344, 172, 0, 1693, 1691, 1, 0, 0, 0, 1693, 1692, 1, 0, 0, 0, 1694, 341, 1, 0, 0, 0, 1695, 1696, 3, 456, 228, 0, 1696, 1697, 5, 47, 0, 0, 1697, 1698, 5, 5, 0, 0, 1698, 343, 1, 0, 0, 0, 1699, 1700, 3, 64, 32, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1703, 5, 21, 0, 0, 1702, 1704, 3, 60, 30, 0, 1703, 1702, 1, 0, 0, 0, 1703, 1704, 1, 0, 0, 0, 1704, 1705, 1, 0, 0, 0, 1705, 1708, 5, 22, 0, 0, 1706, 1707, 5, 58, 0, 0, 1707, 1709, 3, 378, 189, 0, 1708, 1706, 1, 0, 0, 0, 1708, 1709, 1, 0, 0, 0, 1709, 1710, 1, 0, 0, 0, 1710, 1711, 3, 346, 173, 0, 1711, 345, 1, 0, 0, 0, 1712, 1713, 3, 152, 76, 0, 1713, 347, 1, 0, 0, 0, 1714, 1715, 5, 118, 0, 0, 1715, 1724, 5, 25, 0, 0, 1716, 1721, 3, 350, 175, 0, 1717, 1718, 5, 30, 0, 0, 1718, 1720, 3, 350, 175, 0, 1719, 1717, 1, 0, 0, 0, 1720, 1723, 1, 0, 0, 0, 1721, 1719, 1, 0, 0, 0, 1721, 1722, 1, 0, 0, 0, 1722, 1725, 1, 0, 0, 0, 1723, 1721, 1, 0, 0, 0, 1724, 1716, 1, 0, 0, 0, 1724, 1725, 1, 0, 0, 0, 1725, 1726, 1, 0, 0, 0, 1726, 1727, 5, 26, 0, 0, 1727, 349, 1, 0, 0, 0, 1728, 1729, 3, 78, 39, 0, 1729, 1730, 7, 20, 0, 0, 1730, 1731, 3, 78, 39, 0, 1731, 351, 1, 0, 0, 0, 1732, 1735, 3, 354, 177, 0, 1733, 1735, 3, 356, 178, 0, 1734, 1732, 1, 0, 0, 0, 1734, 1733, 1, 0, 0, 0, 1735, 353, 1, 0, 0, 0, 1736, 1738, 5, 23, 0, 0, 1737, 1739, 3, 76, 38, 0, 1738, 1737, 1, 0, 0, 0, 1738, 1739, 1, 0, 0, 0, 1739, 1740, 1, 0, 0, 0, 1740, 1741, 5, 24, 0, 0, 1741, 355, 1, 0, 0, 0, 1742, 1743, 5, 57, 0, 0, 1743, 1744, 3, 152, 76, 0, 1744, 357, 1, 0, 0, 0, 1745, 1746, 5, 194, 0, 0, 1746, 1747, 3, 360, 180, 0, 1747, 1748, 5, 199, 0, 0, 1748, 359, 1, 0, 0, 0, 1749, 1755, 3, 368, 184, 0, 1750, 1751, 3, 370, 185, 0, 1751, 1752, 3, 368, 184, 0, 1752, 1754, 1, 0, 0, 0, 1753, 1750, 1, 0, 0, 0, 1754, 1757, 1, 0, 0, 0, 1755, 1753, 1, 0, 0, 0, 1755, 1756, 1, 0, 0, 0, 1756, 361, 1, 0, 0, 0, 1757, 1755, 1, 0, 0, 0, 1758, 1759, 7, 21, 0, 0, 1759, 363, 1, 0, 0, 0, 1760, 1761, 7, 22, 0, 0, 1761, 365, 1, 0, 0, 0, 1762, 1763, 7, 23, 0, 0, 1763, 367, 1, 0, 0, 0, 1764, 1775, 5, 197, 0, 0, 1765, 1766, 3, 362, 181, 0, 1766, 1767, 3, 364, 182, 0, 1767, 1775, 1, 0, 0, 0, 1768, 1769, 3, 366, 183, 0, 1769, 1770, 3, 362, 181, 0, 1770, 1771, 3, 362, 181, 0, 1771, 1775, 1, 0, 0, 0, 1772, 1775, 3, 362, 181, 0, 1773, 1775, 5, 25, 0, 0, 1774, 1764, 1, 0, 0, 0, 1774, 1765, 1, 0, 0, 0, 1774, 1768, 1, 0, 0, 0, 1774, 1772, 1, 0, 0, 0, 1774, 1773, 1, 0, 0, 0, 1775, 1778, 1, 0, 0, 0, 1776, 1774, 1, 0, 0, 0, 1776, 1777, 1, 0, 0, 0, 1777, 369, 1, 0, 0, 0, 1778, 1776, 1, 0, 0, 0, 1779, 1780, 5, 198, 0, 0, 1780, 1781, 3, 76, 38, 0, 1781, 1782, 5, 195, 0, 0, 1782, 371, 1, 0, 0, 0, 1783, 1784, 5, 42, 0, 0, 1784, 1785, 3, 252, 126, 0, 1785, 373, 1, 0, 0, 0, 1786, 1788, 3, 418, 209, 0, 1787, 1789, 5, 42, 0, 0, 1788, 1787, 1, 0, 0, 0, 1788, 1789, 1, 0, 0, 0, 1789, 375, 1, 0, 0, 0, 1790, 1791, 5, 58, 0, 0, 1791, 1792, 3, 378, 189, 0, 1792, 377, 1, 0, 0, 0, 1793, 1794, 5, 89, 0, 0, 1794, 1795, 5, 21, 0, 0, 1795, 1803, 5, 22, 0, 0, 1796, 1800, 3, 380, 190, 0, 1797, 1801, 5, 42, 0, 0, 1798, 1801, 5, 27, 0, 0, 1799, 1801, 5, 28, 0, 0, 1800, 1797, 1, 0, 0, 0, 1800, 1798, 1, 0, 0, 0, 1800, 1799, 1, 0, 0, 0, 1800, 1801, 1, 0, 0, 0, 1801, 1803, 1, 0, 0, 0, 1802, 1793, 1, 0, 0, 0, 1802, 1796, 1, 0, 0, 0, 1803, 379, 1, 0, 0, 0, 1804, 1814, 3, 384, 192, 0, 1805, 1806, 5, 112, 0, 0, 1806, 1807, 5, 21, 0, 0, 1807, 1814, 5, 22, 0, 0, 1808, 1814, 3, 422, 211, 0, 1809, 1814, 3, 428, 214, 0, 1810, 1814, 3, 434, 217, 0, 1811, 1814, 3, 382, 191, 0, 1812, 1814, 3, 440, 220, 0, 1813, 1804, 1, 0, 0, 0, 1813, 1805, 1, 0, 0, 0, 1813, 1808, 1, 0, 0, 0, 1813, 1809, 1, 0, 0, 0, 1813, 1810, 1, 0, 0, 0, 1813, 1811, 1, 0, 0, 0, 1813, 1812, 1, 0, 0, 0, 1814, 381, 1, 0, 0, 0, 1815, 1816, 3, 456, 228, 0, 1816, 383, 1, 0, 0, 0, 1817, 1830, 3, 390, 195, 0, 1818, 1830, 3, 406, 203, 0, 1819, 1830, 3, 400, 200, 0, 1820, 1830, 3, 410, 205, 0, 1821, 1830, 3, 404, 202, 0, 1822, 1830, 3, 398, 199, 0, 1823, 1830, 3, 394, 197, 0, 1824, 1830, 3, 392, 196, 0, 1825, 1830, 3, 396, 198, 0, 1826, 1830, 3, 444, 222, 0, 1827, 1830, 3, 388, 194, 0, 1828, 1830, 3, 386, 193, 0, 1829, 1817, 1, 0, 0, 0, 1829, 1818, 1, 0, 0, 0, 1829, 1819, 1, 0, 0, 0, 1829, 1820, 1, 0, 0, 0, 1829, 1821, 1, 0, 0, 0, 1829, 1822, 1, 0, 0, 0, 1829, 1823, 1, 0, 0, 0, 1829, 1824, 1, 0, 0, 0, 1829, 1825, 1, 0, 0, 0, 1829, 1826, 1, 0, 0, 0, 1829, 1827, 1, 0, 0, 0, 1829, 1828, 1, 0, 0, 0, 1830, 385, 1, 0, 0, 0, 1831, 1832, 5, 127, 0, 0, 1832, 1834, 5, 21, 0, 0, 1833, 1835, 5, 27, 0, 0, 1834, 1833, 1, 0, 0, 0, 1834, 1835, 1, 0, 0, 0, 1835, 1836, 1, 0, 0, 0, 1836, 1837, 5, 22, 0, 0, 1837, 387, 1, 0, 0, 0, 1838, 1839, 5, 64, 0, 0, 1839, 1840, 5, 21, 0, 0, 1840, 1841, 5, 22, 0, 0, 1841, 389, 1, 0, 0, 0, 1842, 1843, 5, 85, 0, 0, 1843, 1846, 5, 21, 0, 0, 1844, 1847, 3, 406, 203, 0, 1845, 1847, 3, 410, 205, 0, 1846, 1844, 1, 0, 0, 0, 1846, 1845, 1, 0, 0, 0, 1846, 1847, 1, 0, 0, 0, 1847, 1848, 1, 0, 0, 0, 1848, 1849, 5, 22, 0, 0, 1849, 391, 1, 0, 0, 0, 1850, 1851, 5, 154, 0, 0, 1851, 1852, 5, 21, 0, 0, 1852, 1853, 5, 22, 0, 0, 1853, 393, 1, 0, 0, 0, 1854, 1855, 5, 72, 0, 0, 1855, 1856, 5, 21, 0, 0, 1856, 1857, 5, 22, 0, 0, 1857, 395, 1, 0, 0, 0, 1858, 1859, 5, 124, 0, 0, 1859, 1860, 5, 21, 0, 0, 1860, 1861, 5, 22, 0, 0, 1861, 397, 1, 0, 0, 0, 1862, 1863, 5, 140, 0, 0, 1863, 1866, 5, 21, 0, 0, 1864, 1867, 3, 460, 230, 0, 1865, 1867, 3, 476, 238, 0, 1866, 1864, 1, 0, 0, 0, 1866, 1865, 1, 0, 0, 0, 1866, 1867, 1, 0, 0, 0, 1867, 1868, 1, 0, 0, 0, 1868, 1869, 5, 22, 0, 0, 1869, 399, 1, 0, 0, 0, 1870, 1871, 5, 61, 0, 0, 1871, 1877, 5, 21, 0, 0, 1872, 1875, 3, 402, 201, 0, 1873, 1874, 5, 30, 0, 0, 1874, 1876, 3, 420, 210, 0, 1875, 1873, 1, 0, 0, 0, 1875, 1876, 1, 0, 0, 0, 1876, 1878, 1, 0, 0, 0, 1877, 1872, 1, 0, 0, 0, 1877, 1878, 1, 0, 0, 0, 1878, 1879, 1, 0, 0, 0, 1879, 1880, 5, 22, 0, 0, 1880, 401, 1, 0, 0, 0, 1881, 1884, 3, 414, 207, 0, 1882, 1884, 5, 27, 0, 0, 1883, 1881, 1, 0, 0, 0, 1883, 1882, 1, 0, 0, 0, 1884, 403, 1, 0, 0, 0, 1885, 1886, 5, 144, 0, 0, 1886, 1887, 5, 21, 0, 0, 1887, 1888, 3, 442, 221, 0, 1888, 1889, 5, 22, 0, 0, 1889, 405, 1, 0, 0, 0, 1890, 1891, 5, 86, 0, 0, 1891, 1900, 5, 21, 0, 0, 1892, 1898, 3, 408, 204, 0, 1893, 1894, 5, 30, 0, 0, 1894, 1896, 3, 420, 210, 0, 1895, 1897, 5, 42, 0, 0, 1896, 1895, 1, 0, 0, 0, 1896, 1897, 1, 0, 0, 0, 1897, 1899, 1, 0, 0, 0, 1898, 1893, 1, 0, 0, 0, 1898, 1899, 1, 0, 0, 0, 1899, 1901, 1, 0, 0, 0, 1900, 1892, 1, 0, 0, 0, 1900, 1901, 1, 0, 0, 0, 1901, 1902, 1, 0, 0, 0, 1902, 1903, 5, 22, 0, 0, 1903, 407, 1, 0, 0, 0, 1904, 1907, 3, 416, 208, 0, 1905, 1907, 5, 27, 0, 0, 1906, 1904, 1, 0, 0, 0, 1906, 1905, 1, 0, 0, 0, 1907, 409, 1, 0, 0, 0, 1908, 1909, 5, 145, 0, 0, 1909, 1910, 5, 21, 0, 0, 1910, 1911, 3, 412, 206, 0, 1911, 1912, 5, 22, 0, 0, 1912, 411, 1, 0, 0, 0, 1913, 1914, 3, 416, 208, 0, 1914, 413, 1, 0, 0, 0, 1915, 1916, 3, 456, 228, 0, 1916, 415, 1, 0, 0, 0, 1917, 1918, 3, 456, 228, 0, 1918, 417, 1, 0, 0, 0, 1919, 1920, 3, 420, 210, 0, 1920, 419, 1, 0, 0, 0, 1921, 1922, 3, 456, 228, 0, 1922, 421, 1, 0, 0, 0, 1923, 1925, 3, 66, 33, 0, 1924, 1923, 1, 0, 0, 0, 1925, 1928, 1, 0, 0, 0, 1926, 1924, 1, 0, 0, 0, 1926, 1927, 1, 0, 0, 0, 1927, 1931, 1, 0, 0, 0, 1928, 1926, 1, 0, 0, 0, 1929, 1932, 3, 424, 212, 0, 1930, 1932, 3, 426, 213, 0, 1931, 1929, 1, 0, 0, 0, 1931, 1930, 1, 0, 0, 0, 1932, 423, 1, 0, 0, 0, 1933, 1934, 5, 99, 0, 0, 1934, 1935, 5, 21, 0, 0, 1935, 1936, 5, 27, 0, 0, 1936, 1937, 5, 22, 0, 0, 1937, 425, 1, 0, 0, 0, 1938, 1939, 5, 99, 0, 0, 1939, 1948, 5, 21, 0, 0, 1940, 1945, 3, 378, 189, 0, 1941, 1942, 5, 30, 0, 0, 1942, 1944, 3, 378, 189, 0, 1943, 1941, 1, 0, 0, 0, 1944, 1947, 1, 0, 0, 0, 1945, 1943, 1, 0, 0, 0, 1945, 1946, 1, 0, 0, 0, 1946, 1949, 1, 0, 0, 0, 1947, 1945, 1, 0, 0, 0, 1948, 1940, 1, 0, 0, 0, 1948, 1949, 1, 0, 0, 0, 1949, 1950, 1, 0, 0, 0, 1950, 1951, 5, 22, 0, 0, 1951, 1952, 5, 58, 0, 0, 1952, 1953, 3, 378, 189, 0, 1953, 427, 1, 0, 0, 0, 1954, 1957, 3, 430, 215, 0, 1955, 1957, 3, 432, 216, 0, 1956, 1954, 1, 0, 0, 0, 1956, 1955, 1, 0, 0, 0, 1957, 429, 1, 0, 0, 0, 1958, 1959, 5, 118, 0, 0, 1959, 1960, 5, 21, 0, 0, 1960, 1961, 5, 27, 0, 0, 1961, 1962, 5, 22, 0, 0, 1962, 431, 1, 0, 0, 0, 1963, 1964, 5, 118, 0, 0, 1964, 1965, 5, 21, 0, 0, 1965, 1966, 3, 456, 228, 0, 1966, 1967, 5, 30, 0, 0, 1967, 1968, 3, 378, 189, 0, 1968, 1969, 5, 22, 0, 0, 1969, 433, 1, 0, 0, 0, 1970, 1973, 3, 436, 218, 0, 1971, 1973, 3, 438, 219, 0, 1972, 1970, 1, 0, 0, 0, 1972, 1971, 1, 0, 0, 0, 1973, 435, 1, 0, 0, 0, 1974, 1975, 5, 57, 0, 0, 1975, 1976, 5, 21, 0, 0, 1976, 1977, 5, 27, 0, 0, 1977, 1978, 5, 22, 0, 0, 1978, 437, 1, 0, 0, 0, 1979, 1980, 5, 57, 0, 0, 1980, 1981, 5, 21, 0, 0, 1981, 1982, 3, 378, 189, 0, 1982, 1983, 5, 22, 0, 0, 1983, 439, 1, 0, 0, 0, 1984, 1985, 5, 21, 0, 0, 1985, 1986, 3, 380, 190, 0, 1986, 1987, 5, 22, 0, 0, 1987, 441, 1, 0, 0, 0, 1988, 1989, 3, 414, 207, 0, 1989, 443, 1, 0, 0, 0, 1990, 1996, 3, 446, 223, 0, 1991, 1996, 3, 448, 224, 0, 1992, 1996, 3, 450, 225, 0, 1993, 1996, 3, 452, 226, 0, 1994, 1996, 3, 454, 227, 0, 1995, 1990, 1, 0, 0, 0, 1995, 1991, 1, 0, 0, 0, 1995, 1992, 1, 0, 0, 0, 1995, 1993, 1, 0, 0, 0, 1995, 1994, 1, 0, 0, 0, 1996, 445, 1, 0, 0, 0, 1997, 1998, 5, 172, 0, 0, 1998, 2000, 5, 21, 0, 0, 1999, 2001, 3, 476, 238, 0, 2000, 1999, 1, 0, 0, 0, 2000, 2001, 1, 0, 0, 0, 2001, 2002, 1, 0, 0, 0, 2002, 2003, 5, 22, 0, 0, 2003, 447, 1, 0, 0, 0, 2004, 2005, 5, 176, 0, 0, 2005, 2007, 5, 21, 0, 0, 2006, 2008, 3, 476, 238, 0, 2007, 2006, 1, 0, 0, 0, 2007, 2008, 1, 0, 0, 0, 2008, 2009, 1, 0, 0, 0, 2009, 2010, 5, 22, 0, 0, 2010, 449, 1, 0, 0, 0, 2011, 2012, 5, 175, 0, 0, 2012, 2014, 5, 21, 0, 0, 2013, 2015, 3, 476, 238, 0, 2014, 2013, 1, 0, 0, 0, 2014, 2015, 1, 0, 0, 0, 2015, 2016, 1, 0, 0, 0, 2016, 2017, 5, 22, 0, 0, 2017, 451, 1, 0, 0, 0, 2018, 2019, 5, 173, 0, 0, 2019, 2021, 5, 21, 0, 0, 2020, 2022, 3, 476, 238, 0, 2021, 2020, 1, 0, 0, 0, 2021, 2022, 1, 0, 0, 0, 2022, 2023, 1, 0, 0, 0, 2023, 2024, 5, 22, 0, 0, 2024, 453, 1, 0, 0, 0, 2025, 2026, 5, 174, 0, 0, 2026, 2028, 5, 21, 0, 0, 2027, 2029, 3, 476, 238, 0, 2028, 2027, 1, 0, 0, 0, 2028, 2029, 1, 0, 0, 0, 2029, 2030, 1, 0, 0, 0, 2030, 2031, 5, 22, 0, 0, 2031, 455, 1, 0, 0, 0, 2032, 2035, 3, 458, 229, 0, 2033, 2035, 5, 184, 0, 0, 2034, 2032, 1, 0, 0, 0, 2034, 2033, 1, 0, 0, 0, 2035, 457, 1, 0, 0, 0, 2036, 2039, 5, 185, 0, 0, 2037, 2039, 3, 460, 230, 0, 2038, 2036, 1, 0, 0, 0, 2038, 2037, 1, 0, 0, 0, 2039, 459, 1, 0, 0, 0, 2040, 2043, 5, 188, 0, 0, 2041, 2043, 3, 464, 232, 0, 2042, 2040, 1, 0, 0, 0, 2042, 2041, 1, 0, 0, 0, 2043, 461, 1, 0, 0, 0, 2044, 2049, 5, 185, 0, 0, 2045, 2049, 5, 188, 0, 0, 2046, 2049, 5, 184, 0, 0, 2047, 2049, 3, 468, 234, 0, 2048, 2044, 1, 0, 0, 0, 2048, 2045, 1, 0, 0, 0, 2048, 2046, 1, 0, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 463, 1, 0, 0, 0, 2050, 2053, 3, 468, 234, 0, 2051, 2053, 3, 466, 233, 0, 2052, 2050, 1, 0, 0, 0, 2052, 2051, 1, 0, 0, 0, 2053, 465, 1, 0, 0, 0, 2054, 2055, 7, 24, 0, 0, 2055, 467, 1, 0, 0, 0, 2056, 2057, 7, 25, 0, 0, 2057, 469, 1, 0, 0, 0, 2058, 2059, 3, 476, 238, 0, 2059, 471, 1, 0, 0, 0, 2060, 2067, 5, 11, 0, 0, 2061, 2066, 5, 9, 0, 0, 2062, 2066, 5, 10, 0, 0, 2063, 2066, 5, 1, 0, 0, 2064, 2066, 3, 478, 239, 0, 2065, 2061, 1, 0, 0, 0, 2065, 2062, 1, 0, 0, 0, 2065, 2063, 1, 0, 0, 0, 2065, 2064, 1, 0, 0, 0, 2066, 2069, 1, 0, 0, 0, 2067, 2065, 1, 0, 0, 0, 2067, 2068, 1, 0, 0, 0, 2068, 2070, 1, 0, 0, 0, 2069, 2067, 1, 0, 0, 0, 2070, 2071, 5, 11, 0, 0, 2071, 473, 1, 0, 0, 0, 2072, 2079, 5, 12, 0, 0, 2073, 2078, 5, 9, 0, 0, 2074, 2078, 5, 10, 0, 0, 2075, 2078, 5, 2, 0, 0, 2076, 2078, 3, 480, 240, 0, 2077, 2073, 1, 0, 0, 0, 2077, 2074, 1, 0, 0, 0, 2077, 2075, 1, 0, 0, 0, 2077, 2076, 1, 0, 0, 0, 2078, 2081, 1, 0, 0, 0, 2079, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2082, 1, 0, 0, 0, 2081, 2079, 1, 0, 0, 0, 2082, 2083, 5, 12, 0, 0, 2083, 475, 1, 0, 0, 0, 2084, 2087, 3, 472, 236, 0, 2085, 2087, 3, 474, 237, 0, 2086, 2084, 1, 0, 0, 0, 2086, 2085, 1, 0, 0, 0, 2087, 477, 1, 0, 0, 0, 2088, 2090, 5, 196, 0, 0, 2089, 2088, 1, 0, 0, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2089, 1, 0, 0, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2106, 1, 0, 0, 0, 2093, 2095, 5, 25, 0, 0, 2094, 2096, 3, 76, 38, 0, 2095, 2094, 1, 0, 0, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2098, 1, 0, 0, 0, 2097, 2099, 5, 26, 0, 0, 2098, 2097, 1, 0, 0, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2106, 1, 0, 0, 0, 2100, 2106, 5, 26, 0, 0, 2101, 2106, 5, 3, 0, 0, 2102, 2106, 5, 4, 0, 0, 2103, 2106, 3, 482, 241, 0, 2104, 2106, 3, 474, 237, 0, 2105, 2089, 1, 0, 0, 0, 2105, 2093, 1, 0, 0, 0, 2105, 2100, 1, 0, 0, 0, 2105, 2101, 1, 0, 0, 0, 2105, 2102, 1, 0, 0, 0, 2105, 2103, 1, 0, 0, 0, 2105, 2104, 1, 0, 0, 0, 2106, 479, 1, 0, 0, 0, 2107, 2109, 5, 196, 0, 0, 2108, 2107, 1, 0, 0, 0, 2109, 2110, 1, 0, 0, 0, 2110, 2108, 1, 0, 0, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2125, 1, 0, 0, 0, 2112, 2114, 5, 25, 0, 0, 2113, 2115, 3, 76, 38, 0, 2114, 2113, 1, 0, 0, 0, 2114, 2115, 1, 0, 0, 0, 2115, 2117, 1, 0, 0, 0, 2116, 2118, 5, 26, 0, 0, 2117, 2116, 1, 0, 0, 0, 2117, 2118, 1, 0, 0, 0, 2118, 2125, 1, 0, 0, 0, 2119, 2125, 5, 26, 0, 0, 2120, 2125, 5, 3, 0, 0, 2121, 2125, 5, 4, 0, 0, 2122, 2125, 3, 482, 241, 0, 2123, 2125, 3, 472, 236, 0, 2124, 2108, 1, 0, 0, 0, 2124, 2112, 1, 0, 0, 0, 2124, 2119, 1, 0, 0, 0, 2124, 2120, 1, 0, 0, 0, 2124, 2121, 1, 0, 0, 0, 2124, 2122, 1, 0, 0, 0, 2124, 2123, 1, 0, 0, 0, 2125, 481, 1, 0, 0, 0, 2126, 2129, 3, 464, 232, 0, 2127, 2129, 7, 26, 0, 0, 2128, 2126, 1, 0, 0, 0, 2128, 2127, 1, 0, 0, 0, 2129, 2130, 1, 0, 0, 0, 2130, 2128, 1, 0, 0, 0, 2130, 2131, 1, 0, 0, 0, 2131, 483, 1, 0, 0, 0, 204, 485, 488, 491, 495, 504, 528, 534, 538, 545, 552, 568, 612, 619, 625, 634, 637, 646, 654, 663, 666, 680, 687, 689, 700, 707, 709, 717, 721, 725, 732, 738, 743, 752, 759, 777, 788, 794, 802, 809, 817, 823, 826, 829, 847, 853, 861, 868, 874, 881, 894, 903, 906, 911, 916, 934, 940, 944, 948, 951, 960, 966, 971, 973, 977, 984, 991, 1000, 1012, 1022, 1036, 1041, 1051, 1062, 1078, 1092, 1098, 1107, 1116, 1146, 1154, 1161, 1165, 1172, 1178, 1185, 1193, 1201, 1209, 1216, 1222, 1228, 1234, 1241, 1250, 1258, 1268, 1277, 1283, 1292, 1303, 1308, 1313, 1320, 1325, 1329, 1337, 1344, 1352, 1362, 1366, 1371, 1377, 1379, 1388, 1391, 1398, 1412, 1417, 1432, 1436, 1447, 1464, 1468, 1473, 1482, 1502, 1510, 1512, 1522, 1524, 1531, 1536, 1543, 1546, 1551, 1558, 1561, 1569, 1580, 1590, 1598, 1615, 1618, 1646, 1658, 1665, 1687, 1693, 1703, 1708, 1721, 1724, 1734, 1738, 1755, 1774, 1776, 1788, 1800, 1802, 1813, 1829, 1834, 1846, 1866, 1875, 1877, 1883, 1896, 1898, 1900, 1906, 1926, 1931, 1945, 1948, 1956, 1972, 1995, 2000, 2007, 2014, 2021, 2028, 2034, 2038, 2042, 2048, 2052, 2065, 2067, 2077, 2079, 2086, 2091, 2095, 2098, 2105, 2110, 2114, 2117, 2124, 2128, 2130]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java
index c4c1263861..d58a597d98 100644
--- a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java
@@ -156,7 +156,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
PendingUpdateList pul = new PendingUpdateList();
for (RuntimeIterator child : this.children) {
- pul = PendingUpdateList.mergeUpdates(pul, child.getPendingUpdateList(context), this.getMetadata());
+ pul.mergeUpdates(child.getPendingUpdateList(context), this.getMetadata());
}
return pul;
}
diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java
index 131742fe57..f6dfc708ac 100644
--- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java
@@ -159,8 +159,7 @@ public JavaRDD
- getRDD(DynamicContext context) {
public static JavaRDD
- dataFrameToRDDOfItems(JSoundDataFrame df, ExceptionMetadata metadata) {
JavaRDD
rowRDD = df.javaRDD();
- JavaRDD- result = rowRDD.map(new RowToItemMapper(metadata, df.getItemType()));
- return result;
+ return rowRDD.map(new RowToItemMapper(metadata, df.getItemType()));
}
public void materialize(DynamicContext context, List
- result) {
diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java
index 15ed99c538..b225b1bd35 100644
--- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java
+++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java
@@ -391,7 +391,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
}
PendingUpdateList result = new PendingUpdateList();
- if (!isRDDOrDataFrame()) {
+ if (!this.expression.isRDDOrDataFrame()) {
this.child.open(context);
this.tupleContext = new DynamicContext(context); // assign current context
@@ -401,12 +401,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.tupleContext.getVariableValues().setBindingsFromTuple(tuple, getMetadata()); // assign new
// variables
// from new tuple
-
- result = PendingUpdateList.mergeUpdates(
- result,
- this.expression.getPendingUpdateList(this.tupleContext),
- this.getMetadata()
- );
+ result.mergeUpdates(this.expression.getPendingUpdateList(this.tupleContext), this.getMetadata());
}
this.child.close();
@@ -432,7 +427,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
// from new tuple
PendingUpdateList intermediateResult = this.expression.getPendingUpdateList(dynamicContext);
- result = PendingUpdateList.mergeUpdates(result, intermediateResult, this.getMetadata());
+ result.mergeUpdates(intermediateResult, this.getMetadata());
}
}
return result;
diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java
index 5e253d0d01..501d17953b 100644
--- a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java
@@ -37,6 +37,7 @@
import org.rumbledb.runtime.RuntimeIterator;
import org.rumbledb.runtime.typing.AtMostOneItemTypePromotionIterator;
import org.rumbledb.runtime.typing.TypePromotionIterator;
+import org.rumbledb.runtime.update.PendingUpdateList;
import org.rumbledb.types.FunctionSignature;
import org.rumbledb.types.SequenceType;
import org.rumbledb.types.SequenceType.Arity;
@@ -78,6 +79,7 @@ public FunctionItemCallIterator(
this.functionItem = functionItem;
this.functionArguments = functionArguments;
this.functionBodyIterator = null;
+ this.isUpdating = functionItem.getSignature().isUpdating();
this.validateNumberOfArguments();
this.wrapArgumentIteratorsWithTypeCheckingIterators();
@@ -232,7 +234,8 @@ private RuntimeIterator generatePartiallyAppliedFunction(DynamicContext context)
partialApplicationParamNames,
new FunctionSignature(
partialApplicationParamTypes,
- this.functionItem.getSignature().getReturnType()
+ this.functionItem.getSignature().getReturnType(),
+ this.functionItem.getSignature().isUpdating()
),
this.functionItem.getModuleDynamicContext(),
this.functionItem.getBodyIterator(),
@@ -346,4 +349,16 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) {
this.functionBodyIterator = this.functionItem.getBodyIterator();
return this.functionBodyIterator.getDataFrame(this.dynamicContextForCalls);
}
+
+ @Override
+ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
+ if (!isUpdating()) {
+ return new PendingUpdateList();
+ }
+ this.populateDynamicContextWithArguments(context);
+ DynamicContext contextForUpdates = new DynamicContext(this.dynamicContextForCalls);
+ contextForUpdates.setCurrentMutabilityLevel(context.getCurrentMutabilityLevel());
+ this.functionBodyIterator = this.functionItem.getBodyIterator();
+ return this.functionBodyIterator.getPendingUpdateList(contextForUpdates);
+ }
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java
index b4854d4fad..83ad520810 100644
--- a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java
@@ -44,13 +44,15 @@ public FunctionRuntimeIterator(
Map paramNameToSequenceTypes,
SequenceType returnType,
RuntimeIterator bodyIterator,
- RuntimeStaticContext staticContext
+ RuntimeStaticContext staticContext,
+ boolean isUpdating
) {
super(null, staticContext);
this.functionName = functionName;
this.paramNameToSequenceTypes = paramNameToSequenceTypes;
this.returnType = returnType;
this.bodyIterator = bodyIterator;
+ this.isUpdating = isUpdating;
}
@Override
@@ -61,7 +63,8 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
this.paramNameToSequenceTypes,
this.returnType,
dynamicContext.getModuleContext(),
- bodyIteratorCopy
+ bodyIteratorCopy,
+ this.isUpdating
);
function.populateClosureFromDynamicContext(dynamicContext, getMetadata());
return function;
diff --git a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java
index 6bf65e3b88..326e01ae76 100644
--- a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java
@@ -31,6 +31,7 @@
import org.rumbledb.items.structured.JSoundDataFrame;
import org.rumbledb.runtime.HybridRuntimeIterator;
import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.update.PendingUpdateList;
import java.util.List;
import java.util.Map;
@@ -55,13 +56,15 @@ public class StaticUserDefinedFunctionCallIterator extends HybridRuntimeIterator
public StaticUserDefinedFunctionCallIterator(
FunctionIdentifier functionIdentifier,
List functionArguments,
- RuntimeStaticContext staticContext
+ RuntimeStaticContext staticContext,
+ boolean isUpdating
) {
super(null, staticContext);
this.functionIdentifier = functionIdentifier;
this.functionArguments = functionArguments;
this.userDefinedFunctionCallIterator = null;
this.nextExitStatementResult = 0;
+ this.isUpdating = isUpdating;
}
protected boolean implementsDataFrames() {
@@ -199,4 +202,19 @@ public Map getVariableDependencies() {
}
return result;
}
+
+ @Override
+ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
+ if (!isUpdating()) {
+ return new PendingUpdateList();
+ }
+ this.userDefinedFunctionCallIterator = context.getNamedFunctions()
+ .getUserDefinedFunctionCallIterator(
+ this.functionIdentifier,
+ this.getHighestExecutionMode(),
+ getMetadata(),
+ this.functionArguments
+ );
+ return this.userDefinedFunctionCallIterator.getPendingUpdateList(context);
+ }
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java
new file mode 100644
index 0000000000..50247351ca
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java
@@ -0,0 +1,89 @@
+package org.rumbledb.runtime.functions.delta_lake;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.RowFactory;
+import org.apache.spark.sql.types.DataTypes;
+import org.apache.spark.sql.types.StructType;
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.CannotRetrieveResourceException;
+import org.rumbledb.items.BooleanItem;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.functions.input.FileSystemUtil;
+import org.apache.spark.sql.Row;
+import sparksoniq.spark.SparkSessionManager;
+
+import java.io.File;
+import java.net.URI;
+import java.util.List;
+
+import static org.apache.spark.sql.functions.lit;
+import static org.apache.spark.sql.functions.monotonically_increasing_id;
+
+public class CreateDeltaLakeTableFunctionIterator extends AtMostOneItemLocalRuntimeIterator {
+
+ public CreateDeltaLakeTableFunctionIterator(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ RuntimeIterator urlIterator = this.children.get(0);
+ urlIterator.open(context);
+ String url = urlIterator.next().getStringValue();
+ urlIterator.close();
+ URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata());
+ if (FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) {
+ throw new CannotRetrieveResourceException(
+ "File " + uri + " already exists. Cannot create new delta lake table at this location.",
+ getMetadata()
+ );
+ }
+ try {
+ File directory = new File(uri.getPath());
+ if (!directory.exists()) {
+ boolean mkdirs = directory.mkdirs();
+ if (!mkdirs) {
+ throw new RuntimeException("Failed to create directory " + directory);
+ }
+ }
+ Dataset
dataFrame = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .emptyDataFrame();
+ dataFrame = dataFrame.withColumn(SparkSessionManager.mutabilityLevelColumnName, lit(0));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id());
+ dataFrame = dataFrame.withColumn(SparkSessionManager.pathInColumnName, lit(""));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.tableLocationColumnName, lit(uri.toString()));
+
+ StructType schema = new StructType()
+ .add(SparkSessionManager.mutabilityLevelColumnName, DataTypes.IntegerType, false)
+ .add(SparkSessionManager.rowIdColumnName, DataTypes.IntegerType, false)
+ .add(SparkSessionManager.pathInColumnName, DataTypes.StringType, false)
+ .add(SparkSessionManager.tableLocationColumnName, DataTypes.StringType, false);
+
+ Row newRow = RowFactory.create(
+ 0,
+ 0,
+ "",
+ uri.toString()
+ );
+
+ Dataset newRowDataFrame = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .createDataFrame(List.of(newRow), schema);
+
+ Dataset combinedDataFrame = dataFrame.union(newRowDataFrame);
+
+ combinedDataFrame.write().format("delta").mode("error").save(uri.toString());
+ return new BooleanItem(true);
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ return new BooleanItem(false);
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java
new file mode 100644
index 0000000000..c62424558e
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java
@@ -0,0 +1,53 @@
+package org.rumbledb.runtime.functions.delta_lake;
+
+import org.apache.commons.io.FileUtils;
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.CannotRetrieveResourceException;
+import org.rumbledb.items.BooleanItem;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.functions.input.FileSystemUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+
+public class DeleteDeltaLakeTableFunctionIterator extends AtMostOneItemLocalRuntimeIterator {
+
+ public DeleteDeltaLakeTableFunctionIterator(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ RuntimeIterator urlIterator = this.children.get(0);
+ urlIterator.open(context);
+ String url = urlIterator.next().getStringValue();
+ urlIterator.close();
+ URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata());
+ if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) {
+ throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata());
+ }
+
+ // URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory(
+ // this.currentAnnotation.getDeltaTablePath(),
+ // DeltaLakeConfigurationCatalogue.defaultDeltaLakeConfiguration,
+ // ExceptionMetadata.EMPTY_METADATA
+ // );
+
+ try {
+ File oldTable = new File(uri.getPath());
+ FileUtils.deleteDirectory(oldTable);
+ return new BooleanItem(true);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return new BooleanItem(false);
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java
new file mode 100644
index 0000000000..b06283ebcb
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java
@@ -0,0 +1,32 @@
+package org.rumbledb.runtime.functions.delta_lake;
+
+import org.rumbledb.config.RumbleRuntimeConfiguration;
+
+public class DeltaLakeConfigurationCatalogue {
+ static final RumbleRuntimeConfiguration defaultDeltaLakeConfiguration = new RumbleRuntimeConfiguration(
+ new String[] {
+ "--print-iterator-tree",
+ "yes",
+ "--output-format",
+ "delta",
+ "--show-error-info",
+ "yes",
+ "--apply-updates",
+ "yes",
+ }
+ );
+
+ static final RumbleRuntimeConfiguration createDeltaLakeConfiguration = new RumbleRuntimeConfiguration(
+ new String[] {
+ "--print-iterator-tree",
+ "yes",
+ "--output-format",
+ "delta",
+ "--show-error-info",
+ "yes",
+ "--apply-updates",
+ "yes",
+ }
+ );
+
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java
new file mode 100644
index 0000000000..6934f3b13e
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java
@@ -0,0 +1,65 @@
+package org.rumbledb.runtime.functions.input;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.CannotRetrieveResourceException;
+import org.rumbledb.items.structured.JSoundDataFrame;
+import org.rumbledb.runtime.DataFrameRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import sparksoniq.spark.SparkSessionManager;
+
+import java.net.URI;
+import java.util.List;
+
+import static org.apache.spark.sql.functions.lit;
+import static org.apache.spark.sql.functions.monotonically_increasing_id;
+
+public class DeltaFileFunctionIterator extends DataFrameRuntimeIterator {
+
+ private static final long serialVersionUID = 1L;
+
+ public DeltaFileFunctionIterator(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public JSoundDataFrame getDataFrame(DynamicContext context) {
+ RuntimeIterator urlIterator = this.children.get(0);
+ urlIterator.open(context);
+ String url = urlIterator.next().getStringValue();
+ urlIterator.close();
+ URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata());
+ if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) {
+ throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata());
+ }
+ // DeltaTable deltaTable = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(),
+ // uri.toString());
+ SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .read()
+ .format("delta")
+ .load(uri.toString())
+ .withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id())
+ .write()
+ .format("delta")
+ .mode("overwrite")
+ .option("overwriteSchema", true)
+ .save(uri.toString());
+ Dataset dataFrame = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .read()
+ .format("delta")
+ .load(uri.toString());
+ dataFrame = dataFrame.withColumn(SparkSessionManager.mutabilityLevelColumnName, lit(0));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id());
+ dataFrame = dataFrame.withColumn(SparkSessionManager.pathInColumnName, lit(""));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.tableLocationColumnName, lit(uri.toString()));
+ // TODO: Make unique DeltaTable code
+ return new JSoundDataFrame(dataFrame);
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java
index ae28047e8a..6e159fe805 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java
@@ -73,7 +73,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
}
}
- Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
this.hasNext = false;
return result;
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java
index edf66d1b5e..4f5bf5b141 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java
@@ -113,7 +113,7 @@ private void getDescendantPairs(List- items) {
List
- valueList = Collections.singletonList(value);
Item result = ItemFactory.getInstance()
- .createObjectItem(keyList, valueList, getMetadata());
+ .createObjectItem(keyList, valueList, getMetadata(), true);
this.nextResults.add(result);
getDescendantPairs(valueList);
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java
index ee05ad56cb..2315c72ac0 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java
@@ -88,7 +88,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
}
}
- Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
return result;
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java
index e64f62c6ad..922dd969be 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java
@@ -45,10 +45,10 @@ public Item call(Item arg0) throws Exception {
for (String key : arg0.getKeys()) {
Item value = arg0.getItemByKey(key);
Item arrayValue = ItemFactory.getInstance()
- .createArrayItem(new ArrayList
- (Collections.singletonList(value)));
+ .createArrayItem(new ArrayList
- (Collections.singletonList(value)), false);
keyValuePairs.put(key, new ArrayList
- (Collections.singletonList(arrayValue)));
}
- return ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ return ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
}
};
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java
index 48f44c314e..aa3cd8de4e 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java
@@ -71,6 +71,6 @@ else if (!v2.isObject())
}
}
- return ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ return ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
}
};
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java
index 840c4f029a..4787501129 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java
@@ -69,6 +69,18 @@ public void openLocal() {
private void setResultsFromDF() {
JSoundDataFrame childDF = this.iterator.getDataFrame(this.currentDynamicContextForLocalExecution);
for (String key : childDF.getKeys()) {
+ if (key.equals(SparkSessionManager.mutabilityLevelColumnName)) {
+ continue;
+ }
+ if (key.equals(SparkSessionManager.rowIdColumnName)) {
+ continue;
+ }
+ if (key.equals(SparkSessionManager.tableLocationColumnName)) {
+ continue;
+ }
+ if (key.equals(SparkSessionManager.pathInColumnName)) {
+ continue;
+ }
if (
!key.equals(SparkSessionManager.emptyObjectJSONiqItemColumnName)
&& !key.equals(SparkSessionManager.atomicJSONiqItemColumnName)
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java
index 72a385ec29..f17a173d03 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java
@@ -112,7 +112,7 @@ private Item getProjection(Item objItem, List
- keys) {
}
}
return ItemFactory.getInstance()
- .createObjectItem(finalKeylist, finalValueList, getMetadata());
+ .createObjectItem(finalKeylist, finalValueList, getMetadata(), true);
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
index 6b5dd20f0e..0a1f967c24 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
@@ -120,7 +120,7 @@ private Item removeKeys(Item objItem, List removalKeys) {
}
}
return ItemFactory.getInstance()
- .createObjectItem(finalKeylist, finalValueList, getMetadata());
+ .createObjectItem(finalKeylist, finalValueList, getMetadata(), true);
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java
index cbda4f4ad7..9ae3102bb6 100644
--- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java
@@ -470,6 +470,18 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
if (df.isEmptySequence()) {
return null;
}
+ ItemType maxType;
+ if (
+ df.getItemType().isObjectItemType()
+ && df.getItemType().getObjectContentFacet().containsKey("tableLocation")
+ ) {
+ maxType = df.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+ } else {
+ maxType = df.getItemType();
+ }
String input = FlworDataFrameUtils.createTempView(df.getDataFrame());
JSoundDataFrame maxDF = df.evaluateSQL(
String.format(
@@ -478,7 +490,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
SparkSessionManager.atomicJSONiqItemColumnName,
input
),
- df.getItemType()
+ maxType
);
return itemTypePromotion(maxDF.getExactlyOneItem());
}
diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java
index a79cc0bae6..4e22ef925a 100644
--- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java
+++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java
@@ -23,6 +23,8 @@
import org.apache.log4j.LogManager;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.ArrayType;
import org.apache.spark.sql.types.DataType;
import org.apache.spark.sql.types.StructType;
@@ -40,6 +42,7 @@
import org.rumbledb.runtime.flwor.NativeClauseContext;
import org.rumbledb.types.ItemType;
import org.rumbledb.types.SequenceType;
+import org.rumbledb.types.ItemTypeFactory;
import sparksoniq.spark.SparkSessionManager;
@@ -237,6 +240,11 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context);
initLookupPosition(context);
String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame());
+ boolean isObject = childDataFrame.getItemType().isObjectItemType();
+ boolean hasAtomicJSONiqItem = isObject
+ && childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .containsKey(SparkSessionManager.atomicJSONiqItemColumnName);
if (childDataFrame.getItemType().isArrayItemType()) {
ItemType elementType = childDataFrame.getItemType().getArrayContentFacet();
if (elementType.isObjectItemType()) {
@@ -266,6 +274,66 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
),
elementType
);
+ } else if (
+ hasAtomicJSONiqItem
+ &&
+ childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .isArrayItemType()
+ && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation")
+ ) {
+ ItemType elementType = childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .getArrayContentFacet();
+ String sql;
+ JSoundDataFrame res;
+ if (elementType.isObjectItemType()) {
+ sql = String.format(
+ "SELECT `%s`.*, `%s`, `%s`, `%s`, `%s` FROM (SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s)",
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup - 1,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ this.lookup - 1,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup
+ );
+ res = childDataFrame.evaluateSQL(sql, elementType);
+ } else {
+ sql = String.format(
+ "SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s",
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup - 1,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ this.lookup - 1,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup
+ );
+ Dataset
df = childDataFrame.getDataFrame().sparkSession().sql(sql);
+ ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema());
+ res = new JSoundDataFrame(df, deltaItemType);
+ }
+ return res;
}
if (getConfiguration().doStaticAnalysis()) {
throw new UnexpectedStaticTypeException(
diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java
index ba12801d73..f88af52e11 100644
--- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java
+++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java
@@ -23,6 +23,8 @@
import org.apache.log4j.LogManager;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.ArrayType;
import org.rumbledb.api.Item;
import org.rumbledb.context.DynamicContext;
@@ -39,6 +41,7 @@
import org.rumbledb.runtime.flwor.NativeClauseContext;
import org.rumbledb.types.ItemType;
import org.rumbledb.types.SequenceType;
+import org.rumbledb.types.ItemTypeFactory;
import sparksoniq.spark.SparkSessionManager;
@@ -182,6 +185,11 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC
public JSoundDataFrame getDataFrame(DynamicContext context) {
JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context);
String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame());
+ boolean isObject = childDataFrame.getItemType().isObjectItemType();
+ boolean hasAtomicJSONiqItem = isObject
+ && childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .containsKey(SparkSessionManager.atomicJSONiqItemColumnName);
if (childDataFrame.getItemType().isArrayItemType()) {
ItemType elementType = childDataFrame.getItemType().getArrayContentFacet();
if (elementType.isObjectItemType()) {
@@ -205,6 +213,59 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
),
elementType
);
+ } else if (
+ hasAtomicJSONiqItem
+ && childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .isArrayItemType()
+ && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation")
+ ) {
+ ItemType elementType = childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .getArrayContentFacet();
+ String sql;
+ JSoundDataFrame res;
+ // TODO: SORT OUT INDEXING DURING UNBOXING
+ if (elementType.isObjectItemType()) {
+ sql = String.format(
+ "SELECT col.*, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)",
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array
+ );
+ res = childDataFrame.evaluateSQL(sql, elementType);
+ } else {
+ sql = String.format(
+ "SELECT col, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)",
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array
+ );
+ Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql);
+ ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema());
+ res = new JSoundDataFrame(df, deltaItemType);
+ }
+ return res;
}
if (getConfiguration().doStaticAnalysis()) {
throw new UnexpectedStaticTypeException(
diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java
index 1237e01e03..b66278c627 100644
--- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java
+++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java
@@ -20,9 +20,16 @@
package org.rumbledb.runtime.navigation;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Map;
+
import org.apache.log4j.LogManager;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.DataType;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
@@ -31,7 +38,12 @@
import org.rumbledb.context.Name;
import org.rumbledb.context.RuntimeStaticContext;
import org.rumbledb.errorcodes.ErrorCode;
-import org.rumbledb.exceptions.*;
+import org.rumbledb.exceptions.InvalidSelectorException;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.exceptions.MoreThanOneItemException;
+import org.rumbledb.exceptions.NoItemException;
+import org.rumbledb.exceptions.UnexpectedStaticTypeException;
+import org.rumbledb.exceptions.UnexpectedTypeException;
import org.rumbledb.expressions.flowr.FLWOR_CLAUSES;
import org.rumbledb.items.ItemFactory;
import org.rumbledb.items.structured.JSoundDataFrame;
@@ -44,17 +56,13 @@
import org.rumbledb.types.BuiltinTypesCatalogue;
import org.rumbledb.types.FieldDescriptor;
import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
import org.rumbledb.types.SequenceType;
import org.rumbledb.types.SequenceType.Arity;
import org.rumbledb.types.TypeMappings;
import sparksoniq.spark.SparkSessionManager;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Map;
-
public class ObjectLookupIterator extends HybridRuntimeIterator {
private static final long serialVersionUID = 1L;
@@ -351,21 +359,61 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
type = fieldDescriptor.getType();
}
if (type.isObjectItemType()) {
+ // TODO: Find another way to check if delta dataframe -- e.g. flag and mutability level
+ // TODO: implement keyword vars to stop ust using strs
+ String sql;
+ if (childDataFrame.getKeys().contains("tableLocation")) {
+ sql = String.format(
+ "SELECT `%s`.*, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s",
+ key,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ key,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ object
+ );
+
+ } else {
+ sql = String.format("SELECT `%s`.* FROM %s", key, object);
+ }
JSoundDataFrame result = childDataFrame.evaluateSQL(
- String.format("SELECT `%s`.* FROM %s", key, object),
+ sql,
type
);
return result;
} else {
- JSoundDataFrame result = childDataFrame.evaluateSQL(
- String.format(
+ String sql;
+ JSoundDataFrame result;
+ if (childDataFrame.getKeys().contains("tableLocation")) {
+ sql = String.format(
+ "SELECT `%s` AS `%s`, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s",
+ key,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ key,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ object
+ );
+ Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql);
+ ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema());
+ result = new JSoundDataFrame(df, deltaItemType);
+ } else {
+ sql = String.format(
"SELECT `%s` AS `%s` FROM %s",
key,
SparkSessionManager.atomicJSONiqItemColumnName,
object
- ),
- type
- );
+ );
+ result = childDataFrame.evaluateSQL(
+ sql,
+ type
+ );
+ }
return result;
}
}
diff --git a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java
index 36b2d8b91d..d4e39c8d99 100644
--- a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java
@@ -51,7 +51,7 @@ public Item materializeFirstItemOrNull(
if (!this.children.isEmpty()) {
result.addAll(this.children.get(0).materialize(dynamicContext));
}
- Item item = ItemFactory.getInstance().createArrayItem(result);
+ Item item = ItemFactory.getInstance().createArrayItem(result, true);
return item;
}
}
diff --git a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java
index 4c871ea861..cfa46df538 100644
--- a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java
@@ -77,7 +77,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
}
this.hasNext = false;
return ItemFactory.getInstance()
- .createObjectItem(keys, values, getMetadata());
+ .createObjectItem(keys, values, getMetadata(), true);
} else {
@@ -90,7 +90,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
valueIterator.close();
// SIMILAR TO ZORBA, if value is more than one item, wrap it in an array
if (currentResults.size() > 1) {
- values.add(ItemFactory.getInstance().createArrayItem(currentResults));
+ values.add(ItemFactory.getInstance().createArrayItem(currentResults, true));
} else if (currentResults.size() == 1) {
values.add(currentResults.get(0));
} else {
@@ -121,7 +121,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
}
this.hasNext = false;
return ItemFactory.getInstance()
- .createObjectItem(keys, values, getMetadata());
+ .createObjectItem(keys, values, getMetadata(), true);
}
}
}
diff --git a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java
index 256a318fdd..91970ed72d 100644
--- a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java
+++ b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java
@@ -105,6 +105,16 @@ protected Item nextLocal() {
return null;
}
+ @Override
+ public boolean isSequential() {
+ return this.statementsAndExprIterator.isSequential();
+ }
+
+ @Override
+ public boolean isUpdating() {
+ return this.statementsAndExprIterator.isUpdating();
+ }
+
@Override
public PendingUpdateList getPendingUpdateList(DynamicContext context) {
if (!encounteredExitStatement) {
diff --git a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java
index 8f7cc5beb4..bf035392dd 100644
--- a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java
+++ b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java
@@ -156,6 +156,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) {
return exprIterator.getDataFrame(dynamicContext);
}
+ @Override
+ public boolean isUpdating() {
+ return this.children.get(this.children.size() - 1).isUpdating();
+ }
+
@Override
public PendingUpdateList getPendingUpdateList(DynamicContext context) {
RuntimeIterator exprIterator = this.children.get(this.children.size() - 1);
diff --git a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java
index b63ebe5004..39f972fe1e 100644
--- a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java
+++ b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java
@@ -23,6 +23,7 @@
import org.rumbledb.runtime.HybridRuntimeIterator;
import org.rumbledb.runtime.RuntimeIterator;
import org.rumbledb.runtime.functions.sequences.general.TreatAsClosure;
+import org.rumbledb.runtime.update.PendingUpdateList;
import org.rumbledb.types.ItemType;
import org.rumbledb.types.ItemTypeFactory;
import org.rumbledb.types.SequenceType;
@@ -51,12 +52,14 @@ public class TreatIterator extends HybridRuntimeIterator {
public TreatIterator(
RuntimeIterator iterator,
SequenceType sequenceType,
+ boolean isUpdating,
ErrorCode errorCode,
RuntimeStaticContext staticContext
) {
super(Collections.singletonList(iterator), staticContext);
this.iterator = iterator;
this.sequenceType = sequenceType;
+ this.isUpdating = isUpdating;
this.errorCode = errorCode;
if (!this.sequenceType.isEmptySequence()) {
this.itemType = this.sequenceType.getItemType();
@@ -73,6 +76,15 @@ public TreatIterator(
}
}
+ public TreatIterator(
+ RuntimeIterator iterator,
+ SequenceType sequenceType,
+ ErrorCode errorCode,
+ RuntimeStaticContext staticContext
+ ) {
+ this(iterator, sequenceType, false, errorCode, staticContext);
+ }
+
@Override
public boolean hasNextLocal() {
return this.hasNext;
@@ -226,6 +238,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) {
throw errorToThrow("" + dataItemType);
}
+ @Override
+ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
+ return iterator.getPendingUpdateList(context);
+ }
+
/**
* Converts a homogeneous RDD of atomic values to a DataFrame
*
diff --git a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java
index c8666e38c6..2bcb717650 100644
--- a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java
@@ -389,7 +389,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met
}
Integer minLength = itemType.getMinLengthFacet();
Integer maxLength = itemType.getMaxLengthFacet();
- Item arrayItem = ItemFactory.getInstance().createArrayItem(members);
+ Item arrayItem = ItemFactory.getInstance().createArrayItem(members, true);
if (itemType.getName() == null) {
itemType = itemType.getBaseType();
}
@@ -453,7 +453,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met
}
}
Item objectItem = ItemFactory.getInstance()
- .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA);
+ .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA, true);
if (itemType.getName() == null) {
itemType = itemType.getBaseType();
}
diff --git a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java
index 6e56434714..346e72d68c 100644
--- a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java
+++ b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java
@@ -17,9 +17,27 @@ public class PendingUpdateList {
private Map- > delReplaceArrayMap;
private Map
- > renameObjMap;
private Comparator
- targetComparator;
+ private Comparator
- arraySelectorComparator;
public PendingUpdateList() {
+ // TODO: diff comparator for delta
this.targetComparator = (item1, item2) -> {
+ boolean itemIsDelta1 = item1.getTableLocation() != null && !item1.getTableLocation().equals("null");
+ boolean itemIsDelta2 = item2.getTableLocation() != null && !item2.getTableLocation().equals("null");
+ if (itemIsDelta1 && itemIsDelta2) {
+ int tableComp = item1.getTableLocation().compareTo(item2.getTableLocation());
+ if (tableComp != 0) {
+ return tableComp;
+ }
+ int rowComp = Long.compare(item1.getTopLevelID(), item2.getTopLevelID());
+ if (rowComp != 0) {
+ return rowComp;
+ }
+ return item1.getPathIn().compareTo(item2.getPathIn());
+ } else if (itemIsDelta1 || itemIsDelta2) {
+ // TODO: what to compare when one is delta and one is not? Never occurs?
+ return 0;
+ }
int hashCompare = Integer.compare(item1.hashCode(), item2.hashCode());
if (item1.hashCode() != item2.hashCode()) {
return hashCompare;
@@ -29,6 +47,7 @@ public PendingUpdateList() {
}
return Integer.compare(System.identityHashCode(item1), System.identityHashCode(item2));
};
+ this.arraySelectorComparator = Comparator.comparingInt(Item::getIntValue).reversed();
this.insertObjMap = new TreeMap<>(this.targetComparator);
this.insertArrayMap = new TreeMap<>(this.targetComparator);
this.delReplaceObjMap = new TreeMap<>(this.targetComparator);
@@ -44,39 +63,39 @@ public PendingUpdateList(UpdatePrimitive updatePrimitive) {
public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) {
Item target = updatePrimitive.getTarget();
if (updatePrimitive.isDeleteObject()) {
- Map
- locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>());
for (Item locator : updatePrimitive.getContentList()) {
locSrcMap.put(locator, null);
}
- delReplaceObjMap.put(target, locSrcMap);
+ this.delReplaceObjMap.put(target, locSrcMap);
} else if (updatePrimitive.isReplaceObject()) {
- Map
- locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent());
- delReplaceObjMap.put(target, locSrcMap);
+ this.delReplaceObjMap.put(target, locSrcMap);
} else if (updatePrimitive.isInsertObject()) {
- insertObjMap.put(target, updatePrimitive.getContent());
+ this.insertObjMap.put(target, updatePrimitive.getContent());
} else if (updatePrimitive.isRenameObject()) {
- Map
- locSrcMap = renameObjMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.renameObjMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent());
- renameObjMap.put(target, locSrcMap);
+ this.renameObjMap.put(target, locSrcMap);
} else if (updatePrimitive.isDeleteArray()) {
- Map
- locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), null);
- delReplaceArrayMap.put(target, locSrcMap);
+ this.delReplaceArrayMap.put(target, locSrcMap);
} else if (updatePrimitive.isReplaceArray()) {
- Map
- locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent());
- delReplaceArrayMap.put(target, locSrcMap);
+ this.delReplaceArrayMap.put(target, locSrcMap);
} else if (updatePrimitive.isInsertArray()) {
- Map
- > locSrcMap = insertArrayMap.getOrDefault(target, new HashMap<>());
+ Map
- > locSrcMap = this.insertArrayMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContentList());
- insertArrayMap.put(target, locSrcMap);
+ this.insertArrayMap.put(target, locSrcMap);
} else {
throw new OurBadException("Invalid UpdatePrimitive created");
}
@@ -85,7 +104,9 @@ public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) {
public void applyUpdates(ExceptionMetadata metadata) {
UpdatePrimitiveFactory upFactory = UpdatePrimitiveFactory.getInstance();
- Map
- > targetArrayPULs = new HashMap<>();
+ // new TreeMap<>(this.targetComparator) sometimes causes null on apply?
+ Map
- >> targetArrayPULs = new HashMap<>();
+ Map
- > tempSelPULsMap;
List tempArrayPULs;
List objectPUL = new ArrayList<>();
@@ -96,9 +117,9 @@ public void applyUpdates(ExceptionMetadata metadata) {
////// OBJECTS
// DELETES & REPLACES
- for (Item target : delReplaceObjMap.keySet()) {
+ for (Item target : this.delReplaceObjMap.keySet()) {
List
- toDel = new ArrayList<>();
- tempSelSrcMap = delReplaceObjMap.get(target);
+ tempSelSrcMap = this.delReplaceObjMap.get(target);
for (Item locator : tempSelSrcMap.keySet()) {
tempSrc = tempSelSrcMap.get(locator);
if (tempSrc == null) {
@@ -107,19 +128,21 @@ public void applyUpdates(ExceptionMetadata metadata) {
objectPUL.add(upFactory.createReplaceInObjectPrimitive(target, locator, tempSrc, metadata));
}
}
- objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata));
+ if (!toDel.isEmpty()) {
+ objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata));
+ }
}
// INSERTS
- for (Item target : insertObjMap.keySet()) {
- objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, insertObjMap.get(target)));
+ for (Item target : this.insertObjMap.keySet()) {
+ objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, this.insertObjMap.get(target), metadata));
}
// RENAMES
- for (Item target : renameObjMap.keySet()) {
- tempSelSrcMap = renameObjMap.get(target);
+ for (Item target : this.renameObjMap.keySet()) {
+ tempSelSrcMap = this.renameObjMap.get(target);
for (Item locator : tempSelSrcMap.keySet()) {
objectPUL.add(
upFactory.createRenameInObjectPrimitive(target, locator, tempSelSrcMap.get(locator), metadata)
@@ -131,9 +154,9 @@ public void applyUpdates(ExceptionMetadata metadata) {
// DELETES & REPLACES
- for (Item target : delReplaceArrayMap.keySet()) {
- tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>());
- tempSelSrcMap = delReplaceArrayMap.get(target);
+ for (Item target : this.delReplaceArrayMap.keySet()) {
+ tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator));
+ tempSelSrcMap = this.delReplaceArrayMap.get(target);
for (Item locator : tempSelSrcMap.keySet()) {
UpdatePrimitive up;
tempSrc = tempSelSrcMap.get(locator);
@@ -142,38 +165,31 @@ public void applyUpdates(ExceptionMetadata metadata) {
} else {
up = upFactory.createReplaceInArrayPrimitive(target, locator, tempSrc, metadata);
}
- int index = Collections.binarySearch(
- tempArrayPULs,
- up,
- Comparator.comparing(UpdatePrimitive::getIntSelector)
- );
- if (index < 0) {
- index = -index - 1;
- }
- tempArrayPULs.add(index, up);
+ tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>());
+ tempArrayPULs.add(up);
+ tempSelPULsMap.put(locator, tempArrayPULs);
}
- targetArrayPULs.put(target, tempArrayPULs);
+ targetArrayPULs.put(target, tempSelPULsMap);
}
// INSERTS
- for (Item target : insertArrayMap.keySet()) {
+ for (Item target : this.insertArrayMap.keySet()) {
UpdatePrimitive up;
- tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>());
- tempSelSrcListMap = insertArrayMap.get(target);
+ tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator));
+ tempSelSrcListMap = this.insertArrayMap.get(target);
for (Item locator : tempSelSrcListMap.keySet()) {
- up = upFactory.createInsertIntoArrayPrimitive(target, locator, tempSelSrcListMap.get(locator));
- int index = Collections.binarySearch(
- tempArrayPULs,
- up,
- Comparator.comparing(UpdatePrimitive::getIntSelector)
+ up = upFactory.createInsertIntoArrayPrimitive(
+ target,
+ locator,
+ tempSelSrcListMap.get(locator),
+ metadata
);
- if (index < 0) {
- index = -index - 1;
- }
- tempArrayPULs.add(index, up);
+ tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>());
+ tempArrayPULs.add(up);
+ tempSelPULsMap.put(locator, tempArrayPULs);
}
- targetArrayPULs.put(target, tempArrayPULs);
+ targetArrayPULs.put(target, tempSelPULsMap);
}
////// APPLY OBJECTS
@@ -183,151 +199,123 @@ public void applyUpdates(ExceptionMetadata metadata) {
}
////// APPLY ARRAYS
-
for (Item target : targetArrayPULs.keySet()) {
- tempArrayPULs = targetArrayPULs.get(target);
- for (int i = tempArrayPULs.size() - 1; i >= 0; i--) {
- tempArrayPULs.get(i).apply();
+ tempSelPULsMap = targetArrayPULs.get(target);
+ for (Item selector : tempSelPULsMap.keySet()) {
+ tempArrayPULs = tempSelPULsMap.get(selector);
+ for (UpdatePrimitive up : tempArrayPULs) {
+ up.apply();
+ }
}
}
}
- public static PendingUpdateList mergeUpdates(
- PendingUpdateList pul1,
- PendingUpdateList pul2,
+ public void mergeUpdates(
+ PendingUpdateList otherPul,
ExceptionMetadata metadata
) {
- PendingUpdateList res = new PendingUpdateList();
Map
- tempSelSrcMap;
Map
- > tempSelSrcListMap;
Map
- tempSelSrcResMap;
Map
- > tempSelSrcResListMap;
Item tempSrc;
+ Item tempSrcRes;
List
- tempSrcList;
////// OBJECTS
// DELETES & REPLACES
-
- for (Item target : pul1.delReplaceObjMap.keySet()) {
- tempSelSrcMap = pul1.delReplaceObjMap.get(target);
- tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.delReplaceObjMap.keySet()) {
+ tempSelSrcMap = otherPul.delReplaceObjMap.get(target);
+ tempSelSrcResMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcMap.keySet()) {
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
- }
- res.delReplaceObjMap.put(target, tempSelSrcResMap);
- }
-
- for (Item target : pul2.delReplaceObjMap.keySet()) {
- tempSelSrcMap = pul2.delReplaceObjMap.get(target);
- tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcMap.keySet()) {
- if (tempSelSrcResMap.containsKey(selector)) {
- tempSrc = tempSelSrcResMap.get(selector);
- if (tempSrc != null) {
+ tempSrc = tempSelSrcMap.get(selector);
+ tempSrcRes = tempSelSrcResMap.get(selector);
+ boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector);
+ if (tempSrc == null) {
+ boolean hasRename = this.renameObjMap.containsKey(target)
+ && this.renameObjMap.get(target).containsKey(selector);
+ if (hasRename) {
+ this.renameObjMap.get(target).remove(selector);
+ }
+ } else {
+ if (srcResMapHasSel && tempSrcRes != null) {
throw new TooManyReplacesOnSameTargetSelectorException(
target.getDynamicType().getName().toString(),
selector.getStringValue(),
metadata
);
+ } else if (srcResMapHasSel) {
+ continue;
}
- continue;
}
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
+ tempSelSrcResMap.put(selector, tempSrc);
}
- res.delReplaceObjMap.put(target, tempSelSrcResMap);
+ this.delReplaceObjMap.put(target, tempSelSrcResMap);
}
// INSERTS
-
- res.insertObjMap.putAll(pul1.insertObjMap);
-
- for (Item target : pul2.insertObjMap.keySet()) {
- tempSrc = pul2.insertObjMap.get(target);
- if (res.insertObjMap.containsKey(target)) {
- tempSrc = InsertIntoObjectPrimitive.mergeSources(res.insertObjMap.get(target), tempSrc, metadata);
+ for (Item target : otherPul.insertObjMap.keySet()) {
+ tempSrc = otherPul.insertObjMap.get(target);
+ if (this.insertObjMap.containsKey(target)) {
+ tempSrc = InsertIntoObjectPrimitive.mergeSources(this.insertObjMap.get(target), tempSrc, metadata);
}
- res.insertObjMap.put(target, tempSrc);
+ this.insertObjMap.put(target, tempSrc);
}
// RENAME
-
- for (Item target : pul1.renameObjMap.keySet()) {
- tempSelSrcMap = pul1.renameObjMap.get(target);
- tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcMap.keySet()) {
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
- }
- res.renameObjMap.put(target, tempSelSrcResMap);
- }
-
- for (Item target : pul2.renameObjMap.keySet()) {
- tempSelSrcMap = pul2.renameObjMap.get(target);
- tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.renameObjMap.keySet()) {
+ tempSelSrcMap = otherPul.renameObjMap.get(target);
+ tempSelSrcResMap = this.renameObjMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcMap.keySet()) {
if (tempSelSrcResMap.containsKey(selector)) {
throw new TooManyRenamesOnSameTargetSelectorException(selector.getStringValue(), metadata);
}
+ boolean isDelete = this.delReplaceObjMap.containsKey(target)
+ && this.delReplaceObjMap.get(target).containsKey(selector)
+ && this.delReplaceObjMap.get(target).get(selector) == null;
+ if (isDelete) {
+ continue;
+ }
tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
}
- res.renameObjMap.put(target, tempSelSrcResMap);
+ this.renameObjMap.put(target, tempSelSrcResMap);
}
////// ARRAYS
// DELETES & REPLACES
-
- for (Item target : pul1.delReplaceArrayMap.keySet()) {
- tempSelSrcMap = pul1.delReplaceArrayMap.get(target);
- tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.delReplaceArrayMap.keySet()) {
+ tempSelSrcMap = otherPul.delReplaceArrayMap.get(target);
+ tempSelSrcResMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcMap.keySet()) {
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
- }
- res.delReplaceArrayMap.put(target, tempSelSrcResMap);
- }
-
- for (Item target : pul2.delReplaceArrayMap.keySet()) {
- tempSelSrcMap = pul2.delReplaceArrayMap.get(target);
- tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcMap.keySet()) {
- if (tempSelSrcResMap.containsKey(selector)) {
- tempSrc = tempSelSrcResMap.get(selector);
- if (tempSrc != null) {
+ tempSrc = tempSelSrcMap.get(selector);
+ tempSrcRes = tempSelSrcResMap.get(selector);
+ boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector);
+ if (tempSrc != null && srcResMapHasSel) {
+ if (tempSrcRes == null) {
+ continue;
+ } else {
throw new TooManyReplacesOnSameTargetSelectorException(
target.getDynamicType().getName().toString(),
Integer.toString(selector.getIntValue()),
metadata
);
}
- continue;
}
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
+ tempSelSrcResMap.put(selector, tempSrc);
}
- res.delReplaceArrayMap.put(target, tempSelSrcResMap);
+ this.delReplaceArrayMap.put(target, tempSelSrcResMap);
}
// INSERTS
-
- for (Item target : pul1.insertArrayMap.keySet()) {
- tempSelSrcListMap = pul1.insertArrayMap.get(target);
- tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcListMap.keySet()) {
- tempSelSrcResListMap.put(selector, tempSelSrcListMap.get(selector));
- }
- res.insertArrayMap.put(target, tempSelSrcResListMap);
- }
-
- for (Item target : pul2.insertArrayMap.keySet()) {
- tempSelSrcListMap = pul2.insertArrayMap.get(target);
- tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.insertArrayMap.keySet()) {
+ tempSelSrcListMap = otherPul.insertArrayMap.get(target);
+ tempSelSrcResListMap = this.insertArrayMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcListMap.keySet()) {
tempSrcList = tempSelSrcResListMap.getOrDefault(selector, new ArrayList<>());
@@ -336,10 +324,8 @@ public static PendingUpdateList mergeUpdates(
InsertIntoArrayPrimitive.mergeSources(tempSrcList, tempSelSrcListMap.get(selector))
);
}
- res.insertArrayMap.put(target, tempSelSrcResListMap);
+ this.insertArrayMap.put(target, tempSelSrcResListMap);
}
-
- return res;
}
}
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java
index 054fe6f2b0..5bf329c486 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java
@@ -1,5 +1,6 @@
package org.rumbledb.runtime.update.expression;
+import org.apache.commons.lang3.SerializationUtils;
import org.apache.spark.api.java.JavaRDD;
import org.rumbledb.api.Item;
import org.rumbledb.context.DynamicContext;
@@ -72,7 +73,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
try {
target = this.arrayIterator.materializeExactlyOneItem(context);
- content = this.toAppendIterator.materializeExactlyOneItem(context);
+ content = SerializationUtils.clone(this.toAppendIterator.materializeExactlyOneItem(context));
} catch (NoItemException | MoreThanOneItemException e) {
throw new RuntimeException(e);
}
@@ -81,13 +82,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
UpdatePrimitive up;
if (target.isArray()) {
Item locator = ItemFactory.getInstance().createIntItem(target.getSize() + 1);
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
this.getMetadata()
);
}
- up = factory.createInsertIntoArrayPrimitive(target, locator, Collections.singletonList(content));
+ up = factory.createInsertIntoArrayPrimitive(
+ target,
+ locator,
+ Collections.singletonList(content),
+ this.getMetadata()
+ );
} else {
throw new InvalidUpdateTargetException(
"Append expression target must be a single array",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java
index c9a4dc6aae..e05c026095 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java
@@ -83,6 +83,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
@@ -97,6 +100,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java
index 297156cdd6..f36e3b8ebf 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java
@@ -42,7 +42,7 @@ public InsertExpressionIterator(
}
public boolean hasPositionIterator() {
- return positionIterator != null;
+ return this.positionIterator != null;
}
@Override
@@ -84,7 +84,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
try {
main = this.mainIterator.materializeExactlyOneItem(context);
- content = (Item) SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context));
+ content = SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context));
if (this.hasPositionIterator()) {
locator = this.positionIterator.materializeExactlyOneItem(context);
}
@@ -103,13 +103,16 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
this.getMetadata()
);
}
- up = factory.createInsertIntoObjectPrimitive(main, content);
+ up = factory.createInsertIntoObjectPrimitive(main, content, this.getMetadata());
} else if (main.isArray()) {
if (locator == null) {
throw new CannotCastUpdateSelectorException("Insert expression selector is null", this.getMetadata());
@@ -120,13 +123,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
this.getMetadata()
);
}
- up = factory.createInsertIntoArrayPrimitive(main, locator, Collections.singletonList(content));
+ up = factory.createInsertIntoArrayPrimitive(
+ main,
+ locator,
+ Collections.singletonList(content),
+ this.getMetadata()
+ );
} else {
throw new InvalidUpdateTargetException(
"Insert expression target must be a single array or object",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java
index 57fbf49e50..9f0142399f 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java
@@ -90,6 +90,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java
index 25ce38dea5..e32445f544 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java
@@ -74,7 +74,6 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
Item target;
Item locator;
Item content;
-
try {
target = this.mainIterator.materializeExactlyOneItem(context);
locator = this.locatorIterator.materializeExactlyOneItem(context);
@@ -94,7 +93,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
for (Item item : tempContent) {
copyContent.add((Item) SerializationUtils.clone(item));
}
- content = ItemFactory.getInstance().createArrayItem(copyContent);
+ content = ItemFactory.getInstance().createArrayItem(copyContent, true);
}
UpdatePrimitiveFactory factory = UpdatePrimitiveFactory.getInstance();
@@ -106,6 +105,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
@@ -120,6 +122,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java
index fb1a24a0f4..85ae6484c8 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java
@@ -46,20 +46,20 @@ public TransformExpressionIterator(
protected JavaRDD
- getRDDAux(DynamicContext context) {
PendingUpdateList pul = getPendingUpdateList(context);
pul.applyUpdates(this.getMetadata());
- return returnIterator.getRDD(context);
+ return this.returnIterator.getRDD(context);
}
@Override
protected void openLocal() {
PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution);
pul.applyUpdates(this.getMetadata());
- returnIterator.open(this.currentDynamicContextForLocalExecution);
+ this.returnIterator.open(this.currentDynamicContextForLocalExecution);
}
@Override
protected void closeLocal() {
- returnIterator.close();
- for (Name copyVar : copyDeclMap.keySet()) {
+ this.returnIterator.close();
+ for (Name copyVar : this.copyDeclMap.keySet()) {
this.currentDynamicContextForLocalExecution.getVariableValues().removeVariable(copyVar);
}
}
@@ -68,35 +68,39 @@ protected void closeLocal() {
protected void resetLocal() {
PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution);
pul.applyUpdates(this.getMetadata());
- returnIterator.reset(this.currentDynamicContextForLocalExecution);
+ this.returnIterator.reset(this.currentDynamicContextForLocalExecution);
}
@Override
protected boolean hasNextLocal() {
- return returnIterator.hasNext();
+ return this.returnIterator.hasNext();
}
@Override
protected Item nextLocal() {
- return returnIterator.next();
+ return this.returnIterator.next();
}
@Override
public PendingUpdateList getPendingUpdateList(DynamicContext context) {
bindCopyDeclarations(context);
- context.setCurrentMutabilityLevel(this.mutabilityLevel);
- return modifyIterator.getPendingUpdateList(context);
+ DynamicContext newCtx = new DynamicContext(context);
+ newCtx.setCurrentMutabilityLevel(this.mutabilityLevel);
+ return this.modifyIterator.getPendingUpdateList(newCtx);
}
private void bindCopyDeclarations(DynamicContext context) {
- for (Name copyVar : copyDeclMap.keySet()) {
- RuntimeIterator copyIterator = copyDeclMap.get(copyVar);
+ for (Name copyVar : this.copyDeclMap.keySet()) {
+ RuntimeIterator copyIterator = this.copyDeclMap.get(copyVar);
List
- toCopy = copyIterator.materialize(context);
List
- copy = new ArrayList<>();
Item temp;
for (Item item : toCopy) {
- temp = (Item) SerializationUtils.clone(item);
+ temp = SerializationUtils.clone(item);
temp.setMutabilityLevel(this.mutabilityLevel);
+ // TODO: Currently avoids copied delta items being updated via applyDelta but perhaps should be checked
+ // with mutability level
+ temp.setTableLocation(null);
copy.add(temp);
}
context.getVariableValues().addVariableValue(copyVar, copy);
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java
index 8cf51f57bb..e204578079 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java
@@ -1,8 +1,14 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+
public class DeleteFromArrayPrimitive implements UpdatePrimitive {
@@ -23,9 +29,53 @@ public DeleteFromArrayPrimitive(Item targetArray, Item positionInt, ExceptionMet
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
this.target.removeItemAt(this.selector.getIntValue() - 1);
}
+ @Override
+ public void applyDelta() {
+ String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ String selectArrayQuery = "SELECT "
+ + pathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset
arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+ String setClause = "SET " + pathIn + " = ";
+ this.applyItem();
+ setClause = setClause + this.target.getSparkSQLValue(arrayType);
+
+ String query = "UPDATE delta.`" + location + "` " + setClause + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -33,17 +83,17 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public int getIntSelector() {
- return selector.getIntValue();
+ return this.selector.getIntValue();
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java
index a55b5b9a3e..5bd8918c24 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java
@@ -3,11 +3,13 @@
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import sparksoniq.spark.SparkSessionManager;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
import java.util.stream.Collectors;
+import static org.apache.spark.sql.functions.*;
+
public class DeleteFromObjectPrimitive implements UpdatePrimitive {
private Item target;
@@ -30,6 +32,15 @@ public DeleteFromObjectPrimitive(Item targetObject, List- namesToRemove, Ex
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
for (
String str : this.content.stream().map(Item::getStringValue).collect(Collectors.toList())
) {
@@ -37,6 +48,28 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ List setFieldsToNulls = this.content.stream()
+ .map(i -> pathIn + i.getStringValue() + " = NULL")
+ .collect(Collectors.toList());
+ String concatSetNulls = String.join(", ", setFieldsToNulls);
+
+ String query = "UPDATE delta.`" + location + "` SET " + concatSetNulls + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return false;
@@ -44,12 +77,12 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public List
- getContentList() {
- return content;
+ return this.content;
}
@Override
@@ -57,10 +90,4 @@ public boolean isDeleteObject() {
return true;
}
- public static List
- mergeSources(List
- first, List
- second) {
- List
- merged = new ArrayList<>(first);
- merged.addAll(second);
- merged = merged.stream().distinct().collect(Collectors.toList());
- return merged;
- }
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java
index a6f2d9b4e8..2dc0c8e3c5 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java
@@ -1,6 +1,13 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
+import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
import java.util.ArrayList;
import java.util.List;
@@ -11,12 +18,17 @@ public class InsertIntoArrayPrimitive implements UpdatePrimitive {
private Item selector;
private List
- content;
- public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List
- sourceSequence) {
- if (!targetArray.isArray() || !positionInt.isNumeric()) {
- // TODO ERROR
- }
- if (positionInt.getIntValue() < 0 || positionInt.getIntValue() >= targetArray.getSize()) {
- // TODO throw error or do nothing?
+ public InsertIntoArrayPrimitive(
+ Item targetArray,
+ Item positionInt,
+ List
- sourceSequence,
+ ExceptionMetadata metadata
+ ) {
+ if (positionInt.getIntValue() <= 0 || positionInt.getIntValue() > targetArray.getSize() + 1) {
+ throw new CannotResolveUpdateSelectorException(
+ "Cannot insert item at index out of range of target array",
+ metadata
+ );
}
this.target = targetArray;
@@ -27,9 +39,60 @@ public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List
- s
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
this.target.putItemsAt(this.content, this.selector.getIntValue() - 1);
}
+ @Override
+ public void applyDelta() {
+ // TODO: Properly discern ItemType to SQLType
+ // TODO: Sort out types for value item
+ // ASSUMES ArrayType ONLY CONTAINS 1 TYPE AND INSERTION OF A DIFF TYPE IS INVALID
+ // TODO: perhaps check for homogenous typing of array w/o relying on SQL error
+
+ String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+ // DeltaTable dt = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(), location);
+
+ if (startOfArrayIndexing == -1) {
+ String selectArrayQuery = "SELECT "
+ + pathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset
arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ String setClause = pathIn + " = ";
+ this.applyItem();
+ setClause = setClause + this.target.getSparkSQLValue(arrayType);
+
+ String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldQuery);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -37,22 +100,22 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public int getIntSelector() {
- return selector.getIntValue();
+ return this.selector.getIntValue();
}
@Override
public List- getContentList() {
- return content;
+ return this.content;
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java
index 4bcd0eb1a2..e4093e3f06 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java
@@ -1,11 +1,15 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.AnalysisException;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.*;
import org.rumbledb.items.ItemFactory;
+import sparksoniq.spark.SparkSessionManager;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
+
public class InsertIntoObjectPrimitive implements UpdatePrimitive {
@@ -13,9 +17,14 @@ public class InsertIntoObjectPrimitive implements UpdatePrimitive {
private Item content;
- public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) {
- if (!targetObject.isObject() || !contentObject.isObject()) {
- // TODO: ERROR
+ public InsertIntoObjectPrimitive(Item targetObject, Item contentObject, ExceptionMetadata metadata) {
+ for (String key : contentObject.getKeys()) {
+ if (targetObject.getItemByKey(key) != null) {
+ throw new DuplicateKeyOnUpdateApplyException(
+ "cannot insert a key already present in an object",
+ metadata
+ );
+ }
}
this.target = targetObject;
this.content = contentObject;
@@ -23,6 +32,15 @@ public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) {
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
try {
for (String key : this.content.getKeys()) {
this.target.putItemByKey(key, this.content.getItemByKey(key));
@@ -32,6 +50,55 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ // TODO: Properly discern ItemType to SQLType
+ // TODO: Sort out types for value item
+
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+
+ List columnsClauseList = new ArrayList<>();
+ List setClauseList = new ArrayList<>();
+ List keys = this.content.getKeys();
+ List
- values = this.content.getValues();
+ for (int i = 0; i < keys.size(); i++) {
+ columnsClauseList.add(pathIn + keys.get(i) + " " + values.get(i).getSparkSQLType());
+ setClauseList.add(pathIn + keys.get(i) + " = " + values.get(i).getSparkSQLValue());
+ }
+
+ String setClauses = String.join(", ", setClauseList);
+
+ List insertColumnQueries = columnsClauseList.stream()
+ .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");")
+ .collect(Collectors.toList());
+
+ String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClauses + " WHERE rowID == " + rowID;
+
+ SparkSessionManager manager = SparkSessionManager.getInstance();
+
+ // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS
+ for (String insertColumnQuery : insertColumnQueries) {
+ try {
+ manager.getOrCreateSession().sql(insertColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ }
+ manager.getOrCreateSession().sql(setFieldQuery);
+ } else {
+ this.arrayIndexingApplyDelta();
+ // TODO: Add new column for changed array and do the null trick -- do not forget the nullable etc
+ }
+ }
+
@Override
public boolean hasSelector() {
return false;
@@ -57,6 +124,44 @@ public boolean isInsertObject() {
return true;
}
+ @Override
+ public boolean updatesSchemaDelta() {
+ return true;
+ }
+
+ @Override
+ public void arrayIndexingUpdateSchemaDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+
+ String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element");
+
+ List columnsClauseList = new ArrayList<>();
+ List keys = this.content.getKeys();
+ List
- values = this.content.getValues();
+ for (int i = 0; i < keys.size(); i++) {
+ columnsClauseList.add(pathInSchema + keys.get(i) + " " + values.get(i).getSparkSQLType());
+ }
+
+ List insertColumnQueries = columnsClauseList.stream()
+ .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");")
+ .collect(Collectors.toList());
+
+ SparkSessionManager manager = SparkSessionManager.getInstance();
+
+ // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS
+ for (String insertColumnQuery : insertColumnQueries) {
+ try {
+ manager.getOrCreateSession().sql(insertColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ }
+ }
+
public static Item mergeSources(Item first, Item second, ExceptionMetadata metadata) {
Item res;
@@ -67,7 +172,7 @@ public static Item mergeSources(Item first, Item second, ExceptionMetadata metad
values.addAll(second.getValues());
try {
- res = ItemFactory.getInstance().createObjectItem(keys, values, metadata);
+ res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false);
} catch (DuplicateObjectKeyException e) {
throw new DuplicateObjectInsertSourceException(e.getMessage(), metadata);
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java
index 01c0d4037b..538c36cae3 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java
@@ -1,8 +1,16 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.AnalysisException;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+
+import static org.apache.spark.sql.functions.col;
public class RenameInObjectPrimitive implements UpdatePrimitive {
@@ -32,6 +40,15 @@ public RenameInObjectPrimitive(
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
String name = this.selector.getStringValue();
if (this.target.getKeys().contains(name)) {
Item item = this.target.getItemByKey(name);
@@ -41,6 +58,61 @@ public void apply() {
// TODO: implement replace and rename methods for Array & Object to avoid deletion and append
}
+ @Override
+ public void applyDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ String oldName = this.selector.getStringValue();
+
+ String fullOldPath = pathIn + oldName;
+ String fullNewPath = pathIn + this.content.getStringValue();
+
+ String setOldFieldClause = fullOldPath + " = NULL";
+ String setNewFieldClause = fullNewPath + " = " + this.target.getItemByKey(oldName).getSparkSQLValue();
+ String type = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .sql("DESC (SELECT " + fullOldPath + " FROM delta.`" + location + "`)")
+ .filter(col("col_name").equalTo(oldName))
+ .select("data_type")
+ .collectAsList()
+ .get(0)
+ .getString(0);
+
+ String insertNewColumnQuery = "ALTER TABLE delta.`"
+ + location
+ + "` ADD COLUMNS ("
+ + fullNewPath
+ + " "
+ + type
+ + ");";
+ String setFieldsQuery = "UPDATE delta.`"
+ + location
+ + "` SET "
+ + setOldFieldClause
+ + ", "
+ + setNewFieldClause
+ + " WHERE rowID == "
+ + rowID;
+
+ // SKIP INSERTING NEW COL IF COL ALREADY EXISTS
+ try {
+ SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldsQuery);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -48,21 +120,71 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public Item getContent() {
- return content;
+ return this.content;
}
@Override
public boolean isRenameObject() {
return true;
}
+
+ @Override
+ public boolean updatesSchemaDelta() {
+ return true;
+ }
+
+ @Override
+ public void arrayIndexingUpdateSchemaDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+
+ String selectColQuery = "SELECT "
+ + pathIn
+ + this.selector.getStringValue()
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset
colDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectColQuery);
+
+ ItemType colType = ItemTypeFactory.createItemType(colDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element");
+ String fullNewPath = pathInSchema + this.content.getStringValue();
+
+ String insertNewColumnQuery = "ALTER TABLE delta.`"
+ + location
+ + "` ADD COLUMNS ("
+ + fullNewPath
+ + " "
+ + colType.getSparkSQLType()
+ + ");";
+
+ // SKIP INSERTING NEW COL IF COL ALREADY EXISTS
+ try {
+ SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ }
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java
index 9be2c98200..04d027b242 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java
@@ -1,8 +1,14 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+
public class ReplaceInArrayPrimitive implements UpdatePrimitive {
@@ -30,6 +36,15 @@ public ReplaceInArrayPrimitive(
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
int index = this.selector.getIntValue() - 1;
if (index >= 0 || index < this.target.getSize()) {
this.target.removeItemAt(index);
@@ -41,6 +56,47 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ // TODO: Sort out diff types of content Item
+ // TODO: Find out name of array column
+ // ASSUME pathIn CONTAINS ARRAYFIELD NAME
+ // PERHAPS CASE OF REPLACING ARRAY WITH 1 ITEM SHOULD CREATE NEW ARRAYCOL WITH CORRECTED TYPE IF TYPE CHANGES
+
+ String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ String selectArrayQuery = "SELECT "
+ + pathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ String setField = pathIn + " = ";
+ this.applyItem();
+ setField = setField + this.target.getSparkSQLValue(arrayType);
+
+ String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -48,22 +104,22 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public int getIntSelector() {
- return selector.getIntValue();
+ return this.selector.getIntValue();
}
@Override
public Item getContent() {
- return content;
+ return this.content;
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java
index cfa9c68e9c..e8ddd3ab58 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java
@@ -3,6 +3,10 @@
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import sparksoniq.spark.SparkSessionManager;
+
+
+import static org.apache.spark.sql.functions.*;
public class ReplaceInObjectPrimitive implements UpdatePrimitive {
@@ -19,7 +23,7 @@ public ReplaceInObjectPrimitive(
if (targetObject.getItemByKey(targetName.getStringValue()) == null) {
throw new CannotResolveUpdateSelectorException(
- "Cannot delete key that does not exist in target object",
+ "Cannot replace key that does not exist in target object",
metadata
);
}
@@ -31,6 +35,15 @@ public ReplaceInObjectPrimitive(
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
String name = this.getSelector().getStringValue();
if (this.getTarget().getKeys().contains(name)) {
this.getTarget().removeItemByKey(name);
@@ -38,6 +51,29 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ // TODO: Sort out diff types of content Item
+ // PERHAPS CHANGE OF TYPE SHOULD CREATE NEW COLUMN?
+
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+
+ String setField = pathIn + this.selector.getStringValue() + " = " + this.content.getSparkSQLValue();
+
+ String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java
index 7827587d36..af73ecea42 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java
@@ -1,13 +1,26 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.api.java.JavaRDD;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.items.parsing.RowToItemMapper;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+import java.util.Arrays;
import java.util.List;
public interface UpdatePrimitive {
void apply();
+ void applyItem();
+
+ void applyDelta();
+
boolean hasSelector();
Item getTarget();
@@ -56,5 +69,82 @@ default boolean isRenameObject() {
return false;
}
+ default boolean updatesSchemaDelta() {
+ return false;
+ }
+
+ default void arrayIndexingUpdateSchemaDelta() {
+ throw new UnsupportedOperationException("Operation not defined");
+ }
+
+ default void arrayIndexingApplyDelta() {
+ Item target = this.getTarget();
+
+ String pathIn = target.getPathIn().substring(target.getPathIn().indexOf(".") + 1);
+ String location = target.getTableLocation();
+ long rowID = target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ String preIndexingPathIn = pathIn.substring(0, startOfArrayIndexing);
+ String postIndexingPathIn = pathIn.substring(startOfArrayIndexing);
+ List fields = Arrays.asList(postIndexingPathIn.split("\\."));
+
+ // TODO: Perhaps an if here to update schema if required but need to sort out new name of array column --
+ if (this.updatesSchemaDelta()) {
+ this.arrayIndexingUpdateSchemaDelta();
+ }
+
+ String selectArrayQuery = "SELECT "
+ + preIndexingPathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ JavaRDD rowRDD = arrayDF.javaRDD();
+ JavaRDD- itemRDD = rowRDD.map(new RowToItemMapper(ExceptionMetadata.EMPTY_METADATA, arrayType));
+ List
- collectedItems = itemRDD.take(2);
+ Item originalArray = collectedItems.get(0);
+ // TODO: errors if 0 items or more than one item
+
+ Item innerItem = originalArray;
+ for (int i = 0; i < fields.size() - 1; i++) {
+ String field = fields.get(i);
+ if (innerItem.isObject()) {
+ innerItem = innerItem.getItemByKey(field);
+ } else if (innerItem.isArray()) {
+ int index = Integer.parseInt(field.substring(field.indexOf("[") + 1, field.indexOf("]")));
+ innerItem = innerItem.getItemAt(index);
+ }
+ }
+
+ String finalSelector = fields.get(fields.size() - 1);
+ this.applyItem();
+ if (innerItem.isObject()) {
+ innerItem.removeItemByKey(finalSelector);
+ innerItem.putItemByKey(finalSelector, this.getTarget());
+ } else if (innerItem.isArray()) {
+ int finalIndex = Integer.parseInt(
+ finalSelector.substring(finalSelector.indexOf("[") + 1, finalSelector.indexOf("]"))
+ );
+ innerItem.removeItemAt(finalIndex);
+ innerItem.putItemAt(this.getTarget(), finalIndex);
+ }
+
+ String setClause = preIndexingPathIn + " = " + originalArray.getSparkSQLValue(arrayType);
+ String query = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ }
+
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java
index 2dc938b1c2..c351803af8 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java
@@ -32,12 +32,21 @@ public UpdatePrimitive createDeleteFromObjectPrimitive(
return new DeleteFromObjectPrimitive(targetObject, selectorStrs, metadata);
}
- public UpdatePrimitive createInsertIntoArrayPrimitive(Item targetArray, Item selectorInt, List
- contents) {
- return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents);
+ public UpdatePrimitive createInsertIntoArrayPrimitive(
+ Item targetArray,
+ Item selectorInt,
+ List
- contents,
+ ExceptionMetadata metadata
+ ) {
+ return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents, metadata);
}
- public UpdatePrimitive createInsertIntoObjectPrimitive(Item targetObject, Item contentsObject) {
- return new InsertIntoObjectPrimitive(targetObject, contentsObject);
+ public UpdatePrimitive createInsertIntoObjectPrimitive(
+ Item targetObject,
+ Item contentsObject,
+ ExceptionMetadata metadata
+ ) {
+ return new InsertIntoObjectPrimitive(targetObject, contentsObject, metadata);
}
public UpdatePrimitive createReplaceInArrayPrimitive(
diff --git a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java
index 5899742ed1..8581c4311a 100644
--- a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java
+++ b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java
@@ -155,7 +155,7 @@ private static Item assembleResponse(RumbleRuntimeConfiguration configuration, L
);
} else {
if (results != null) {
- Item values = ItemFactory.getInstance().createArrayItem(results);
+ Item values = ItemFactory.getInstance().createArrayItem(results, false);
output.putItemByKey("values", values);
}
}
diff --git a/src/main/java/org/rumbledb/types/ArrayItemType.java b/src/main/java/org/rumbledb/types/ArrayItemType.java
index ddf40af11e..34d0ab69ee 100644
--- a/src/main/java/org/rumbledb/types/ArrayItemType.java
+++ b/src/main/java/org/rumbledb/types/ArrayItemType.java
@@ -266,4 +266,12 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati
return this.content.isCompatibleWithDataFrames(configuration);
}
+ @Override
+ public String getSparkSQLType() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("ARRAY<");
+ sb.append(this.getArrayContentFacet().getSparkSQLType());
+ sb.append(">");
+ return sb.toString();
+ }
}
diff --git a/src/main/java/org/rumbledb/types/AtomicItemType.java b/src/main/java/org/rumbledb/types/AtomicItemType.java
index 02b3b48e82..a4c3fb22e6 100644
--- a/src/main/java/org/rumbledb/types/AtomicItemType.java
+++ b/src/main/java/org/rumbledb/types/AtomicItemType.java
@@ -547,4 +547,24 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati
}
return true;
}
+
+ @Override
+ public String getSparkSQLType() {
+ if (this.getPrimitiveType().equals(stringItem)) {
+ return "STRING";
+ }
+ if (this.getPrimitiveType().equals(booleanItem)) {
+ return "BOOLEAN";
+ }
+ if (this.getPrimitiveType().equals(doubleItem)) {
+ return "DOUBLE";
+ }
+ if (this.getPrimitiveType().equals(floatItem)) {
+ return "FLOAT";
+ }
+ if (this.getPrimitiveType().equals(decimalItem)) {
+ return "DECIMAL";
+ }
+ throw new UnsupportedOperationException("getSparkSQLType is unsupported for " + this.getPrimitiveType());
+ }
}
diff --git a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java
index 1f7ba3822a..a6e6b27258 100644
--- a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java
+++ b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java
@@ -613,4 +613,21 @@ public void processBaseType() {
ExceptionMetadata.EMPTY_METADATA
);
}
+
+ @Override
+ public String getSparkSQLType() {
+ if (this.equals(BuiltinTypesCatalogue.integerItem)) {
+ return "INT";
+ }
+ if (this.equals(BuiltinTypesCatalogue.intItem)) {
+ return "INT";
+ }
+ if (this.equals(BuiltinTypesCatalogue.longItem)) {
+ return "LONG";
+ }
+ if (this.equals(BuiltinTypesCatalogue.shortItem)) {
+ return "SHORT";
+ }
+ return this.primitiveType.getSparkSQLType();
+ }
}
diff --git a/src/main/java/org/rumbledb/types/FunctionSignature.java b/src/main/java/org/rumbledb/types/FunctionSignature.java
index be9defb075..8e5369e121 100644
--- a/src/main/java/org/rumbledb/types/FunctionSignature.java
+++ b/src/main/java/org/rumbledb/types/FunctionSignature.java
@@ -26,14 +26,24 @@
public class FunctionSignature implements Serializable {
private List parameterTypes;
private SequenceType returnType;
+ private boolean isUpdating;
private static final long serialVersionUID = 1L;
public FunctionSignature(
List parameterTypes,
- SequenceType returnType
+ SequenceType returnType,
+ boolean isUpdating
) {
this.parameterTypes = parameterTypes;
this.returnType = returnType;
+ this.isUpdating = isUpdating;
+ }
+
+ public FunctionSignature(
+ List parameterTypes,
+ SequenceType returnType
+ ) {
+ this(parameterTypes, returnType, false);
}
@@ -45,6 +55,10 @@ public SequenceType getReturnType() {
return this.returnType;
}
+ public boolean isUpdating() {
+ return this.isUpdating;
+ }
+
@Override
public boolean equals(Object instance) {
return instance instanceof FunctionSignature
diff --git a/src/main/java/org/rumbledb/types/ItemType.java b/src/main/java/org/rumbledb/types/ItemType.java
index 101c5978a6..c51604f2e8 100644
--- a/src/main/java/org/rumbledb/types/ItemType.java
+++ b/src/main/java/org/rumbledb/types/ItemType.java
@@ -451,6 +451,15 @@ default boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurat
return false;
}
+ /**
+ * Returns the SparkSQL type of the item type for use in a query.
+ *
+ * @return String representing the SparkSQL type of the item type.
+ */
+ default String getSparkSQLType() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getName());
+ }
+
String toString();
default boolean isResolved() {
diff --git a/src/main/java/org/rumbledb/types/ObjectItemType.java b/src/main/java/org/rumbledb/types/ObjectItemType.java
index 7c189dcbb4..5bb2b3f66d 100644
--- a/src/main/java/org/rumbledb/types/ObjectItemType.java
+++ b/src/main/java/org/rumbledb/types/ObjectItemType.java
@@ -372,4 +372,28 @@ public void checkSubtypeConsistency() {
);
}
}
+
+
+ @Override
+ public String getSparkSQLType() {
+ StringBuilder sb = new StringBuilder();
+ Map content = this.getObjectContentFacet();
+ String[] keys = content.keySet().toArray(new String[0]);
+
+ sb.append("STRUCT<");
+ for (int i = 0; i < keys.length; i++) {
+ String key = keys[i];
+ FieldDescriptor field = content.get(key);
+
+ sb.append(key);
+ sb.append(":");
+ sb.append(field.getType().getSparkSQLType());
+ if (i < keys.length - 1) {
+ sb.append(", ");
+ }
+ }
+ sb.append(">");
+
+ return sb.toString();
+ }
}
diff --git a/src/main/java/sparksoniq/spark/SparkSessionManager.java b/src/main/java/sparksoniq/spark/SparkSessionManager.java
index 17923d698a..cca6a293f0 100644
--- a/src/main/java/sparksoniq/spark/SparkSessionManager.java
+++ b/src/main/java/sparksoniq/spark/SparkSessionManager.java
@@ -83,12 +83,16 @@ public class SparkSessionManager {
private SparkSession session;
private JavaSparkContext javaSparkContext;
- public static String atomicJSONiqItemColumnName = "0d08af5d-10bb-4a73-af84-c6aac917a830";
- public static String emptyObjectJSONiqItemColumnName = "a84bc646-05af-4383-8853-2e9f31a710f2";
- public static String temporaryColumnName = "0f7b4040-b404-4239-99dd-9b4cf2900594";
- public static String countColumnName = "5af0c0c8-e84c-482a-82ce-1887565cf448";
- public static String rightHandSideHashColumnName = "db273b7d-d927-4c0d-b9c1-665af71faa2b ";
- public static String leftHandSideHashColumnName = "171bdb70-7400-48ed-a105-d132f4e38a2d";
+ public static String atomicJSONiqItemColumnName = "atomic0d08af5d-10bb-4a73-af84-c6aac917a830";
+ public static String emptyObjectJSONiqItemColumnName = "emptyobja84bc646-05af-4383-8853-2e9f31a710f2";
+ public static String temporaryColumnName = "tmp0f7b4040-b404-4239-99dd-9b4cf2900594";
+ public static String countColumnName = "count5af0c0c8-e84c-482a-82ce-1887565cf448";
+ public static String rightHandSideHashColumnName = "rhsdb273b7d-d927-4c0d-b9c1-665af71faa2b ";
+ public static String leftHandSideHashColumnName = "lhs171bdb70-7400-48ed-a105-d132f4e38a2d";
+ public static String mutabilityLevelColumnName = "mutabilityLevel";
+ public static String rowIdColumnName = "rowID";
+ public static String pathInColumnName = "pathIn";
+ public static String tableLocationColumnName = "tableLocation";
private SparkSessionManager() {
}
@@ -126,6 +130,11 @@ private void setDefaultConfiguration() {
this.configuration.setAppName(APP_NAME);
}
this.configuration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product
+ this.configuration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension");
+ this.configuration.set(
+ "spark.sql.catalog.spark_catalog",
+ "org.apache.spark.sql.delta.catalog.DeltaCatalog"
+ );
if (!this.configuration.contains("spark.master")) {
this.configuration.set("spark.master", "local[*]");
}
diff --git a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java
index 90933724fe..6048587b3a 100644
--- a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java
+++ b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java
@@ -101,7 +101,8 @@ public Item call(Tuple2