diff --git a/dbml-homepage/docs/docs.md b/dbml-homepage/docs/docs.md index a21925366..c93794c79 100644 --- a/dbml-homepage/docs/docs.md +++ b/dbml-homepage/docs/docs.md @@ -17,6 +17,8 @@ outlines the full syntax documentations of DBML. - [Column Definition](#column-definition) - [Column Settings](#column-settings) - [Default Value](#default-value) +- [Constraint Definition](#constraint-definition) + - [Constraint Settings](#constraint-settings) - [Index Definition](#index-definition) - [Index Settings](#index-settings) - [Relationships & Foreign Key Definitions](#relationships--foreign-key-definitions) @@ -177,6 +179,7 @@ The list of column settings you can use: - `unique`: mark the column unique - `default: some_value`: set a default value of the column, please refer to the 'Default Value' section below - `increment`: mark the column as auto-increment +- ``constraint: `check expression` ``: add a check expression to this column. Multiple constraints can be defined on a column. For constraints involving multiple columns, refer to the 'Constraints' section **Note:** You can use a workaround for un-supported settings by adding the setting name into the column type name, such as `id "bigint unsigned" [pk]` @@ -202,6 +205,25 @@ Table users { rating integer [default: 10] } ``` +## Constraint Definition + +Constraints allow users to specify custom checks on one or many columns. These checks can be used to enforce constraints on the possible values of one or many columns, which are otherwise impossible to express. + +```text +Table users { + id integer + wealth integer + debt integer + + constraints { + `debt + wealth >= 0` [name: 'chk_positive_money'] + } +} +``` + +### Constraint Settings + +- `name`: name of constraint ## Index Definition diff --git a/packages/dbml-cli/__test__/sql2dbml/multiple_schema_mssql/expect-out-files/multiple_schema.out.dbml b/packages/dbml-cli/__test__/sql2dbml/multiple_schema_mssql/expect-out-files/multiple_schema.out.dbml index 473e6cfad..7ba386d78 100644 --- a/packages/dbml-cli/__test__/sql2dbml/multiple_schema_mssql/expect-out-files/multiple_schema.out.dbml +++ b/packages/dbml-cli/__test__/sql2dbml/multiple_schema_mssql/expect-out-files/multiple_schema.out.dbml @@ -1,34 +1,10 @@ -Enum "users_pjs_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "users_pjs2_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "users_pg_enum" { - "male" - "female" -} - -Enum "users_pg2_enum" { - "male2" - "female2" -} - Table "users" { "id" int [pk] "name" nvarchar(255) - "pjs" users_pjs_enum [not null] - "pjs2" users_pjs2_enum [not null] - "pg" users_pg_enum [not null] - "pg2" users_pg2_enum [not null] + "pjs" nvarchar(255) [not null, constraint: `[pjs] IN ('created2', 'running2', 'done2', 'failure2')`] + "pjs2" nvarchar(255) [not null, constraint: `[pjs2] IN ('created2', 'running2', 'done2', 'failure2')`] + "pg" nvarchar(255) [not null, constraint: `[pg] IN ('male', 'female')`] + "pg2" nvarchar(255) [not null, constraint: `[pg2] IN ('male2', 'female2')`] } Table "products" { @@ -48,37 +24,13 @@ Ref:"ecommerce"."users"."id" < "schemaA"."products"."name" Ref:"users"."id" < "schemaA"."locations"."name" -Enum "ecommerce"."users_ejs_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "ecommerce"."users_ejs2_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "ecommerce"."users_eg_enum" { - "male" - "female" -} - -Enum "ecommerce"."users_eg2_enum" { - "male2" - "female2" -} - Table "ecommerce"."users" { "id" int [pk] "name" nvarchar(255) - "ejs" ecommerce.users_ejs_enum [not null] - "ejs2" ecommerce.users_ejs2_enum [not null] - "eg" ecommerce.users_eg_enum [not null] - "eg2" ecommerce.users_eg2_enum [not null] + "ejs" nvarchar(255) [not null, constraint: `[ejs] IN ('created2', 'running2', 'done2', 'failure2')`] + "ejs2" nvarchar(255) [not null, constraint: `[ejs2] IN ('created2', 'running2', 'done2', 'failure2')`] + "eg" nvarchar(255) [not null, constraint: `[eg] IN ('male', 'female')`] + "eg2" nvarchar(255) [not null, constraint: `[eg2] IN ('male2', 'female2')`] Indexes { (name, ejs) [name: "idx_1"] diff --git a/packages/dbml-core/__tests__/importer/mssql_importer/input/constraints.in.sql b/packages/dbml-core/__tests__/importer/mssql_importer/input/constraints.in.sql new file mode 100644 index 000000000..9b572531c --- /dev/null +++ b/packages/dbml-core/__tests__/importer/mssql_importer/input/constraints.in.sql @@ -0,0 +1,259 @@ +-- Comprehensive test for CHECK constraints in MSSQL +-- Tests various edge cases including brackets, quotes, complex expressions + +-- Test 1: Column-level constraints with simple conditions +CREATE TABLE products ( + id INT PRIMARY KEY, + price DECIMAL(10,2) CHECK (price > 0), + quantity INT CHECK (quantity >= 0), + discount DECIMAL(5,2) CHECK (discount >= 0 AND discount <= 100) +); + +-- Test 2: Table-level named constraints +CREATE TABLE employees ( + emp_id INT PRIMARY KEY, + age INT, + salary DECIMAL(10,2), + CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65), + CONSTRAINT chk_salary CHECK (salary > 0) +); + +-- Test 3: Constraints with bracket-quoted identifiers (MSSQL style) +CREATE TABLE [special_table] ( + [id] INT PRIMARY KEY, + [price] DECIMAL CHECK ([price] > 0), + [status] VARCHAR(20) CHECK ([status] IN ('active', 'inactive')) +); + +-- Test 4: Constraints with complex expressions +CREATE TABLE [transactions] ( + txn_id INT PRIMARY KEY, + amount DECIMAL(10,2), + fee DECIMAL(10,2), + total DECIMAL(10,2), + CHECK (total = amount + fee), + CHECK (amount > 0 OR fee > 0) +); + +-- Test 5: Constraints with string comparisons and LIKE +CREATE TABLE contacts ( + contact_id INT PRIMARY KEY, + email VARCHAR(100) CHECK (email LIKE '%@%'), + phone VARCHAR(20) CHECK (phone LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]') +); + +-- Test 6: Constraints with IN operator and multiple values +CREATE TABLE orders ( + order_id INT PRIMARY KEY, + status VARCHAR(20) CHECK (status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')), + priority INT CHECK (priority IN (1, 2, 3, 4, 5)) +); + +-- Test 7: Constraints with NOT IN +CREATE TABLE users ( + user_id INT PRIMARY KEY, + role VARCHAR(20) CHECK (role NOT IN ('banned', 'deleted', 'suspended')) +); + +-- Test 8: Constraints with nested parentheses +CREATE TABLE ranges ( + range_id INT PRIMARY KEY, + min_val INT, + max_val INT, + CHECK ((min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)) +); + +-- Test 9: Constraints with CASE expressions +CREATE TABLE inventory ( + item_id INT PRIMARY KEY, + stock INT, + status VARCHAR(20), + CHECK ( + CASE + WHEN status = 'active' THEN stock + WHEN status = 'discontinued' THEN 0 + ELSE 1 + END >= 0 + ) +); + +-- Test 10: Multiple constraints on same table (mixed column and table level) +CREATE TABLE accounts ( + account_id INT PRIMARY KEY, + balance DECIMAL(15,2) CHECK (balance >= 0), + overdraft_limit DECIMAL(15,2) CHECK (overdraft_limit >= 0), + CONSTRAINT chk_balance_overdraft CHECK (balance + overdraft_limit >= 0) +); + +-- Test 11: ALTER TABLE ADD CONSTRAINT (named) +CREATE TABLE shipments ( + shipment_id INT PRIMARY KEY, + weight DECIMAL(10,2), + cost DECIMAL(10,2) +); + +ALTER TABLE shipments ADD CONSTRAINT chk_weight CHECK (weight > 0); +ALTER TABLE shipments ADD CONSTRAINT chk_cost CHECK (cost >= 0); + +-- Test 12: ALTER TABLE ADD CONSTRAINT (unnamed - MSSQL auto-generates name) +CREATE TABLE payments ( + payment_id INT PRIMARY KEY, + amount DECIMAL(10,2) +); + +ALTER TABLE payments ADD CHECK (amount > 0); + +-- Test 13: Constraints with mathematical expressions +CREATE TABLE pricing ( + price_id INT PRIMARY KEY, + base_price DECIMAL(10,2), + discount_pct DECIMAL(5,2), + final_price DECIMAL(10,2), + CHECK (final_price = base_price * (1 - discount_pct / 100)) +); + +-- Test 14: Constraints with COALESCE and NULL handling +CREATE TABLE settings ( + setting_id INT PRIMARY KEY, + value VARCHAR(100), + default_value VARCHAR(100), + CHECK (COALESCE(value, default_value) IS NOT NULL) +); + +-- Test 15: Constraints with date/time operations +CREATE TABLE bookings ( + booking_id INT PRIMARY KEY, + check_in DATE, + check_out DATE, + CHECK (check_out > check_in), + CHECK (check_in >= GETDATE()) +); + +-- Test 16: Constraints with string functions +CREATE TABLE documents ( + doc_id INT PRIMARY KEY, + title VARCHAR(200), + content VARCHAR(MAX), + CHECK (LEN(title) > 0), + CHECK (LEN(content) >= 10) +); + +-- Test 17: Multiple CHECK constraints with OR conditions +CREATE TABLE events ( + event_id INT PRIMARY KEY, + status VARCHAR(20), + cancelled BIT, + CHECK (status = 'active' OR status = 'completed' OR cancelled = 1) +); + +-- Test 18: Constraints with BETWEEN +CREATE TABLE grades ( + grade_id INT PRIMARY KEY, + score INT, + CHECK (score BETWEEN 0 AND 100) +); + +-- Test 19: Named constraints with brackets in names +CREATE TABLE products_special ( + product_id INT PRIMARY KEY, + code VARCHAR(50), + CONSTRAINT [chk_code_format] CHECK (code LIKE '[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]') +); + +-- Test 20: Constraint with bit column +CREATE TABLE features ( + feature_id INT PRIMARY KEY, + is_enabled BIT, + is_premium BIT, + CHECK (is_enabled = 1 OR is_premium = 0) +); + +-- Test 21: Constraints with ISNULL (MSSQL specific) +CREATE TABLE configs ( + config_id INT PRIMARY KEY, + value1 INT, + value2 INT, + CHECK (ISNULL(value1, 0) + ISNULL(value2, 0) > 0) +); + +-- Test 22: Multiple ALTER TABLE statements on same table +CREATE TABLE audit_log ( + log_id INT PRIMARY KEY, + severity INT, + message VARCHAR(MAX) +); + +ALTER TABLE audit_log ADD CONSTRAINT chk_severity_range CHECK (severity BETWEEN 1 AND 5); +ALTER TABLE audit_log ADD CONSTRAINT chk_message_length CHECK (LEN(message) > 0); +ALTER TABLE audit_log ADD CHECK (severity > 0); + +-- Test 23: Constraints with comparison operators +CREATE TABLE limits ( + limit_id INT PRIMARY KEY, + min_value INT, + max_value INT, + CHECK (max_value > min_value), + CHECK (min_value >= 0), + CHECK (max_value <= 1000) +); + +-- Test 24: Constraints with != and <> operators +CREATE TABLE statuses ( + status_id INT PRIMARY KEY, + current_status VARCHAR(20), + previous_status VARCHAR(20), + CHECK (current_status != previous_status), + CHECK (current_status <> '') +); + +-- Test 25: Table with brackets in names and constraint expressions +CREATE TABLE [order_items] ( + [order_item_id] INT PRIMARY KEY, + [order_id] INT, + [quantity] INT, + [unit_price] DECIMAL(10,2), + CHECK ([quantity] > 0), + CONSTRAINT [chk_price_positive] CHECK ([unit_price] > 0) +); + +-- Test 26: Constraint with modulo operator +CREATE TABLE sequences ( + seq_id INT PRIMARY KEY, + value INT, + CHECK (value % 2 = 0) +); + +-- Test 27: Constraint with ABS function +CREATE TABLE temperatures ( + temp_id INT PRIMARY KEY, + celsius DECIMAL(5,2), + CHECK (ABS(celsius) < 100) +); + +-- Test 28: Constraint with CHARINDEX +CREATE TABLE emails ( + email_id INT PRIMARY KEY, + email_address VARCHAR(100), + CHECK (CHARINDEX('@', email_address) > 0) +); + +-- Test 29: Constraint with UPPER/LOWER +CREATE TABLE codes ( + code_id INT PRIMARY KEY, + code VARCHAR(50), + CHECK (code = UPPER(code)) +); + +-- Test 30: Complex multi-column constraint +CREATE TABLE order_discounts ( + discount_id INT PRIMARY KEY, + order_total DECIMAL(10,2), + discount_pct DECIMAL(5,2), + discount_amt DECIMAL(10,2), + final_total DECIMAL(10,2), + CONSTRAINT chk_discount_calculation CHECK ( + (discount_amt = order_total * discount_pct / 100) AND + (final_total = order_total - discount_amt) AND + (final_total >= 0) + ) +); diff --git a/packages/dbml-core/__tests__/importer/mssql_importer/output/check_constraint.out.dbml b/packages/dbml-core/__tests__/importer/mssql_importer/output/check_constraint.out.dbml index 3b5768af6..106540d2c 100644 --- a/packages/dbml-core/__tests__/importer/mssql_importer/output/check_constraint.out.dbml +++ b/packages/dbml-core/__tests__/importer/mssql_importer/output/check_constraint.out.dbml @@ -1,23 +1,17 @@ -Enum "sample_table_status_enum" { - "active" - "inactive" - "pending" -} - Table "sample_table" { - "status" sample_table_status_enum - "email" VARCHAR(100) - "user_type" VARCHAR(20) -} - -Enum "myschema"."sample_table_status_enum" { - "active" - "inactive" - "pending" + "status" VARCHAR(20) [constraint: `[status] IN ('active', 'inactive', 'pending')`] + "email" VARCHAR(100) [constraint: `[email] LIKE '%@%.%'`] + "user_type" VARCHAR(20) [constraint: `[user_type] NOT IN ('banned', 'suspended')`] } Table "myschema"."sample_table" { - "status" myschema.sample_table_status_enum + "status" VARCHAR(20) "email" VARCHAR(100) "user_type" VARCHAR(20) + + Constraints { + `status IN ('active', 'inactive', 'pending')` [name: 'chk_status'] + `email LIKE '%@%.%'` [name: 'chk_email'] + `user_type NOT IN ('banned', 'suspended')` [name: 'chk_user_type'] + } } diff --git a/packages/dbml-core/__tests__/importer/mssql_importer/output/constraints.out.dbml b/packages/dbml-core/__tests__/importer/mssql_importer/output/constraints.out.dbml new file mode 100644 index 000000000..84553f73a --- /dev/null +++ b/packages/dbml-core/__tests__/importer/mssql_importer/output/constraints.out.dbml @@ -0,0 +1,294 @@ +Table "products" { + "id" INT [pk] + "price" DECIMAL(10,2) [constraint: `price > 0`] + "quantity" INT [constraint: `quantity >= 0`] + "discount" DECIMAL(5,2) [constraint: `discount >= 0 AND discount <= 100`] +} + +Table "employees" { + "emp_id" INT [pk] + "age" INT + "salary" DECIMAL(10,2) + + Constraints { + `age >= 18 AND age <= 65` [name: 'chk_age'] + `salary > 0` [name: 'chk_salary'] + } +} + +Table "special_table" { + "id" INT [pk] + "price" DECIMAL [constraint: `[price] > 0`] + "status" VARCHAR(20) [constraint: `[status] IN ('active', 'inactive')`] +} + +Table "transactions" { + "txn_id" INT [pk] + "amount" DECIMAL(10,2) + "fee" DECIMAL(10,2) + "total" DECIMAL(10,2) + + Constraints { + `total = amount + fee` + `amount > 0 OR fee > 0` + } +} + +Table "contacts" { + "contact_id" INT [pk] + "email" VARCHAR(100) [constraint: `email LIKE '%@%'`] + "phone" VARCHAR(20) [constraint: `phone LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'`] +} + +Table "orders" { + "order_id" INT [pk] + "status" VARCHAR(20) [constraint: `status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')`] + "priority" INT [constraint: `priority IN (1, 2, 3, 4, 5)`] +} + +Table "users" { + "user_id" INT [pk] + "role" VARCHAR(20) [constraint: `role NOT IN ('banned', 'deleted', 'suspended')`] +} + +Table "ranges" { + "range_id" INT [pk] + "min_val" INT + "max_val" INT + + Constraints { + `(min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)` + } +} + +Table "inventory" { + "item_id" INT [pk] + "stock" INT + "status" VARCHAR(20) + + Constraints { + `CASE + WHEN status = 'active' THEN stock + WHEN status = 'discontinued' THEN 0 + ELSE 1 + END >= 0` + } +} + +Table "accounts" { + "account_id" INT [pk] + "balance" DECIMAL(15,2) [constraint: `balance >= 0`] + "overdraft_limit" DECIMAL(15,2) [constraint: `overdraft_limit >= 0`] + + Constraints { + `balance + overdraft_limit >= 0` [name: 'chk_balance_overdraft'] + } +} + +Table "shipments" { + "shipment_id" INT [pk] + "weight" DECIMAL(10,2) + "cost" DECIMAL(10,2) + + Constraints { + `weight > 0` [name: 'chk_weight'] + `cost >= 0` [name: 'chk_cost'] + } +} + +Table "payments" { + "payment_id" INT [pk] + "amount" DECIMAL(10,2) + + Constraints { + `amount > 0` + } +} + +Table "pricing" { + "price_id" INT [pk] + "base_price" DECIMAL(10,2) + "discount_pct" DECIMAL(5,2) + "final_price" DECIMAL(10,2) + + Constraints { + `final_price = base_price * (1 - discount_pct / 100)` + } +} + +Table "settings" { + "setting_id" INT [pk] + "value" VARCHAR(100) + "default_value" VARCHAR(100) + + Constraints { + `COALESCE(value, default_value) IS NOT NULL` + } +} + +Table "bookings" { + "booking_id" INT [pk] + "check_in" DATE + "check_out" DATE + + Constraints { + `check_out > check_in` + `check_in >= GETDATE()` + } +} + +Table "documents" { + "doc_id" INT [pk] + "title" VARCHAR(200) + "content" VARCHAR(MAX) + + Constraints { + `LEN(title) > 0` + `LEN(content) >= 10` + } +} + +Table "events" { + "event_id" INT [pk] + "status" VARCHAR(20) + "cancelled" BIT + + Constraints { + `status = 'active' OR status = 'completed' OR cancelled = 1` + } +} + +Table "grades" { + "grade_id" INT [pk] + "score" INT + + Constraints { + `score BETWEEN 0 AND 100` + } +} + +Table "products_special" { + "product_id" INT [pk] + "code" VARCHAR(50) + + Constraints { + `code LIKE '[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]'` [name: 'chk_code_format'] + } +} + +Table "features" { + "feature_id" INT [pk] + "is_enabled" BIT + "is_premium" BIT + + Constraints { + `is_enabled = 1 OR is_premium = 0` + } +} + +Table "configs" { + "config_id" INT [pk] + "value1" INT + "value2" INT + + Constraints { + `ISNULL(value1, 0) + ISNULL(value2, 0) > 0` + } +} + +Table "audit_log" { + "log_id" INT [pk] + "severity" INT + "message" VARCHAR(MAX) + + Constraints { + `severity BETWEEN 1 AND 5` [name: 'chk_severity_range'] + `LEN(message) > 0` [name: 'chk_message_length'] + `severity > 0` + } +} + +Table "limits" { + "limit_id" INT [pk] + "min_value" INT + "max_value" INT + + Constraints { + `max_value > min_value` + `min_value >= 0` + `max_value <= 1000` + } +} + +Table "statuses" { + "status_id" INT [pk] + "current_status" VARCHAR(20) + "previous_status" VARCHAR(20) + + Constraints { + `current_status != previous_status` + `current_status <> ''` + } +} + +Table "order_items" { + "order_item_id" INT [pk] + "order_id" INT + "quantity" INT + "unit_price" DECIMAL(10,2) + + Constraints { + `[quantity] > 0` + `[unit_price] > 0` [name: 'chk_price_positive'] + } +} + +Table "sequences" { + "seq_id" INT [pk] + "value" INT + + Constraints { + `value % 2 = 0` + } +} + +Table "temperatures" { + "temp_id" INT [pk] + "celsius" DECIMAL(5,2) + + Constraints { + `ABS(celsius) < 100` + } +} + +Table "emails" { + "email_id" INT [pk] + "email_address" VARCHAR(100) + + Constraints { + `CHARINDEX('@', email_address) > 0` + } +} + +Table "codes" { + "code_id" INT [pk] + "code" VARCHAR(50) + + Constraints { + `code = UPPER(code)` + } +} + +Table "order_discounts" { + "discount_id" INT [pk] + "order_total" DECIMAL(10,2) + "discount_pct" DECIMAL(5,2) + "discount_amt" DECIMAL(10,2) + "final_total" DECIMAL(10,2) + + Constraints { + `(discount_amt = order_total * discount_pct / 100) AND + (final_total = order_total - discount_amt) AND + (final_total >= 0)` [name: 'chk_discount_calculation'] + } +} diff --git a/packages/dbml-core/__tests__/importer/mssql_importer/output/general_schema.out.dbml b/packages/dbml-core/__tests__/importer/mssql_importer/output/general_schema.out.dbml index 52f8292d7..6d94ea853 100644 --- a/packages/dbml-core/__tests__/importer/mssql_importer/output/general_schema.out.dbml +++ b/packages/dbml-core/__tests__/importer/mssql_importer/output/general_schema.out.dbml @@ -1,19 +1,7 @@ -Enum "orders_status_enum" { - "created" - "running" - "done" - "failure" -} - -Enum "products_status_enum" { - "Out of Stock" - "In Stock" -} - Table "orders" { "id" int [pk, increment] "user_id" int [unique, not null] - "status" orders_status_enum [not null] + "status" nvarchar(255) [not null, constraint: `[status] IN ('created', 'running', 'done', 'failure')`] "created_at" varchar(255) [note: 'When order created'] Note: 'This is a note in table "orders"' } @@ -29,7 +17,7 @@ Table "products" { "name" varchar(255) "merchant_id" int [not null] "price" int - "status" products_status_enum [not null] + "status" nvarchar(255) [not null, constraint: `[status] IN ('Out of Stock', 'In Stock')`] "created_at" datetime [default: `GETDATE()`] Indexes { diff --git a/packages/dbml-core/__tests__/importer/mssql_importer/output/multiple_schema.out.dbml b/packages/dbml-core/__tests__/importer/mssql_importer/output/multiple_schema.out.dbml index a805f7fab..543790326 100644 --- a/packages/dbml-core/__tests__/importer/mssql_importer/output/multiple_schema.out.dbml +++ b/packages/dbml-core/__tests__/importer/mssql_importer/output/multiple_schema.out.dbml @@ -1,34 +1,10 @@ -Enum "users_pjs_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "users_pjs2_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "users_pg_enum" { - "male" - "female" -} - -Enum "users_pg2_enum" { - "male2" - "female2" -} - Table "users" { "id" int [pk] "name" nvarchar(255) - "pjs" users_pjs_enum [not null] - "pjs2" users_pjs2_enum [not null] - "pg" users_pg_enum [not null] - "pg2" users_pg2_enum [not null] + "pjs" nvarchar(255) [not null, constraint: `[pjs] IN ('created2', 'running2', 'done2', 'failure2')`] + "pjs2" nvarchar(255) [not null, constraint: `[pjs2] IN ('created2', 'running2', 'done2', 'failure2')`] + "pg" nvarchar(255) [not null, constraint: `[pg] IN ('male', 'female')`] + "pg2" nvarchar(255) [not null, constraint: `[pg2] IN ('male2', 'female2')`] } Table "products" { @@ -48,37 +24,13 @@ Ref:"ecommerce"."users"."id" < "schemaA"."products"."name" Ref:"users"."id" < "schemaA"."locations"."name" -Enum "ecommerce"."users_ejs_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "ecommerce"."users_ejs2_enum" { - "created2" - "running2" - "done2" - "failure2" -} - -Enum "ecommerce"."users_eg_enum" { - "male" - "female" -} - -Enum "ecommerce"."users_eg2_enum" { - "male2" - "female2" -} - Table "ecommerce"."users" { "id" int [pk] "name" nvarchar(255) - "ejs" ecommerce.users_ejs_enum [not null] - "ejs2" ecommerce.users_ejs2_enum [not null] - "eg" ecommerce.users_eg_enum [not null] - "eg2" ecommerce.users_eg2_enum [not null] + "ejs" nvarchar(255) [not null, constraint: `[ejs] IN ('created2', 'running2', 'done2', 'failure2')`] + "ejs2" nvarchar(255) [not null, constraint: `[ejs2] IN ('created2', 'running2', 'done2', 'failure2')`] + "eg" nvarchar(255) [not null, constraint: `[eg] IN ('male', 'female')`] + "eg2" nvarchar(255) [not null, constraint: `[eg2] IN ('male2', 'female2')`] Indexes { (name, ejs) [name: "idx_1"] diff --git a/packages/dbml-core/__tests__/importer/mysql_importer/input/constraints.in.sql b/packages/dbml-core/__tests__/importer/mysql_importer/input/constraints.in.sql new file mode 100644 index 000000000..89298c611 --- /dev/null +++ b/packages/dbml-core/__tests__/importer/mysql_importer/input/constraints.in.sql @@ -0,0 +1,238 @@ +-- Comprehensive test for CHECK constraints in MySQL +-- Tests various edge cases including backticks, quotes, complex expressions + +-- Test 1: Column-level constraints with simple conditions +CREATE TABLE products ( + id INT PRIMARY KEY, + price DECIMAL(10,2) CHECK (price > 0), + quantity INT CHECK (quantity >= 0), + discount DECIMAL(5,2) CHECK (discount >= 0 AND discount <= 100) +); + +-- Test 2: Table-level named constraints +CREATE TABLE employees ( + emp_id INT PRIMARY KEY, + age INT, + salary DECIMAL(10,2), + CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65), + CONSTRAINT chk_salary CHECK (salary > 0) +); + +-- Test 3: Constraints with backtick-quoted identifiers (MySQL style) +-- CREATE TABLE `special_table` ( +-- `id` INT PRIMARY KEY, +-- `price` DECIMAL CHECK (`price` > 0), +-- `status` VARCHAR(20) CHECK (`status` IN ('active', 'inactive')) +--); + +-- Test 4: Constraints with complex expressions +CREATE TABLE transactions ( + txn_id INT PRIMARY KEY, + amount DECIMAL(10,2), + fee DECIMAL(10,2), + total DECIMAL(10,2), + CHECK (total = amount + fee), + CHECK (amount > 0 OR fee > 0) +); + +-- Test 5: Constraints with string comparisons and LIKE +CREATE TABLE contacts ( + contact_id INT PRIMARY KEY, + email VARCHAR(100) CHECK (email LIKE '%@%'), + phone VARCHAR(20) CHECK (phone REGEXP '^[0-9]{3}-[0-9]{3}-[0-9]{4}$') +); + +-- Test 6: Constraints with IN operator and multiple values +CREATE TABLE orders ( + order_id INT PRIMARY KEY, + status VARCHAR(20) CHECK (status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')), + priority INT CHECK (priority IN (1, 2, 3, 4, 5)) +); + +-- Test 7: Constraints with NOT IN +CREATE TABLE users ( + user_id INT PRIMARY KEY, + role VARCHAR(20) CHECK (role NOT IN ('banned', 'deleted', 'suspended')) +); + +-- Test 8: Constraints with nested parentheses +CREATE TABLE `ranges` ( + range_id INT PRIMARY KEY, + min_val INT, + max_val INT, + CHECK ((min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)) +); + +-- Test 9: Constraints with CASE expressions +CREATE TABLE inventory ( + item_id INT PRIMARY KEY, + stock INT, + status VARCHAR(20), + CHECK ( + CASE + WHEN status = 'active' THEN stock >= 0 + WHEN status = 'discontinued' THEN stock = 0 + ELSE TRUE + END + ) +); + +-- Test 10: Multiple constraints on same table (mixed column and table level) +CREATE TABLE accounts ( + account_id INT PRIMARY KEY, + balance DECIMAL(15,2) CHECK (balance >= 0), + overdraft_limit DECIMAL(15,2) CHECK (overdraft_limit >= 0), + CONSTRAINT chk_balance_overdraft CHECK (balance + overdraft_limit >= 0) +); + +-- Test 11: ALTER TABLE ADD CONSTRAINT (named) +CREATE TABLE shipments ( + shipment_id INT PRIMARY KEY, + weight DECIMAL(10,2), + cost DECIMAL(10,2) +); + +ALTER TABLE shipments ADD CONSTRAINT chk_weight CHECK (weight > 0); +ALTER TABLE shipments ADD CONSTRAINT chk_cost CHECK (cost >= 0); + +-- Test 12: ALTER TABLE ADD CONSTRAINT (unnamed) +CREATE TABLE payments ( + payment_id INT PRIMARY KEY, + amount DECIMAL(10,2) +); + +ALTER TABLE payments ADD CHECK (amount > 0); + +-- Test 13: Constraints with mathematical expressions +CREATE TABLE pricing ( + price_id INT PRIMARY KEY, + base_price DECIMAL(10,2), + discount_pct DECIMAL(5,2), + final_price DECIMAL(10,2), + CHECK (final_price = base_price * (1 - discount_pct / 100)) +); + +-- Test 14: Constraints with COALESCE and NULL handling +CREATE TABLE settings ( + setting_id INT PRIMARY KEY, + value VARCHAR(100), + default_value VARCHAR(100), + CHECK (COALESCE(value, default_value) IS NOT NULL) +); + +-- Test 15: Constraints with date/time operations +CREATE TABLE bookings ( + booking_id INT PRIMARY KEY, + check_in DATE, + check_out DATE, + CHECK (check_out > check_in), + CHECK (check_in >= CURDATE()) +); + +-- Test 16: Constraints with string functions +CREATE TABLE documents ( + doc_id INT PRIMARY KEY, + title VARCHAR(200), + content TEXT, + CHECK (CHAR_LENGTH(title) > 0), + CHECK (CHAR_LENGTH(content) >= 10) +); + +-- Test 17: Multiple CHECK constraints with OR conditions +CREATE TABLE events ( + event_id INT PRIMARY KEY, + status VARCHAR(20), + cancelled BOOLEAN, + CHECK (status = 'active' OR status = 'completed' OR cancelled = TRUE) +); + +-- Test 18: Constraints with BETWEEN +CREATE TABLE grades ( + grade_id INT PRIMARY KEY, + score INT, + CHECK (score BETWEEN 0 AND 100) +); + +-- Test 19: Named constraints with special characters in expression +CREATE TABLE products_special ( + product_id INT PRIMARY KEY, + code VARCHAR(50), + CONSTRAINT `chk_code_format` CHECK (code REGEXP '^[A-Z]{3}-[0-9]{4}$') +); + +-- Test 20: Constraint with boolean column +CREATE TABLE features ( + feature_id INT PRIMARY KEY, + is_enabled BOOLEAN, + is_premium BOOLEAN, + CHECK (is_enabled = TRUE OR is_premium = FALSE) +); + +-- Test 21: Constraints with JSON validation (MySQL 5.7+) +CREATE TABLE configs ( + config_id INT PRIMARY KEY, + settings JSON, + CHECK (JSON_VALID(settings)) +); + +-- Test 22: Multiple ALTER TABLE statements on same table +CREATE TABLE audit_log ( + log_id INT PRIMARY KEY, + severity INT, + message TEXT +); + +ALTER TABLE audit_log ADD CONSTRAINT chk_severity_range CHECK (severity BETWEEN 1 AND 5); +ALTER TABLE audit_log ADD CONSTRAINT chk_message_length CHECK (CHAR_LENGTH(message) > 0); +ALTER TABLE audit_log ADD CHECK (severity > 0); + +-- Test 23: Constraints with comparison operators +CREATE TABLE limits ( + limit_id INT PRIMARY KEY, + min_value INT, + max_value INT, + CHECK (max_value > min_value), + CHECK (min_value >= 0), + CHECK (max_value <= 1000) +); + +-- Test 24: Constraints with != and <> operators +CREATE TABLE statuses ( + status_id INT PRIMARY KEY, + current_status VARCHAR(20), + previous_status VARCHAR(20), + CHECK (current_status != previous_status), + CHECK (current_status <> '') +); + +-- Test 25: Constraints with IFNULL +CREATE TABLE defaults ( + default_id INT PRIMARY KEY, + value1 INT, + value2 INT, + CHECK (IFNULL(value1, 0) + IFNULL(value2, 0) > 0) +); + +-- Test 26: Table with backticks in names and constraint expressions +-- CREATE TABLE `order_items` ( +-- `order_item_id` INT PRIMARY KEY, +-- `order_id` INT, +-- `quantity` INT, +-- `unit_price` DECIMAL(10,2), +-- CHECK (`quantity` > 0), +-- CONSTRAINT `chk_price_positive` CHECK (`unit_price` > 0) +-- ); + +-- Test 27: Constraint with MOD operator +CREATE TABLE sequences ( + seq_id INT PRIMARY KEY, + value INT, + CHECK (MOD(value, 2) = 0) +); + +-- Test 28: Constraint with ABS function +CREATE TABLE temperatures ( + temp_id INT PRIMARY KEY, + celsius DECIMAL(5,2), + CHECK (ABS(celsius) < 100) +); diff --git a/packages/dbml-core/__tests__/importer/mysql_importer/output/constraints.out.dbml b/packages/dbml-core/__tests__/importer/mysql_importer/output/constraints.out.dbml new file mode 100644 index 000000000..ab1a6dd4c --- /dev/null +++ b/packages/dbml-core/__tests__/importer/mysql_importer/output/constraints.out.dbml @@ -0,0 +1,253 @@ +Table "products" { + "id" INT [pk] + "price" DECIMAL(10,2) [constraint: `price > 0`] + "quantity" INT [constraint: `quantity >= 0`] + "discount" DECIMAL(5,2) [constraint: `discount >= 0 AND discount <= 100`] +} + +Table "employees" { + "emp_id" INT [pk] + "age" INT + "salary" DECIMAL(10,2) + + Constraints { + `age >= 18 AND age <= 65` [name: 'chk_age'] + `salary > 0` [name: 'chk_salary'] + } +} + +Table "transactions" { + "txn_id" INT [pk] + "amount" DECIMAL(10,2) + "fee" DECIMAL(10,2) + "total" DECIMAL(10,2) + + Constraints { + `total = amount + fee` + `amount > 0 OR fee > 0` + } +} + +Table "contacts" { + "contact_id" INT [pk] + "email" VARCHAR(100) [constraint: `email LIKE '%@%'`] + "phone" VARCHAR(20) [constraint: `phone REGEXP '^[0-9]{3}-[0-9]{3}-[0-9]{4}$'`] +} + +Table "orders" { + "order_id" INT [pk] + "status" VARCHAR(20) [constraint: `status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')`] + "priority" INT [constraint: `priority IN (1, 2, 3, 4, 5)`] +} + +Table "users" { + "user_id" INT [pk] + "role" VARCHAR(20) [constraint: `role NOT IN ('banned', 'deleted', 'suspended')`] +} + +Table "ranges" { + "range_id" INT [pk] + "min_val" INT + "max_val" INT + + Constraints { + `(min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)` + } +} + +Table "inventory" { + "item_id" INT [pk] + "stock" INT + "status" VARCHAR(20) + + Constraints { + `CASE + WHEN status = 'active' THEN stock >= 0 + WHEN status = 'discontinued' THEN stock = 0 + ELSE TRUE + END` + } +} + +Table "accounts" { + "account_id" INT [pk] + "balance" DECIMAL(15,2) [constraint: `balance >= 0`] + "overdraft_limit" DECIMAL(15,2) [constraint: `overdraft_limit >= 0`] + + Constraints { + `balance + overdraft_limit >= 0` [name: 'chk_balance_overdraft'] + } +} + +Table "shipments" { + "shipment_id" INT [pk] + "weight" DECIMAL(10,2) + "cost" DECIMAL(10,2) + + Constraints { + `weight > 0` [name: 'chk_weight'] + `cost >= 0` [name: 'chk_cost'] + } +} + +Table "payments" { + "payment_id" INT [pk] + "amount" DECIMAL(10,2) + + Constraints { + `amount > 0` + } +} + +Table "pricing" { + "price_id" INT [pk] + "base_price" DECIMAL(10,2) + "discount_pct" DECIMAL(5,2) + "final_price" DECIMAL(10,2) + + Constraints { + `final_price = base_price * (1 - discount_pct / 100)` + } +} + +Table "settings" { + "setting_id" INT [pk] + "value" VARCHAR(100) + "default_value" VARCHAR(100) + + Constraints { + `COALESCE(value, default_value) IS NOT NULL` + } +} + +Table "bookings" { + "booking_id" INT [pk] + "check_in" DATE + "check_out" DATE + + Constraints { + `check_out > check_in` + `check_in >= CURDATE()` + } +} + +Table "documents" { + "doc_id" INT [pk] + "title" VARCHAR(200) + "content" TEXT + + Constraints { + `CHAR_LENGTH(title) > 0` + `CHAR_LENGTH(content) >= 10` + } +} + +Table "events" { + "event_id" INT [pk] + "status" VARCHAR(20) + "cancelled" BOOLEAN + + Constraints { + `status = 'active' OR status = 'completed' OR cancelled = TRUE` + } +} + +Table "grades" { + "grade_id" INT [pk] + "score" INT + + Constraints { + `score BETWEEN 0 AND 100` + } +} + +Table "products_special" { + "product_id" INT [pk] + "code" VARCHAR(50) + + Constraints { + `code REGEXP '^[A-Z]{3}-[0-9]{4}$'` [name: 'chk_code_format'] + } +} + +Table "features" { + "feature_id" INT [pk] + "is_enabled" BOOLEAN + "is_premium" BOOLEAN + + Constraints { + `is_enabled = TRUE OR is_premium = FALSE` + } +} + +Table "configs" { + "config_id" INT [pk] + "settings" JSON + + Constraints { + `JSON_VALID(settings)` + } +} + +Table "audit_log" { + "log_id" INT [pk] + "severity" INT + "message" TEXT + + Constraints { + `severity BETWEEN 1 AND 5` [name: 'chk_severity_range'] + `CHAR_LENGTH(message) > 0` [name: 'chk_message_length'] + `severity > 0` + } +} + +Table "limits" { + "limit_id" INT [pk] + "min_value" INT + "max_value" INT + + Constraints { + `max_value > min_value` + `min_value >= 0` + `max_value <= 1000` + } +} + +Table "statuses" { + "status_id" INT [pk] + "current_status" VARCHAR(20) + "previous_status" VARCHAR(20) + + Constraints { + `current_status != previous_status` + `current_status <> ''` + } +} + +Table "defaults" { + "default_id" INT [pk] + "value1" INT + "value2" INT + + Constraints { + `IFNULL(value1, 0) + IFNULL(value2, 0) > 0` + } +} + +Table "sequences" { + "seq_id" INT [pk] + "value" INT + + Constraints { + `MOD(value, 2) = 0` + } +} + +Table "temperatures" { + "temp_id" INT [pk] + "celsius" DECIMAL(5,2) + + Constraints { + `ABS(celsius) < 100` + } +} diff --git a/packages/dbml-core/__tests__/importer/mysql_importer/output/ddl_create.out.dbml b/packages/dbml-core/__tests__/importer/mysql_importer/output/ddl_create.out.dbml index 38ef7975e..f5df6a987 100644 --- a/packages/dbml-core/__tests__/importer/mysql_importer/output/ddl_create.out.dbml +++ b/packages/dbml-core/__tests__/importer/mysql_importer/output/ddl_create.out.dbml @@ -69,6 +69,10 @@ Table "parent_table" { "id" int [pk] "column1" varchar(30) + Constraints { + `char_length(column1)>10` + } + Indexes { column1 [name: "parent_table_i1"] } @@ -124,6 +128,10 @@ Table "dt_table" { Table "with_check" { "c1" integer [not null] "c2" varchar(22) + + Constraints { + `c2 in ('a', 'b', 'c')` [name: 'c1'] + } } Table "genvalue1" { @@ -418,6 +426,10 @@ Table "T10" { "ID" BIGINT "S" VARCHAR(100) "I" INT + + Constraints { + `ID < 5` [name: 'ABC'] + } } Table "tbl_signed_unsigned" { @@ -478,7 +490,7 @@ Table "\\test\\_table\\" { Table "global_priv" { "Host" CHAR(60) [not null, default: ''] "User" CHAR(80) [not null, default: ''] - "Privilege" LONGTEXT [not null, default: '{}'] + "Privilege" LONGTEXT [not null, constraint: `json_valid(`Privilege`)`, default: '{}'] Indexes { (Host, User) [pk] @@ -488,6 +500,20 @@ Table "global_priv" { Table "geo" { "coordinate" JSON + + Constraints { + `JSON_SCHEMA_VALID( + '{ + "type":"object", + "properties":{ + "latitude":{"type":"number", "minimum":-90, "maximum":90}, + "longitude":{"type":"number", "minimum":-180, "maximum":180} + }, + "required": ["latitude", "longitude"] + }', + coordinate + )` + } } Table "tab1" { diff --git a/packages/dbml-core/__tests__/importer/postgres_importer/input/constraints.in.sql b/packages/dbml-core/__tests__/importer/postgres_importer/input/constraints.in.sql new file mode 100644 index 000000000..14e88096a --- /dev/null +++ b/packages/dbml-core/__tests__/importer/postgres_importer/input/constraints.in.sql @@ -0,0 +1,210 @@ +-- Comprehensive test for CHECK constraints in PostgreSQL +-- Tests various edge cases including backticks, quotes, complex expressions + +-- Test 1: Column-level constraints with simple conditions +CREATE TABLE products ( + id INT PRIMARY KEY, + price DECIMAL(10,2) CHECK (price > 0), + quantity INT CHECK (quantity >= 0), + discount DECIMAL(5,2) CHECK (discount >= 0 AND discount <= 100) +); + +-- Test 2: Table-level named constraints +CREATE TABLE employees ( + emp_id INT PRIMARY KEY, + age INT, + salary DECIMAL(10,2), + CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65), + CONSTRAINT chk_salary CHECK (salary > 0) +); + +-- Test 3: Constraints with quoted identifiers (should be preserved) +CREATE TABLE "special_table" ( + "id" INT PRIMARY KEY, + "price" DECIMAL CHECK ("price" > 0), + "status" VARCHAR(20) CHECK ("status" IN ('active', 'inactive')) +); + +-- Test 4: Constraints with complex expressions +CREATE TABLE transactions ( + txn_id INT PRIMARY KEY, + amount DECIMAL(10,2), + fee DECIMAL(10,2), + total DECIMAL(10,2), + CHECK (total = amount + fee), + CHECK (amount > 0 OR fee > 0) +); + +-- Test 5: Constraints with string comparisons and LIKE +CREATE TABLE contacts ( + contact_id INT PRIMARY KEY, + email VARCHAR(100) CHECK (email LIKE '%@%'), + phone VARCHAR(20) CHECK (phone ~ '^[0-9]{3}-[0-9]{3}-[0-9]{4}$') +); + +-- Test 6: Constraints with IN operator and multiple values +CREATE TABLE orders ( + order_id INT PRIMARY KEY, + status VARCHAR(20) CHECK (status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')), + priority INT CHECK (priority IN (1, 2, 3, 4, 5)) +); + +-- Test 7: Constraints with NOT IN +CREATE TABLE users ( + user_id INT PRIMARY KEY, + role VARCHAR(20) CHECK (role NOT IN ('banned', 'deleted', 'suspended')) +); + +-- Test 8: Constraints with nested parentheses +CREATE TABLE ranges ( + range_id INT PRIMARY KEY, + min_val INT, + max_val INT, + CHECK ((min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)) +); + +-- Test 9: Constraints with CASE expressions +CREATE TABLE inventory ( + item_id INT PRIMARY KEY, + stock INT, + status VARCHAR(20), + CHECK ( + CASE + WHEN status = 'active' THEN stock >= 0 + WHEN status = 'discontinued' THEN stock = 0 + ELSE TRUE + END + ) +); + +-- Test 10: Multiple constraints on same table (mixed column and table level) +CREATE TABLE accounts ( + account_id INT PRIMARY KEY, + balance DECIMAL(15,2) CHECK (balance >= 0), + overdraft_limit DECIMAL(15,2) CHECK (overdraft_limit >= 0), + CONSTRAINT chk_balance_overdraft CHECK (balance + overdraft_limit >= 0) +); + +-- Test 11: ALTER TABLE ADD CONSTRAINT (named) +CREATE TABLE shipments ( + shipment_id INT PRIMARY KEY, + weight DECIMAL(10,2), + cost DECIMAL(10,2) +); + +ALTER TABLE shipments ADD CONSTRAINT chk_weight CHECK (weight > 0); +ALTER TABLE shipments ADD CONSTRAINT chk_cost CHECK (cost >= 0); + +-- Test 12: ALTER TABLE ADD CONSTRAINT (unnamed) +CREATE TABLE payments ( + payment_id INT PRIMARY KEY, + amount DECIMAL(10,2) +); + +ALTER TABLE payments ADD CHECK (amount > 0); + +-- Test 13: Constraints with subquery-like expressions (without actual subquery) +CREATE TABLE pricing ( + price_id INT PRIMARY KEY, + base_price DECIMAL(10,2), + discount_pct DECIMAL(5,2), + final_price DECIMAL(10,2), + CHECK (final_price = base_price * (1 - discount_pct / 100)) +); + +-- Test 14: Constraints with COALESCE and NULL handling +CREATE TABLE settings ( + setting_id INT PRIMARY KEY, + value VARCHAR(100), + default_value VARCHAR(100), + CHECK (COALESCE(value, default_value) IS NOT NULL) +); + +-- Test 15: Constraints with date/time operations +CREATE TABLE bookings ( + booking_id INT PRIMARY KEY, + check_in DATE, + check_out DATE, + CHECK (check_out > check_in), + CHECK (check_in >= CURRENT_DATE) +); + +-- Test 16: Constraints with mathematical operations +CREATE TABLE circles ( + circle_id INT PRIMARY KEY, + radius DECIMAL(10,2), + area DECIMAL(15,2), + CHECK (area > 0), + CHECK (radius > 0) +); + +-- Test 17: Constraints with string functions +CREATE TABLE documents ( + doc_id INT PRIMARY KEY, + title VARCHAR(200), + content TEXT, + CHECK (LENGTH(title) > 0), + CHECK (LENGTH(content) >= 10) +); + +-- Test 18: Multiple CHECK constraints with OR conditions +CREATE TABLE events ( + event_id INT PRIMARY KEY, + status VARCHAR(20), + cancelled BOOLEAN, + CHECK (status = 'active' OR status = 'completed' OR cancelled = TRUE) +); + +-- Test 19: Constraints with type casts +CREATE TABLE measurements ( + measurement_id INT PRIMARY KEY, + value VARCHAR(50), + CHECK (value::NUMERIC > 0) +); + +-- Test 20: Constraints with BETWEEN +CREATE TABLE grades ( + grade_id INT PRIMARY KEY, + score INT, + CHECK (score BETWEEN 0 AND 100) +); + +-- Test 21: Named constraints with special characters in expression +CREATE TABLE products_special ( + product_id INT PRIMARY KEY, + code VARCHAR(50), + CONSTRAINT "chk_code_format" CHECK (code ~ '^[A-Z]{3}-[0-9]{4}$') +); + +-- Test 22: Constraint with boolean column +CREATE TABLE features ( + feature_id INT PRIMARY KEY, + is_enabled BOOLEAN, + is_premium BOOLEAN, + CHECK (is_enabled = TRUE OR is_premium = FALSE) +); + +-- Test 23: Constraint with array operations (PostgreSQL specific) +CREATE TABLE tags_table ( + id INT PRIMARY KEY, + tags TEXT[], + CHECK (array_length(tags, 1) > 0) +); + +-- Test 24: Constraint with JSON validation (PostgreSQL specific) +CREATE TABLE configs ( + config_id INT PRIMARY KEY, + settings JSONB, + CHECK (settings IS NOT NULL) +); + +-- Test 25: Multiple ALTER TABLE statements on same table +CREATE TABLE audit_log ( + log_id INT PRIMARY KEY, + severity INT, + message TEXT +); + +ALTER TABLE audit_log ADD CONSTRAINT chk_severity_range CHECK (severity BETWEEN 1 AND 5); +ALTER TABLE audit_log ADD CONSTRAINT chk_message_length CHECK (LENGTH(message) > 0); +ALTER TABLE audit_log ADD CHECK (severity > 0); diff --git a/packages/dbml-core/__tests__/importer/postgres_importer/output/cmd_create_table.out.dbml b/packages/dbml-core/__tests__/importer/postgres_importer/output/cmd_create_table.out.dbml index 61c72e998..2067ef248 100644 --- a/packages/dbml-core/__tests__/importer/postgres_importer/output/cmd_create_table.out.dbml +++ b/packages/dbml-core/__tests__/importer/postgres_importer/output/cmd_create_table.out.dbml @@ -1,11 +1,11 @@ Table "a" { "id" integer [unique, pk, default: 1] - "name" varchar(255) + "name" varchar(255) [constraint: `"id" > -1`] } Table "b" { "id" uuid - "name" varchar [not null] + "name" varchar [not null, constraint: `name <> ''`] "email" varchar(55) Indexes { diff --git a/packages/dbml-core/__tests__/importer/postgres_importer/output/constraints.out.dbml b/packages/dbml-core/__tests__/importer/postgres_importer/output/constraints.out.dbml new file mode 100644 index 000000000..8052c6b36 --- /dev/null +++ b/packages/dbml-core/__tests__/importer/postgres_importer/output/constraints.out.dbml @@ -0,0 +1,237 @@ +Table "products" { + "id" INT [pk] + "price" DECIMAL(10,2) [constraint: `price > 0`] + "quantity" INT [constraint: `quantity >= 0`] + "discount" DECIMAL(5,2) [constraint: `discount >= 0 AND discount <= 100`] +} + +Table "employees" { + "emp_id" INT [pk] + "age" INT + "salary" DECIMAL(10,2) + + Constraints { + `age >= 18 AND age <= 65` [name: 'chk_age'] + `salary > 0` [name: 'chk_salary'] + } +} + +Table "special_table" { + "id" INT [pk] + "price" DECIMAL [constraint: `"price" > 0`] + "status" VARCHAR(20) [constraint: `"status" IN ('active', 'inactive')`] +} + +Table "transactions" { + "txn_id" INT [pk] + "amount" DECIMAL(10,2) + "fee" DECIMAL(10,2) + "total" DECIMAL(10,2) + + Constraints { + `total = amount + fee` + `amount > 0 OR fee > 0` + } +} + +Table "contacts" { + "contact_id" INT [pk] + "email" VARCHAR(100) [constraint: `email LIKE '%@%'`] + "phone" VARCHAR(20) [constraint: `phone ~ '^[0-9]{3}-[0-9]{3}-[0-9]{4}$'`] +} + +Table "orders" { + "order_id" INT [pk] + "status" VARCHAR(20) [constraint: `status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')`] + "priority" INT [constraint: `priority IN (1, 2, 3, 4, 5)`] +} + +Table "users" { + "user_id" INT [pk] + "role" VARCHAR(20) [constraint: `role NOT IN ('banned', 'deleted', 'suspended')`] +} + +Table "ranges" { + "range_id" INT [pk] + "min_val" INT + "max_val" INT + + Constraints { + `(min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)` + } +} + +Table "inventory" { + "item_id" INT [pk] + "stock" INT + "status" VARCHAR(20) + + Constraints { + `CASE + WHEN status = 'active' THEN stock >= 0 + WHEN status = 'discontinued' THEN stock = 0 + ELSE TRUE + END` + } +} + +Table "accounts" { + "account_id" INT [pk] + "balance" DECIMAL(15,2) [constraint: `balance >= 0`] + "overdraft_limit" DECIMAL(15,2) [constraint: `overdraft_limit >= 0`] + + Constraints { + `balance + overdraft_limit >= 0` [name: 'chk_balance_overdraft'] + } +} + +Table "shipments" { + "shipment_id" INT [pk] + "weight" DECIMAL(10,2) + "cost" DECIMAL(10,2) + + Constraints { + `weight > 0` [name: 'chk_weight'] + `cost >= 0` [name: 'chk_cost'] + } +} + +Table "payments" { + "payment_id" INT [pk] + "amount" DECIMAL(10,2) + + Constraints { + `amount > 0` + } +} + +Table "pricing" { + "price_id" INT [pk] + "base_price" DECIMAL(10,2) + "discount_pct" DECIMAL(5,2) + "final_price" DECIMAL(10,2) + + Constraints { + `final_price = base_price * (1 - discount_pct / 100)` + } +} + +Table "settings" { + "setting_id" INT [pk] + "value" VARCHAR(100) + "default_value" VARCHAR(100) + + Constraints { + `COALESCE(value, default_value) IS NOT NULL` + } +} + +Table "bookings" { + "booking_id" INT [pk] + "check_in" DATE + "check_out" DATE + + Constraints { + `check_out > check_in` + `check_in >= CURRENT_DATE` + } +} + +Table "circles" { + "circle_id" INT [pk] + "radius" DECIMAL(10,2) + "area" DECIMAL(15,2) + + Constraints { + `area > 0` + `radius > 0` + } +} + +Table "documents" { + "doc_id" INT [pk] + "title" VARCHAR(200) + "content" TEXT + + Constraints { + `LENGTH(title) > 0` + `LENGTH(content) >= 10` + } +} + +Table "events" { + "event_id" INT [pk] + "status" VARCHAR(20) + "cancelled" BOOLEAN + + Constraints { + `status = 'active' OR status = 'completed' OR cancelled = TRUE` + } +} + +Table "measurements" { + "measurement_id" INT [pk] + "value" VARCHAR(50) + + Constraints { + `value::NUMERIC > 0` + } +} + +Table "grades" { + "grade_id" INT [pk] + "score" INT + + Constraints { + `score BETWEEN 0 AND 100` + } +} + +Table "products_special" { + "product_id" INT [pk] + "code" VARCHAR(50) + + Constraints { + `code ~ '^[A-Z]{3}-[0-9]{4}$'` [name: 'chk_code_format'] + } +} + +Table "features" { + "feature_id" INT [pk] + "is_enabled" BOOLEAN + "is_premium" BOOLEAN + + Constraints { + `is_enabled = TRUE OR is_premium = FALSE` + } +} + +Table "tags_table" { + "id" INT [pk] + "tags" "TEXT[]" + + Constraints { + `array_length(tags, 1) > 0` + } +} + +Table "configs" { + "config_id" INT [pk] + "settings" JSONB + + Constraints { + `settings IS NOT NULL` + } +} + +Table "audit_log" { + "log_id" INT [pk] + "severity" INT + "message" TEXT + + Constraints { + `severity BETWEEN 1 AND 5` [name: 'chk_severity_range'] + `LENGTH(message) > 0` [name: 'chk_message_length'] + `severity > 0` + } +} diff --git a/packages/dbml-core/__tests__/importer/postgres_importer/output/db_dump.out.dbml b/packages/dbml-core/__tests__/importer/postgres_importer/output/db_dump.out.dbml index 7ae51d9c8..580d05aab 100644 --- a/packages/dbml-core/__tests__/importer/postgres_importer/output/db_dump.out.dbml +++ b/packages/dbml-core/__tests__/importer/postgres_importer/output/db_dump.out.dbml @@ -22,6 +22,15 @@ Table "humanresources"."employee" { "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] "organizationnode" "character varying" [default: `'/'::charactervarying`, note: 'Where the employee is located in corporate hierarchy.'] + + Constraints { + `((birthdate >= '1930-01-01'::date) AND (birthdate <= (now() - '18 years'::interval)))` [name: 'CK_Employee_BirthDate'] + `(upper((gender)::text) = ANY (ARRAY['M'::text, 'F'::text]))` [name: 'CK_Employee_Gender'] + `((hiredate >= '1996-07-01'::date) AND (hiredate <= (now() + '1 day'::interval)))` [name: 'CK_Employee_HireDate'] + `(upper((maritalstatus)::text) = ANY (ARRAY['M'::text, 'S'::text]))` [name: 'CK_Employee_MaritalStatus'] + `((sickleavehours >= 0) AND (sickleavehours <= 120))` [name: 'CK_Employee_SickLeaveHours'] + `((vacationhours >= '-40'::integer) AND (vacationhours <= 240))` [name: 'CK_Employee_VacationHours'] + } Note: 'Employee information such as salary, department, and title.' } @@ -33,6 +42,10 @@ Table "humanresources"."employeedepartmenthistory" { "enddate" date [note: 'Date the employee left the department. NULL = Current department.'] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `((enddate >= startdate) OR (enddate IS NULL))` [name: 'CK_EmployeeDepartmentHistory_EndDate'] + } + Indexes { (businessentityid, startdate, departmentid, shiftid) [pk, name: "PK_EmployeeDepartmentHistory_BusinessEntityID_StartDate_Departm"] } @@ -46,6 +59,11 @@ Table "humanresources"."employeepayhistory" { "payfrequency" smallint [not null, note: '1 = Salary received monthly, 2 = Salary received biweekly'] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `(payfrequency = ANY (ARRAY[1, 2]))` [name: 'CK_EmployeePayHistory_PayFrequency'] + `((rate >= 6.50) AND (rate <= 200.00))` [name: 'CK_EmployeePayHistory_Rate'] + } + Indexes { (businessentityid, ratechangedate) [pk, name: "PK_EmployeePayHistory_BusinessEntityID_RateChangeDate"] } @@ -129,6 +147,11 @@ Table "person"."person" { "demographics" xml [note: 'Personal information such as hobbies, and income collected from online shoppers. Used for sales analysis.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `((emailpromotion >= 0) AND (emailpromotion <= 2))` [name: 'CK_Person_EmailPromotion'] + `((persontype IS NULL) OR (upper((persontype)::text) = ANY (ARRAY['SC'::text, 'VC'::text, 'IN'::text, 'EM'::text, 'SP'::text, 'GC'::text])))` [name: 'CK_Person_PersonType'] + } Note: 'Human beings involved with AdventureWorks: employees, customer contacts, and vendor contacts.' } @@ -217,6 +240,13 @@ Table "production"."billofmaterials" { "bomlevel" smallint [not null, note: 'Indicates the depth the component is from its parent (AssemblyID).'] "perassemblyqty" numeric(8,2) [not null, default: 1.00, note: 'Quantity of the component needed to create the assembly.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(((productassemblyid IS NULL) AND (bomlevel = 0) AND (perassemblyqty = 1.00)) OR ((productassemblyid IS NOT NULL) AND (bomlevel >= 1)))` [name: 'CK_BillOfMaterials_BOMLevel'] + `((enddate > startdate) OR (enddate IS NULL))` [name: 'CK_BillOfMaterials_EndDate'] + `(perassemblyqty >= 1.00)` [name: 'CK_BillOfMaterials_PerAssemblyQty'] + `(productassemblyid <> componentid)` [name: 'CK_BillOfMaterials_ProductAssemblyID'] + } Note: 'Items required to make bicycles and bicycle subassemblies. It identifies the heirarchical relationship between a parent product and its components.' } @@ -241,6 +271,10 @@ Table "production"."document" { "rowguid" uuid [unique, not null, default: `public.uuid_generate_v1()`, note: 'ROWGUIDCOL number uniquely identifying the record. Required for FileStream.'] "modifieddate" timestamp [not null, default: `now()`] "documentnode" "character varying" [pk, not null, default: `'/'::charactervarying`, note: 'Primary key for Document records.'] + + Constraints { + `((status >= 1) AND (status <= 3))` [name: 'CK_Document_Status'] + } Note: 'Product maintenance documents.' } @@ -257,6 +291,11 @@ Table "production"."location" { "costrate" numeric [not null, default: 0.00, note: 'Standard hourly cost of the manufacturing location.'] "availability" numeric(8,2) [not null, default: 0.00, note: 'Work capacity (in hours) of the manufacturing location.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(availability >= 0.00)` [name: 'CK_Location_Availability'] + `(costrate >= 0.00)` [name: 'CK_Location_CostRate'] + } Note: 'Product inventory and manufacturing locations.' } @@ -286,6 +325,19 @@ Table "production"."product" { "discontinueddate" timestamp [note: 'Date the product was discontinued.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `((upper((class)::text) = ANY (ARRAY['L'::text, 'M'::text, 'H'::text])) OR (class IS NULL))` [name: 'CK_Product_Class'] + `(daystomanufacture >= 0)` [name: 'CK_Product_DaysToManufacture'] + `(listprice >= 0.00)` [name: 'CK_Product_ListPrice'] + `((upper((productline)::text) = ANY (ARRAY['S'::text, 'T'::text, 'M'::text, 'R'::text])) OR (productline IS NULL))` [name: 'CK_Product_ProductLine'] + `(reorderpoint > 0)` [name: 'CK_Product_ReorderPoint'] + `(safetystocklevel > 0)` [name: 'CK_Product_SafetyStockLevel'] + `((sellenddate >= sellstartdate) OR (sellenddate IS NULL))` [name: 'CK_Product_SellEndDate'] + `(standardcost >= 0.00)` [name: 'CK_Product_StandardCost'] + `((upper((style)::text) = ANY (ARRAY['W'::text, 'M'::text, 'U'::text])) OR (style IS NULL))` [name: 'CK_Product_Style'] + `(weight > 0.00)` [name: 'CK_Product_Weight'] + } Note: 'Products sold or used in the manfacturing of sold products.' } @@ -304,6 +356,11 @@ Table "production"."productcosthistory" { "standardcost" numeric [not null, note: 'Standard cost of the product.'] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `((enddate >= startdate) OR (enddate IS NULL))` [name: 'CK_ProductCostHistory_EndDate'] + `(standardcost >= 0.00)` [name: 'CK_ProductCostHistory_StandardCost'] + } + Indexes { (productid, startdate) [pk, name: "PK_ProductCostHistory_ProductID_StartDate"] } @@ -338,6 +395,10 @@ Table "production"."productinventory" { "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `((bin >= 0) AND (bin <= 100))` [name: 'CK_ProductInventory_Bin'] + } + Indexes { (productid, locationid) [pk, name: "PK_ProductInventory_ProductID_LocationID"] } @@ -351,6 +412,11 @@ Table "production"."productlistpricehistory" { "listprice" numeric [not null, note: 'Product list price.'] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `((enddate >= startdate) OR (enddate IS NULL))` [name: 'CK_ProductListPriceHistory_EndDate'] + `(listprice > 0.00)` [name: 'CK_ProductListPriceHistory_ListPrice'] + } + Indexes { (productid, startdate) [pk, name: "PK_ProductListPriceHistory_ProductID_StartDate"] } @@ -422,6 +488,10 @@ Table "production"."productreview" { "comments" "character varying(3850)" [note: '''Reviewer\'s comments WARNING: can have several lines!'''] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `((rating >= 1) AND (rating <= 5))` [name: 'CK_ProductReview_Rating'] + } Note: 'Customer reviews of products they have purchased.' } @@ -451,6 +521,10 @@ Table "production"."transactionhistory" { "quantity" integer [not null, note: 'Product quantity.'] "actualcost" numeric [not null, note: 'Product cost.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(upper((transactiontype)::text) = ANY (ARRAY['W'::text, 'S'::text, 'P'::text]))` [name: 'CK_TransactionHistory_TransactionType'] + } Note: 'Record of each purchase order, sales order, or work order transaction year to date.' } @@ -464,6 +538,10 @@ Table "production"."transactionhistoryarchive" { "quantity" integer [not null, note: 'Product quantity.'] "actualcost" numeric [not null, note: 'Product cost.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(upper((transactiontype)::text) = ANY (ARRAY['W'::text, 'S'::text, 'P'::text]))` [name: 'CK_TransactionHistoryArchive_TransactionType'] + } Note: 'Transactions for previous years.' } @@ -484,6 +562,12 @@ Table "production"."workorder" { "duedate" timestamp [not null, note: 'Work order due date.'] "scrapreasonid" smallint [note: 'Reason for inspection failure.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `((enddate >= startdate) OR (enddate IS NULL))` [name: 'CK_WorkOrder_EndDate'] + `(orderqty > 0)` [name: 'CK_WorkOrder_OrderQty'] + `(scrappedqty >= 0)` [name: 'CK_WorkOrder_ScrappedQty'] + } Note: 'Manufacturing work orders.' } @@ -501,6 +585,14 @@ Table "production"."workorderrouting" { "actualcost" numeric [note: 'Actual manufacturing cost.'] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `(actualcost > 0.00)` [name: 'CK_WorkOrderRouting_ActualCost'] + `((actualenddate >= actualstartdate) OR (actualenddate IS NULL) OR (actualstartdate IS NULL))` [name: 'CK_WorkOrderRouting_ActualEndDate'] + `(actualresourcehrs >= 0.0000)` [name: 'CK_WorkOrderRouting_ActualResourceHrs'] + `(plannedcost > 0.00)` [name: 'CK_WorkOrderRouting_PlannedCost'] + `(scheduledenddate >= scheduledstartdate)` [name: 'CK_WorkOrderRouting_ScheduledEndDate'] + } + Indexes { (workorderid, productid, operationsequence) [pk, name: "PK_WorkOrderRouting_WorkOrderID_ProductID_OperationSequence"] } @@ -518,6 +610,13 @@ Table "purchasing"."purchaseorderdetail" { "rejectedqty" numeric(8,2) [not null, note: 'Quantity rejected during inspection.'] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `(orderqty > 0)` [name: 'CK_PurchaseOrderDetail_OrderQty'] + `(receivedqty >= 0.00)` [name: 'CK_PurchaseOrderDetail_ReceivedQty'] + `(rejectedqty >= 0.00)` [name: 'CK_PurchaseOrderDetail_RejectedQty'] + `(unitprice >= 0.00)` [name: 'CK_PurchaseOrderDetail_UnitPrice'] + } + Indexes { (purchaseorderid, purchaseorderdetailid) [pk, name: "PK_PurchaseOrderDetail_PurchaseOrderID_PurchaseOrderDetailID"] } @@ -537,6 +636,14 @@ Table "purchasing"."purchaseorderheader" { "taxamt" numeric [not null, default: 0.00, note: 'Tax amount.'] "freight" numeric [not null, default: 0.00, note: 'Shipping cost.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(freight >= 0.00)` [name: 'CK_PurchaseOrderHeader_Freight'] + `((shipdate >= orderdate) OR (shipdate IS NULL))` [name: 'CK_PurchaseOrderHeader_ShipDate'] + `((status >= 1) AND (status <= 4))` [name: 'CK_PurchaseOrderHeader_Status'] + `(subtotal >= 0.00)` [name: 'CK_PurchaseOrderHeader_SubTotal'] + `(taxamt >= 0.00)` [name: 'CK_PurchaseOrderHeader_TaxAmt'] + } Note: '''General purchase order information. See PurchaseOrderDetail for more details.''' } @@ -554,6 +661,15 @@ Table "purchasing"."productvendor" { "unitmeasurecode" "character (3)" [not null, note: '''The product\'s unit of measure.'''] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `(averageleadtime >= 1)` [name: 'CK_ProductVendor_AverageLeadTime'] + `(lastreceiptcost > 0.00)` [name: 'CK_ProductVendor_LastReceiptCost'] + `(maxorderqty >= 1)` [name: 'CK_ProductVendor_MaxOrderQty'] + `(minorderqty >= 1)` [name: 'CK_ProductVendor_MinOrderQty'] + `(onorderqty >= 0)` [name: 'CK_ProductVendor_OnOrderQty'] + `(standardprice > 0.00)` [name: 'CK_ProductVendor_StandardPrice'] + } + Indexes { (productid, businessentityid) [pk, name: "PK_ProductVendor_ProductID_BusinessEntityID"] } @@ -567,6 +683,11 @@ Table "purchasing"."shipmethod" { "shiprate" numeric [not null, default: 0.00, note: 'Shipping charge per pound.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(shipbase > 0.00)` [name: 'CK_ShipMethod_ShipBase'] + `(shiprate > 0.00)` [name: 'CK_ShipMethod_ShipRate'] + } Note: 'Shipping company lookup table.' } @@ -579,6 +700,10 @@ Table "purchasing"."vendor" { "activeflag" public.Flag [not null, default: true, note: '0 = Vendor no longer used. 1 = Vendor is actively used.'] "purchasingwebserviceurl" "character varying(1024)" [note: 'Vendor URL.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `((creditrating >= 1) AND (creditrating <= 5))` [name: 'CK_Vendor_CreditRating'] + } Note: 'Companies from whom Adventure Works Cycles purchases parts or other goods.' } @@ -659,6 +784,10 @@ Table "sales"."shoppingcartitem" { "productid" integer [not null, note: 'Product ordered. Foreign key to Product.ProductID.'] "datecreated" timestamp [not null, default: `now()`, note: 'Date the time the record was created.'] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(quantity >= 1)` [name: 'CK_ShoppingCartItem_Quantity'] + } Note: 'Contains online customer orders until the order is submitted or cancelled.' } @@ -674,6 +803,13 @@ Table "sales"."specialoffer" { "maxqty" integer [note: 'Maximum discount percent allowed.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(discountpct >= 0.00)` [name: 'CK_SpecialOffer_DiscountPct'] + `(enddate >= startdate)` [name: 'CK_SpecialOffer_EndDate'] + `(maxqty >= 0)` [name: 'CK_SpecialOffer_MaxQty'] + `(minqty >= 0)` [name: 'CK_SpecialOffer_MinQty'] + } Note: 'Sale discounts lookup table.' } @@ -689,6 +825,12 @@ Table "sales"."salesorderdetail" { "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `(orderqty > 0)` [name: 'CK_SalesOrderDetail_OrderQty'] + `(unitprice >= 0.00)` [name: 'CK_SalesOrderDetail_UnitPrice'] + `(unitpricediscount >= 0.00)` [name: 'CK_SalesOrderDetail_UnitPriceDiscount'] + } + Indexes { (salesorderid, salesorderdetailid) [pk, name: "PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID"] } @@ -721,6 +863,15 @@ Table "sales"."salesorderheader" { "comment" "character varying(128)" [note: 'Sales representative comments.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(duedate >= orderdate)` [name: 'CK_SalesOrderHeader_DueDate'] + `(freight >= 0.00)` [name: 'CK_SalesOrderHeader_Freight'] + `((shipdate >= orderdate) OR (shipdate IS NULL))` [name: 'CK_SalesOrderHeader_ShipDate'] + `((status >= 0) AND (status <= 8))` [name: 'CK_SalesOrderHeader_Status'] + `(subtotal >= 0.00)` [name: 'CK_SalesOrderHeader_SubTotal'] + `(taxamt >= 0.00)` [name: 'CK_SalesOrderHeader_TaxAmt'] + } Note: 'General sales order information.' } @@ -757,6 +908,14 @@ Table "sales"."salesperson" { "saleslastyear" numeric [not null, default: 0.00, note: 'Sales total of previous year.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(bonus >= 0.00)` [name: 'CK_SalesPerson_Bonus'] + `(commissionpct >= 0.00)` [name: 'CK_SalesPerson_CommissionPct'] + `(saleslastyear >= 0.00)` [name: 'CK_SalesPerson_SalesLastYear'] + `(salesquota > 0.00)` [name: 'CK_SalesPerson_SalesQuota'] + `(salesytd >= 0.00)` [name: 'CK_SalesPerson_SalesYTD'] + } Note: 'Sales representative current information.' } @@ -767,6 +926,10 @@ Table "sales"."salespersonquotahistory" { "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `(salesquota > 0.00)` [name: 'CK_SalesPersonQuotaHistory_SalesQuota'] + } + Indexes { (businessentityid, quotadate) [pk, name: "PK_SalesPersonQuotaHistory_BusinessEntityID_QuotaDate"] } @@ -792,6 +955,13 @@ Table "sales"."salesterritory" { "costlastyear" numeric [not null, default: 0.00, note: 'Business costs in the territory the previous year.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `(costlastyear >= 0.00)` [name: 'CK_SalesTerritory_CostLastYear'] + `(costytd >= 0.00)` [name: 'CK_SalesTerritory_CostYTD'] + `(saleslastyear >= 0.00)` [name: 'CK_SalesTerritory_SalesLastYear'] + `(salesytd >= 0.00)` [name: 'CK_SalesTerritory_SalesYTD'] + } Note: 'Sales territory lookup table.' } @@ -803,6 +973,10 @@ Table "sales"."salesterritoryhistory" { "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + Constraints { + `((enddate >= startdate) OR (enddate IS NULL))` [name: 'CK_SalesTerritoryHistory_EndDate'] + } + Indexes { (businessentityid, startdate, territoryid) [pk, name: "PK_SalesTerritoryHistory_BusinessEntityID_StartDate_TerritoryID"] } @@ -817,6 +991,10 @@ Table "sales"."salestaxrate" { "name" public.Name [not null, note: 'Tax rate description.'] "rowguid" uuid [not null, default: `public.uuid_generate_v1()`] "modifieddate" timestamp [not null, default: `now()`] + + Constraints { + `((taxtype >= 1) AND (taxtype <= 3))` [name: 'CK_SalesTaxRate_TaxType'] + } Note: 'Tax rate lookup table.' } diff --git a/packages/dbml-core/__tests__/model_exporter/dbml_exporter/input/constraints.in.json b/packages/dbml-core/__tests__/model_exporter/dbml_exporter/input/constraints.in.json new file mode 100644 index 000000000..f10535465 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/dbml_exporter/input/constraints.in.json @@ -0,0 +1,365 @@ +{ + "schemas": [], + "tables": [ + { + "name": "User", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "name", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 174, + "line": 12, + "column": 3 + }, + "end": { + "offset": 213, + "line": 12, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 185, + "line": 12, + "column": 14 + }, + "end": { + "offset": 212, + "line": 12, + "column": 41 + } + }, + "expression": "LEN(name) > 0" + } + ] + }, + { + "name": "email", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 216, + "line": 13, + "column": 3 + }, + "end": { + "offset": 226, + "line": 13, + "column": 13 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 145, + "line": 9, + "column": 1 + }, + "end": { + "offset": 377, + "line": 19, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 160, + "line": 10, + "column": 3 + }, + "end": { + "offset": 170, + "line": 10, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [ + { + "token": { + "start": { + "offset": 248, + "line": 16, + "column": 5 + }, + "end": { + "offset": 293, + "line": 16, + "column": 50 + } + }, + "name": "name_not_too_long", + "expression": "LEN(name) < 256" + }, + { + "token": { + "start": { + "offset": 298, + "line": 17, + "column": 5 + }, + "end": { + "offset": 371, + "line": 17, + "column": 78 + } + }, + "expression": "REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')" + } + ] + }, + { + "name": "User2", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 411, + "line": 24, + "column": 3 + }, + "end": { + "offset": 422, + "line": 24, + "column": 14 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 379, + "line": 21, + "column": 1 + }, + "end": { + "offset": 424, + "line": 25, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 395, + "line": 22, + "column": 3 + }, + "end": { + "offset": 405, + "line": 22, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [] + }, + { + "name": "User3", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 442, + "line": 28, + "column": 3 + }, + "end": { + "offset": 515, + "line": 28, + "column": 76 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 455, + "line": 28, + "column": 16 + }, + "end": { + "offset": 480, + "line": 28, + "column": 41 + } + }, + "expression": "balance > 0" + }, + { + "token": { + "start": { + "offset": 482, + "line": 28, + "column": 43 + }, + "end": { + "offset": 514, + "line": 28, + "column": 75 + } + }, + "expression": "balance < 10000000" + } + ] + } + ], + "token": { + "start": { + "offset": 426, + "line": 27, + "column": 1 + }, + "end": { + "offset": 517, + "line": 29, + "column": 2 + } + }, + "indexes": [], + "partials": [], + "constraints": [] + } + ], + "notes": [], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "tablePartials": [ + { + "name": "WithMoney", + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 27, + "line": 2, + "column": 3 + }, + "end": { + "offset": 66, + "line": 2, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 40, + "line": 2, + "column": 16 + }, + "end": { + "offset": 65, + "line": 2, + "column": 41 + } + }, + "expression": "balance > 0" + } + ] + } + ], + "token": { + "start": { + "offset": 0, + "line": 1, + "column": 1 + }, + "end": { + "offset": 143, + "line": 7, + "column": 2 + } + }, + "indexes": [], + "constraints": [ + { + "token": { + "start": { + "offset": 88, + "line": 5, + "column": 5 + }, + "end": { + "offset": 137, + "line": 5, + "column": 54 + } + }, + "name": "not_too_much_money", + "expression": "balance < 10000000" + } + ] + } + ] +} diff --git a/packages/dbml-core/__tests__/model_exporter/dbml_exporter/output/constraints.out.dbml b/packages/dbml-core/__tests__/model_exporter/dbml_exporter/output/constraints.out.dbml new file mode 100644 index 000000000..d0c7a8546 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/dbml_exporter/output/constraints.out.dbml @@ -0,0 +1,23 @@ +Table "User" { + "balance" int [constraint: `balance > 0`] + "name" TEXT [constraint: `LEN(name) > 0`] + "email" TEXT + + Constraints { + `balance < 10000000` [name: 'User.not_too_much_money'] + `LEN(name) < 256` [name: 'name_not_too_long'] + `REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$')` + } +} + +Table "User2" { + "balance" int + + Constraints { + `balance < 10000000` [name: 'User2.not_too_much_money'] + } +} + +Table "User3" { + "balance" int [constraint: `balance > 0`, constraint: `balance < 10000000`] +} diff --git a/packages/dbml-core/__tests__/model_exporter/model_exporter.spec.js b/packages/dbml-core/__tests__/model_exporter/model_exporter.spec.js index 0ee97b007..57f5b900a 100644 --- a/packages/dbml-core/__tests__/model_exporter/model_exporter.spec.js +++ b/packages/dbml-core/__tests__/model_exporter/model_exporter.spec.js @@ -4,6 +4,7 @@ import JsonExporter from '../../src/export/JsonExporter'; import MysqlExporter from '../../src/export/MysqlExporter'; import PostgresExporter from '../../src/export/PostgresExporter'; import SqlServerExporter from '../../src/export/SqlServerExporter'; +import OracleExporter from '../../src/export/OracleExporter'; describe('@dbml/core - model_exporter', () => { /** @@ -55,6 +56,10 @@ describe('@dbml/core - model_exporter', () => { test.each(scanTestNames(__dirname, 'mssql_exporter/input'))('mssql_exporter/%s', (name) => { runTest(name, 'mssql_exporter', 'mssql', SqlServerExporter); }); + + test.each(scanTestNames(__dirname, 'oracle_exporter/input'))('oracle_exporter/%s', (name) => { + runTest(name, 'oracle_exporter', 'oracle', OracleExporter); + }); /* eslint-enable */ }); diff --git a/packages/dbml-core/__tests__/model_exporter/mssql_exporter/input/constraints.in.json b/packages/dbml-core/__tests__/model_exporter/mssql_exporter/input/constraints.in.json new file mode 100644 index 000000000..f10535465 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/mssql_exporter/input/constraints.in.json @@ -0,0 +1,365 @@ +{ + "schemas": [], + "tables": [ + { + "name": "User", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "name", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 174, + "line": 12, + "column": 3 + }, + "end": { + "offset": 213, + "line": 12, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 185, + "line": 12, + "column": 14 + }, + "end": { + "offset": 212, + "line": 12, + "column": 41 + } + }, + "expression": "LEN(name) > 0" + } + ] + }, + { + "name": "email", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 216, + "line": 13, + "column": 3 + }, + "end": { + "offset": 226, + "line": 13, + "column": 13 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 145, + "line": 9, + "column": 1 + }, + "end": { + "offset": 377, + "line": 19, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 160, + "line": 10, + "column": 3 + }, + "end": { + "offset": 170, + "line": 10, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [ + { + "token": { + "start": { + "offset": 248, + "line": 16, + "column": 5 + }, + "end": { + "offset": 293, + "line": 16, + "column": 50 + } + }, + "name": "name_not_too_long", + "expression": "LEN(name) < 256" + }, + { + "token": { + "start": { + "offset": 298, + "line": 17, + "column": 5 + }, + "end": { + "offset": 371, + "line": 17, + "column": 78 + } + }, + "expression": "REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')" + } + ] + }, + { + "name": "User2", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 411, + "line": 24, + "column": 3 + }, + "end": { + "offset": 422, + "line": 24, + "column": 14 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 379, + "line": 21, + "column": 1 + }, + "end": { + "offset": 424, + "line": 25, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 395, + "line": 22, + "column": 3 + }, + "end": { + "offset": 405, + "line": 22, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [] + }, + { + "name": "User3", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 442, + "line": 28, + "column": 3 + }, + "end": { + "offset": 515, + "line": 28, + "column": 76 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 455, + "line": 28, + "column": 16 + }, + "end": { + "offset": 480, + "line": 28, + "column": 41 + } + }, + "expression": "balance > 0" + }, + { + "token": { + "start": { + "offset": 482, + "line": 28, + "column": 43 + }, + "end": { + "offset": 514, + "line": 28, + "column": 75 + } + }, + "expression": "balance < 10000000" + } + ] + } + ], + "token": { + "start": { + "offset": 426, + "line": 27, + "column": 1 + }, + "end": { + "offset": 517, + "line": 29, + "column": 2 + } + }, + "indexes": [], + "partials": [], + "constraints": [] + } + ], + "notes": [], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "tablePartials": [ + { + "name": "WithMoney", + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 27, + "line": 2, + "column": 3 + }, + "end": { + "offset": 66, + "line": 2, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 40, + "line": 2, + "column": 16 + }, + "end": { + "offset": 65, + "line": 2, + "column": 41 + } + }, + "expression": "balance > 0" + } + ] + } + ], + "token": { + "start": { + "offset": 0, + "line": 1, + "column": 1 + }, + "end": { + "offset": 143, + "line": 7, + "column": 2 + } + }, + "indexes": [], + "constraints": [ + { + "token": { + "start": { + "offset": 88, + "line": 5, + "column": 5 + }, + "end": { + "offset": 137, + "line": 5, + "column": 54 + } + }, + "name": "not_too_much_money", + "expression": "balance < 10000000" + } + ] + } + ] +} diff --git a/packages/dbml-core/__tests__/model_exporter/mssql_exporter/output/constraints.out.sql b/packages/dbml-core/__tests__/model_exporter/mssql_exporter/output/constraints.out.sql new file mode 100644 index 000000000..d36cc2536 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/mssql_exporter/output/constraints.out.sql @@ -0,0 +1,20 @@ +CREATE TABLE [User] ( + [balance] int CHECK (balance > 0), + [name] TEXT CHECK (LEN(name) > 0), + [email] TEXT, + CONSTRAINT [User.not_too_much_money] CHECK (balance < 10000000), + CONSTRAINT [name_not_too_long] CHECK (LEN(name) < 256), + CHECK (REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$')) +) +GO + +CREATE TABLE [User2] ( + [balance] int, + CONSTRAINT [User2.not_too_much_money] CHECK (balance < 10000000) +) +GO + +CREATE TABLE [User3] ( + [balance] int CHECK ((balance > 0) AND (balance < 10000000)) +) +GO diff --git a/packages/dbml-core/__tests__/model_exporter/mysql_exporter/input/constraints.in.json b/packages/dbml-core/__tests__/model_exporter/mysql_exporter/input/constraints.in.json new file mode 100644 index 000000000..f10535465 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/mysql_exporter/input/constraints.in.json @@ -0,0 +1,365 @@ +{ + "schemas": [], + "tables": [ + { + "name": "User", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "name", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 174, + "line": 12, + "column": 3 + }, + "end": { + "offset": 213, + "line": 12, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 185, + "line": 12, + "column": 14 + }, + "end": { + "offset": 212, + "line": 12, + "column": 41 + } + }, + "expression": "LEN(name) > 0" + } + ] + }, + { + "name": "email", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 216, + "line": 13, + "column": 3 + }, + "end": { + "offset": 226, + "line": 13, + "column": 13 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 145, + "line": 9, + "column": 1 + }, + "end": { + "offset": 377, + "line": 19, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 160, + "line": 10, + "column": 3 + }, + "end": { + "offset": 170, + "line": 10, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [ + { + "token": { + "start": { + "offset": 248, + "line": 16, + "column": 5 + }, + "end": { + "offset": 293, + "line": 16, + "column": 50 + } + }, + "name": "name_not_too_long", + "expression": "LEN(name) < 256" + }, + { + "token": { + "start": { + "offset": 298, + "line": 17, + "column": 5 + }, + "end": { + "offset": 371, + "line": 17, + "column": 78 + } + }, + "expression": "REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')" + } + ] + }, + { + "name": "User2", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 411, + "line": 24, + "column": 3 + }, + "end": { + "offset": 422, + "line": 24, + "column": 14 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 379, + "line": 21, + "column": 1 + }, + "end": { + "offset": 424, + "line": 25, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 395, + "line": 22, + "column": 3 + }, + "end": { + "offset": 405, + "line": 22, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [] + }, + { + "name": "User3", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 442, + "line": 28, + "column": 3 + }, + "end": { + "offset": 515, + "line": 28, + "column": 76 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 455, + "line": 28, + "column": 16 + }, + "end": { + "offset": 480, + "line": 28, + "column": 41 + } + }, + "expression": "balance > 0" + }, + { + "token": { + "start": { + "offset": 482, + "line": 28, + "column": 43 + }, + "end": { + "offset": 514, + "line": 28, + "column": 75 + } + }, + "expression": "balance < 10000000" + } + ] + } + ], + "token": { + "start": { + "offset": 426, + "line": 27, + "column": 1 + }, + "end": { + "offset": 517, + "line": 29, + "column": 2 + } + }, + "indexes": [], + "partials": [], + "constraints": [] + } + ], + "notes": [], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "tablePartials": [ + { + "name": "WithMoney", + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 27, + "line": 2, + "column": 3 + }, + "end": { + "offset": 66, + "line": 2, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 40, + "line": 2, + "column": 16 + }, + "end": { + "offset": 65, + "line": 2, + "column": 41 + } + }, + "expression": "balance > 0" + } + ] + } + ], + "token": { + "start": { + "offset": 0, + "line": 1, + "column": 1 + }, + "end": { + "offset": 143, + "line": 7, + "column": 2 + } + }, + "indexes": [], + "constraints": [ + { + "token": { + "start": { + "offset": 88, + "line": 5, + "column": 5 + }, + "end": { + "offset": 137, + "line": 5, + "column": 54 + } + }, + "name": "not_too_much_money", + "expression": "balance < 10000000" + } + ] + } + ] +} diff --git a/packages/dbml-core/__tests__/model_exporter/mysql_exporter/output/constraints.out.sql b/packages/dbml-core/__tests__/model_exporter/mysql_exporter/output/constraints.out.sql new file mode 100644 index 000000000..97de3d170 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/mysql_exporter/output/constraints.out.sql @@ -0,0 +1,17 @@ +CREATE TABLE `User` ( + `balance` int CHECK (balance > 0), + `name` TEXT CHECK (LEN(name) > 0), + `email` TEXT, + CONSTRAINT `User.not_too_much_money` CHECK (balance < 10000000), + CONSTRAINT `name_not_too_long` CHECK (LEN(name) < 256), + CHECK (REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$')) +); + +CREATE TABLE `User2` ( + `balance` int, + CONSTRAINT `User2.not_too_much_money` CHECK (balance < 10000000) +); + +CREATE TABLE `User3` ( + `balance` int CHECK ((balance > 0) AND (balance < 10000000)) +); diff --git a/packages/dbml-core/__tests__/model_exporter/oracle_exporter/input/constraints.in.json b/packages/dbml-core/__tests__/model_exporter/oracle_exporter/input/constraints.in.json new file mode 100644 index 000000000..f10535465 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/oracle_exporter/input/constraints.in.json @@ -0,0 +1,365 @@ +{ + "schemas": [], + "tables": [ + { + "name": "User", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "name", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 174, + "line": 12, + "column": 3 + }, + "end": { + "offset": 213, + "line": 12, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 185, + "line": 12, + "column": 14 + }, + "end": { + "offset": 212, + "line": 12, + "column": 41 + } + }, + "expression": "LEN(name) > 0" + } + ] + }, + { + "name": "email", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 216, + "line": 13, + "column": 3 + }, + "end": { + "offset": 226, + "line": 13, + "column": 13 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 145, + "line": 9, + "column": 1 + }, + "end": { + "offset": 377, + "line": 19, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 160, + "line": 10, + "column": 3 + }, + "end": { + "offset": 170, + "line": 10, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [ + { + "token": { + "start": { + "offset": 248, + "line": 16, + "column": 5 + }, + "end": { + "offset": 293, + "line": 16, + "column": 50 + } + }, + "name": "name_not_too_long", + "expression": "LEN(name) < 256" + }, + { + "token": { + "start": { + "offset": 298, + "line": 17, + "column": 5 + }, + "end": { + "offset": 371, + "line": 17, + "column": 78 + } + }, + "expression": "REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')" + } + ] + }, + { + "name": "User2", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 411, + "line": 24, + "column": 3 + }, + "end": { + "offset": 422, + "line": 24, + "column": 14 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 379, + "line": 21, + "column": 1 + }, + "end": { + "offset": 424, + "line": 25, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 395, + "line": 22, + "column": 3 + }, + "end": { + "offset": 405, + "line": 22, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [] + }, + { + "name": "User3", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 442, + "line": 28, + "column": 3 + }, + "end": { + "offset": 515, + "line": 28, + "column": 76 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 455, + "line": 28, + "column": 16 + }, + "end": { + "offset": 480, + "line": 28, + "column": 41 + } + }, + "expression": "balance > 0" + }, + { + "token": { + "start": { + "offset": 482, + "line": 28, + "column": 43 + }, + "end": { + "offset": 514, + "line": 28, + "column": 75 + } + }, + "expression": "balance < 10000000" + } + ] + } + ], + "token": { + "start": { + "offset": 426, + "line": 27, + "column": 1 + }, + "end": { + "offset": 517, + "line": 29, + "column": 2 + } + }, + "indexes": [], + "partials": [], + "constraints": [] + } + ], + "notes": [], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "tablePartials": [ + { + "name": "WithMoney", + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 27, + "line": 2, + "column": 3 + }, + "end": { + "offset": 66, + "line": 2, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 40, + "line": 2, + "column": 16 + }, + "end": { + "offset": 65, + "line": 2, + "column": 41 + } + }, + "expression": "balance > 0" + } + ] + } + ], + "token": { + "start": { + "offset": 0, + "line": 1, + "column": 1 + }, + "end": { + "offset": 143, + "line": 7, + "column": 2 + } + }, + "indexes": [], + "constraints": [ + { + "token": { + "start": { + "offset": 88, + "line": 5, + "column": 5 + }, + "end": { + "offset": 137, + "line": 5, + "column": 54 + } + }, + "name": "not_too_much_money", + "expression": "balance < 10000000" + } + ] + } + ] +} diff --git a/packages/dbml-core/__tests__/model_exporter/oracle_exporter/output/constraints.out.sql b/packages/dbml-core/__tests__/model_exporter/oracle_exporter/output/constraints.out.sql new file mode 100644 index 000000000..25956ee08 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/oracle_exporter/output/constraints.out.sql @@ -0,0 +1,17 @@ +CREATE TABLE "User" ( + "balance" int CHECK (balance > 0), + "name" TEXT CHECK (LEN(name) > 0), + "email" TEXT, + CONSTRAINT "User.not_too_much_money" CHECK (balance < 10000000), + CONSTRAINT "name_not_too_long" CHECK (LEN(name) < 256), + CHECK (REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$')) +); + +CREATE TABLE "User2" ( + "balance" int, + CONSTRAINT "User2.not_too_much_money" CHECK (balance < 10000000) +); + +CREATE TABLE "User3" ( + "balance" int CHECK ((balance > 0) AND (balance < 10000000)) +); diff --git a/packages/dbml-core/__tests__/model_exporter/postgres_exporter/input/constraints.in.json b/packages/dbml-core/__tests__/model_exporter/postgres_exporter/input/constraints.in.json new file mode 100644 index 000000000..f10535465 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/postgres_exporter/input/constraints.in.json @@ -0,0 +1,365 @@ +{ + "schemas": [], + "tables": [ + { + "name": "User", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "name", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 174, + "line": 12, + "column": 3 + }, + "end": { + "offset": 213, + "line": 12, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 185, + "line": 12, + "column": 14 + }, + "end": { + "offset": 212, + "line": 12, + "column": 41 + } + }, + "expression": "LEN(name) > 0" + } + ] + }, + { + "name": "email", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 216, + "line": 13, + "column": 3 + }, + "end": { + "offset": 226, + "line": 13, + "column": 13 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 145, + "line": 9, + "column": 1 + }, + "end": { + "offset": 377, + "line": 19, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 160, + "line": 10, + "column": 3 + }, + "end": { + "offset": 170, + "line": 10, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [ + { + "token": { + "start": { + "offset": 248, + "line": 16, + "column": 5 + }, + "end": { + "offset": 293, + "line": 16, + "column": 50 + } + }, + "name": "name_not_too_long", + "expression": "LEN(name) < 256" + }, + { + "token": { + "start": { + "offset": 298, + "line": 17, + "column": 5 + }, + "end": { + "offset": 371, + "line": 17, + "column": 78 + } + }, + "expression": "REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')" + } + ] + }, + { + "name": "User2", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 411, + "line": 24, + "column": 3 + }, + "end": { + "offset": 422, + "line": 24, + "column": 14 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 379, + "line": 21, + "column": 1 + }, + "end": { + "offset": 424, + "line": 25, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 395, + "line": 22, + "column": 3 + }, + "end": { + "offset": 405, + "line": 22, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [] + }, + { + "name": "User3", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 442, + "line": 28, + "column": 3 + }, + "end": { + "offset": 515, + "line": 28, + "column": 76 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 455, + "line": 28, + "column": 16 + }, + "end": { + "offset": 480, + "line": 28, + "column": 41 + } + }, + "expression": "balance > 0" + }, + { + "token": { + "start": { + "offset": 482, + "line": 28, + "column": 43 + }, + "end": { + "offset": 514, + "line": 28, + "column": 75 + } + }, + "expression": "balance < 10000000" + } + ] + } + ], + "token": { + "start": { + "offset": 426, + "line": 27, + "column": 1 + }, + "end": { + "offset": 517, + "line": 29, + "column": 2 + } + }, + "indexes": [], + "partials": [], + "constraints": [] + } + ], + "notes": [], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "tablePartials": [ + { + "name": "WithMoney", + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 27, + "line": 2, + "column": 3 + }, + "end": { + "offset": 66, + "line": 2, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 40, + "line": 2, + "column": 16 + }, + "end": { + "offset": 65, + "line": 2, + "column": 41 + } + }, + "expression": "balance > 0" + } + ] + } + ], + "token": { + "start": { + "offset": 0, + "line": 1, + "column": 1 + }, + "end": { + "offset": 143, + "line": 7, + "column": 2 + } + }, + "indexes": [], + "constraints": [ + { + "token": { + "start": { + "offset": 88, + "line": 5, + "column": 5 + }, + "end": { + "offset": 137, + "line": 5, + "column": 54 + } + }, + "name": "not_too_much_money", + "expression": "balance < 10000000" + } + ] + } + ] +} diff --git a/packages/dbml-core/__tests__/model_exporter/postgres_exporter/output/constraints.out.sql b/packages/dbml-core/__tests__/model_exporter/postgres_exporter/output/constraints.out.sql new file mode 100644 index 000000000..25956ee08 --- /dev/null +++ b/packages/dbml-core/__tests__/model_exporter/postgres_exporter/output/constraints.out.sql @@ -0,0 +1,17 @@ +CREATE TABLE "User" ( + "balance" int CHECK (balance > 0), + "name" TEXT CHECK (LEN(name) > 0), + "email" TEXT, + CONSTRAINT "User.not_too_much_money" CHECK (balance < 10000000), + CONSTRAINT "name_not_too_long" CHECK (LEN(name) < 256), + CHECK (REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$')) +); + +CREATE TABLE "User2" ( + "balance" int, + CONSTRAINT "User2.not_too_much_money" CHECK (balance < 10000000) +); + +CREATE TABLE "User3" ( + "balance" int CHECK ((balance > 0) AND (balance < 10000000)) +); diff --git a/packages/dbml-core/__tests__/model_structure/constraints.js b/packages/dbml-core/__tests__/model_structure/constraints.js new file mode 100644 index 000000000..4122a8750 --- /dev/null +++ b/packages/dbml-core/__tests__/model_structure/constraints.js @@ -0,0 +1,72 @@ +import Database from '../../src/model_structure/database'; +import jsonDb from './constraints.json'; + +describe('@dbml/core - model_structure', () => { + let database; + + beforeAll(() => { + database = new Database(jsonDb); + }); + + describe('table_partial_and_table_with_constraints_schema', () => { + describe('nested_structure', () => { + test('table partial WithMoney has correct constraints', () => { + const tablePartial = database.tablePartials[0]; + + const tablePartialConstraint = tablePartial.constraints[0]; + expect(tablePartial.constraints.length).toEqual(1); + expect(tablePartialConstraint.name).toEqual('not_too_much_money'); + expect(tablePartialConstraint.expression).toEqual('balance < 10000000'); + + const tablePartialField = tablePartial.fields[0]; + expect(tablePartialField.constraints.length).toEqual(1); + expect(tablePartialField.constraints[0].name).toEqual(undefined); + expect(tablePartialField.constraints[0].expression).toEqual('balance > 0'); + }); + test('table User has correct constraints', () => { + const table = database.schemas[0].findTable('User'); + + expect(table.constraints.length).toEqual(3); + + expect(table.constraints[0].name).toEqual('User.not_too_much_money'); + expect(table.constraints[0].expression).toEqual('balance < 10000000'); + expect(table.constraints[0].table).toEqual(table); + expect(table.constraints[0].injectedPartial).toEqual(database.tablePartials[0]); + + expect(table.constraints[1].name).toEqual('name_not_too_long'); + expect(table.constraints[1].expression).toEqual('LEN(name) < 256'); + expect(table.constraints[1].table).toEqual(table); + + expect(table.constraints[2].name).toEqual(undefined); + expect(table.constraints[2].expression).toEqual("REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')"); + expect(table.constraints[2].table).toEqual(table); + + const column0 = table.findField('name'); + + expect(column0.constraints.length).toEqual(1); + expect(column0.constraints[0].name).toEqual(undefined); + expect(column0.constraints[0].expression).toEqual('LEN(name) > 0'); + expect(column0.constraints[0].table).toEqual(table); + expect(column0.constraints[0].column).toEqual(column0); + + const column1 = table.findField('email'); + + expect(column1.constraints.length).toEqual(0); + }); + test('table User2 has correct constraints', () => { + const table = database.schemas[0].findTable('User2'); + + expect(table.constraints.length).toEqual(1); + + expect(table.constraints[0].name).toEqual('User2.not_too_much_money'); + expect(table.constraints[0].expression).toEqual('balance < 10000000'); + expect(table.constraints[0].table).toEqual(table); + expect(table.constraints[0].injectedPartial).toEqual(database.tablePartials[0]); + + const column0 = table.findField('balance'); + + expect(column0.constraints.length).toEqual(0); + }); + }); + }); +}); diff --git a/packages/dbml-core/__tests__/model_structure/constraints.json b/packages/dbml-core/__tests__/model_structure/constraints.json new file mode 100644 index 000000000..c01916cff --- /dev/null +++ b/packages/dbml-core/__tests__/model_structure/constraints.json @@ -0,0 +1,287 @@ +{ + "schemas": [], + "tables": [ + { + "name": "User", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "name", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 174, + "line": 12, + "column": 3 + }, + "end": { + "offset": 213, + "line": 12, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 185, + "line": 12, + "column": 14 + }, + "end": { + "offset": 212, + "line": 12, + "column": 41 + } + }, + "expression": "LEN(name) > 0" + } + ] + }, + { + "name": "email", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 216, + "line": 13, + "column": 3 + }, + "end": { + "offset": 226, + "line": 13, + "column": 13 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 145, + "line": 9, + "column": 1 + }, + "end": { + "offset": 377, + "line": 19, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 160, + "line": 10, + "column": 3 + }, + "end": { + "offset": 170, + "line": 10, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [ + { + "token": { + "start": { + "offset": 248, + "line": 16, + "column": 5 + }, + "end": { + "offset": 293, + "line": 16, + "column": 50 + } + }, + "name": "name_not_too_long", + "expression": "LEN(name) < 256" + }, + { + "token": { + "start": { + "offset": 298, + "line": 17, + "column": 5 + }, + "end": { + "offset": 371, + "line": 17, + "column": 78 + } + }, + "expression": "REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')" + } + ] + }, + { + "name": "User2", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 411, + "line": 24, + "column": 3 + }, + "end": { + "offset": 422, + "line": 24, + "column": 14 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 379, + "line": 21, + "column": 1 + }, + "end": { + "offset": 424, + "line": 25, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 395, + "line": 22, + "column": 3 + }, + "end": { + "offset": 405, + "line": 22, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [] + } + ], + "notes": [], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "tablePartials": [ + { + "name": "WithMoney", + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 27, + "line": 2, + "column": 3 + }, + "end": { + "offset": 66, + "line": 2, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 40, + "line": 2, + "column": 16 + }, + "end": { + "offset": 65, + "line": 2, + "column": 41 + } + }, + "expression": "balance > 0" + } + ] + } + ], + "token": { + "start": { + "offset": 0, + "line": 1, + "column": 1 + }, + "end": { + "offset": 143, + "line": 7, + "column": 2 + } + }, + "indexes": [], + "constraints": [ + { + "token": { + "start": { + "offset": 88, + "line": 5, + "column": 5 + }, + "end": { + "offset": 137, + "line": 5, + "column": 54 + } + }, + "name": "not_too_much_money", + "expression": "balance < 10000000" + } + ] + } + ] +} diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/input/check_constraints.in.sql b/packages/dbml-core/__tests__/parser/mssql-parse/input/check_constraints.in.sql new file mode 100644 index 000000000..fc707b357 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/mssql-parse/input/check_constraints.in.sql @@ -0,0 +1,105 @@ +-- Column-level CHECK constraints +CREATE TABLE [products] ( + [id] int PRIMARY KEY, + [price] decimal(10,4) CHECK ([price] > 0), + [quantity] int CHECK ([quantity] >= 0), + [discount] decimal(5,2) CHECK ([discount] >= 0 AND [discount] <= 100), + [status] varchar(20) CHECK ([status] IN ('active', 'inactive', 'pending')) +); + +-- Table-level CHECK constraints +CREATE TABLE [orders] ( + [order_id] int PRIMARY KEY, + [order_date] datetime, + [delivery_date] datetime, + [total] decimal(10,2), + CHECK ([delivery_date] > [order_date]), + CHECK ([total] >= 0) +); + +-- Named CHECK constraints +CREATE TABLE [employees] ( + [emp_id] int PRIMARY KEY, + [age] int, + [salary] decimal(10,2), + [email] varchar(100), + CONSTRAINT chk_age CHECK ([age] >= 18 AND [age] <= 65), + CONSTRAINT chk_salary CHECK ([salary] > 0) +); + +-- Multiple CHECK constraints on same column +CREATE TABLE [inventory] ( + [item_id] int PRIMARY KEY, + [stock] int CHECK ([stock] >= 0) CHECK ([stock] <= 10000) +); + +-- CHECK with NOT IN (should be constraint, not enum) +CREATE TABLE [users] ( + [user_id] int PRIMARY KEY, + [username] varchar(50), + [role] varchar(20) CHECK ([role] NOT IN ('banned', 'suspended')) +); + +-- ALTER TABLE ADD CONSTRAINT CHECK +CREATE TABLE [accounts] ( + [account_id] int PRIMARY KEY, + [balance] decimal(15,2) +); +GO + +ALTER TABLE [accounts] + ADD CONSTRAINT chk_balance_positive + CHECK ([balance] >= 0); +GO + +ALTER TABLE [accounts] + ADD CHECK ([balance] <= 1000000); +GO + +-- CHECK with complex expressions +CREATE TABLE [transactions] ( + [txn_id] int PRIMARY KEY, + [amount] decimal(10,2), + [fee] decimal(10,2), + [type] varchar(20), + CHECK ([amount] + [fee] > 0), + CHECK ([type] IN ('debit', 'credit')) +); + +-- CHECK with OR operator +CREATE TABLE [settings] ( + [setting_id] int PRIMARY KEY, + [value] int, + CHECK ([value] = 0 OR [value] = 1 OR [value] = -1) +); + +-- CHECK with LIKE operator +CREATE TABLE [contacts] ( + [contact_id] int PRIMARY KEY, + [email] varchar(100) CHECK ([email] LIKE '%@%.%'), + [phone] varchar(20) CHECK ([phone] LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]') +); + +-- CHECK with nested parentheses +CREATE TABLE [ranges] ( + [range_id] int PRIMARY KEY, + [min_val] int, + [max_val] int, + CHECK (([min_val] >= 0) AND ([max_val] <= 100) AND ([min_val] < [max_val])) +); + +-- Table-level CHECK with single column IN +CREATE TABLE [shipments] ( + [shipment_id] int PRIMARY KEY, + [priority] varchar(20), + [carrier] varchar(50), + CHECK ([priority] IN ('low', 'medium', 'high', 'urgent')) +); + +-- Table-level CHECK with same column in multiple IN clauses +CREATE TABLE [workflow] ( + [workflow_id] int PRIMARY KEY, + [status] varchar(20), + [category] varchar(50), + CHECK ([status] IN ('draft', 'pending') AND [status] IN ('active', 'inactive')) +); diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/check_constraints.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/check_constraints.out.json new file mode 100644 index 000000000..2adb70b4e --- /dev/null +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/check_constraints.out.json @@ -0,0 +1,402 @@ +{ + "tables": [ + { + "name": "products", + "fields": [ + { + "name": "id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "price", + "type": { + "type_name": "decimal(10,4)" + }, + "constraints": [ + { + "expression": "[price] > 0" + } + ] + }, + { + "name": "quantity", + "type": { + "type_name": "int" + }, + "constraints": [ + { + "expression": "[quantity] >= 0" + } + ] + }, + { + "name": "discount", + "type": { + "type_name": "decimal(5,2)" + }, + "constraints": [ + { + "expression": "[discount] >= 0 AND [discount] <= 100" + } + ] + }, + { + "name": "status", + "type": { + "type_name": "varchar(20)" + }, + "constraints": [ + { + "expression": "[status] IN ('active', 'inactive', 'pending')" + } + ] + } + ] + }, + { + "name": "orders", + "fields": [ + { + "name": "order_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "order_date", + "type": { + "type_name": "datetime" + } + }, + { + "name": "delivery_date", + "type": { + "type_name": "datetime" + } + }, + { + "name": "total", + "type": { + "type_name": "decimal(10,2)" + } + } + ], + "constraints": [ + { + "expression": "[delivery_date] > [order_date]" + }, + { + "expression": "[total] >= 0" + } + ] + }, + { + "name": "employees", + "fields": [ + { + "name": "emp_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "age", + "type": { + "type_name": "int" + } + }, + { + "name": "salary", + "type": { + "type_name": "decimal(10,2)" + } + }, + { + "name": "email", + "type": { + "type_name": "varchar(100)" + } + } + ], + "constraints": [ + { + "expression": "[age] >= 18 AND [age] <= 65", + "name": "chk_age" + }, + { + "expression": "[salary] > 0", + "name": "chk_salary" + } + ] + }, + { + "name": "inventory", + "fields": [ + { + "name": "item_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "stock", + "type": { + "type_name": "int" + }, + "constraints": [ + { + "expression": "[stock] >= 0" + }, + { + "expression": "[stock] <= 10000" + } + ] + } + ] + }, + { + "name": "users", + "fields": [ + { + "name": "user_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "username", + "type": { + "type_name": "varchar(50)" + } + }, + { + "name": "role", + "type": { + "type_name": "varchar(20)" + }, + "constraints": [ + { + "expression": "[role] NOT IN ('banned', 'suspended')" + } + ] + } + ] + }, + { + "name": "accounts", + "fields": [ + { + "name": "account_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "balance", + "type": { + "type_name": "decimal(15,2)" + } + } + ], + "constraints": [ + { + "expression": "[balance] >= 0", + "name": "chk_balance_positive" + }, + { + "expression": "[balance] <= 1000000" + } + ] + }, + { + "name": "transactions", + "fields": [ + { + "name": "txn_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "amount", + "type": { + "type_name": "decimal(10,2)" + } + }, + { + "name": "fee", + "type": { + "type_name": "decimal(10,2)" + } + }, + { + "name": "type", + "type": { + "type_name": "varchar(20)" + } + } + ], + "constraints": [ + { + "expression": "[amount] + [fee] > 0" + }, + { + "expression": "[type] IN ('debit', 'credit')" + } + ] + }, + { + "name": "settings", + "fields": [ + { + "name": "setting_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "[value]", + "type": { + "type_name": "int" + } + } + ], + "constraints": [ + { + "expression": "[value] = 0 OR [value] = 1 OR [value] = -1" + } + ] + }, + { + "name": "contacts", + "fields": [ + { + "name": "contact_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "email", + "type": { + "type_name": "varchar(100)" + }, + "constraints": [ + { + "expression": "[email] LIKE '%@%.%'" + } + ] + }, + { + "name": "phone", + "type": { + "type_name": "varchar(20)" + }, + "constraints": [ + { + "expression": "[phone] LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'" + } + ] + } + ] + }, + { + "name": "ranges", + "fields": [ + { + "name": "range_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "min_val", + "type": { + "type_name": "int" + } + }, + { + "name": "max_val", + "type": { + "type_name": "int" + } + } + ], + "constraints": [ + { + "expression": "([min_val] >= 0) AND ([max_val] <= 100) AND ([min_val] < [max_val])" + } + ] + }, + { + "name": "shipments", + "fields": [ + { + "name": "shipment_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "priority", + "type": { + "type_name": "varchar(20)" + } + }, + { + "name": "carrier", + "type": { + "type_name": "varchar(50)" + } + } + ], + "constraints": [ + { + "expression": "[priority] IN ('low', 'medium', 'high', 'urgent')" + } + ] + }, + { + "name": "workflow", + "fields": [ + { + "name": "workflow_id", + "type": { + "type_name": "int" + }, + "pk": true + }, + { + "name": "status", + "type": { + "type_name": "varchar(20)" + } + }, + { + "name": "category", + "type": { + "type_name": "varchar(50)" + } + } + ], + "constraints": [ + { + "expression": "[status] IN ('draft', 'pending') AND [status] IN ('active', 'inactive')" + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/default_tables.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/default_tables.out.json index 91f33da05..5192fd83d 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/default_tables.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/default_tables.out.json @@ -4,79 +4,72 @@ "name": "products", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, - "pk": true, "dbdefault": { - "type": "number", - "value": "123" + "value": "123", + "type": "number" }, - "name": "id" + "pk": true }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schemaName": null + "type_name": "varchar(255)" }, "dbdefault": { - "type": "string", - "value": "Tea" - }, - "name": "name" + "value": "Tea", + "type": "string" + } }, { + "name": "merchant_id", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, - "not_null": true, - "name": "merchant_id" + "not_null": true }, { + "name": "price", "type": { - "type_name": "float", - "schemaName": null + "type_name": "float" }, "dbdefault": { - "type": "number", - "value": "123.12" - }, - "name": "price" + "value": "123.12", + "type": "number" + } }, { + "name": "status", "type": { - "type_name": "varchar(255)", - "schemaName": null + "type_name": "varchar(255)" }, "dbdefault": { - "type": "boolean", - "value": "NULL" - }, - "name": "status" + "value": "NULL", + "type": "boolean" + } }, { + "name": "created_at", "type": { - "type_name": "date", - "schemaName": null + "type_name": "date" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "created_at" + "value": "GETDATE()", + "type": "expression" + } }, { + "name": "expiration", "type": { - "type_name": "date", - "schemaName": null + "type_name": "date" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "expiration" + "value": "GETDATE()", + "type": "expression" + } } ] } diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/enum_tables.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/enum_tables.out.json index 3e9ac35a0..f3fa489f3 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/enum_tables.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/enum_tables.out.json @@ -4,19 +4,23 @@ "name": "jobs", "fields": [ { + "name": "id", "type": { - "type_name": "integer", - "schemaName": null + "type_name": "integer" }, - "pk": true, - "name": "id" + "pk": true }, { + "name": "status", "type": { - "type_name": "jobs_status_enum" + "type_name": "nvarchar(255)" }, "not_null": true, - "name": "status" + "constraints": [ + { + "expression": "[status] IN ('created', 'running', 'done', 'failed', 'wait for validation')" + } + ] } ] }, @@ -24,85 +28,41 @@ "name": "orders", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, - "pk": true, - "name": "id" + "pk": true }, { + "name": "created_at", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "created_at" + "type_name": "varchar(255)" + } }, { + "name": "priority", "type": { - "type_name": "orders_priority_enum", - "schemaName": null + "type_name": "nvarchar(255)" }, "not_null": true, - "name": "priority" + "constraints": [ + { + "expression": "[priority] IN ('low', 'medium', 'high')" + } + ] }, { + "name": "status", "type": { - "type_name": "orders_status_enum", - "schemaName": null + "type_name": "nvarchar(255)" }, "not_null": true, - "name": "status" - } - ] - } - ], - "enums": [ - { - "name": "jobs_status_enum", - "values": [ - { - "name": "created" - }, - { - "name": "running" - }, - { - "name": "done" - }, - { - "name": "failed" - }, - { - "name": "wait for validation" - } - ] - }, - { - "name": "orders_priority_enum", - "values": [ - { - "name": "low" - }, - { - "name": "medium" - }, - { - "name": "high" - } - ] - }, - { - "name": "orders_status_enum", - "values": [ - { - "name": "pending" - }, - { - "name": "processing" - }, - { - "name": "done" + "constraints": [ + { + "expression": "[status] IN ('pending', 'processing', 'done')" + } + ] } ] } diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/general_schema.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/general_schema.out.json index 21b89bcf9..81fe29328 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/general_schema.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/general_schema.out.json @@ -4,37 +4,38 @@ "name": "orders", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schema": null + "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "user_id", "type": { - "type_name": "int", - "schema": null + "type_name": "int" }, - "unique": true, "not_null": true, - "name": "user_id" + "unique": true }, { + "name": "status", "type": { - "type_name": "orders_status_enum", - "schema": null + "type_name": "nvarchar(255)" }, "not_null": true, - "name": "status" + "constraints": [ + { + "expression": "[status] IN ('created', 'running', 'done', 'failure')" + } + ] }, { + "name": "created_at", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "created_at" + "type_name": "varchar(255)" + } } ] }, @@ -42,29 +43,26 @@ "name": "order_items", "fields": [ { + "name": "order_id", "type": { - "type_name": "int", - "schema": null - }, - "name": "order_id" + "type_name": "int" + } }, { + "name": "product_id", "type": { - "type_name": "int", - "schema": null - }, - "name": "product_id" + "type_name": "int" + } }, { + "name": "quantity", "type": { - "type_name": "int", - "schema": null + "type_name": "int" }, "dbdefault": { - "type": "number", - "value": "1" - }, - "name": "quantity" + "value": "1", + "type": "number" + } } ] }, @@ -72,53 +70,47 @@ "name": "products", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schema": null + "type_name": "int" }, - "pk": true, - "name": "id" + "pk": true }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "name" + "type_name": "varchar(255)" + } }, { + "name": "merchant_id", "type": { - "type_name": "int", - "schema": null + "type_name": "int" }, - "not_null": true, - "name": "merchant_id" + "not_null": true }, { + "name": "price", "type": { - "type_name": "int", - "schema": null - }, - "name": "price" + "type_name": "int" + } }, { + "name": "status", "type": { - "type_name": "products_status_enum", - "schema": null + "type_name": "nvarchar(255)" }, - "not_null": true, - "name": "status" + "not_null": true }, { + "name": "created_at", "type": { - "type_name": "datetime", - "schema": null + "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "created_at" + "value": "GETDATE()", + "type": "expression" + } } ], "indexes": [ @@ -146,61 +138,59 @@ } ] } + ], + "constraints": [ + { + "expression": "[status] IN ('Out of Stock', 'In Stock')" + } ] }, { "name": "users", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schema": null + "type_name": "int" }, - "pk": true, - "name": "id" + "pk": true }, { + "name": "full_name", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "full_name" + "type_name": "varchar(255)" + } }, { + "name": "email", "type": { - "type_name": "varchar(255)", - "schema": null + "type_name": "varchar(255)" }, - "unique": true, - "name": "email" + "unique": true }, { + "name": "gender", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "gender" + "type_name": "varchar(255)" + } }, { + "name": "date_of_birth", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "date_of_birth" + "type_name": "varchar(255)" + } }, { + "name": "created_at", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "created_at" + "type_name": "varchar(255)" + } }, { + "name": "country_code", "type": { - "type_name": "int", - "schema": null - }, - "name": "country_code" + "type_name": "int" + } } ] }, @@ -208,39 +198,34 @@ "name": "merchants", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schema": null - }, - "name": "id" + "type_name": "int" + } }, { + "name": "merchant_name", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "merchant_name" + "type_name": "varchar(255)" + } }, { + "name": "country_code", "type": { - "type_name": "int", - "schema": null - }, - "name": "country_code" + "type_name": "int" + } }, { + "name": "created_at", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "created_at" + "type_name": "varchar(255)" + } }, { + "name": "admin_id", "type": { - "type_name": "int", - "schema": null - }, - "name": "admin_id" + "type_name": "int" + } } ], "indexes": [ @@ -259,26 +244,23 @@ "name": "countries", "fields": [ { + "name": "code", "type": { - "type_name": "int", - "schema": null + "type_name": "int" }, - "pk": true, - "name": "code" + "pk": true }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "name" + "type_name": "varchar(255)" + } }, { + "name": "continent_name", "type": { - "type_name": "varchar(255)", - "schema": null - }, - "name": "continent_name" + "type_name": "varchar(255)" + } } ] } @@ -287,140 +269,110 @@ { "endpoints": [ { + "tableName": "order_items", "fieldNames": [ "order_id" ], - "relation": "*", - "tableName": "order_items" + "relation": "*" }, { + "tableName": "orders", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "orders" + "relation": "1" } ] }, { "endpoints": [ { + "tableName": "order_items", "fieldNames": [ "product_id" ], - "relation": "*", - "tableName": "order_items" + "relation": "*" }, { + "tableName": "products", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "products" + "relation": "1" } ] }, { "endpoints": [ { + "tableName": "users", "fieldNames": [ "country_code" ], - "relation": "*", - "tableName": "users" + "relation": "*" }, { + "tableName": "countries", "fieldNames": [ "code" ], - "relation": "1", - "tableName": "countries" + "relation": "1" } ] }, { "endpoints": [ { + "tableName": "merchants", "fieldNames": [ "country_code" ], - "relation": "*", - "tableName": "merchants" + "relation": "*" }, { + "tableName": "countries", "fieldNames": [ "code" ], - "relation": "1", - "tableName": "countries" + "relation": "1" } ] }, { "endpoints": [ { + "tableName": "products", "fieldNames": [ "merchant_id" ], - "relation": "*", - "tableName": "products" + "relation": "*" }, { + "tableName": "merchants", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "merchants" + "relation": "1" } ] }, { "endpoints": [ { + "tableName": "merchants", "fieldNames": [ "admin_id" ], - "relation": "*", - "tableName": "merchants" + "relation": "*" }, { + "tableName": "users", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "users" - } - ] - } - ], - "enums": [ - { - "name": "orders_status_enum", - "values": [ - { - "name": "created" - }, - { - "name": "running" - }, - { - "name": "done" - }, - { - "name": "failure" - } - ] - }, - { - "name": "products_status_enum", - "values": [ - { - "name": "Out of Stock" - }, - { - "name": "In Stock" + "relation": "1" } ] } ] -} +} \ No newline at end of file diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/index_tables.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/index_tables.out.json index 99d6eb2e1..70c7ce7c2 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/index_tables.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/index_tables.out.json @@ -4,53 +4,53 @@ "name": "users", "fields": [ { + "name": "id", "type": { "type_name": "int" - }, - "name": "id" + } }, { + "name": "full_name", "type": { "type_name": "nvarchar(255)" - }, - "name": "full_name" + } }, { + "name": "email", "type": { "type_name": "nvarchar(255)" }, - "unique": true, - "name": "email" + "unique": true }, { + "name": "gender", "type": { "type_name": "nvarchar(255)" - }, - "name": "gender" + } }, { + "name": "date_of_birth", "type": { "type_name": "nvarchar(255)" - }, - "name": "date_of_birth" + } }, { + "name": "created_at", "type": { "type_name": "nvarchar(255)" - }, - "name": "created_at" + } }, { + "name": "country_code", "type": { "type_name": "int" - }, - "name": "country_code" + } }, { + "name": "active", "type": { "type_name": "boolean" - }, - "name": "active" + } } ], "indexes": [ @@ -104,4 +104,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/inline_referential_actions.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/inline_referential_actions.out.json index 70c54155a..8fcb15057 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/inline_referential_actions.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/inline_referential_actions.out.json @@ -4,54 +4,48 @@ "name": "users", "fields": [ { + "name": "user_id", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, - "pk": true, "increment": true, - "name": "user_id" + "pk": true }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "name" + "type_name": "varchar(255)" + } }, { + "name": "email", "type": { - "type_name": "varchar(255)", - "schemaName": null + "type_name": "varchar(255)" }, - "unique": true, - "name": "email" + "unique": true }, { + "name": "date_of_birth", "type": { - "type_name": "datetime", - "schemaName": null - }, - "name": "date_of_birth" + "type_name": "datetime" + } }, { + "name": "created_at", "type": { - "type_name": "datetime", - "schemaName": null + "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "created_at" + "value": "GETDATE()", + "type": "expression" + } }, { + "name": "country_code", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, - "not_null": true, - "name": "country_code" + "not_null": true } ] }, @@ -59,29 +53,26 @@ "name": "orders", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "user_id", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, - "unique": true, "not_null": true, - "name": "user_id" + "unique": true }, { + "name": "created_at", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "created_at" + "type_name": "varchar(255)" + } } ] }, @@ -89,36 +80,32 @@ "name": "products", "fields": [ { + "name": "id", "type": { - "type_name": "int", - "schemaName": null - }, - "name": "id" + "type_name": "int" + } }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "name" + "type_name": "varchar(255)" + } }, { + "name": "price", "type": { - "type_name": "decimal(10,4)", - "schemaName": null - }, - "name": "price" + "type_name": "decimal(10,4)" + } }, { + "name": "created_at", "type": { - "type_name": "datetime", - "schemaName": null + "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "created_at" + "value": "GETDATE()", + "type": "expression" + } } ], "indexes": [ @@ -137,43 +124,38 @@ "name": "order_items", "fields": [ { + "name": "order_id", "type": { - "type_name": "int", - "schemaName": null - }, - "name": "order_id" + "type_name": "int" + } }, { + "name": "product_id", "type": { - "type_name": "int", - "schemaName": null - }, - "name": "product_id" + "type_name": "int" + } }, { + "name": "product_name", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "product_name" + "type_name": "varchar(255)" + } }, { + "name": "quantity", "type": { - "type_name": "int", - "schemaName": null + "type_name": "int" }, "dbdefault": { - "type": "number", - "value": "1" - }, - "name": "quantity" + "value": "1", + "type": "number" + } } ] } ], "refs": [ { - "onDelete": "NO ACTION", "endpoints": [ { "tableName": "orders", @@ -189,10 +171,10 @@ ], "relation": "1" } - ] + ], + "onDelete": "NO ACTION" }, { - "onDelete": "CASCADE", "endpoints": [ { "tableName": "order_items", @@ -208,10 +190,10 @@ ], "relation": "1" } - ] + ], + "onDelete": "CASCADE" }, { - "onDelete": "SET NULL", "endpoints": [ { "tableName": "order_items", @@ -227,7 +209,8 @@ ], "relation": "1" } - ] + ], + "onDelete": "SET NULL" } ] } \ No newline at end of file diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/insert.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/insert.out.json index c13405592..6a66703cb 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/insert.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/insert.out.json @@ -1,4 +1,24 @@ { + "tables": [ + { + "name": "T1", + "schemaName": "dbo", + "fields": [ + { + "name": "column_1", + "type": { + "type_name": "int IDENTITY" + } + }, + { + "name": "column_2", + "type": { + "type_name": "VARCHAR(30)" + } + } + ] + } + ], "records": [ { "tableName": "UnitMeasure", @@ -145,7 +165,6 @@ { "tableName": "UnitMeasure", "schemaName": "Production", - "columns": [], "values": [ [ { @@ -211,27 +230,5 @@ ] ] } - ], - "tables": [ - { - "fields": [ - { - "name": "column_1", - "type": { - "type_name": "int IDENTITY", - "schemaName": null - } - }, - { - "name": "column_2", - "type": { - "type_name": "VARCHAR(30)", - "schemaName": null - } - } - ], - "name": "T1", - "schemaName": "dbo" - } ] } \ No newline at end of file diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/referential_actions.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/referential_actions.out.json index e8a98ec30..68c51ea64 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/referential_actions.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/referential_actions.out.json @@ -4,32 +4,32 @@ "name": "orders", "fields": [ { + "name": "id", "type": { "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "user_id", "type": { "type_name": "int" }, - "unique": true, "not_null": true, - "name": "user_id" + "unique": true }, { + "name": "status", "type": { "type_name": "orders_status_enum" - }, - "name": "status" + } }, { + "name": "created_at", "type": { "type_name": "varchar(255)" - }, - "name": "created_at" + } } ] }, @@ -37,32 +37,32 @@ "name": "order_items", "fields": [ { + "name": "order_id", "type": { "type_name": "int" - }, - "name": "order_id" + } }, { + "name": "product_id", "type": { "type_name": "int" - }, - "name": "product_id" + } }, { + "name": "product_name", "type": { "type_name": "varchar(255)" - }, - "name": "product_name" + } }, { + "name": "quantity", "type": { "type_name": "int" }, "dbdefault": { - "type": "number", - "value": "1" - }, - "name": "quantity" + "value": "1", + "type": "number" + } } ] }, @@ -70,32 +70,32 @@ "name": "products", "fields": [ { + "name": "id", "type": { "type_name": "int" - }, - "name": "id" + } }, { + "name": "name", "type": { "type_name": "varchar(255)" - }, - "name": "name" + } }, { + "name": "price", "type": { "type_name": "decimal(10,4)" - }, - "name": "price" + } }, { + "name": "created_at", "type": { "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "now()" - }, - "name": "created_at" + "value": "now()", + "type": "expression" + } } ], "indexes": [ @@ -118,48 +118,48 @@ "name": "users", "fields": [ { + "name": "id", "type": { "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "name", "type": { "type_name": "varchar(255)" - }, - "name": "name" + } }, { + "name": "email", "type": { "type_name": "varchar(255)" }, - "unique": true, - "name": "email" + "unique": true }, { + "name": "date_of_birth", "type": { "type_name": "datetime" - }, - "name": "date_of_birth" + } }, { + "name": "created_at", "type": { "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "now()" - }, - "name": "created_at" + "value": "now()", + "type": "expression" + } }, { + "name": "country_code", "type": { "type_name": "int" }, - "not_null": true, - "name": "country_code" + "not_null": true } ] }, @@ -167,23 +167,23 @@ "name": "countries", "fields": [ { + "name": "code", "type": { "type_name": "int" }, - "pk": true, - "name": "code" + "pk": true }, { + "name": "name", "type": { "type_name": "varchar(255)" - }, - "name": "name" + } }, { + "name": "continent_name", "type": { "type_name": "varchar(255)" - }, - "name": "continent_name" + } } ] } @@ -192,18 +192,18 @@ { "endpoints": [ { + "tableName": "orders", "fieldNames": [ "user_id" ], - "relation": "*", - "tableName": "orders" + "relation": "*" }, { + "tableName": "users", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "users" + "relation": "1" } ], "onDelete": "NO ACTION" @@ -211,18 +211,18 @@ { "endpoints": [ { + "tableName": "order_items", "fieldNames": [ "order_id" ], - "relation": "*", - "tableName": "order_items" + "relation": "*" }, { + "tableName": "orders", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "orders" + "relation": "1" } ], "onDelete": "CASCADE" @@ -230,20 +230,20 @@ { "endpoints": [ { + "tableName": "order_items", "fieldNames": [ "product_id", "product_name" ], - "relation": "*", - "tableName": "order_items" + "relation": "*" }, { + "tableName": "products", "fieldNames": [ "id", "name" ], - "relation": "1", - "tableName": "products" + "relation": "1" } ], "onDelete": "SET NULL" @@ -251,21 +251,21 @@ { "endpoints": [ { + "tableName": "users", "fieldNames": [ "country_code" ], - "relation": "*", - "tableName": "users" + "relation": "*" }, { + "tableName": "countries", "fieldNames": [ "code" ], - "relation": "1", - "tableName": "countries" + "relation": "1" } ], "onDelete": "NO ACTION" } ] -} +} \ No newline at end of file diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/table_constraints_indexes.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/table_constraints_indexes.out.json index 29955a26f..695898895 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/table_constraints_indexes.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/table_constraints_indexes.out.json @@ -4,36 +4,34 @@ "name": "products", "fields": [ { + "name": "id", "type": { "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "name" + "type_name": "varchar(255)" + } }, { + "name": "price", "type": { - "type_name": "decimal(10,4)", - "schemaName": null - }, - "name": "price" + "type_name": "decimal(10,4)" + } }, { + "name": "created_at", "type": { "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "created_at" + "value": "GETDATE()", + "type": "expression" + } } ] }, @@ -41,25 +39,23 @@ "name": "countries", "fields": [ { + "name": "country_code", "type": { "type_name": "int" }, - "pk": true, - "name": "country_code" + "pk": true }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "name" + "type_name": "varchar(255)" + } }, { + "name": "continent_name", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "continent_name" + "type_name": "varchar(255)" + } } ], "indexes": [ @@ -79,49 +75,47 @@ "name": "users", "fields": [ { + "name": "id", "type": { "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "name", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "name" + "type_name": "varchar(255)" + } }, { + "name": "email", "type": { - "type_name": "varchar(255)", - "schemaName": null - }, - "name": "email" + "type_name": "varchar(255)" + } }, { + "name": "date_of_birth", "type": { "type_name": "datetime" - }, - "name": "date_of_birth" + } }, { + "name": "created_at", "type": { "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "created_at" + "value": "GETDATE()", + "type": "expression" + } }, { + "name": "country_code", "type": { "type_name": "int" }, - "not_null": true, - "name": "country_code" + "not_null": true } ], "indexes": [ @@ -145,29 +139,29 @@ "name": "orders", "fields": [ { + "name": "id", "type": { "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "user_id", "type": { "type_name": "int" }, - "not_null": true, - "name": "user_id" + "not_null": true }, { + "name": "created_at", "type": { "type_name": "datetime" }, "dbdefault": { - "type": "expression", - "value": "GETDATE()" - }, - "name": "created_at" + "value": "GETDATE()", + "type": "expression" + } } ] }, @@ -175,39 +169,39 @@ "name": "order_items", "fields": [ { + "name": "id", "type": { "type_name": "int" }, - "pk": true, "increment": true, - "name": "id" + "pk": true }, { + "name": "order_id", "type": { "type_name": "int" }, - "not_null": true, - "name": "order_id" + "not_null": true }, { + "name": "product_id", "type": { "type_name": "int" }, "dbdefault": { - "type": "boolean", - "value": "null" - }, - "name": "product_id" + "value": "null", + "type": "boolean" + } }, { + "name": "quantity", "type": { "type_name": "int" }, "dbdefault": { - "type": "number", - "value": "1" - }, - "name": "quantity" + "value": "1", + "type": "number" + } } ] } @@ -216,18 +210,18 @@ { "endpoints": [ { + "tableName": "users", "fieldNames": [ "country_code" ], - "relation": "*", - "tableName": "users" + "relation": "*" }, { + "tableName": "countries", "fieldNames": [ "country_code" ], - "relation": "1", - "tableName": "countries" + "relation": "1" } ], "onDelete": "NO ACTION", @@ -236,38 +230,38 @@ { "endpoints": [ { + "tableName": "orders", "fieldNames": [ "user_id" ], - "relation": "*", - "tableName": "orders" + "relation": "*" }, { + "tableName": "users", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "users" + "relation": "1" } ], - "onUpdate": "NO ACTION", - "onDelete": "SET NULL" + "onDelete": "SET NULL", + "onUpdate": "NO ACTION" }, { "endpoints": [ { + "tableName": "order_items", "fieldNames": [ "order_id" ], - "relation": "*", - "tableName": "order_items" + "relation": "*" }, { + "tableName": "orders", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "orders" + "relation": "1" } ], "onDelete": "CASCADE", @@ -276,18 +270,18 @@ { "endpoints": [ { + "tableName": "order_items", "fieldNames": [ "product_id" ], - "relation": "*", - "tableName": "order_items" + "relation": "*" }, { + "tableName": "products", "fieldNames": [ "id" ], - "relation": "1", - "tableName": "products" + "relation": "1" } ], "onDelete": "SET NULL" diff --git a/packages/dbml-core/__tests__/parser/mssql-parse/output/wrapped_type.out.json b/packages/dbml-core/__tests__/parser/mssql-parse/output/wrapped_type.out.json index 4460d345f..d16ab26da 100644 --- a/packages/dbml-core/__tests__/parser/mssql-parse/output/wrapped_type.out.json +++ b/packages/dbml-core/__tests__/parser/mssql-parse/output/wrapped_type.out.json @@ -4,33 +4,30 @@ "name": "products", "fields": [ { + "name": "name", "type": { - "type_name": "varchar(MAX)", - "schemaName": null + "type_name": "varchar(MAX)" }, "dbdefault": { - "type": "string", - "value": "Tea" - }, - "name": "name" + "value": "Tea", + "type": "string" + } }, { + "name": "status", "type": { - "type_name": "varchar(255)", - "schemaName": null + "type_name": "varchar(255)" }, "dbdefault": { - "type": "boolean", - "value": "NULL" - }, - "name": "status" + "value": "NULL", + "type": "boolean" + } }, { + "name": "price", "type": { - "type_name": "double precision", - "schemaName": null - }, - "name": "price" + "type_name": "double precision" + } } ] } diff --git a/packages/dbml-core/__tests__/parser/mysql-parse/input/alter_table_check_constraints.in.sql b/packages/dbml-core/__tests__/parser/mysql-parse/input/alter_table_check_constraints.in.sql new file mode 100644 index 000000000..0c70f11b1 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/mysql-parse/input/alter_table_check_constraints.in.sql @@ -0,0 +1,22 @@ +-- Test ALTER TABLE ADD CHECK constraints for MySQL + +CREATE TABLE products ( + id INT PRIMARY KEY, + price DECIMAL(10,4) +); + +-- Add unnamed CHECK constraint +ALTER TABLE products ADD CHECK (price > 0); + +-- Add named CHECK constraint +ALTER TABLE products ADD CONSTRAINT chk_price_upper CHECK (price <= 1000000); + +CREATE TABLE employees ( + emp_id INT PRIMARY KEY, + age INT, + salary DECIMAL(10,2) +); + +-- Add multiple CHECK constraints +ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65); +ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary > 0); diff --git a/packages/dbml-core/__tests__/parser/mysql-parse/input/check_constraints.in.sql b/packages/dbml-core/__tests__/parser/mysql-parse/input/check_constraints.in.sql new file mode 100644 index 000000000..eda677401 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/mysql-parse/input/check_constraints.in.sql @@ -0,0 +1,102 @@ +-- Column-level CHECK constraints +CREATE TABLE `products` ( + `id` int PRIMARY KEY, + `price` decimal(10,4) CHECK (`price` > 0), + `quantity` int CHECK (`quantity` >= 0), + `discount` decimal(5,2) CHECK (`discount` >= 0 AND `discount` <= 100), + `status` varchar(20) CHECK (`status` IN ('active', 'inactive', 'pending')) +); + +-- Table-level CHECK constraints +CREATE TABLE `orders` ( + `order_id` int PRIMARY KEY, + `order_date` datetime, + `delivery_date` datetime, + `total` decimal(10,2), + CHECK (`delivery_date` > `order_date`), + CHECK (`total` >= 0) +); + +-- Named CHECK constraints +CREATE TABLE `employees` ( + `emp_id` int PRIMARY KEY, + `age` int, + `salary` decimal(10,2), + `email` varchar(100), + CONSTRAINT chk_age CHECK (`age` >= 18 AND `age` <= 65), + CONSTRAINT chk_salary CHECK (`salary` > 0) +); + +-- Multiple CHECK constraints on same column +CREATE TABLE `inventory` ( + `item_id` int PRIMARY KEY, + `stock` int CHECK (`stock` >= 0) CHECK (`stock` <= 10000) +); + +-- CHECK with NOT IN (should be constraint, not enum) +CREATE TABLE `users` ( + `user_id` int PRIMARY KEY, + `username` varchar(50), + `role` varchar(20) CHECK (`role` NOT IN ('banned', 'suspended')) +); + +-- ALTER TABLE ADD CONSTRAINT CHECK +CREATE TABLE `accounts` ( + `account_id` int PRIMARY KEY, + `balance` decimal(15,2) +); + +ALTER TABLE `accounts` + ADD CONSTRAINT chk_balance_positive + CHECK (`balance` >= 0); + +ALTER TABLE `accounts` + ADD CHECK (`balance` <= 1000000); + +-- CHECK with complex expressions +CREATE TABLE `transactions` ( + `txn_id` int PRIMARY KEY, + `amount` decimal(10,2), + `fee` decimal(10,2), + `type` varchar(20), + CHECK (`amount` + `fee` > 0), + CHECK (`type` IN ('debit', 'credit')) +); + +-- CHECK with OR operator +CREATE TABLE `settings` ( + `setting_id` int PRIMARY KEY, + `value` int, + CHECK (`value` = 0 OR `value` = 1 OR `value` = -1) +); + +-- CHECK with LIKE operator +CREATE TABLE `contacts` ( + `contact_id` int PRIMARY KEY, + `email` varchar(100) CHECK (`email` LIKE '%@%.%'), + `phone` varchar(20) CHECK (`phone` REGEXP '^[0-9]{3}-[0-9]{3}-[0-9]{4}$') +); + +-- CHECK with nested parentheses +CREATE TABLE `ranges` ( + `range_id` int PRIMARY KEY, + `min_val` int, + `max_val` int, + CHECK ((`min_val` >= 0) AND (`max_val` <= 100) AND (`min_val` < `max_val`)) +); + +-- Table-level CHECK with single column IN +CREATE TABLE `shipments` ( + `shipment_id` int PRIMARY KEY, + `priority` varchar(20), + `carrier` varchar(50), + CHECK (`priority` IN ('low', 'medium', 'high', 'urgent')) +); + +-- Table-level CHECK with same column in multiple IN clauses +CREATE TABLE `workflow` ( + `workflow_id` int PRIMARY KEY, + `status` varchar(20), + `category` varchar(50), + CHECK (`status` IN ('draft', 'pending') AND `status` IN ('active', 'inactive')) +); diff --git a/packages/dbml-core/__tests__/parser/mysql-parse/output/alter_table_check_constraints.out.json b/packages/dbml-core/__tests__/parser/mysql-parse/output/alter_table_check_constraints.out.json new file mode 100644 index 000000000..2ab3f0a92 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/mysql-parse/output/alter_table_check_constraints.out.json @@ -0,0 +1,84 @@ +{ + "schemas": [], + "tables": [ + { + "name": "products", + "fields": [ + { + "name": "id", + "type": { + "type_name": "INT", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "price", + "type": { + "type_name": "DECIMAL(10,4)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "price > 0" + }, + { + "expression": "price <= 1000000", + "name": "chk_price_upper" + } + ] + }, + { + "name": "employees", + "fields": [ + { + "name": "emp_id", + "type": { + "type_name": "INT", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "age", + "type": { + "type_name": "INT", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "salary", + "type": { + "type_name": "DECIMAL(10,2)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "age >= 18 AND age <= 65", + "name": "chk_age" + }, + { + "expression": "salary > 0", + "name": "chk_salary" + } + ] + } + ], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "records": [] +} diff --git a/packages/dbml-core/__tests__/parser/mysql-parse/output/check_constraints.out.json b/packages/dbml-core/__tests__/parser/mysql-parse/output/check_constraints.out.json new file mode 100644 index 000000000..2be2801c5 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/mysql-parse/output/check_constraints.out.json @@ -0,0 +1,493 @@ +{ + "schemas": [], + "tables": [ + { + "name": "products", + "fields": [ + { + "name": "id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "price", + "type": { + "type_name": "decimal(10,4)", + "schemaName": null + }, + "constraints": [ + { + "expression": "`price` > 0" + } + ] + }, + { + "name": "quantity", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [ + { + "expression": "`quantity` >= 0" + } + ] + }, + { + "name": "discount", + "type": { + "type_name": "decimal(5,2)", + "schemaName": null + }, + "constraints": [ + { + "expression": "`discount` >= 0 AND `discount` <= 100" + } + ] + }, + { + "name": "status", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [ + { + "expression": "`status` IN ('active', 'inactive', 'pending')" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "orders", + "fields": [ + { + "name": "order_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "order_date", + "type": { + "type_name": "datetime", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "delivery_date", + "type": { + "type_name": "datetime", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "total", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "`delivery_date` > `order_date`" + }, + { + "expression": "`total` >= 0" + } + ] + }, + { + "name": "employees", + "fields": [ + { + "name": "emp_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "age", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "salary", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "email", + "type": { + "type_name": "varchar(100)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "`age` >= 18 AND `age` <= 65", + "name": "chk_age" + }, + { + "expression": "`salary` > 0", + "name": "chk_salary" + } + ] + }, + { + "name": "inventory", + "fields": [ + { + "name": "item_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "stock", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [ + { + "expression": "`stock` >= 0" + }, + { + "expression": "`stock` <= 10000" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "users", + "fields": [ + { + "name": "user_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "username", + "type": { + "type_name": "varchar(50)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "role", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [ + { + "expression": "`role` NOT IN ('banned', 'suspended')" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "accounts", + "fields": [ + { + "name": "account_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "balance", + "type": { + "type_name": "decimal(15,2)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "`balance` >= 0", + "name": "chk_balance_positive" + }, + { + "expression": "`balance` <= 1000000" + } + ] + }, + { + "name": "transactions", + "fields": [ + { + "name": "txn_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "amount", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "fee", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "type", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "`amount` + `fee` > 0" + }, + { + "expression": "`type` IN ('debit', 'credit')" + } + ] + }, + { + "name": "settings", + "fields": [ + { + "name": "setting_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "value", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "`value` = 0 OR `value` = 1 OR `value` = -1" + } + ] + }, + { + "name": "contacts", + "fields": [ + { + "name": "contact_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "email", + "type": { + "type_name": "varchar(100)", + "schemaName": null + }, + "constraints": [ + { + "expression": "`email` LIKE '%@%.%'" + } + ] + }, + { + "name": "phone", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [ + { + "expression": "`phone` REGEXP '^[0-9]{3}-[0-9]{3}-[0-9]{4}$'" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "ranges", + "fields": [ + { + "name": "range_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "min_val", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "max_val", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "(`min_val` >= 0) AND (`max_val` <= 100) AND (`min_val` < `max_val`)" + } + ] + }, + { + "name": "shipments", + "fields": [ + { + "name": "shipment_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "priority", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "carrier", + "type": { + "type_name": "varchar(50)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "`priority` IN ('low', 'medium', 'high', 'urgent')" + } + ] + }, + { + "name": "workflow", + "fields": [ + { + "name": "workflow_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "status", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "category", + "type": { + "type_name": "varchar(50)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "`status` IN ('draft', 'pending') AND `status` IN ('active', 'inactive')" + } + ] + } + ], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "records": [] +} diff --git a/packages/dbml-core/__tests__/parser/postgres-parse/input/alter_table_check_constraints.in.sql b/packages/dbml-core/__tests__/parser/postgres-parse/input/alter_table_check_constraints.in.sql new file mode 100644 index 000000000..01e22f549 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/postgres-parse/input/alter_table_check_constraints.in.sql @@ -0,0 +1,22 @@ +-- Test ALTER TABLE ADD CHECK constraints for PostgreSQL + +CREATE TABLE products ( + id INT PRIMARY KEY, + price DECIMAL(10,4) +); + +-- Add unnamed CHECK constraint +ALTER TABLE products ADD CHECK (price > 0); + +-- Add named CHECK constraint +ALTER TABLE products ADD CONSTRAINT chk_price_upper CHECK (price <= 1000000); + +CREATE TABLE employees ( + emp_id INT PRIMARY KEY, + age INT, + salary DECIMAL(10,2) +); + +-- Add multiple CHECK constraints +ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65); +ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary > 0); diff --git a/packages/dbml-core/__tests__/parser/postgres-parse/input/check_constraints.in.sql b/packages/dbml-core/__tests__/parser/postgres-parse/input/check_constraints.in.sql new file mode 100644 index 000000000..7e62836b3 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/postgres-parse/input/check_constraints.in.sql @@ -0,0 +1,102 @@ +-- Column-level CHECK constraints +CREATE TABLE products ( + id int PRIMARY KEY, + price decimal(10,4) CHECK (price > 0), + quantity int CHECK (quantity >= 0), + discount decimal(5,2) CHECK (discount >= 0 AND discount <= 100), + status varchar(20) CHECK (status IN ('active', 'inactive', 'pending')) +); + +-- Table-level CHECK constraints +CREATE TABLE orders ( + order_id int PRIMARY KEY, + order_date timestamp, + delivery_date timestamp, + total decimal(10,2), + CHECK (delivery_date > order_date), + CHECK (total >= 0) +); + +-- Named CHECK constraints +CREATE TABLE employees ( + emp_id int PRIMARY KEY, + age int, + salary decimal(10,2), + email varchar(100), + CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65), + CONSTRAINT chk_salary CHECK (salary > 0) +); + +-- Multiple CHECK constraints on same column +CREATE TABLE inventory ( + item_id int PRIMARY KEY, + stock int CHECK (stock >= 0) CHECK (stock <= 10000) +); + +-- CHECK with NOT IN (should be constraint, not enum) +CREATE TABLE users ( + user_id int PRIMARY KEY, + username varchar(50), + role varchar(20) CHECK (role NOT IN ('banned', 'suspended')) +); + +-- ALTER TABLE ADD CONSTRAINT CHECK +CREATE TABLE accounts ( + account_id int PRIMARY KEY, + balance decimal(15,2) +); + +ALTER TABLE accounts + ADD CONSTRAINT chk_balance_positive + CHECK (balance >= 0); + +ALTER TABLE accounts + ADD CHECK (balance <= 1000000); + +-- CHECK with complex expressions +CREATE TABLE transactions ( + txn_id int PRIMARY KEY, + amount decimal(10,2), + fee decimal(10,2), + type varchar(20), + CHECK (amount + fee > 0), + CHECK (type IN ('debit', 'credit')) +); + +-- CHECK with OR operator +CREATE TABLE settings ( + setting_id int PRIMARY KEY, + value int, + CHECK (value = 0 OR value = 1 OR value = -1) +); + +-- CHECK with LIKE operator +CREATE TABLE contacts ( + contact_id int PRIMARY KEY, + email varchar(100) CHECK (email LIKE '%@%.%'), + phone varchar(20) CHECK (phone ~ '^[0-9]{3}-[0-9]{3}-[0-9]{4}$') +); + +-- CHECK with nested parentheses +CREATE TABLE ranges ( + range_id int PRIMARY KEY, + min_val int, + max_val int, + CHECK ((min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)) +); + +-- Table-level CHECK with single column IN +CREATE TABLE shipments ( + shipment_id int PRIMARY KEY, + priority varchar(20), + carrier varchar(50), + CHECK (priority IN ('low', 'medium', 'high', 'urgent')) +); + +-- Table-level CHECK with same column in multiple IN clauses +CREATE TABLE workflow ( + workflow_id int PRIMARY KEY, + status varchar(20), + category varchar(50), + CHECK (status IN ('draft', 'pending') AND status IN ('active', 'inactive')) +); diff --git a/packages/dbml-core/__tests__/parser/postgres-parse/output/alter_table_check_constraints.out.json b/packages/dbml-core/__tests__/parser/postgres-parse/output/alter_table_check_constraints.out.json new file mode 100644 index 000000000..2ab3f0a92 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/postgres-parse/output/alter_table_check_constraints.out.json @@ -0,0 +1,84 @@ +{ + "schemas": [], + "tables": [ + { + "name": "products", + "fields": [ + { + "name": "id", + "type": { + "type_name": "INT", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "price", + "type": { + "type_name": "DECIMAL(10,4)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "price > 0" + }, + { + "expression": "price <= 1000000", + "name": "chk_price_upper" + } + ] + }, + { + "name": "employees", + "fields": [ + { + "name": "emp_id", + "type": { + "type_name": "INT", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "age", + "type": { + "type_name": "INT", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "salary", + "type": { + "type_name": "DECIMAL(10,2)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "age >= 18 AND age <= 65", + "name": "chk_age" + }, + { + "expression": "salary > 0", + "name": "chk_salary" + } + ] + } + ], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "records": [] +} diff --git a/packages/dbml-core/__tests__/parser/postgres-parse/output/check_constraints.out.json b/packages/dbml-core/__tests__/parser/postgres-parse/output/check_constraints.out.json new file mode 100644 index 000000000..3e63b7f14 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/postgres-parse/output/check_constraints.out.json @@ -0,0 +1,493 @@ +{ + "schemas": [], + "tables": [ + { + "name": "products", + "fields": [ + { + "name": "id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "price", + "type": { + "type_name": "decimal(10,4)", + "schemaName": null + }, + "constraints": [ + { + "expression": "price > 0" + } + ] + }, + { + "name": "quantity", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [ + { + "expression": "quantity >= 0" + } + ] + }, + { + "name": "discount", + "type": { + "type_name": "decimal(5,2)", + "schemaName": null + }, + "constraints": [ + { + "expression": "discount >= 0 AND discount <= 100" + } + ] + }, + { + "name": "status", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [ + { + "expression": "status IN ('active', 'inactive', 'pending')" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "orders", + "fields": [ + { + "name": "order_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "order_date", + "type": { + "type_name": "timestamp", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "delivery_date", + "type": { + "type_name": "timestamp", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "total", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "delivery_date > order_date" + }, + { + "expression": "total >= 0" + } + ] + }, + { + "name": "employees", + "fields": [ + { + "name": "emp_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "age", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "salary", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "email", + "type": { + "type_name": "varchar(100)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "age >= 18 AND age <= 65", + "name": "chk_age" + }, + { + "expression": "salary > 0", + "name": "chk_salary" + } + ] + }, + { + "name": "inventory", + "fields": [ + { + "name": "item_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "stock", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [ + { + "expression": "stock >= 0" + }, + { + "expression": "stock <= 10000" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "users", + "fields": [ + { + "name": "user_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "username", + "type": { + "type_name": "varchar(50)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "role", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [ + { + "expression": "role NOT IN ('banned', 'suspended')" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "accounts", + "fields": [ + { + "name": "account_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "balance", + "type": { + "type_name": "decimal(15,2)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "balance >= 0", + "name": "chk_balance_positive" + }, + { + "expression": "balance <= 1000000" + } + ] + }, + { + "name": "transactions", + "fields": [ + { + "name": "txn_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "amount", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "fee", + "type": { + "type_name": "decimal(10,2)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "type", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "amount + fee > 0" + }, + { + "expression": "type IN ('debit', 'credit')" + } + ] + }, + { + "name": "settings", + "fields": [ + { + "name": "setting_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "value", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "value = 0 OR value = 1 OR value = -1" + } + ] + }, + { + "name": "contacts", + "fields": [ + { + "name": "contact_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "email", + "type": { + "type_name": "varchar(100)", + "schemaName": null + }, + "constraints": [ + { + "expression": "email LIKE '%@%.%'" + } + ] + }, + { + "name": "phone", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [ + { + "expression": "phone ~ '^[0-9]{3}-[0-9]{3}-[0-9]{4}$'" + } + ] + } + ], + "indexes": [], + "constraints": [] + }, + { + "name": "ranges", + "fields": [ + { + "name": "range_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "min_val", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "max_val", + "type": { + "type_name": "int", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "(min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)" + } + ] + }, + { + "name": "shipments", + "fields": [ + { + "name": "shipment_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "priority", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "carrier", + "type": { + "type_name": "varchar(50)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "priority IN ('low', 'medium', 'high', 'urgent')" + } + ] + }, + { + "name": "workflow", + "fields": [ + { + "name": "workflow_id", + "type": { + "type_name": "int", + "schemaName": null + }, + "pk": true, + "constraints": [] + }, + { + "name": "status", + "type": { + "type_name": "varchar(20)", + "schemaName": null + }, + "constraints": [] + }, + { + "name": "category", + "type": { + "type_name": "varchar(50)", + "schemaName": null + }, + "constraints": [] + } + ], + "indexes": [], + "constraints": [ + { + "expression": "status IN ('draft', 'pending') AND status IN ('active', 'inactive')" + } + ] + } + ], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "records": [] +} diff --git a/packages/dbml-core/__tests__/parser/postgres-parse/output/cmd_create_table.out.json b/packages/dbml-core/__tests__/parser/postgres-parse/output/cmd_create_table.out.json index c0d470d0f..8a1e3ffad 100644 --- a/packages/dbml-core/__tests__/parser/postgres-parse/output/cmd_create_table.out.json +++ b/packages/dbml-core/__tests__/parser/postgres-parse/output/cmd_create_table.out.json @@ -15,7 +15,8 @@ "type": "number" }, "unique": true, - "pk": true + "pk": true, + "constraints": [] }, { "name": "name", @@ -23,10 +24,16 @@ "type_name": "varchar(255)", "schemaName": null }, - "not_null": false + "not_null": false, + "constraints": [ + { + "expression": "\"id\" > -1" + } + ] } ], - "indexes": [] + "indexes": [], + "constraints": [] }, { "name": "b", @@ -36,7 +43,8 @@ "type": { "type_name": "uuid", "schemaName": null - } + }, + "constraints": [] }, { "name": "name", @@ -44,14 +52,20 @@ "type_name": "varchar", "schemaName": null }, - "not_null": true + "not_null": true, + "constraints": [ + { + "expression": "name <> ''" + } + ] }, { "name": "email", "type": { "type_name": "varchar(55)", "schemaName": null - } + }, + "constraints": [] } ], "indexes": [ @@ -74,7 +88,8 @@ } ] } - ] + ], + "constraints": [] }, { "name": "c", @@ -85,7 +100,8 @@ "type_name": "CHARACTER VARYING(255)", "schemaName": null }, - "unique": true + "unique": true, + "constraints": [] }, { "name": "phone", @@ -93,17 +109,20 @@ "type_name": "SERIAL", "schemaName": null }, - "increment": true + "increment": true, + "constraints": [] }, { "name": "time", "type": { "type_name": "timestamp", "schemaName": null - } + }, + "constraints": [] } ], - "indexes": [] + "indexes": [], + "constraints": [] }, { "name": "circles", @@ -113,10 +132,12 @@ "type": { "type_name": "circle", "schemaName": null - } + }, + "constraints": [] } ], - "indexes": [] + "indexes": [], + "constraints": [] }, { "name": "foo", @@ -126,108 +147,124 @@ "type": { "type_name": "text[]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar2", "type": { "type_name": "int[1]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar3", "type": { "type_name": "int[2][3]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar4", "type": { "type_name": "int[]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar5", "type": { "type_name": "int[2]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar6", "type": { "type_name": "text[8]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar7", "type": { "type_name": "text[100]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar8", "type": { "type_name": "time(2)[]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar9", "type": { "type_name": "time(1)[1]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar10", "type": { "type_name": "time(1)[]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar11", "type": { "type_name": "time[5]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar12", "type": { "type_name": "timestamp(2)[10][2][5]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar13", "type": { "type_name": "character varying[]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar14", "type": { "type_name": "character varying(25)[][2][]", "schemaName": null - } + }, + "constraints": [] }, { "name": "bar15", "type": { "type_name": "character varying[76]", "schemaName": null - } + }, + "constraints": [] } ], - "indexes": [] + "indexes": [], + "constraints": [] } ], "refs": [ @@ -276,5 +313,6 @@ "enums": [], "tableGroups": [], "aliases": [], - "project": {} -} \ No newline at end of file + "project": {}, + "records": [] +} diff --git a/packages/dbml-core/__tests__/parser/schemarb-parse/input/constraints.in.rb b/packages/dbml-core/__tests__/parser/schemarb-parse/input/constraints.in.rb new file mode 100644 index 000000000..1f32e7d49 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/schemarb-parse/input/constraints.in.rb @@ -0,0 +1,118 @@ +# Test 1: Table-level CHECK constraints inside create_table (Rails 6.1+) +create_table "products" do |t| + t.integer "id" + t.decimal "price" + t.integer "quantity" + t.decimal "discount" + t.check_constraint "price > 0", name: "price_positive" + t.check_constraint "quantity >= 0" +end + +# Test 2: Table with multiple named and unnamed CHECK constraints +create_table "employees" do |t| + t.integer "emp_id" + t.integer "age" + t.decimal "salary" + t.check_constraint "age >= 18 AND age <= 65", name: "chk_age" + t.check_constraint "salary > 0", name: "chk_salary" +end + +# Test 3: Table with complex CHECK constraint expressions +create_table "orders" do |t| + t.integer "order_id" + t.timestamp "order_date" + t.timestamp "delivery_date" + t.decimal "total" + t.check_constraint "delivery_date > order_date" + t.check_constraint "total >= 0" +end + +# Test 4: Using add_check_constraint at top level (named) +create_table "shipments" do |t| + t.integer "shipment_id" + t.decimal "weight" + t.decimal "cost" +end +add_check_constraint :shipments, "weight > 0", name: "chk_weight" +add_check_constraint :shipments, "cost >= 0", name: "chk_cost" + +# Test 5: Using add_check_constraint without name +create_table "payments" do |t| + t.integer "payment_id" + t.decimal "amount" +end +add_check_constraint :payments, "amount > 0" + +# Test 6: CHECK constraint with IN clause +create_table "users" do |t| + t.integer "user_id" + t.string "role" + t.check_constraint "role NOT IN ('banned', 'deleted', 'suspended')" +end + +# Test 7: CHECK constraint with multiple conditions +create_table "ranges" do |t| + t.integer "range_id" + t.integer "min_val" + t.integer "max_val" + t.check_constraint "(min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)" +end + +# Test 8: CHECK constraint with CASE expression +create_table "inventory" do |t| + t.integer "item_id" + t.integer "stock" + t.string "status" + t.check_constraint "CASE WHEN status = 'active' THEN stock WHEN status = 'discontinued' THEN 0 ELSE 1 END >= 0" +end + +# Test 9: Mixed column-level and table-level constraints +create_table "accounts" do |t| + t.integer "account_id" + t.decimal "balance" + t.decimal "overdraft_limit" + t.check_constraint "balance + overdraft_limit >= 0", name: "chk_balance_overdraft" +end + +# Test 10: Multiple CHECK constraints (mixed named and unnamed) +create_table "transactions" do |t| + t.integer "txn_id" + t.decimal "amount" + t.decimal "fee" + t.decimal "total" + t.check_constraint "total = amount + fee" + t.check_constraint "amount > 0 OR fee > 0" +end + +# Test 11: CHECK constraint with string patterns +create_table "contacts" do |t| + t.integer "contact_id" + t.string "email" + t.string "phone" + t.check_constraint "email LIKE '%@%'" +end + +# Test 12: Complex expressions with OR +create_table "settings" do |t| + t.integer "setting_id" + t.integer "value" + t.check_constraint "value = 0 OR value = 1 OR value = -1" +end + +# Test 13: add_check_constraint with string table name (double quotes) +create_table "pricing" do |t| + t.integer "price_id" + t.decimal "base_price" + t.decimal "discount_pct" + t.decimal "final_price" +end +add_check_constraint "pricing", "final_price = base_price * (1 - discount_pct / 100)" + +# Test 14: Multiple add_check_constraint statements with different syntaxes +create_table "limits" do |t| + t.integer "limit_id" + t.integer "min_value" + t.integer "max_value" +end +add_check_constraint :limits, "max_value > min_value" +add_check_constraint "limits", "min_value >= 0", name: "chk_min_positive" diff --git a/packages/dbml-core/__tests__/parser/schemarb-parse/output/constraints.out.json b/packages/dbml-core/__tests__/parser/schemarb-parse/output/constraints.out.json new file mode 100644 index 000000000..23a663b49 --- /dev/null +++ b/packages/dbml-core/__tests__/parser/schemarb-parse/output/constraints.out.json @@ -0,0 +1,678 @@ +{ + "tables": [ + { + "name": "products", + "fields": [ + { + "name": "id", + "type": { + "type_name": "integer" + } + }, + { + "name": "price", + "type": { + "type_name": "decimal" + } + }, + { + "name": "quantity", + "type": { + "type_name": "integer" + } + }, + { + "name": "discount", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "price > 0", + "name": "price_positive" + }, + { + "expression": "quantity >= 0" + } + ] + }, + { + "name": "employees", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "emp_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "age", + "type": { + "type_name": "integer" + } + }, + { + "name": "salary", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "age >= 18 AND age <= 65", + "name": "chk_age" + }, + { + "expression": "salary > 0", + "name": "chk_salary" + } + ] + }, + { + "name": "orders", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "order_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "order_date", + "type": { + "type_name": "timestamp" + } + }, + { + "name": "delivery_date", + "type": { + "type_name": "timestamp" + } + }, + { + "name": "total", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "delivery_date > order_date" + }, + { + "expression": "total >= 0" + } + ] + }, + { + "name": "shipments", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "shipment_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "weight", + "type": { + "type_name": "decimal" + } + }, + { + "name": "cost", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "weight > 0", + "name": "chk_weight" + }, + { + "expression": "cost >= 0", + "name": "chk_cost" + } + ] + }, + { + "name": "payments", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "payment_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "amount", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "amount > 0" + } + ] + }, + { + "name": "users", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "user_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "role", + "type": { + "type_name": "string" + } + } + ], + "constraints": [ + { + "expression": "role NOT IN ('banned', 'deleted', 'suspended')" + } + ] + }, + { + "name": "ranges", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "range_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "min_val", + "type": { + "type_name": "integer" + } + }, + { + "name": "max_val", + "type": { + "type_name": "integer" + } + } + ], + "constraints": [ + { + "expression": "(min_val >= 0) AND (max_val <= 100) AND (min_val < max_val)" + } + ] + }, + { + "name": "inventory", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "item_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "stock", + "type": { + "type_name": "integer" + } + }, + { + "name": "status", + "type": { + "type_name": "string" + } + } + ], + "constraints": [ + { + "expression": "CASE WHEN status = 'active' THEN stock WHEN status = 'discontinued' THEN 0 ELSE 1 END >= 0" + } + ] + }, + { + "name": "accounts", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "account_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "balance", + "type": { + "type_name": "decimal" + } + }, + { + "name": "overdraft_limit", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "balance + overdraft_limit >= 0", + "name": "chk_balance_overdraft" + } + ] + }, + { + "name": "transactions", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "txn_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "amount", + "type": { + "type_name": "decimal" + } + }, + { + "name": "fee", + "type": { + "type_name": "decimal" + } + }, + { + "name": "total", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "total = amount + fee" + }, + { + "expression": "amount > 0 OR fee > 0" + } + ] + }, + { + "name": "contacts", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "contact_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "email", + "type": { + "type_name": "string" + } + }, + { + "name": "phone", + "type": { + "type_name": "string" + } + } + ], + "constraints": [ + { + "expression": "email LIKE '%@%'" + } + ] + }, + { + "name": "settings", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "setting_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "value", + "type": { + "type_name": "integer" + } + } + ], + "constraints": [ + { + "expression": "value = 0 OR value = 1 OR value = -1" + } + ] + }, + { + "name": "pricing", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "price_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "base_price", + "type": { + "type_name": "decimal" + } + }, + { + "name": "discount_pct", + "type": { + "type_name": "decimal" + } + }, + { + "name": "final_price", + "type": { + "type_name": "decimal" + } + } + ], + "constraints": [ + { + "expression": "final_price = base_price * (1 - discount_pct / 100)" + } + ] + }, + { + "name": "limits", + "fields": [ + { + "name": "id", + "type": { + "type_name": "varchar" + } + }, + { + "name": "limit_id", + "type": { + "type_name": "integer" + } + }, + { + "name": "min_value", + "type": { + "type_name": "integer" + } + }, + { + "name": "max_value", + "type": { + "type_name": "integer" + } + } + ], + "constraints": [ + { + "expression": "max_value > min_value" + }, + { + "expression": "min_value >= 0", + "name": "chk_min_positive" + } + ] + } + ], + "refs": [ + { + "name": "fk_rails_orders_orders", + "endpoints": [ + { + "tableName": "orders", + "fieldNames": [ + "order_id" + ], + "relation": "1" + }, + { + "tableName": "orders", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_shipments_shipments", + "endpoints": [ + { + "tableName": "shipments", + "fieldNames": [ + "shipment_id" + ], + "relation": "1" + }, + { + "tableName": "shipments", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_payments_payments", + "endpoints": [ + { + "tableName": "payments", + "fieldNames": [ + "payment_id" + ], + "relation": "1" + }, + { + "tableName": "payments", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_users_users", + "endpoints": [ + { + "tableName": "users", + "fieldNames": [ + "user_id" + ], + "relation": "1" + }, + { + "tableName": "users", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_ranges_ranges", + "endpoints": [ + { + "tableName": "ranges", + "fieldNames": [ + "range_id" + ], + "relation": "1" + }, + { + "tableName": "ranges", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_accounts_accounts", + "endpoints": [ + { + "tableName": "accounts", + "fieldNames": [ + "account_id" + ], + "relation": "1" + }, + { + "tableName": "accounts", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_contacts_contacts", + "endpoints": [ + { + "tableName": "contacts", + "fieldNames": [ + "contact_id" + ], + "relation": "1" + }, + { + "tableName": "contacts", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_settings_settings", + "endpoints": [ + { + "tableName": "settings", + "fieldNames": [ + "setting_id" + ], + "relation": "1" + }, + { + "tableName": "settings", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + }, + { + "name": "fk_rails_limits_limits", + "endpoints": [ + { + "tableName": "limits", + "fieldNames": [ + "limit_id" + ], + "relation": "1" + }, + { + "tableName": "limits", + "fieldNames": [ + "id" + ], + "relation": "1" + } + ] + } + ] +} diff --git a/packages/dbml-core/src/export/DbmlExporter.js b/packages/dbml-core/src/export/DbmlExporter.js index 29be9e1a7..08bb24638 100644 --- a/packages/dbml-core/src/export/DbmlExporter.js +++ b/packages/dbml-core/src/export/DbmlExporter.js @@ -70,6 +70,9 @@ class DbmlExporter { if (field.increment) { constraints.push('increment'); } + if (field.constraintIds) { + constraints.push(...field.constraintIds.map((id) => `constraint: \`${model.constraints[id].expression}\``)); + } if (field.dbdefault) { let value = 'default: '; switch (field.dbdefault.type) { @@ -152,14 +155,32 @@ class DbmlExporter { return lines; } + static getConstraintLines (tableId, model) { + const table = model.tables[tableId]; + + const lines = table.constraintIds.map((constraintId) => { + let line = ''; + const { expression, name } = model.constraints[constraintId]; + line += `\`${expression}\``; + if (name) { + line += ` [name: '${name}']` + } + return line; + }) + + return lines; + } + static getTableContentArr (tableIds, model) { const tableContentArr = tableIds.map((tableId) => { const fieldContents = DbmlExporter.getFieldLines(tableId, model); + const constraintContents = DbmlExporter.getConstraintLines(tableId, model); const indexContents = DbmlExporter.getIndexLines(tableId, model); return { tableId, fieldContents, + constraintContents, indexContents, }; }); @@ -192,6 +213,12 @@ class DbmlExporter { const fieldStr = tableContent.fieldContents.map(field => ` ${field}\n`).join(''); + let constraintStr = ''; + if (!isEmpty(tableContent.constraintContents)) { + const constraintBody = tableContent.constraintContents.map(constraintLine => ` ${constraintLine}\n`).join(''); + constraintStr = `\n Constraints {\n${constraintBody} }\n`; + } + let indexStr = ''; if (!isEmpty(tableContent.indexContents)) { const indexBody = tableContent.indexContents.map(indexLine => ` ${indexLine}\n`).join(''); @@ -200,7 +227,7 @@ class DbmlExporter { const noteStr = table.note ? ` Note: ${DbmlExporter.escapeNote(table.note)}\n`: ''; - return `Table ${tableName}${tableSettingStr} {\n${fieldStr}${indexStr}${noteStr}}\n`; + return `Table ${tableName}${tableSettingStr} {\n${fieldStr}${constraintStr}${indexStr}${noteStr}}\n`; }); return tableStrs.length ? tableStrs.join('\n') : ''; diff --git a/packages/dbml-core/src/export/MysqlExporter.js b/packages/dbml-core/src/export/MysqlExporter.js index 12bd6ddf3..0aa904d31 100644 --- a/packages/dbml-core/src/export/MysqlExporter.js +++ b/packages/dbml-core/src/export/MysqlExporter.js @@ -37,6 +37,21 @@ class MySQLExporter { if (field.increment) { line += ' AUTO_INCREMENT'; } + if (field.constraintIds && field.constraintIds.length > 0) { + if (field.constraintIds.length === 1) { + const constraint = model.constraints[field.constraintIds[0]]; + if (constraint.name) { + line += ` CONSTRAINT \`${constraint.name}\``; + } + line += ` CHECK (${constraint.expression})`; + } else { + const constraintExpressions = field.constraintIds.map(constraintId => { + const constraint = model.constraints[constraintId]; + return `(${constraint.expression})`; + }); + line += ` CHECK (${constraintExpressions.join(' AND ')})`; + } + } if (field.dbdefault) { if (field.dbdefault.type === 'expression') { line += ` DEFAULT (${field.dbdefault.value})`; @@ -84,14 +99,39 @@ class MySQLExporter { return lines; } + static getConstraintLines (tableId, model) { + const table = model.tables[tableId]; + + if (!table.constraintIds || table.constraintIds.length === 0) { + return []; + } + + const lines = table.constraintIds.map((constraintId) => { + const constraint = model.constraints[constraintId]; + let line = ''; + + if (constraint.name) { + line = `CONSTRAINT \`${constraint.name}\` `; + } + + line += `CHECK (${constraint.expression})`; + + return line; + }); + + return lines; + } + static getTableContentArr (tableIds, model) { const tableContentArr = tableIds.map((tableId) => { const fieldContents = MySQLExporter.getFieldLines(tableId, model); + const constraintContents = MySQLExporter.getConstraintLines(tableId, model); const compositePKs = MySQLExporter.getCompositePKs(tableId, model); return { tableId, fieldContents, + constraintContents, compositePKs, }; }); @@ -103,7 +143,7 @@ class MySQLExporter { const tableContentArr = MySQLExporter.getTableContentArr(tableIds, model); const tableStrs = tableContentArr.map((tableContent) => { - const content = [...tableContent.fieldContents, ...tableContent.compositePKs]; + const content = [...tableContent.fieldContents, ...tableContent.constraintContents, ...tableContent.compositePKs]; const table = model.tables[tableContent.tableId]; const schema = model.schemas[table.schemaId]; const tableStr = `CREATE TABLE ${shouldPrintSchema(schema, model) diff --git a/packages/dbml-core/src/export/OracleExporter.js b/packages/dbml-core/src/export/OracleExporter.js index 6c4fd2d1f..79577072a 100644 --- a/packages/dbml-core/src/export/OracleExporter.js +++ b/packages/dbml-core/src/export/OracleExporter.js @@ -96,6 +96,22 @@ class OracleExporter { line += ' NOT NULL'; } + if (cloneField.constraintIds && cloneField.constraintIds.length > 0) { + if (cloneField.constraintIds.length === 1) { + const constraint = model.constraints[cloneField.constraintIds[0]]; + if (constraint.name) { + line += ` CONSTRAINT "${constraint.name}"`; + } + line += ` CHECK (${constraint.expression})`; + } else { + const constraintExpressions = cloneField.constraintIds.map(constraintId => { + const constraint = model.constraints[constraintId]; + return `(${constraint.expression})`; + }); + line += ` CHECK (${constraintExpressions.join(' AND ')})`; + } + } + return line; }); @@ -130,14 +146,39 @@ class OracleExporter { return lines; } + static getConstraintLines (tableId, model) { + const table = model.tables[tableId]; + + if (!table.constraintIds || table.constraintIds.length === 0) { + return []; + } + + const lines = table.constraintIds.map((constraintId) => { + const constraint = model.constraints[constraintId]; + let line = ''; + + if (constraint.name) { + line = `CONSTRAINT "${constraint.name}" `; + } + + line += `CHECK (${constraint.expression})`; + + return line; + }); + + return lines; + } + static getTableContents (tableIds, model) { const tableContentArr = tableIds.map((tableId) => { const fieldContents = this.getFieldLines(tableId, model); + const constraintContents = this.getConstraintLines(tableId, model); const compositePKs = this.getCompositePKs(tableId, model); return { tableId, fieldContents, + constraintContents, compositePKs, }; }); @@ -149,7 +190,7 @@ class OracleExporter { const tableContentList = this.getTableContents(tableIds, model); const tableStrs = tableContentList.map((tableContent) => { - const content = [...tableContent.fieldContents, ...tableContent.compositePKs]; + const content = [...tableContent.fieldContents, ...tableContent.constraintContents, ...tableContent.compositePKs]; const table = model.tables[tableContent.tableId]; const schema = model.schemas[table.schemaId]; diff --git a/packages/dbml-core/src/export/PostgresExporter.js b/packages/dbml-core/src/export/PostgresExporter.js index 61357ffa0..393cf7238 100644 --- a/packages/dbml-core/src/export/PostgresExporter.js +++ b/packages/dbml-core/src/export/PostgresExporter.js @@ -201,6 +201,21 @@ class PostgresExporter { if (field.not_null) { line += ' NOT NULL'; } + if (field.constraintIds && field.constraintIds.length > 0) { + if (field.constraintIds.length === 1) { + const constraint = model.constraints[field.constraintIds[0]]; + if (constraint.name) { + line += ` CONSTRAINT "${constraint.name}"`; + } + line += ` CHECK (${constraint.expression})`; + } else { + const constraintExpressions = field.constraintIds.map(constraintId => { + const constraint = model.constraints[constraintId]; + return `(${constraint.expression})`; + }); + line += ` CHECK (${constraintExpressions.join(' AND ')})`; + } + } if (field.dbdefault) { if (field.dbdefault.type === 'expression') { line += ` DEFAULT (${field.dbdefault.value})`; @@ -245,14 +260,39 @@ class PostgresExporter { return lines; } + static getConstraintLines (tableId, model) { + const table = model.tables[tableId]; + + if (!table.constraintIds || table.constraintIds.length === 0) { + return []; + } + + const lines = table.constraintIds.map((constraintId) => { + const constraint = model.constraints[constraintId]; + let line = ''; + + if (constraint.name) { + line = `CONSTRAINT "${constraint.name}" `; + } + + line += `CHECK (${constraint.expression})`; + + return line; + }); + + return lines; + } + static getTableContentArr (tableIds, model, enumSet) { const tableContentArr = tableIds.map((tableId) => { const fieldContents = PostgresExporter.getFieldLines(tableId, model, enumSet); + const constraintContents = PostgresExporter.getConstraintLines(tableId, model); const compositePKs = PostgresExporter.getCompositePKs(tableId, model); return { tableId, fieldContents, + constraintContents, compositePKs, }; }); @@ -264,7 +304,7 @@ class PostgresExporter { const tableContentArr = PostgresExporter.getTableContentArr(tableIds, model, enumSet); const tableStrs = tableContentArr.map((tableContent) => { - const content = [...tableContent.fieldContents, ...tableContent.compositePKs]; + const content = [...tableContent.fieldContents, ...tableContent.constraintContents, ...tableContent.compositePKs]; const table = model.tables[tableContent.tableId]; const schema = model.schemas[table.schemaId]; const tableStr = `CREATE TABLE ${shouldPrintSchema(schema, model) diff --git a/packages/dbml-core/src/export/SqlServerExporter.js b/packages/dbml-core/src/export/SqlServerExporter.js index 8458c714a..0d3dfc2f9 100644 --- a/packages/dbml-core/src/export/SqlServerExporter.js +++ b/packages/dbml-core/src/export/SqlServerExporter.js @@ -38,6 +38,21 @@ class SqlServerExporter { if (field.increment) { line += ' IDENTITY(1, 1)'; } + if (field.constraintIds && field.constraintIds.length > 0) { + if (field.constraintIds.length === 1) { + const constraint = model.constraints[field.constraintIds[0]]; + if (constraint.name) { + line += ` CONSTRAINT [${constraint.name}]`; + } + line += ` CHECK (${constraint.expression})`; + } else { + const constraintExpressions = field.constraintIds.map(constraintId => { + const constraint = model.constraints[constraintId]; + return `(${constraint.expression})`; + }); + line += ` CHECK (${constraintExpressions.join(' AND ')})`; + } + } if (field.dbdefault) { if (field.dbdefault.type === 'expression') { line += ` DEFAULT (${field.dbdefault.value})`; @@ -81,14 +96,39 @@ class SqlServerExporter { return lines; } + static getConstraintLines (tableId, model) { + const table = model.tables[tableId]; + + if (!table.constraintIds || table.constraintIds.length === 0) { + return []; + } + + const lines = table.constraintIds.map((constraintId) => { + const constraint = model.constraints[constraintId]; + let line = ''; + + if (constraint.name) { + line = `CONSTRAINT [${constraint.name}] `; + } + + line += `CHECK (${constraint.expression})`; + + return line; + }); + + return lines; + } + static getTableContentArr (tableIds, model) { const tableContentArr = tableIds.map((tableId) => { const fieldContents = SqlServerExporter.getFieldLines(tableId, model); + const constraintContents = SqlServerExporter.getConstraintLines(tableId, model); const compositePKs = SqlServerExporter.getCompositePKs(tableId, model); return { tableId, fieldContents, + constraintContents, compositePKs, }; }); @@ -100,7 +140,7 @@ class SqlServerExporter { const tableContentArr = SqlServerExporter.getTableContentArr(tableIds, model); const tableStrs = tableContentArr.map((tableContent) => { - const content = [...tableContent.fieldContents, ...tableContent.compositePKs]; + const content = [...tableContent.fieldContents, ...tableContent.constraintContents, ...tableContent.compositePKs]; const table = model.tables[tableContent.tableId]; const schema = model.schemas[table.schemaId]; const tableStr = `CREATE TABLE ${shouldPrintSchema(schema, model) diff --git a/packages/dbml-core/src/index.js b/packages/dbml-core/src/index.js index 7c731e4fc..fa4e847fb 100644 --- a/packages/dbml-core/src/index.js +++ b/packages/dbml-core/src/index.js @@ -1,6 +1,6 @@ import ModelExporter from './export/ModelExporter'; import Parser from './parse/Parser'; -import { CompilerError } from '../lib/parse/error'; +import { CompilerError } from './parse/error'; import importer from './import'; import exporter from './export'; import { VERSION } from './utils/version'; diff --git a/packages/dbml-core/src/model_structure/constraint.js b/packages/dbml-core/src/model_structure/constraint.js new file mode 100644 index 000000000..677f0483d --- /dev/null +++ b/packages/dbml-core/src/model_structure/constraint.js @@ -0,0 +1,51 @@ +import Element from './element'; + +class Constraint extends Element { + constructor ({ + token, name, expression, table, column = null, injectedPartial = null, + } = {}) { + super(token); + this.name = name; + this.expression = expression; + this.table = table; + this.column = column; + this.injectedPartial = injectedPartial; + this.dbState = this.table.dbState; + this.generateId(); + } + + generateId () { + this.id = this.dbState.generateId('constraintId'); + } + + export () { + return { + ...this.shallowExport(), + }; + } + + exportParentIds () { + return { + tableId: this.table.id, + columnId: this.column?.id, + injectedPartialId: this.injectedPartial?.id, + }; + } + + shallowExport () { + return { + name: this.name, + expression: this.expression, + }; + } + + normalize (model) { + model.constraints[this.id] = { + id: this.id, + ...this.shallowExport(), + ...this.exportParentIds(), + }; + } +} + +export default Constraint; diff --git a/packages/dbml-core/src/model_structure/database.js b/packages/dbml-core/src/model_structure/database.js index 55767acb3..1dfb9b37f 100644 --- a/packages/dbml-core/src/model_structure/database.js +++ b/packages/dbml-core/src/model_structure/database.js @@ -262,6 +262,7 @@ class Database extends Element { enumValues: {}, indexes: {}, indexColumns: {}, + constraints: {}, fields: {}, records: {}, tablePartials: {}, diff --git a/packages/dbml-core/src/model_structure/dbState.js b/packages/dbml-core/src/model_structure/dbState.js index dfb9c7378..48de08478 100644 --- a/packages/dbml-core/src/model_structure/dbState.js +++ b/packages/dbml-core/src/model_structure/dbState.js @@ -10,6 +10,7 @@ export default class DbState { this.enumValueId = 1; this.endpointId = 1; this.indexId = 1; + this.constraintId = 1; this.fieldId = 1; this.indexColumnId = 1; this.recordId = 1; diff --git a/packages/dbml-core/src/model_structure/field.js b/packages/dbml-core/src/model_structure/field.js index 29bb95077..51047a5c6 100644 --- a/packages/dbml-core/src/model_structure/field.js +++ b/packages/dbml-core/src/model_structure/field.js @@ -1,11 +1,12 @@ import { get } from 'lodash'; import Element from './element'; import { DEFAULT_SCHEMA_NAME } from './config'; +import Constraint from './constraint'; class Field extends Element { constructor ({ name, type, unique, pk, token, not_null: notNull, note, dbdefault, - increment, table = {}, noteToken = null, injectedPartial = null, injectedToken = null, + increment, constraints = [], table = {}, noteToken = null, injectedPartial = null, injectedToken = null, } = {}) { super(token); if (!name) { this.error('Field must have a name'); } @@ -20,6 +21,7 @@ class Field extends Element { this.noteToken = note ? get(note, 'token', noteToken) : null; this.dbdefault = dbdefault; this.increment = increment; + this.constraints = []; this.endpoints = []; this.table = table; this.injectedPartial = injectedPartial; @@ -27,6 +29,8 @@ class Field extends Element { this.dbState = this.table.dbState; this.generateId(); this.bindType(); + + this.processConstraints(constraints); } generateId () { @@ -91,6 +95,7 @@ class Field extends Element { dbdefault: this.dbdefault, increment: this.increment, injectedPartialId: this.injectedPartial?.id, + constraintIds: this.constraints.map((constraint) => constraint.id), }; } @@ -101,6 +106,14 @@ class Field extends Element { ...this.exportChildIds(), ...this.exportParentIds(), }; + + this.constraints.forEach((constraint) => constraint.normalize(model)); + } + + processConstraints (constraints) { + constraints.forEach((constraint) => { + this.constraints.push(new Constraint({ ...constraint, table: this.table, column: this })); + }); } } diff --git a/packages/dbml-core/src/model_structure/indexColumn.js b/packages/dbml-core/src/model_structure/indexColumn.js index 58fcab67b..f8229665e 100644 --- a/packages/dbml-core/src/model_structure/indexColumn.js +++ b/packages/dbml-core/src/model_structure/indexColumn.js @@ -1,7 +1,9 @@ import Element from './element'; class IndexColumn extends Element { - constructor ({ type, value, index, token }) { + constructor ({ + type, value, index, token, + }) { super(); this.type = type; this.value = value; diff --git a/packages/dbml-core/src/model_structure/table.js b/packages/dbml-core/src/model_structure/table.js index 73b48c884..37c2c615a 100644 --- a/packages/dbml-core/src/model_structure/table.js +++ b/packages/dbml-core/src/model_structure/table.js @@ -4,10 +4,11 @@ import Field from './field'; import Index from './indexes'; import { DEFAULT_SCHEMA_NAME } from './config'; import { shouldPrintSchema } from './utils'; +import Constraint from './constraint'; class Table extends Element { constructor ({ - name, alias, note, fields = [], indexes = [], schema = {}, token, headerColor, noteToken = null, partials = [], + name, alias, note, fields = [], indexes = [], constraints = [], schema = {}, token, headerColor, noteToken = null, partials = [], } = {}) { super(token); this.name = name; @@ -17,6 +18,7 @@ class Table extends Element { this.headerColor = headerColor; this.fields = []; this.indexes = []; + this.constraints = []; this.schema = schema; this.partials = partials; this.dbState = this.schema.dbState; @@ -28,6 +30,7 @@ class Table extends Element { this.processPartials(); this.checkFieldCount(); this.processIndexes(indexes); + this.processConstraints(constraints); } generateId () { @@ -78,6 +81,16 @@ class Table extends Element { }); } + processConstraints (constraints) { + constraints.forEach((constraint) => { + this.pushConstraint(new Constraint({ ...constraint, table: this })); + }); + } + + pushConstraint (constraint) { + this.constraints.push(constraint); + } + findField (fieldName) { return this.fields.find(f => f.name === fieldName); } @@ -183,6 +196,15 @@ class Table extends Element { tablePartial.indexes.forEach((index) => { this.indexes.push(new Index({ ...index, table: this, injectedPartial: tablePartial })); }); + + tablePartial.constraints.forEach((constraint) => { + this.constraints.push(new Constraint({ + ...constraint, + name: constraint.name && `${this.name}.${constraint.name}`, // deduplicate constraint names when instantiated to tables + table: this, + injectedPartial: tablePartial, + })); + }); }); } @@ -204,6 +226,7 @@ class Table extends Element { return { fieldIds: this.fields.map(f => f.id), indexIds: this.indexes.map(i => i.id), + constraintIds: this.constraints.map(c => c.id), }; } @@ -234,6 +257,7 @@ class Table extends Element { this.fields.forEach((field) => field.normalize(model)); this.indexes.forEach((index) => index.normalize(model)); + this.constraints.forEach((constraint) => constraint.normalize(model)); } } diff --git a/packages/dbml-core/src/model_structure/tablePartial.js b/packages/dbml-core/src/model_structure/tablePartial.js index 48750ef6b..32c1b4107 100644 --- a/packages/dbml-core/src/model_structure/tablePartial.js +++ b/packages/dbml-core/src/model_structure/tablePartial.js @@ -3,7 +3,7 @@ import Element from './element'; class TablePartial extends Element { constructor ({ - name, note, fields = [], indexes = [], token, headerColor, noteToken = null, dbState, + name, note, fields = [], indexes = [], constraints = [], token, headerColor, noteToken = null, dbState, } = {}) { super(token); this.name = name; @@ -12,6 +12,7 @@ class TablePartial extends Element { this.headerColor = headerColor; this.fields = fields; this.indexes = indexes; + this.constraints = constraints; this.dbState = dbState; this.generateId(); } diff --git a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/AST.js b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/AST.js index 7f3259461..60b45f8cd 100644 --- a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/AST.js +++ b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/AST.js @@ -10,7 +10,9 @@ export class Index { * columns: {value: string, type: 'column' | 'string' | 'expression'}[], * }} param0 */ - constructor ({ name, unique, pk, type, columns }) { + constructor ({ + name, unique, pk, type, columns, + }) { /** @type {string} */ this.name = name; @@ -51,10 +53,13 @@ export class Field { * dbdefault: {value: string, type: 'string' | 'number' | 'boolean' | 'expression'}, * unique: boolean, * pk: boolean, - * note: {value: string} + * note: {value: string}, + * constraints: {expression: string, name?: string}[] * }} param0 */ - constructor ({ name, type, not_null, increment, dbdefault, unique, pk, note }) { + constructor ({ + name, type, not_null, increment, dbdefault, unique, pk, note, constraints, + }) { /** @type {string} */ this.name = name; @@ -78,6 +83,9 @@ export class Field { /** @type {{value: string}} */ this.note = note; + + /** @type {{expression: string, name?: string}[]} */ + this.constraints = constraints; } toJSON () { @@ -90,6 +98,7 @@ export class Field { unique: this.unique, pk: this.pk, note: this.note, + constraints: this.constraints, }; } } @@ -101,10 +110,13 @@ export class Table { * schemaName: string, * fields: Field[], * indexes: Index[], - * note: {value: string} + * note: {value: string}, + * constraints: {expression: string, name?: string}[] * }} param0 */ - constructor ({ name, schemaName, fields, indexes, note }) { + constructor ({ + name, schemaName, fields, indexes, note, constraints, + }) { /** @type {string} */ this.name = name; @@ -119,6 +131,9 @@ export class Table { /** @type {{value: string}} */ this.note = note; + + /** @type {{expression: string, name?: string}[]} */ + this.constraints = constraints || []; } toJSON () { @@ -128,6 +143,7 @@ export class Table { fields: this.fields?.map(f => f.toJSON()), indexes: this.indexes?.map(i => i.toJSON()), note: this.note, + constraints: this.constraints, }; } } @@ -141,7 +157,9 @@ export class Endpoint { * relation: '*' | '1' * }} param0 */ - constructor ({ tableName, schemaName, fieldNames, relation }) { + constructor ({ + tableName, schemaName, fieldNames, relation, + }) { /** @type {string} */ this.tableName = tableName; @@ -174,7 +192,9 @@ export class Ref { * onUpdate: string * }} param0 */ - constructor ({ name, endpoints, onDelete, onUpdate }) { + constructor ({ + name, endpoints, onDelete, onUpdate, + }) { /** @type {string} */ this.name = name; @@ -231,7 +251,9 @@ export class TableRecord { * schemaName?: string, * }} param0 */ - constructor({ tableName, columns, values, schemaName = undefined }) { + constructor ({ + tableName, columns, values, schemaName = undefined, + }) { /** @type {string} */ this.tableName = tableName; diff --git a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/constants.js b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/constants.js index bf448be05..f832a2c1a 100644 --- a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/constants.js +++ b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/constants.js @@ -5,6 +5,7 @@ export const TABLE_CONSTRAINT_KIND = { UNIQUE: 'unique', PK: 'pk', DEFAULT: 'default', + CHECK: 'check', }; export const COLUMN_CONSTRAINT_KIND = { diff --git a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mssql/MssqlASTGen.js b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mssql/MssqlASTGen.js index ec8dad02d..ee15f37d3 100644 --- a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mssql/MssqlASTGen.js +++ b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mssql/MssqlASTGen.js @@ -6,16 +6,11 @@ import TSqlParserVisitor from '../../parsers/mssql/TSqlParserVisitor'; import { COLUMN_CONSTRAINT_KIND, DATA_TYPE, TABLE_CONSTRAINT_KIND } from '../constants'; import { getOriginalText } from '../helpers'; import { - Field, Index, Table, TableRecord, Enum, + Field, Index, Table, TableRecord, } from '../AST'; const ADD_DESCRIPTION_FUNCTION_NAME = 'sp_addextendedproperty'; -const CHECK_CONSTRAINT_CONDITION_TYPE = { - RAW: 'raw', - ENUM: 'enum', -}; - const getSchemaAndTableName = (names) => { const tableName = last(names); const schemaName = names.length > 1 ? nth(names, -2) : undefined; @@ -85,7 +80,7 @@ const splitColumnDefTableConstraints = (columnDefTableConstraints) => { }; const parseFieldsAndInlineRefsFromFieldsData = (fieldsData, tableName, schemaName) => { - const [resInlineRefs, fields, checkConstraints] = fieldsData.reduce((acc, fieldData) => { + const [resInlineRefs, fields] = fieldsData.reduce((acc, fieldData) => { const inlineRefs = fieldData.inline_refs.map(inlineRef => { inlineRef.endpoints[0].tableName = tableName; inlineRef.endpoints[0].schemaName = schemaName; @@ -95,11 +90,10 @@ const parseFieldsAndInlineRefsFromFieldsData = (fieldsData, tableName, schemaNam acc[0].push(inlineRefs); acc[1].push(fieldData.field); - acc[2].push(...fieldData.checkConstraints); return acc; }, [[], [], []]); - return { inlineRefs: resInlineRefs, fields, checkConstraints }; + return { inlineRefs: resInlineRefs, fields }; }; export default class MssqlASTGen extends TSqlParserVisitor { @@ -527,7 +521,7 @@ export default class MssqlASTGen extends TSqlParserVisitor { fieldsData, indexes, tableRefs, checkConstraints: tableCheckConstraints, } = splitColumnDefTableConstraints(columnDefTableConstraints); - const { inlineRefs, fields, checkConstraints: columnCheckConstraints } = parseFieldsAndInlineRefsFromFieldsData(fieldsData, tableName, schemaName); + const { inlineRefs, fields } = parseFieldsAndInlineRefsFromFieldsData(fieldsData, tableName, schemaName); this.data.refs.push(...flatten(inlineRefs)); @@ -537,29 +531,12 @@ export default class MssqlASTGen extends TSqlParserVisitor { return tableRef; })); - // these check constraints represent enums - const checkConstraints = columnCheckConstraints.concat(tableCheckConstraints); - checkConstraints.forEach((checkConstraint) => { - const field = fields.find((fieldItem) => fieldItem.name === checkConstraint.column); - if (!field) return; - - const enumObject = new Enum({ - name: `${tableName}_${field.name}_enum`, - values: checkConstraint.columnValues.map((value) => ({ name: value })), - schemaName, - }); - - this.data.enums.push(enumObject); - // TODO: handle multiple enums for the same field - field.type.type_name = enumObject.name; - field.type.schemaName = enumObject.schemaName; - }); - const table = new Table({ name: tableName, schemaName, fields, indexes: tableIndices.concat(indexes), + constraints: tableCheckConstraints, }); this.data.tables.push(table); @@ -632,7 +609,6 @@ export default class MssqlASTGen extends TSqlParserVisitor { value: { field, inline_refs: [], - checkConstraints: [], }, }; @@ -666,12 +642,15 @@ export default class MssqlASTGen extends TSqlParserVisitor { definition.value.inline_refs.push(columnDef.value); break; case COLUMN_CONSTRAINT_KIND.CHECK: { - const { type: columnDefType, value } = columnDef.value; - - // we keep the current behavior: when a field has a check constraints cannot be converted to enum, we will ignore it - if (columnDefType !== CHECK_CONSTRAINT_CONDITION_TYPE.ENUM) return; - - definition.value.checkConstraints.push(value); + const { expression, name } = columnDef.value; + if (!field.constraints) { + field.constraints = []; + } + const constraintObj = { expression }; + if (name) { + constraintObj.name = name; + } + field.constraints.push(constraintObj); break; } default: @@ -786,11 +765,16 @@ export default class MssqlASTGen extends TSqlParserVisitor { }; } - // we do not handle check constraint since it is complicated and hard to extract enum from it if (ctx.check_constraint()) { + const constraintName = ctx.id_() ? ctx.id_().accept(this) : null; + const checkConstraintResult = ctx.check_constraint().accept(this); + return { kind: COLUMN_CONSTRAINT_KIND.CHECK, - value: ctx.check_constraint().accept(this), + value: { + ...checkConstraintResult, + name: constraintName, + }, }; } @@ -810,27 +794,8 @@ export default class MssqlASTGen extends TSqlParserVisitor { // | search_condition OR search_condition // ; visitSearch_condition (ctx) { - // we will parse the enum from the most basic condition - map to the old behavior - // others, we will get the check constraint to ensure the constraint is applied - enhance the old behavior - if (!ctx.predicate() || ctx.NOT().length) { - return { - type: CHECK_CONSTRAINT_CONDITION_TYPE.RAW, - value: getOriginalText(ctx), - }; - } - - const predicate = ctx.predicate().accept(this); - - if (!predicate) { - return { - type: CHECK_CONSTRAINT_CONDITION_TYPE.RAW, - value: getOriginalText(ctx), - }; - } - return { - type: CHECK_CONSTRAINT_CONDITION_TYPE.ENUM, - value: predicate, + expression: getOriginalText(ctx), }; } @@ -1014,11 +979,13 @@ export default class MssqlASTGen extends TSqlParserVisitor { if (ctx.check_constraint()) { const checkConstraint = ctx.check_constraint().accept(this); - if (checkConstraint.type !== CHECK_CONSTRAINT_CONDITION_TYPE.ENUM) return null; return { kind: TABLE_CONSTRAINT_KIND.CHECK, - value: checkConstraint.value, + value: { + expression: checkConstraint.expression, + name, + }, }; } @@ -1104,19 +1071,11 @@ export default class MssqlASTGen extends TSqlParserVisitor { }); checkConstraints.forEach((checkConstraint) => { - const field = table.fields.find((fieldItem) => fieldItem.name === checkConstraint.column); - if (!field) return; - - const enumObject = new Enum({ - name: `${tableName}_${field.name}_enum`, - values: checkConstraint.columnValues.map((value) => ({ name: value })), - schemaName, - }); - - this.data.enums.push(enumObject); - // TODO: handle multiple enums for the same field - field.type.type_name = enumObject.name; - field.type.schemaName = enumObject.schemaName; + const constraintObj = { expression: checkConstraint.expression }; + if (checkConstraint.name) { + constraintObj.name = checkConstraint.name; + } + table.constraints.push(constraintObj); }); } diff --git a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mysql/MySQLASTGen.js b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mysql/MySQLASTGen.js index ebc6b20a0..95d773055 100644 --- a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mysql/MySQLASTGen.js +++ b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/mysql/MySQLASTGen.js @@ -8,6 +8,7 @@ import { import { TABLE_CONSTRAINT_KIND, COLUMN_CONSTRAINT_KIND, DATA_TYPE, CONSTRAINT_TYPE, } from '../constants'; +import { getOriginalText } from '../helpers'; const TABLE_OPTIONS_KIND = { NOTE: 'note', @@ -16,6 +17,7 @@ const TABLE_OPTIONS_KIND = { const ALTER_KIND = { ADD_PK: 'add_pk', ADD_FK: 'add_fk', + ADD_CHECK: 'add_check', }; const INDEX_OPTION_KIND = { @@ -109,11 +111,12 @@ export default class MySQLASTGen extends MySQLParserVisitor { options, } = createTableResult; - const [fieldsData, indexes, tableRefs, singlePkIndex] = definitions.reduce((acc, ele) => { + const [fieldsData, indexes, tableRefs, singlePkIndex, tableConstraints] = definitions.reduce((acc, ele) => { if (ele.kind === TABLE_CONSTRAINT_KIND.FIELD) acc[0].push(ele.value); else if (ele.kind === TABLE_CONSTRAINT_KIND.INDEX) acc[1].push(ele.value); else if (ele.kind === TABLE_CONSTRAINT_KIND.UNIQUE) acc[1].push(ele.value); else if (ele.kind === TABLE_CONSTRAINT_KIND.FK) acc[2].push(ele.value); + else if (ele.kind === TABLE_CONSTRAINT_KIND.CHECK) acc[4].push(ele.value); else if (ele.kind === TABLE_CONSTRAINT_KIND.PK) { /** @type {Index} */ const index = ele.value; @@ -121,7 +124,7 @@ export default class MySQLASTGen extends MySQLParserVisitor { else acc[3] = index; } return acc; - }, [[], [], [], null]); + }, [[], [], [], null, []]); const inlineRefsOfFields = fieldsData.map(fieldData => { const { field, inlineRefs } = fieldData; @@ -172,6 +175,7 @@ export default class MySQLASTGen extends MySQLParserVisitor { schemaName, fields: fieldsData.map(fd => fd.field), indexes, + constraints: tableConstraints, ...tableOptions, }); @@ -337,7 +341,7 @@ export default class MySQLASTGen extends MySQLParserVisitor { visitColumnDefinition (ctx) { const type = ctx.dataType().accept(this); - const constraints = { inlineRefs: [] }; + const constraints = { inlineRefs: [], constraints: [] }; ctx.columnConstraint().forEach(c => { const constraint = c.accept(this); @@ -348,6 +352,11 @@ export default class MySQLASTGen extends MySQLParserVisitor { return; } + if (constraint.kind === COLUMN_CONSTRAINT_KIND.CHECK) { + constraints.constraints.push(constraint.value); + return; + } + constraints[constraint.kind] = constraint.value; }); @@ -570,6 +579,19 @@ export default class MySQLASTGen extends MySQLParserVisitor { }; } + // checkColumnConstraint: (CONSTRAINT name = uid?)? CHECK '(' expression ')' + visitCheckColumnConstraint (ctx) { + const name = ctx.name?.accept(this); + const expression = getOriginalText(ctx.expression()); + return { + kind: COLUMN_CONSTRAINT_KIND.CHECK, + value: { + expression, + name, + }, + }; + } + // NULL_LITERAL | CAST '(' expression AS convertedDataType ')' | unaryOperator? constant // | currentTimestamp (ON UPDATE currentTimestamp)? | '(' expression ')' | '(' fullId ')' visitDefaultValue (ctx) { @@ -819,8 +841,17 @@ export default class MySQLASTGen extends MySQLParserVisitor { }; } - visitCheckTableConstraint () { - // ignored + // checkTableConstraint: (CONSTRAINT name = uid?)? CHECK '(' expression ')' + visitCheckTableConstraint (ctx) { + const name = ctx.name?.accept(this); + const expression = getOriginalText(ctx.expression()); + return { + kind: TABLE_CONSTRAINT_KIND.CHECK, + value: { + expression, + name, + }, + }; } // USING (BTREE | HASH) @@ -915,6 +946,8 @@ export default class MySQLASTGen extends MySQLParserVisitor { ref.endpoints[0].tableName = tableName; this.data.refs.push(ref); + } else if (alter.kind === ALTER_KIND.ADD_CHECK) { + table.constraints.push(alter.value); } return null; }); @@ -960,6 +993,19 @@ export default class MySQLASTGen extends MySQLParserVisitor { }; } + // ADD (CONSTRAINT name = uid?)? CHECK '(' expression ')' + visitAlterByAddCheckTableConstraint (ctx) { + const name = ctx.name?.accept(this); + const expression = getOriginalText(ctx.expression()); + return { + kind: ALTER_KIND.ADD_CHECK, + value: { + expression, + name, + }, + }; + } + // CREATE intimeAction = (ONLINE | OFFLINE)? indexCategory = (UNIQUE | FULLTEXT | SPATIAL)? INDEX uid indexType? ON tableName indexColumnNames // indexOption* (ALGORITHM EQUAL_SYMBOL? algType = (DEFAULT | INPLACE | COPY) | LOCK EQUAL_SYMBOL? lockType = (DEFAULT | NONE | SHARED | EXCLUSIVE))* visitCreateIndex (ctx) { diff --git a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/postgres/PostgresASTGen.js b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/postgres/PostgresASTGen.js index 8aced31ba..23138fed8 100644 --- a/packages/dbml-core/src/parse/ANTLR/ASTGeneration/postgres/PostgresASTGen.js +++ b/packages/dbml-core/src/parse/ANTLR/ASTGeneration/postgres/PostgresASTGen.js @@ -3,8 +3,13 @@ /* eslint-disable class-methods-use-this */ import { last, flatten, flattenDepth } from 'lodash'; import PostgreSQLParserVisitor from '../../parsers/postgresql/PostgreSQLParserVisitor'; -import { Enum, Field, Index, TableRecord, Table } from '../AST'; -import { TABLE_CONSTRAINT_KIND, CONSTRAINT_TYPE, COLUMN_CONSTRAINT_KIND, DATA_TYPE } from '../constants'; +import { + Enum, Field, Index, TableRecord, Table, +} from '../AST'; +import { + TABLE_CONSTRAINT_KIND, CONSTRAINT_TYPE, COLUMN_CONSTRAINT_KIND, DATA_TYPE, +} from '../constants'; +import { getOriginalText } from '../helpers'; const COMMAND_KIND = { REF: 'ref', @@ -118,13 +123,14 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { const tableElements = ctx.opttableelementlist().accept(this).filter(e => e); - const [fieldsData, indexes, tableRefs] = tableElements.reduce((acc, ele) => { + const [fieldsData, indexes, tableRefs, tableConstraints] = tableElements.reduce((acc, ele) => { if (ele.kind === TABLE_CONSTRAINT_KIND.FIELD) acc[0].push(ele.value); else if (ele.kind === TABLE_CONSTRAINT_KIND.INDEX) acc[1].push(ele.value); else if (ele.kind === TABLE_CONSTRAINT_KIND.FK) acc[2].push(ele.value); else if (ele.kind === TABLE_CONSTRAINT_KIND.UNIQUE) acc[1].push(ele.value); + else if (ele.kind === TABLE_CONSTRAINT_KIND.CHECK) acc[3].push(ele.value); return acc; - }, [[], [], []]); + }, [[], [], [], []]); this.data.refs.push(...flatten( fieldsData.map(fieldData => fieldData.inline_refs.map(inlineRef => { @@ -146,6 +152,7 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { schemaName, fields: fieldsData.map(fd => fd.field), indexes, + constraints: tableConstraints, }); } @@ -240,6 +247,16 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { }), }; } + + if (ctx.CHECK()) { + const expression = getOriginalText(ctx.a_expr()); + return { + kind: TABLE_CONSTRAINT_KIND.CHECK, + value: { + expression, + }, + }; + } } // OPEN_PAREN columnlist CLOSE_PAREN | @@ -265,11 +282,11 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { const name = ctx.colid().accept(this); const type = ctx.typename().accept(this); - const contraints = ctx.colquallist().accept(this); + const constraints = ctx.colquallist().accept(this); const serialIncrementType = new Set(['serial', 'smallserial', 'bigserial']); const columnTypeName = type.type_name.toLowerCase(); - if ((serialIncrementType.has(columnTypeName))) contraints.increment = true; + if ((serialIncrementType.has(columnTypeName))) constraints.increment = true; return { kind: TABLE_CONSTRAINT_KIND.FIELD, @@ -277,16 +294,16 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { field: new Field({ name, type, - ...contraints, + ...constraints, }), - inline_refs: contraints.inline_refs, + inline_refs: constraints.inline_refs, }, }; } // colconstraint* visitColquallist (ctx) { - const r = { inline_refs: [] }; + const r = { inline_refs: [], constraints: [] }; ctx.colconstraint().forEach(c => { const constraint = c.accept(this); if (!constraint) return; @@ -296,6 +313,11 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { return; } + if (constraint.kind === COLUMN_CONSTRAINT_KIND.CHECK) { + r.constraints.push(constraint.value); + return; + } + r[constraint.kind] = constraint.value; }); @@ -359,6 +381,16 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { }; } + if (ctx.CHECK()) { + const expression = getOriginalText(ctx.a_expr()); + return { + kind: COLUMN_CONSTRAINT_KIND.CHECK, + value: { + expression, + }, + }; + } + if (ctx.REFERENCES()) { const names = ctx.qualified_name().accept(this); const refTableName = last(names); @@ -816,6 +848,13 @@ export default class PostgresASTGen extends PostgreSQLParserVisitor { cmd.value.endpoints[0].schemaName = schemaName; this.data.refs.push(cmd.value); break; + case TABLE_CONSTRAINT_KIND.CHECK: { + const table = findTable(this.data.tables, schemaName, tableName); + if (!table) break; + if (!table.constraints) table.constraints = []; + table.constraints.push(cmd.value); + break; + } case TABLE_CONSTRAINT_KIND.UNIQUE: case TABLE_CONSTRAINT_KIND.PK: case TABLE_CONSTRAINT_KIND.INDEX: { diff --git a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.g4 b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.g4 index 97328c055..26895e1b6 100644 --- a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.g4 +++ b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.g4 @@ -5401,7 +5401,7 @@ plsql_unreserved_keyword //| COLUMN_NAME | COMMIT | CONSTANT - | CONSTRAINT + //| CONSTRAINT // TDD 72 //| CONSTRAINT_NAME | CONTINUE_P | CURRENT_P diff --git a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.interp b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.interp index c2f066d03..927fda616 100644 --- a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.interp +++ b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.interp @@ -2179,4 +2179,4 @@ opt_returning_clause_into atn: -[4, 1, 679, 10705, 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, 2, 607, 7, 607, 2, 608, 7, 608, 2, 609, 7, 609, 2, 610, 7, 610, 2, 611, 7, 611, 2, 612, 7, 612, 2, 613, 7, 613, 2, 614, 7, 614, 2, 615, 7, 615, 2, 616, 7, 616, 2, 617, 7, 617, 2, 618, 7, 618, 2, 619, 7, 619, 2, 620, 7, 620, 2, 621, 7, 621, 2, 622, 7, 622, 2, 623, 7, 623, 2, 624, 7, 624, 2, 625, 7, 625, 2, 626, 7, 626, 2, 627, 7, 627, 2, 628, 7, 628, 2, 629, 7, 629, 2, 630, 7, 630, 2, 631, 7, 631, 2, 632, 7, 632, 2, 633, 7, 633, 2, 634, 7, 634, 2, 635, 7, 635, 2, 636, 7, 636, 2, 637, 7, 637, 2, 638, 7, 638, 2, 639, 7, 639, 2, 640, 7, 640, 2, 641, 7, 641, 2, 642, 7, 642, 2, 643, 7, 643, 2, 644, 7, 644, 2, 645, 7, 645, 2, 646, 7, 646, 2, 647, 7, 647, 2, 648, 7, 648, 2, 649, 7, 649, 2, 650, 7, 650, 2, 651, 7, 651, 2, 652, 7, 652, 2, 653, 7, 653, 2, 654, 7, 654, 2, 655, 7, 655, 2, 656, 7, 656, 2, 657, 7, 657, 2, 658, 7, 658, 2, 659, 7, 659, 2, 660, 7, 660, 2, 661, 7, 661, 2, 662, 7, 662, 2, 663, 7, 663, 2, 664, 7, 664, 2, 665, 7, 665, 2, 666, 7, 666, 2, 667, 7, 667, 2, 668, 7, 668, 2, 669, 7, 669, 2, 670, 7, 670, 2, 671, 7, 671, 2, 672, 7, 672, 2, 673, 7, 673, 2, 674, 7, 674, 2, 675, 7, 675, 2, 676, 7, 676, 2, 677, 7, 677, 2, 678, 7, 678, 2, 679, 7, 679, 2, 680, 7, 680, 2, 681, 7, 681, 2, 682, 7, 682, 2, 683, 7, 683, 2, 684, 7, 684, 2, 685, 7, 685, 2, 686, 7, 686, 2, 687, 7, 687, 2, 688, 7, 688, 2, 689, 7, 689, 2, 690, 7, 690, 2, 691, 7, 691, 2, 692, 7, 692, 2, 693, 7, 693, 2, 694, 7, 694, 2, 695, 7, 695, 2, 696, 7, 696, 2, 697, 7, 697, 2, 698, 7, 698, 2, 699, 7, 699, 2, 700, 7, 700, 2, 701, 7, 701, 2, 702, 7, 702, 2, 703, 7, 703, 2, 704, 7, 704, 2, 705, 7, 705, 2, 706, 7, 706, 2, 707, 7, 707, 2, 708, 7, 708, 2, 709, 7, 709, 2, 710, 7, 710, 2, 711, 7, 711, 2, 712, 7, 712, 2, 713, 7, 713, 2, 714, 7, 714, 2, 715, 7, 715, 2, 716, 7, 716, 2, 717, 7, 717, 2, 718, 7, 718, 2, 719, 7, 719, 2, 720, 7, 720, 2, 721, 7, 721, 2, 722, 7, 722, 2, 723, 7, 723, 2, 724, 7, 724, 2, 725, 7, 725, 2, 726, 7, 726, 2, 727, 7, 727, 2, 728, 7, 728, 2, 729, 7, 729, 2, 730, 7, 730, 2, 731, 7, 731, 2, 732, 7, 732, 2, 733, 7, 733, 2, 734, 7, 734, 2, 735, 7, 735, 2, 736, 7, 736, 2, 737, 7, 737, 2, 738, 7, 738, 2, 739, 7, 739, 2, 740, 7, 740, 2, 741, 7, 741, 2, 742, 7, 742, 2, 743, 7, 743, 2, 744, 7, 744, 2, 745, 7, 745, 2, 746, 7, 746, 2, 747, 7, 747, 2, 748, 7, 748, 2, 749, 7, 749, 2, 750, 7, 750, 2, 751, 7, 751, 2, 752, 7, 752, 2, 753, 7, 753, 2, 754, 7, 754, 2, 755, 7, 755, 2, 756, 7, 756, 2, 757, 7, 757, 2, 758, 7, 758, 2, 759, 7, 759, 2, 760, 7, 760, 2, 761, 7, 761, 2, 762, 7, 762, 2, 763, 7, 763, 2, 764, 7, 764, 2, 765, 7, 765, 2, 766, 7, 766, 2, 767, 7, 767, 2, 768, 7, 768, 2, 769, 7, 769, 2, 770, 7, 770, 2, 771, 7, 771, 2, 772, 7, 772, 2, 773, 7, 773, 2, 774, 7, 774, 2, 775, 7, 775, 2, 776, 7, 776, 2, 777, 7, 777, 2, 778, 7, 778, 2, 779, 7, 779, 2, 780, 7, 780, 2, 781, 7, 781, 2, 782, 7, 782, 2, 783, 7, 783, 2, 784, 7, 784, 2, 785, 7, 785, 2, 786, 7, 786, 2, 787, 7, 787, 2, 788, 7, 788, 2, 789, 7, 789, 2, 790, 7, 790, 2, 791, 7, 791, 2, 792, 7, 792, 2, 793, 7, 793, 2, 794, 7, 794, 2, 795, 7, 795, 2, 796, 7, 796, 2, 797, 7, 797, 2, 798, 7, 798, 2, 799, 7, 799, 2, 800, 7, 800, 2, 801, 7, 801, 2, 802, 7, 802, 2, 803, 7, 803, 2, 804, 7, 804, 2, 805, 7, 805, 2, 806, 7, 806, 2, 807, 7, 807, 2, 808, 7, 808, 2, 809, 7, 809, 2, 810, 7, 810, 2, 811, 7, 811, 2, 812, 7, 812, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 1636, 8, 3, 5, 3, 1638, 8, 3, 10, 3, 12, 3, 1641, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 1768, 8, 4, 1, 5, 1, 5, 3, 5, 1772, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 3, 8, 1785, 8, 8, 1, 9, 5, 9, 1788, 8, 9, 10, 9, 12, 9, 1791, 9, 9, 1, 10, 5, 10, 1794, 8, 10, 10, 10, 12, 10, 1797, 9, 10, 1, 11, 1, 11, 1, 11, 3, 11, 1802, 8, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 1817, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 1829, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 1847, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 1852, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 1862, 8, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 1886, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 1893, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 1899, 8, 22, 1, 23, 5, 23, 1902, 8, 23, 10, 23, 12, 23, 1905, 9, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 1913, 8, 24, 1, 25, 1, 25, 3, 25, 1917, 8, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 1929, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 1960, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 1965, 8, 29, 10, 29, 12, 29, 1968, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 1973, 8, 30, 10, 30, 12, 30, 1976, 9, 30, 1, 31, 1, 31, 3, 31, 1980, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 1987, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 1993, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 2010, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 2015, 8, 35, 1, 36, 1, 36, 3, 36, 2019, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 2032, 8, 38, 1, 39, 1, 39, 3, 39, 2036, 8, 39, 1, 40, 1, 40, 1, 40, 3, 40, 2041, 8, 40, 1, 41, 1, 41, 1, 41, 3, 41, 2046, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 2058, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 2067, 8, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2080, 8, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2085, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2096, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2107, 8, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2112, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2123, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2134, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2143, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2153, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2168, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2180, 8, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2185, 8, 48, 1, 49, 1, 49, 1, 49, 5, 49, 2190, 8, 49, 10, 49, 12, 49, 2193, 9, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 2203, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 2461, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 2468, 8, 53, 1, 54, 1, 54, 1, 54, 3, 54, 2473, 8, 54, 1, 55, 1, 55, 1, 55, 3, 55, 2478, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 2483, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 2491, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 3, 59, 2500, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 2505, 8, 60, 10, 60, 12, 60, 2508, 9, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 2517, 8, 61, 3, 61, 2519, 8, 61, 1, 62, 4, 62, 2522, 8, 62, 11, 62, 12, 62, 2523, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 2530, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 2536, 8, 63, 3, 63, 2538, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 2566, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 5, 66, 2574, 8, 66, 10, 66, 12, 66, 2577, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 5, 68, 2587, 8, 68, 10, 68, 12, 68, 2590, 9, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 2601, 8, 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, 3, 69, 2615, 8, 69, 1, 70, 1, 70, 1, 70, 3, 70, 2620, 8, 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, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 2644, 8, 71, 1, 72, 1, 72, 1, 73, 1, 73, 3, 73, 2650, 8, 73, 1, 74, 1, 74, 1, 74, 3, 74, 2655, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 2662, 8, 75, 1, 76, 5, 76, 2665, 8, 76, 10, 76, 12, 76, 2668, 9, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 2705, 8, 77, 1, 78, 1, 78, 3, 78, 2709, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 2716, 8, 79, 1, 80, 1, 80, 3, 80, 2720, 8, 80, 1, 81, 1, 81, 1, 81, 5, 81, 2725, 8, 81, 10, 81, 12, 81, 2728, 9, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 2741, 8, 83, 1, 84, 1, 84, 1, 84, 5, 84, 2746, 8, 84, 10, 84, 12, 84, 2749, 9, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 2759, 8, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 2792, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 2802, 8, 87, 1, 88, 1, 88, 3, 88, 2806, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 3, 89, 2813, 8, 89, 1, 90, 1, 90, 1, 90, 5, 90, 2818, 8, 90, 10, 90, 12, 90, 2821, 9, 90, 1, 91, 1, 91, 1, 91, 5, 91, 2826, 8, 91, 10, 91, 12, 91, 2829, 9, 91, 1, 92, 1, 92, 1, 92, 3, 92, 2834, 8, 92, 1, 93, 1, 93, 3, 93, 2838, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 2848, 8, 95, 1, 95, 1, 95, 1, 96, 5, 96, 2853, 8, 96, 10, 96, 12, 96, 2856, 9, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 2866, 8, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 3, 98, 2898, 8, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 3, 98, 2906, 8, 98, 1, 99, 1, 99, 1, 99, 3, 99, 2911, 8, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 3, 100, 2918, 8, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 5, 102, 2926, 8, 102, 10, 102, 12, 102, 2929, 9, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 2938, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 2958, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 2973, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 2998, 8, 105, 1, 106, 1, 106, 1, 106, 3, 106, 3003, 8, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 3010, 8, 107, 1, 108, 1, 108, 1, 108, 5, 108, 3015, 8, 108, 10, 108, 12, 108, 3018, 9, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 3, 110, 3028, 8, 110, 1, 111, 1, 111, 1, 111, 3, 111, 3033, 8, 111, 1, 112, 1, 112, 1, 112, 5, 112, 3038, 8, 112, 10, 112, 12, 112, 3041, 9, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 3, 113, 3051, 8, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 3, 114, 3059, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 3070, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 3, 118, 3086, 8, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 3, 119, 3094, 8, 119, 1, 120, 1, 120, 3, 120, 3098, 8, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 5, 122, 3110, 8, 122, 10, 122, 12, 122, 3113, 9, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 3129, 8, 123, 1, 124, 1, 124, 1, 124, 3, 124, 3134, 8, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 3, 125, 3141, 8, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 3, 126, 3150, 8, 126, 1, 126, 3, 126, 3153, 8, 126, 1, 127, 1, 127, 1, 127, 3, 127, 3158, 8, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 3, 128, 3165, 8, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 3, 130, 3176, 8, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 3189, 8, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 3, 132, 3202, 8, 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, 134, 1, 134, 1, 134, 1, 134, 3, 134, 3220, 8, 134, 1, 134, 3, 134, 3223, 8, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 3, 135, 3232, 8, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 3, 137, 3247, 8, 137, 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, 3, 139, 3262, 8, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 3, 140, 3271, 8, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 3, 141, 3278, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 3285, 8, 142, 1, 143, 4, 143, 3288, 8, 143, 11, 143, 12, 143, 3289, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 3, 144, 3320, 8, 144, 3, 144, 3322, 8, 144, 1, 145, 1, 145, 3, 145, 3326, 8, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 3, 146, 3334, 8, 146, 1, 147, 1, 147, 1, 147, 5, 147, 3339, 8, 147, 10, 147, 12, 147, 3342, 9, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 3, 148, 3355, 8, 148, 1, 149, 1, 149, 3, 149, 3359, 8, 149, 1, 150, 1, 150, 3, 150, 3363, 8, 150, 1, 151, 1, 151, 1, 151, 3, 151, 3368, 8, 151, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 3374, 8, 152, 1, 153, 1, 153, 3, 153, 3378, 8, 153, 1, 154, 1, 154, 3, 154, 3382, 8, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 3, 156, 3395, 8, 156, 1, 157, 1, 157, 1, 157, 1, 157, 3, 157, 3401, 8, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 3, 158, 3410, 8, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 5, 159, 3417, 8, 159, 10, 159, 12, 159, 3420, 9, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 3, 160, 3429, 8, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 5, 162, 3438, 8, 162, 10, 162, 12, 162, 3441, 9, 162, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 3, 164, 3550, 8, 164, 1, 165, 1, 165, 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, 166, 3, 166, 3568, 8, 166, 1, 167, 4, 167, 3571, 8, 167, 11, 167, 12, 167, 3572, 1, 168, 1, 168, 3, 168, 3577, 8, 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, 169, 1, 169, 3, 169, 3594, 8, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 3, 170, 3602, 8, 170, 1, 171, 1, 171, 1, 171, 5, 171, 3607, 8, 171, 10, 171, 12, 171, 3610, 9, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 5, 173, 3620, 8, 173, 10, 173, 12, 173, 3623, 9, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 3, 174, 3632, 8, 174, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 3, 178, 3666, 8, 178, 1, 179, 1, 179, 1, 179, 3, 179, 3671, 8, 179, 1, 180, 1, 180, 1, 180, 3, 180, 3676, 8, 180, 1, 181, 1, 181, 3, 181, 3680, 8, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 3, 182, 3688, 8, 182, 3, 182, 3690, 8, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 3, 183, 3748, 8, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 3, 185, 3765, 8, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 3, 186, 3773, 8, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 3, 187, 3796, 8, 187, 1, 188, 1, 188, 3, 188, 3800, 8, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 3, 189, 3820, 8, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 3, 193, 3857, 8, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 3, 194, 3866, 8, 194, 1, 195, 1, 195, 1, 195, 3, 195, 3871, 8, 195, 1, 196, 1, 196, 1, 196, 3, 196, 3876, 8, 196, 1, 197, 1, 197, 1, 197, 3, 197, 3881, 8, 197, 1, 198, 1, 198, 1, 198, 3, 198, 3886, 8, 198, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 3, 202, 3939, 8, 202, 1, 203, 1, 203, 1, 203, 1, 203, 3, 203, 3945, 8, 203, 1, 204, 1, 204, 1, 204, 5, 204, 3950, 8, 204, 10, 204, 12, 204, 3953, 9, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 3, 205, 3962, 8, 205, 1, 206, 1, 206, 1, 206, 3, 206, 3967, 8, 206, 1, 207, 4, 207, 3970, 8, 207, 11, 207, 12, 207, 3971, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 3, 212, 3990, 8, 212, 1, 213, 1, 213, 3, 213, 3994, 8, 213, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 3, 215, 4004, 8, 215, 1, 216, 1, 216, 1, 217, 1, 217, 3, 217, 4010, 8, 217, 1, 217, 1, 217, 5, 217, 4014, 8, 217, 10, 217, 12, 217, 4017, 9, 217, 1, 218, 1, 218, 1, 218, 1, 218, 3, 218, 4023, 8, 218, 1, 219, 1, 219, 1, 219, 3, 219, 4028, 8, 219, 1, 220, 5, 220, 4031, 8, 220, 10, 220, 12, 220, 4034, 9, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 3, 221, 4047, 8, 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, 3, 222, 4075, 8, 222, 1, 223, 1, 223, 1, 223, 5, 223, 4080, 8, 223, 10, 223, 12, 223, 4083, 9, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 5, 225, 4094, 8, 225, 10, 225, 12, 225, 4097, 9, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 3, 227, 4111, 8, 227, 1, 228, 1, 228, 1, 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, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 3, 229, 4228, 8, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 5, 231, 4237, 8, 231, 10, 231, 12, 231, 4240, 9, 231, 1, 232, 1, 232, 1, 232, 3, 232, 4245, 8, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 3, 233, 4253, 8, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 5, 235, 4262, 8, 235, 10, 235, 12, 235, 4265, 9, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 3, 237, 4273, 8, 237, 1, 238, 1, 238, 1, 238, 5, 238, 4278, 8, 238, 10, 238, 12, 238, 4281, 9, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 3, 239, 4320, 8, 239, 1, 240, 1, 240, 1, 240, 1, 240, 3, 240, 4326, 8, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 5, 242, 4345, 8, 242, 10, 242, 12, 242, 4348, 9, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 3, 243, 4375, 8, 243, 1, 244, 1, 244, 3, 244, 4379, 8, 244, 1, 245, 1, 245, 1, 245, 3, 245, 4384, 8, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 3, 246, 4393, 8, 246, 1, 247, 1, 247, 3, 247, 4397, 8, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 3, 249, 4424, 8, 249, 1, 250, 1, 250, 1, 250, 5, 250, 4429, 8, 250, 10, 250, 12, 250, 4432, 9, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 3, 251, 4446, 8, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 3, 252, 4466, 8, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 3, 253, 4486, 8, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 3, 256, 4579, 8, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 3, 257, 4604, 8, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 3, 258, 4611, 8, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 3, 259, 4627, 8, 259, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 5, 261, 4634, 8, 261, 10, 261, 12, 261, 4637, 9, 261, 1, 262, 1, 262, 3, 262, 4641, 8, 262, 1, 263, 1, 263, 4, 263, 4645, 8, 263, 11, 263, 12, 263, 4646, 1, 264, 1, 264, 1, 264, 5, 264, 4652, 8, 264, 10, 264, 12, 264, 4655, 9, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 3, 266, 4668, 8, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 3, 267, 4817, 8, 267, 1, 268, 1, 268, 3, 268, 4821, 8, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 3, 269, 4914, 8, 269, 1, 270, 1, 270, 1, 270, 3, 270, 4919, 8, 270, 1, 271, 1, 271, 3, 271, 4923, 8, 271, 1, 272, 1, 272, 1, 272, 1, 272, 3, 272, 4929, 8, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 3, 273, 4997, 8, 273, 1, 274, 1, 274, 1, 275, 1, 275, 3, 275, 5003, 8, 275, 1, 276, 1, 276, 1, 276, 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, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 3, 277, 5032, 8, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 3, 278, 5049, 8, 278, 1, 279, 1, 279, 1, 279, 5, 279, 5054, 8, 279, 10, 279, 12, 279, 5057, 9, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 3, 280, 5068, 8, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 3, 281, 5128, 8, 281, 1, 282, 1, 282, 1, 282, 5, 282, 5133, 8, 282, 10, 282, 12, 282, 5136, 9, 282, 1, 283, 1, 283, 1, 283, 3, 283, 5141, 8, 283, 1, 284, 1, 284, 1, 284, 1, 284, 3, 284, 5147, 8, 284, 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, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 3, 286, 5173, 8, 286, 1, 287, 1, 287, 1, 287, 1, 287, 3, 287, 5179, 8, 287, 1, 288, 1, 288, 1, 288, 1, 288, 3, 288, 5185, 8, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 5, 290, 5194, 8, 290, 10, 290, 12, 290, 5197, 9, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 3, 291, 5208, 8, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 3, 292, 5237, 8, 292, 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, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 3, 294, 5276, 8, 294, 1, 295, 1, 295, 3, 295, 5280, 8, 295, 1, 296, 1, 296, 3, 296, 5284, 8, 296, 1, 297, 1, 297, 3, 297, 5288, 8, 297, 1, 298, 1, 298, 1, 298, 3, 298, 5293, 8, 298, 1, 299, 1, 299, 1, 299, 5, 299, 5298, 8, 299, 10, 299, 12, 299, 5301, 9, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 3, 300, 5314, 8, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 3, 301, 5327, 8, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 3, 302, 5335, 8, 302, 1, 303, 1, 303, 1, 303, 5, 303, 5340, 8, 303, 10, 303, 12, 303, 5343, 9, 303, 1, 304, 1, 304, 1, 304, 3, 304, 5348, 8, 304, 1, 305, 1, 305, 3, 305, 5352, 8, 305, 1, 306, 1, 306, 1, 306, 3, 306, 5357, 8, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 3, 307, 5364, 8, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 3, 308, 5378, 8, 308, 3, 308, 5380, 8, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 3, 309, 5387, 8, 309, 1, 310, 1, 310, 3, 310, 5391, 8, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 5, 311, 5398, 8, 311, 10, 311, 12, 311, 5401, 9, 311, 1, 312, 1, 312, 1, 312, 5, 312, 5406, 8, 312, 10, 312, 12, 312, 5409, 9, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 3, 313, 5417, 8, 313, 3, 313, 5419, 8, 313, 1, 314, 1, 314, 3, 314, 5423, 8, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 5, 315, 5430, 8, 315, 10, 315, 12, 315, 5433, 9, 315, 1, 316, 1, 316, 3, 316, 5437, 8, 316, 1, 316, 1, 316, 1, 316, 1, 316, 3, 316, 5443, 8, 316, 1, 316, 1, 316, 1, 316, 3, 316, 5448, 8, 316, 1, 317, 1, 317, 3, 317, 5452, 8, 317, 1, 317, 1, 317, 1, 317, 3, 317, 5457, 8, 317, 1, 318, 1, 318, 1, 318, 1, 318, 3, 318, 5463, 8, 318, 1, 319, 1, 319, 1, 320, 1, 320, 3, 320, 5469, 8, 320, 1, 320, 1, 320, 1, 320, 1, 320, 3, 320, 5475, 8, 320, 1, 320, 1, 320, 1, 320, 1, 320, 3, 320, 5481, 8, 320, 1, 321, 1, 321, 1, 321, 3, 321, 5486, 8, 321, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 3, 323, 5501, 8, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 5, 324, 5508, 8, 324, 10, 324, 12, 324, 5511, 9, 324, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 5, 326, 5519, 8, 326, 10, 326, 12, 326, 5522, 9, 326, 1, 327, 4, 327, 5525, 8, 327, 11, 327, 12, 327, 5526, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 3, 328, 5566, 8, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 3, 329, 5576, 8, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 330, 3, 330, 5583, 8, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 5, 331, 5592, 8, 331, 10, 331, 12, 331, 5595, 9, 331, 1, 332, 1, 332, 1, 332, 3, 332, 5600, 8, 332, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 5, 334, 5608, 8, 334, 10, 334, 12, 334, 5611, 9, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 4, 336, 5620, 8, 336, 11, 336, 12, 336, 5621, 1, 337, 1, 337, 3, 337, 5626, 8, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 3, 338, 5664, 8, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 3, 339, 5678, 8, 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, 3, 340, 5692, 8, 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, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 3, 341, 5716, 8, 341, 1, 342, 1, 342, 1, 342, 5, 342, 5721, 8, 342, 10, 342, 12, 342, 5724, 9, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 5, 343, 5731, 8, 343, 10, 343, 12, 343, 5734, 9, 343, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 346, 4, 346, 5743, 8, 346, 11, 346, 12, 346, 5744, 1, 347, 1, 347, 1, 347, 3, 347, 5750, 8, 347, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 3, 348, 5786, 8, 348, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 3, 349, 5793, 8, 349, 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, 3, 351, 5808, 8, 351, 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, 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, 3, 353, 5855, 8, 353, 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, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 3, 355, 5892, 8, 355, 1, 356, 1, 356, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 5, 358, 5901, 8, 358, 10, 358, 12, 358, 5904, 9, 358, 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, 3, 360, 5920, 8, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 3, 361, 6390, 8, 361, 1, 362, 1, 362, 3, 362, 6394, 8, 362, 1, 363, 1, 363, 1, 363, 3, 363, 6399, 8, 363, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 3, 364, 6458, 8, 364, 1, 365, 1, 365, 3, 365, 6462, 8, 365, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 3, 366, 6681, 8, 366, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 368, 1, 368, 1, 368, 5, 368, 6694, 8, 368, 10, 368, 12, 368, 6697, 9, 368, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 3, 369, 6707, 8, 369, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 3, 370, 6714, 8, 370, 1, 371, 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, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 3, 372, 6907, 8, 372, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 374, 1, 374, 3, 374, 6917, 8, 374, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 3, 375, 6925, 8, 375, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 3, 376, 6954, 8, 376, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 378, 1, 378, 1, 378, 5, 378, 6968, 8, 378, 10, 378, 12, 378, 6971, 9, 378, 1, 379, 1, 379, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 3, 380, 7012, 8, 380, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 3, 381, 7026, 8, 381, 1, 382, 1, 382, 1, 382, 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, 3, 383, 7048, 8, 383, 1, 384, 1, 384, 1, 384, 5, 384, 7053, 8, 384, 10, 384, 12, 384, 7056, 9, 384, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 3, 385, 7063, 8, 385, 1, 386, 1, 386, 3, 386, 7067, 8, 386, 1, 387, 1, 387, 1, 388, 1, 388, 1, 388, 3, 388, 7074, 8, 388, 1, 389, 1, 389, 1, 389, 1, 389, 1, 390, 1, 390, 1, 390, 3, 390, 7083, 8, 390, 1, 391, 1, 391, 1, 391, 1, 392, 1, 392, 1, 392, 1, 392, 3, 392, 7092, 8, 392, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 3, 393, 7144, 8, 393, 1, 394, 1, 394, 1, 394, 3, 394, 7149, 8, 394, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 3, 395, 7161, 8, 395, 1, 396, 1, 396, 3, 396, 7165, 8, 396, 1, 396, 5, 396, 7168, 8, 396, 10, 396, 12, 396, 7171, 9, 396, 1, 397, 1, 397, 3, 397, 7175, 8, 397, 1, 398, 1, 398, 3, 398, 7179, 8, 398, 1, 398, 1, 398, 3, 398, 7183, 8, 398, 1, 399, 1, 399, 1, 399, 3, 399, 7188, 8, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 3, 399, 7204, 8, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 400, 1, 400, 3, 400, 7212, 8, 400, 1, 400, 1, 400, 1, 400, 3, 400, 7217, 8, 400, 1, 401, 1, 401, 1, 401, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 403, 1, 403, 3, 403, 7230, 8, 403, 1, 404, 4, 404, 7233, 8, 404, 11, 404, 12, 404, 7234, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 3, 405, 7242, 8, 405, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 3, 406, 7252, 8, 406, 1, 407, 1, 407, 3, 407, 7256, 8, 407, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 3, 408, 7267, 8, 408, 1, 409, 1, 409, 1, 409, 1, 409, 1, 409, 1, 410, 1, 410, 1, 410, 1, 410, 3, 410, 7278, 8, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 3, 410, 7286, 8, 410, 1, 411, 1, 411, 1, 411, 5, 411, 7291, 8, 411, 10, 411, 12, 411, 7294, 9, 411, 1, 412, 1, 412, 1, 413, 1, 413, 1, 413, 1, 413, 1, 413, 1, 413, 1, 414, 1, 414, 1, 414, 1, 414, 1, 414, 1, 415, 1, 415, 1, 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, 3, 416, 7332, 8, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 3, 416, 7340, 8, 416, 1, 417, 1, 417, 3, 417, 7344, 8, 417, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 3, 419, 7425, 8, 419, 1, 420, 1, 420, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 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, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 3, 422, 7453, 8, 422, 1, 423, 1, 423, 1, 423, 3, 423, 7458, 8, 423, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 3, 424, 7473, 8, 424, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 3, 425, 7485, 8, 425, 1, 426, 1, 426, 1, 426, 5, 426, 7490, 8, 426, 10, 426, 12, 426, 7493, 9, 426, 1, 427, 1, 427, 1, 428, 1, 428, 1, 428, 1, 429, 1, 429, 3, 429, 7502, 8, 429, 1, 430, 1, 430, 1, 430, 3, 430, 7507, 8, 430, 1, 431, 1, 431, 3, 431, 7511, 8, 431, 1, 432, 1, 432, 3, 432, 7515, 8, 432, 1, 433, 1, 433, 3, 433, 7519, 8, 433, 1, 434, 1, 434, 3, 434, 7523, 8, 434, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 3, 435, 7530, 8, 435, 1, 436, 1, 436, 1, 436, 1, 437, 1, 437, 1, 437, 5, 437, 7538, 8, 437, 10, 437, 12, 437, 7541, 9, 437, 1, 438, 1, 438, 3, 438, 7545, 8, 438, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 3, 439, 7563, 8, 439, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 3, 440, 7574, 8, 440, 1, 441, 1, 441, 1, 441, 5, 441, 7579, 8, 441, 10, 441, 12, 441, 7582, 9, 441, 1, 442, 1, 442, 1, 442, 1, 443, 1, 443, 3, 443, 7589, 8, 443, 1, 444, 1, 444, 1, 444, 3, 444, 7594, 8, 444, 1, 445, 1, 445, 1, 445, 1, 445, 1, 445, 1, 445, 1, 446, 1, 446, 1, 446, 1, 446, 1, 446, 3, 446, 7607, 8, 446, 1, 447, 1, 447, 1, 447, 1, 447, 3, 447, 7613, 8, 447, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 3, 448, 7642, 8, 448, 1, 449, 1, 449, 1, 449, 1, 449, 1, 449, 3, 449, 7649, 8, 449, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 3, 450, 7661, 8, 450, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 452, 1, 452, 1, 452, 3, 452, 7674, 8, 452, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 3, 453, 7689, 8, 453, 1, 453, 1, 453, 1, 453, 1, 453, 3, 453, 7695, 8, 453, 1, 454, 1, 454, 1, 455, 1, 455, 1, 455, 5, 455, 7702, 8, 455, 10, 455, 12, 455, 7705, 9, 455, 1, 456, 1, 456, 1, 456, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 3, 457, 7720, 8, 457, 1, 457, 3, 457, 7723, 8, 457, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 3, 458, 7734, 8, 458, 1, 459, 1, 459, 1, 459, 3, 459, 7739, 8, 459, 1, 460, 1, 460, 3, 460, 7743, 8, 460, 1, 460, 1, 460, 3, 460, 7747, 8, 460, 1, 460, 1, 460, 1, 460, 3, 460, 7752, 8, 460, 1, 460, 3, 460, 7755, 8, 460, 1, 460, 1, 460, 1, 460, 1, 460, 3, 460, 7761, 8, 460, 1, 460, 1, 460, 3, 460, 7765, 8, 460, 3, 460, 7767, 8, 460, 1, 460, 3, 460, 7770, 8, 460, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 3, 461, 7777, 8, 461, 1, 461, 3, 461, 7780, 8, 461, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 3, 461, 7787, 8, 461, 1, 461, 1, 461, 1, 462, 1, 462, 1, 462, 1, 462, 3, 462, 7795, 8, 462, 1, 462, 3, 462, 7798, 8, 462, 1, 462, 1, 462, 1, 462, 1, 462, 1, 463, 1, 463, 1, 463, 3, 463, 7807, 8, 463, 1, 463, 1, 463, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 465, 1, 465, 1, 465, 3, 465, 7822, 8, 465, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 3, 467, 7835, 8, 467, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 3, 468, 7846, 8, 468, 1, 468, 3, 468, 7849, 8, 468, 1, 469, 1, 469, 3, 469, 7853, 8, 469, 1, 470, 1, 470, 1, 470, 1, 470, 3, 470, 7859, 8, 470, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 472, 1, 472, 1, 472, 5, 472, 7873, 8, 472, 10, 472, 12, 472, 7876, 9, 472, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 3, 473, 7888, 8, 473, 1, 474, 1, 474, 1, 474, 1, 475, 1, 475, 1, 475, 5, 475, 7896, 8, 475, 10, 475, 12, 475, 7899, 9, 475, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 477, 1, 477, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 5, 478, 7916, 8, 478, 10, 478, 12, 478, 7919, 9, 478, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 3, 479, 7926, 8, 479, 1, 480, 1, 480, 3, 480, 7930, 8, 480, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 3, 481, 7940, 8, 481, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 3, 482, 7950, 8, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 3, 482, 7961, 8, 482, 3, 482, 7963, 8, 482, 1, 483, 1, 483, 3, 483, 7967, 8, 483, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 3, 484, 7977, 8, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 3, 484, 7993, 8, 484, 3, 484, 7995, 8, 484, 1, 484, 1, 484, 1, 484, 3, 484, 8000, 8, 484, 5, 484, 8002, 8, 484, 10, 484, 12, 484, 8005, 9, 484, 1, 485, 1, 485, 1, 485, 3, 485, 8010, 8, 485, 1, 486, 1, 486, 1, 486, 1, 487, 1, 487, 3, 487, 8017, 8, 487, 1, 487, 1, 487, 1, 488, 1, 488, 1, 488, 5, 488, 8024, 8, 488, 10, 488, 12, 488, 8027, 9, 488, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 490, 1, 490, 1, 490, 1, 490, 3, 490, 8041, 8, 490, 1, 491, 1, 491, 3, 491, 8045, 8, 491, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 3, 492, 8052, 8, 492, 1, 492, 3, 492, 8055, 8, 492, 1, 493, 1, 493, 3, 493, 8059, 8, 493, 1, 494, 3, 494, 8062, 8, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 3, 494, 8075, 8, 494, 1, 495, 1, 495, 3, 495, 8079, 8, 495, 1, 496, 1, 496, 1, 496, 3, 496, 8084, 8, 496, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 3, 497, 8092, 8, 497, 1, 498, 1, 498, 3, 498, 8096, 8, 498, 1, 499, 1, 499, 3, 499, 8100, 8, 499, 1, 500, 1, 500, 1, 500, 1, 500, 1, 501, 1, 501, 1, 501, 5, 501, 8109, 8, 501, 10, 501, 12, 501, 8112, 9, 501, 1, 502, 1, 502, 1, 502, 1, 502, 3, 502, 8118, 8, 502, 1, 502, 1, 502, 1, 503, 1, 503, 3, 503, 8124, 8, 503, 1, 503, 1, 503, 3, 503, 8128, 8, 503, 3, 503, 8130, 8, 503, 1, 504, 1, 504, 3, 504, 8134, 8, 504, 1, 505, 1, 505, 1, 505, 1, 505, 3, 505, 8140, 8, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 3, 505, 8149, 8, 505, 1, 505, 1, 505, 1, 505, 1, 505, 3, 505, 8155, 8, 505, 3, 505, 8157, 8, 505, 3, 505, 8159, 8, 505, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 3, 506, 8166, 8, 506, 1, 507, 1, 507, 3, 507, 8170, 8, 507, 1, 508, 1, 508, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 3, 509, 8179, 8, 509, 1, 510, 1, 510, 3, 510, 8183, 8, 510, 1, 511, 1, 511, 1, 512, 1, 512, 1, 513, 1, 513, 1, 513, 1, 513, 3, 513, 8193, 8, 513, 1, 514, 1, 514, 1, 514, 5, 514, 8198, 8, 514, 10, 514, 12, 514, 8201, 9, 514, 1, 515, 1, 515, 1, 515, 1, 515, 1, 515, 3, 515, 8208, 8, 515, 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, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 520, 1, 520, 1, 520, 3, 520, 8232, 8, 520, 1, 521, 1, 521, 1, 521, 1, 521, 3, 521, 8238, 8, 521, 1, 522, 1, 522, 3, 522, 8242, 8, 522, 1, 523, 4, 523, 8245, 8, 523, 11, 523, 12, 523, 8246, 1, 524, 1, 524, 1, 524, 1, 524, 1, 525, 1, 525, 1, 525, 3, 525, 8256, 8, 525, 1, 525, 1, 525, 3, 525, 8260, 8, 525, 1, 525, 3, 525, 8263, 8, 525, 1, 526, 1, 526, 1, 526, 3, 526, 8268, 8, 526, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 5, 527, 8279, 8, 527, 10, 527, 12, 527, 8282, 9, 527, 1, 528, 1, 528, 1, 528, 3, 528, 8287, 8, 528, 1, 529, 1, 529, 1, 529, 1, 529, 5, 529, 8293, 8, 529, 10, 529, 12, 529, 8296, 9, 529, 3, 529, 8298, 8, 529, 1, 530, 1, 530, 1, 530, 4, 530, 8303, 8, 530, 11, 530, 12, 530, 8304, 1, 531, 1, 531, 1, 531, 3, 531, 8310, 8, 531, 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, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8331, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8340, 8, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8345, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8351, 8, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8356, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8363, 8, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8368, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 5, 531, 8374, 8, 531, 10, 531, 12, 531, 8377, 9, 531, 1, 532, 3, 532, 8380, 8, 532, 1, 532, 1, 532, 1, 532, 1, 532, 1, 532, 3, 532, 8387, 8, 532, 1, 533, 1, 533, 3, 533, 8391, 8, 533, 1, 534, 3, 534, 8394, 8, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 3, 534, 8401, 8, 534, 1, 535, 1, 535, 1, 535, 3, 535, 8406, 8, 535, 1, 535, 3, 535, 8409, 8, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 3, 535, 8416, 8, 535, 1, 536, 1, 536, 3, 536, 8420, 8, 536, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 3, 537, 8429, 8, 537, 1, 538, 1, 538, 3, 538, 8433, 8, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 3, 538, 8441, 8, 538, 3, 538, 8443, 8, 538, 1, 539, 1, 539, 1, 539, 5, 539, 8448, 8, 539, 10, 539, 12, 539, 8451, 9, 539, 1, 540, 1, 540, 3, 540, 8455, 8, 540, 1, 540, 3, 540, 8458, 8, 540, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 3, 542, 8473, 8, 542, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 3, 543, 8485, 8, 543, 1, 544, 1, 544, 1, 544, 1, 545, 1, 545, 1, 545, 5, 545, 8493, 8, 545, 10, 545, 12, 545, 8496, 9, 545, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 3, 546, 8504, 8, 546, 1, 547, 1, 547, 1, 547, 3, 547, 8509, 8, 547, 1, 548, 1, 548, 1, 548, 3, 548, 8514, 8, 548, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 3, 549, 8521, 8, 549, 1, 549, 3, 549, 8524, 8, 549, 1, 550, 1, 550, 3, 550, 8528, 8, 550, 1, 551, 1, 551, 1, 551, 5, 551, 8533, 8, 551, 10, 551, 12, 551, 8536, 9, 551, 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, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 3, 553, 8559, 8, 553, 1, 553, 1, 553, 1, 554, 1, 554, 1, 554, 5, 554, 8566, 8, 554, 10, 554, 12, 554, 8569, 9, 554, 1, 555, 1, 555, 1, 555, 3, 555, 8574, 8, 555, 1, 555, 1, 555, 3, 555, 8578, 8, 555, 1, 556, 4, 556, 8581, 8, 556, 11, 556, 12, 556, 8582, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 3, 557, 8593, 8, 557, 1, 558, 1, 558, 1, 558, 5, 558, 8598, 8, 558, 10, 558, 12, 558, 8601, 9, 558, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 3, 559, 8609, 8, 559, 1, 560, 3, 560, 8612, 8, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 3, 560, 8621, 8, 560, 3, 560, 8623, 8, 560, 1, 560, 1, 560, 1, 560, 1, 560, 3, 560, 8629, 8, 560, 1, 561, 1, 561, 3, 561, 8633, 8, 561, 1, 561, 5, 561, 8636, 8, 561, 10, 561, 12, 561, 8639, 9, 561, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 3, 562, 8652, 8, 562, 3, 562, 8654, 8, 562, 1, 563, 1, 563, 1, 563, 1, 563, 3, 563, 8660, 8, 563, 1, 564, 1, 564, 1, 564, 1, 564, 3, 564, 8666, 8, 564, 1, 564, 3, 564, 8669, 8, 564, 1, 564, 1, 564, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 3, 565, 8678, 8, 565, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 3, 566, 8696, 8, 566, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 3, 567, 8703, 8, 567, 1, 568, 1, 568, 3, 568, 8707, 8, 568, 1, 569, 1, 569, 3, 569, 8711, 8, 569, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 571, 1, 571, 1, 571, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 3, 572, 8727, 8, 572, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 3, 573, 8734, 8, 573, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 3, 574, 8742, 8, 574, 1, 575, 1, 575, 3, 575, 8746, 8, 575, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 3, 576, 8753, 8, 576, 1, 576, 1, 576, 1, 577, 1, 577, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 3, 578, 8766, 8, 578, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 3, 579, 8782, 8, 579, 1, 579, 1, 579, 1, 579, 1, 579, 3, 579, 8788, 8, 579, 1, 579, 1, 579, 1, 579, 1, 579, 3, 579, 8794, 8, 579, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 3, 580, 8801, 8, 580, 1, 581, 1, 581, 1, 581, 3, 581, 8806, 8, 581, 1, 582, 1, 582, 1, 583, 1, 583, 3, 583, 8812, 8, 583, 1, 584, 1, 584, 1, 584, 5, 584, 8817, 8, 584, 10, 584, 12, 584, 8820, 9, 584, 1, 585, 1, 585, 1, 585, 5, 585, 8825, 8, 585, 10, 585, 12, 585, 8828, 9, 585, 1, 586, 1, 586, 1, 586, 5, 586, 8833, 8, 586, 10, 586, 12, 586, 8836, 9, 586, 1, 587, 1, 587, 3, 587, 8840, 8, 587, 1, 587, 1, 587, 3, 587, 8844, 8, 587, 1, 587, 1, 587, 1, 587, 1, 587, 3, 587, 8850, 8, 587, 1, 588, 1, 588, 3, 588, 8854, 8, 588, 1, 588, 1, 588, 3, 588, 8858, 8, 588, 1, 589, 3, 589, 8861, 8, 589, 1, 589, 1, 589, 1, 590, 1, 590, 3, 590, 8867, 8, 590, 1, 591, 1, 591, 1, 591, 3, 591, 8872, 8, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 3, 591, 8888, 8, 591, 1, 591, 3, 591, 8891, 8, 591, 3, 591, 8893, 8, 591, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 3, 592, 8905, 8, 592, 3, 592, 8907, 8, 592, 1, 593, 1, 593, 3, 593, 8911, 8, 593, 1, 593, 1, 593, 1, 593, 1, 593, 3, 593, 8917, 8, 593, 1, 593, 1, 593, 1, 593, 3, 593, 8922, 8, 593, 1, 594, 1, 594, 1, 594, 1, 594, 5, 594, 8928, 8, 594, 10, 594, 12, 594, 8931, 9, 594, 1, 595, 3, 595, 8934, 8, 595, 1, 595, 1, 595, 1, 596, 1, 596, 1, 596, 5, 596, 8941, 8, 596, 10, 596, 12, 596, 8944, 9, 596, 1, 597, 1, 597, 1, 597, 5, 597, 8949, 8, 597, 10, 597, 12, 597, 8952, 9, 597, 1, 598, 1, 598, 1, 598, 3, 598, 8957, 8, 598, 1, 599, 3, 599, 8960, 8, 599, 1, 599, 1, 599, 1, 600, 1, 600, 1, 600, 1, 600, 1, 600, 3, 600, 8969, 8, 600, 1, 601, 1, 601, 1, 601, 3, 601, 8974, 8, 601, 1, 602, 1, 602, 1, 602, 5, 602, 8979, 8, 602, 10, 602, 12, 602, 8982, 9, 602, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 3, 603, 8991, 8, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 3, 603, 9017, 8, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 3, 603, 9028, 8, 603, 5, 603, 9030, 8, 603, 10, 603, 12, 603, 9033, 9, 603, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 3, 604, 9040, 8, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 3, 604, 9063, 8, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 3, 604, 9071, 8, 604, 1, 605, 1, 605, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 3, 606, 9081, 8, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 3, 606, 9095, 8, 606, 1, 606, 1, 606, 1, 607, 1, 607, 1, 607, 1, 607, 1, 607, 1, 607, 3, 607, 9105, 8, 607, 1, 608, 1, 608, 3, 608, 9109, 8, 608, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9123, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9130, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9137, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9144, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9169, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9198, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9237, 8, 609, 3, 609, 9239, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9267, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9288, 8, 609, 1, 610, 1, 610, 1, 610, 1, 610, 1, 610, 3, 610, 9295, 8, 610, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 3, 611, 9308, 8, 611, 1, 612, 1, 612, 1, 612, 1, 612, 1, 612, 1, 613, 1, 613, 1, 613, 5, 613, 9318, 8, 613, 10, 613, 12, 613, 9321, 9, 613, 1, 614, 1, 614, 1, 614, 3, 614, 9326, 8, 614, 1, 615, 1, 615, 1, 616, 1, 616, 1, 616, 1, 616, 1, 616, 3, 616, 9335, 8, 616, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 3, 617, 9352, 8, 617, 1, 618, 1, 618, 1, 618, 1, 619, 1, 619, 1, 619, 1, 619, 1, 619, 1, 619, 1, 619, 3, 619, 9364, 8, 619, 1, 620, 1, 620, 1, 620, 1, 620, 1, 620, 1, 620, 1, 620, 3, 620, 9373, 8, 620, 1, 621, 1, 621, 1, 621, 3, 621, 9378, 8, 621, 1, 622, 1, 622, 1, 622, 5, 622, 9383, 8, 622, 10, 622, 12, 622, 9386, 9, 622, 1, 623, 1, 623, 1, 623, 1, 623, 1, 624, 1, 624, 1, 624, 3, 624, 9395, 8, 624, 1, 624, 3, 624, 9398, 8, 624, 1, 625, 1, 625, 1, 625, 1, 625, 1, 625, 1, 625, 1, 625, 1, 626, 1, 626, 3, 626, 9409, 8, 626, 1, 627, 1, 627, 1, 627, 1, 627, 3, 627, 9415, 8, 627, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 3, 628, 9430, 8, 628, 1, 629, 1, 629, 1, 629, 1, 629, 1, 629, 1, 629, 3, 629, 9438, 8, 629, 1, 630, 1, 630, 1, 630, 1, 630, 1, 630, 1, 630, 1, 630, 3, 630, 9447, 8, 630, 1, 631, 1, 631, 1, 631, 1, 631, 1, 631, 1, 631, 1, 631, 3, 631, 9456, 8, 631, 1, 631, 3, 631, 9459, 8, 631, 1, 632, 1, 632, 1, 632, 3, 632, 9464, 8, 632, 1, 632, 1, 632, 1, 632, 1, 632, 1, 632, 1, 632, 1, 632, 3, 632, 9473, 8, 632, 1, 633, 1, 633, 1, 633, 3, 633, 9478, 8, 633, 1, 633, 1, 633, 1, 634, 1, 634, 1, 634, 1, 634, 1, 634, 1, 634, 1, 635, 1, 635, 1, 636, 1, 636, 3, 636, 9492, 8, 636, 1, 637, 1, 637, 1, 638, 1, 638, 1, 638, 1, 638, 1, 638, 1, 638, 3, 638, 9502, 8, 638, 1, 639, 1, 639, 1, 639, 1, 639, 1, 639, 1, 639, 3, 639, 9510, 8, 639, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 3, 640, 9524, 8, 640, 1, 641, 1, 641, 1, 641, 5, 641, 9529, 8, 641, 10, 641, 12, 641, 9532, 9, 641, 1, 642, 1, 642, 1, 642, 5, 642, 9537, 8, 642, 10, 642, 12, 642, 9540, 9, 642, 1, 643, 1, 643, 1, 643, 1, 643, 1, 643, 3, 643, 9547, 8, 643, 1, 644, 1, 644, 1, 644, 5, 644, 9552, 8, 644, 10, 644, 12, 644, 9555, 9, 644, 1, 645, 1, 645, 1, 645, 3, 645, 9560, 8, 645, 1, 645, 1, 645, 1, 646, 1, 646, 1, 646, 5, 646, 9567, 8, 646, 10, 646, 12, 646, 9570, 9, 646, 1, 647, 1, 647, 1, 647, 1, 647, 1, 647, 3, 647, 9577, 8, 647, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 3, 648, 9587, 8, 648, 1, 649, 1, 649, 1, 650, 1, 650, 1, 650, 1, 650, 1, 650, 1, 650, 1, 650, 3, 650, 9598, 8, 650, 1, 651, 1, 651, 1, 651, 1, 651, 1, 651, 3, 651, 9605, 8, 651, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 3, 652, 9635, 8, 652, 1, 653, 1, 653, 1, 653, 1, 653, 1, 653, 1, 653, 1, 653, 3, 653, 9644, 8, 653, 1, 654, 1, 654, 1, 654, 1, 654, 1, 654, 3, 654, 9651, 8, 654, 1, 655, 1, 655, 1, 655, 1, 655, 1, 655, 1, 655, 1, 656, 4, 656, 9660, 8, 656, 11, 656, 12, 656, 9661, 1, 657, 1, 657, 1, 657, 1, 657, 1, 657, 1, 658, 1, 658, 1, 658, 3, 658, 9672, 8, 658, 1, 659, 1, 659, 3, 659, 9676, 8, 659, 1, 660, 1, 660, 3, 660, 9680, 8, 660, 1, 661, 1, 661, 1, 661, 3, 661, 9685, 8, 661, 1, 661, 1, 661, 1, 661, 1, 661, 1, 661, 1, 661, 3, 661, 9693, 8, 661, 1, 661, 1, 661, 3, 661, 9697, 8, 661, 1, 662, 1, 662, 3, 662, 9701, 8, 662, 1, 663, 4, 663, 9704, 8, 663, 11, 663, 12, 663, 9705, 1, 664, 5, 664, 9709, 8, 664, 10, 664, 12, 664, 9712, 9, 664, 1, 665, 1, 665, 3, 665, 9716, 8, 665, 1, 666, 1, 666, 1, 666, 5, 666, 9721, 8, 666, 10, 666, 12, 666, 9724, 9, 666, 1, 667, 1, 667, 1, 667, 1, 667, 1, 667, 3, 667, 9731, 8, 667, 1, 667, 3, 667, 9734, 8, 667, 1, 668, 1, 668, 1, 668, 5, 668, 9739, 8, 668, 10, 668, 12, 668, 9742, 9, 668, 1, 669, 1, 669, 3, 669, 9746, 8, 669, 1, 670, 1, 670, 1, 670, 5, 670, 9751, 8, 670, 10, 670, 12, 670, 9754, 9, 670, 1, 671, 1, 671, 1, 672, 1, 672, 1, 673, 1, 673, 1, 674, 1, 674, 1, 674, 1, 674, 1, 674, 1, 674, 1, 674, 3, 674, 9769, 8, 674, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 3, 675, 9784, 8, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 3, 675, 9798, 8, 675, 1, 675, 1, 675, 1, 675, 3, 675, 9803, 8, 675, 1, 676, 1, 676, 1, 677, 1, 677, 1, 678, 1, 678, 1, 679, 1, 679, 1, 680, 1, 680, 1, 680, 1, 681, 1, 681, 1, 681, 1, 681, 5, 681, 9820, 8, 681, 10, 681, 12, 681, 9823, 9, 681, 1, 681, 1, 681, 3, 681, 9827, 8, 681, 1, 682, 1, 682, 1, 682, 3, 682, 9832, 8, 682, 1, 683, 1, 683, 1, 683, 1, 683, 1, 683, 3, 683, 9839, 8, 683, 1, 684, 1, 684, 1, 685, 1, 685, 1, 685, 3, 685, 9846, 8, 685, 1, 686, 1, 686, 1, 686, 5, 686, 9851, 8, 686, 10, 686, 12, 686, 9854, 9, 686, 1, 687, 1, 687, 1, 687, 1, 687, 1, 687, 1, 687, 3, 687, 9862, 8, 687, 1, 688, 1, 688, 1, 688, 1, 688, 3, 688, 9868, 8, 688, 1, 689, 1, 689, 1, 689, 1, 689, 3, 689, 9874, 8, 689, 1, 690, 1, 690, 1, 690, 1, 690, 3, 690, 9880, 8, 690, 1, 691, 1, 691, 1, 691, 1, 691, 1, 691, 1, 691, 3, 691, 9888, 8, 691, 1, 692, 1, 692, 1, 692, 1, 692, 1, 692, 1, 692, 1, 692, 3, 692, 9897, 8, 692, 1, 693, 1, 693, 1, 694, 1, 694, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 3, 695, 9955, 8, 695, 1, 696, 1, 696, 1, 697, 1, 697, 1, 698, 1, 698, 1, 699, 1, 699, 1, 699, 1, 699, 1, 700, 5, 700, 9968, 8, 700, 10, 700, 12, 700, 9971, 9, 700, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 3, 701, 9993, 8, 701, 1, 702, 1, 702, 1, 703, 1, 703, 1, 703, 1, 703, 3, 703, 10001, 8, 703, 1, 704, 1, 704, 3, 704, 10005, 8, 704, 1, 705, 1, 705, 1, 705, 1, 705, 1, 705, 1, 705, 1, 705, 1, 706, 1, 706, 1, 706, 3, 706, 10017, 8, 706, 3, 706, 10019, 8, 706, 1, 707, 1, 707, 1, 708, 4, 708, 10024, 8, 708, 11, 708, 12, 708, 10025, 1, 709, 1, 709, 1, 709, 1, 709, 1, 710, 1, 710, 1, 710, 3, 710, 10035, 8, 710, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 3, 711, 10053, 8, 711, 1, 711, 1, 711, 1, 712, 1, 712, 1, 712, 1, 712, 3, 712, 10061, 8, 712, 1, 713, 1, 713, 1, 714, 1, 714, 1, 714, 1, 714, 1, 714, 3, 714, 10070, 8, 714, 1, 715, 1, 715, 1, 715, 5, 715, 10075, 8, 715, 10, 715, 12, 715, 10078, 9, 715, 1, 716, 1, 716, 1, 716, 1, 717, 1, 717, 1, 718, 1, 718, 3, 718, 10087, 8, 718, 1, 719, 1, 719, 1, 720, 1, 720, 3, 720, 10093, 8, 720, 1, 721, 1, 721, 1, 722, 1, 722, 1, 722, 3, 722, 10100, 8, 722, 1, 723, 1, 723, 1, 723, 3, 723, 10105, 8, 723, 1, 724, 1, 724, 1, 724, 1, 724, 3, 724, 10111, 8, 724, 1, 725, 1, 725, 3, 725, 10115, 8, 725, 1, 726, 1, 726, 1, 727, 5, 727, 10120, 8, 727, 10, 727, 12, 727, 10123, 9, 727, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 3, 728, 10152, 8, 728, 1, 729, 1, 729, 1, 729, 1, 729, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 3, 730, 10172, 8, 730, 1, 731, 1, 731, 3, 731, 10176, 8, 731, 1, 732, 1, 732, 1, 732, 1, 732, 1, 732, 1, 733, 1, 733, 1, 733, 1, 733, 1, 733, 1, 733, 1, 734, 1, 734, 1, 734, 3, 734, 10192, 8, 734, 1, 735, 1, 735, 1, 735, 5, 735, 10197, 8, 735, 10, 735, 12, 735, 10200, 9, 735, 1, 736, 1, 736, 1, 736, 1, 736, 1, 737, 1, 737, 1, 738, 1, 738, 1, 739, 1, 739, 3, 739, 10212, 8, 739, 1, 739, 1, 739, 1, 739, 1, 739, 5, 739, 10218, 8, 739, 10, 739, 12, 739, 10221, 9, 739, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 741, 1, 741, 1, 741, 1, 741, 1, 741, 5, 741, 10238, 8, 741, 10, 741, 12, 741, 10241, 9, 741, 1, 742, 1, 742, 1, 742, 3, 742, 10246, 8, 742, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 744, 1, 744, 3, 744, 10258, 8, 744, 1, 745, 4, 745, 10261, 8, 745, 11, 745, 12, 745, 10262, 1, 746, 1, 746, 1, 746, 1, 746, 1, 746, 1, 747, 1, 747, 1, 747, 3, 747, 10273, 8, 747, 1, 748, 1, 748, 1, 748, 1, 749, 1, 749, 1, 749, 1, 749, 1, 749, 1, 750, 1, 750, 1, 750, 1, 750, 1, 750, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 3, 751, 10305, 8, 751, 1, 752, 1, 752, 1, 752, 3, 752, 10310, 8, 752, 1, 753, 1, 753, 1, 753, 1, 753, 1, 753, 5, 753, 10317, 8, 753, 10, 753, 12, 753, 10320, 9, 753, 1, 753, 1, 753, 3, 753, 10324, 8, 753, 1, 754, 1, 754, 3, 754, 10328, 8, 754, 1, 755, 1, 755, 1, 755, 3, 755, 10333, 8, 755, 1, 756, 1, 756, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 758, 1, 758, 1, 758, 3, 758, 10349, 8, 758, 1, 759, 1, 759, 1, 759, 1, 759, 1, 759, 1, 760, 1, 760, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 3, 761, 10367, 8, 761, 1, 761, 3, 761, 10370, 8, 761, 1, 761, 1, 761, 1, 762, 1, 762, 3, 762, 10376, 8, 762, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 3, 763, 10404, 8, 763, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 3, 764, 10414, 8, 764, 1, 765, 1, 765, 1, 765, 4, 765, 10419, 8, 765, 11, 765, 12, 765, 10420, 3, 765, 10423, 8, 765, 1, 766, 1, 766, 1, 766, 3, 766, 10428, 8, 766, 1, 767, 1, 767, 1, 767, 1, 767, 1, 768, 1, 768, 1, 768, 5, 768, 10437, 8, 768, 10, 768, 12, 768, 10440, 9, 768, 1, 769, 1, 769, 1, 769, 1, 769, 1, 769, 1, 770, 1, 770, 1, 770, 3, 770, 10450, 8, 770, 1, 771, 1, 771, 1, 771, 1, 771, 1, 771, 1, 771, 1, 771, 1, 772, 1, 772, 1, 772, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 3, 773, 10471, 8, 773, 1, 773, 1, 773, 1, 774, 1, 774, 1, 774, 3, 774, 10478, 8, 774, 1, 775, 1, 775, 1, 775, 5, 775, 10483, 8, 775, 10, 775, 12, 775, 10486, 9, 775, 1, 776, 1, 776, 1, 776, 3, 776, 10491, 8, 776, 1, 776, 3, 776, 10494, 8, 776, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 3, 777, 10505, 8, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 3, 777, 10512, 8, 777, 3, 777, 10514, 8, 777, 1, 777, 1, 777, 1, 778, 1, 778, 1, 778, 1, 778, 1, 778, 3, 778, 10523, 8, 778, 1, 779, 1, 779, 1, 779, 5, 779, 10528, 8, 779, 10, 779, 12, 779, 10531, 9, 779, 1, 780, 1, 780, 1, 780, 3, 780, 10536, 8, 780, 1, 781, 1, 781, 1, 781, 1, 781, 3, 781, 10542, 8, 781, 1, 782, 1, 782, 3, 782, 10546, 8, 782, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 784, 1, 784, 1, 785, 1, 785, 1, 785, 3, 785, 10561, 8, 785, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 3, 786, 10578, 8, 786, 3, 786, 10580, 8, 786, 1, 787, 1, 787, 1, 787, 1, 787, 1, 787, 1, 788, 1, 788, 1, 788, 1, 788, 1, 789, 1, 789, 1, 789, 1, 790, 1, 790, 1, 790, 1, 790, 1, 791, 1, 791, 1, 791, 1, 791, 1, 792, 1, 792, 3, 792, 10604, 8, 792, 1, 792, 1, 792, 3, 792, 10608, 8, 792, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 3, 793, 10619, 8, 793, 1, 793, 3, 793, 10622, 8, 793, 1, 794, 1, 794, 3, 794, 10626, 8, 794, 1, 795, 1, 795, 1, 795, 3, 795, 10631, 8, 795, 1, 796, 4, 796, 10634, 8, 796, 11, 796, 12, 796, 10635, 1, 797, 1, 797, 1, 797, 1, 797, 1, 797, 1, 798, 1, 798, 1, 798, 5, 798, 10646, 8, 798, 10, 798, 12, 798, 10649, 9, 798, 1, 799, 1, 799, 1, 799, 3, 799, 10654, 8, 799, 1, 800, 1, 800, 3, 800, 10658, 8, 800, 1, 801, 1, 801, 3, 801, 10662, 8, 801, 1, 802, 1, 802, 3, 802, 10666, 8, 802, 1, 803, 1, 803, 1, 803, 3, 803, 10671, 8, 803, 1, 804, 1, 804, 3, 804, 10675, 8, 804, 1, 805, 1, 805, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 807, 1, 807, 1, 808, 1, 808, 1, 809, 1, 809, 1, 810, 1, 810, 1, 811, 1, 811, 1, 811, 1, 812, 1, 812, 1, 812, 1, 812, 1, 812, 3, 812, 10703, 8, 812, 1, 812, 0, 1, 1206, 813, 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, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, 532, 534, 536, 538, 540, 542, 544, 546, 548, 550, 552, 554, 556, 558, 560, 562, 564, 566, 568, 570, 572, 574, 576, 578, 580, 582, 584, 586, 588, 590, 592, 594, 596, 598, 600, 602, 604, 606, 608, 610, 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 662, 664, 666, 668, 670, 672, 674, 676, 678, 680, 682, 684, 686, 688, 690, 692, 694, 696, 698, 700, 702, 704, 706, 708, 710, 712, 714, 716, 718, 720, 722, 724, 726, 728, 730, 732, 734, 736, 738, 740, 742, 744, 746, 748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 782, 784, 786, 788, 790, 792, 794, 796, 798, 800, 802, 804, 806, 808, 810, 812, 814, 816, 818, 820, 822, 824, 826, 828, 830, 832, 834, 836, 838, 840, 842, 844, 846, 848, 850, 852, 854, 856, 858, 860, 862, 864, 866, 868, 870, 872, 874, 876, 878, 880, 882, 884, 886, 888, 890, 892, 894, 896, 898, 900, 902, 904, 906, 908, 910, 912, 914, 916, 918, 920, 922, 924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 944, 946, 948, 950, 952, 954, 956, 958, 960, 962, 964, 966, 968, 970, 972, 974, 976, 978, 980, 982, 984, 986, 988, 990, 992, 994, 996, 998, 1000, 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018, 1020, 1022, 1024, 1026, 1028, 1030, 1032, 1034, 1036, 1038, 1040, 1042, 1044, 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060, 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076, 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1092, 1094, 1096, 1098, 1100, 1102, 1104, 1106, 1108, 1110, 1112, 1114, 1116, 1118, 1120, 1122, 1124, 1126, 1128, 1130, 1132, 1134, 1136, 1138, 1140, 1142, 1144, 1146, 1148, 1150, 1152, 1154, 1156, 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174, 1176, 1178, 1180, 1182, 1184, 1186, 1188, 1190, 1192, 1194, 1196, 1198, 1200, 1202, 1204, 1206, 1208, 1210, 1212, 1214, 1216, 1218, 1220, 1222, 1224, 1226, 1228, 1230, 1232, 1234, 1236, 1238, 1240, 1242, 1244, 1246, 1248, 1250, 1252, 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268, 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288, 1290, 1292, 1294, 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1316, 1318, 1320, 1322, 1324, 1326, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388, 1390, 1392, 1394, 1396, 1398, 1400, 1402, 1404, 1406, 1408, 1410, 1412, 1414, 1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436, 1438, 1440, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532, 1534, 1536, 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568, 1570, 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, 1618, 1620, 1622, 1624, 0, 66, 2, 0, 195, 195, 357, 357, 2, 0, 66, 66, 311, 311, 2, 0, 99, 99, 311, 311, 3, 0, 66, 66, 99, 99, 311, 311, 2, 0, 133, 133, 191, 191, 2, 0, 245, 245, 325, 325, 2, 0, 10, 10, 94, 94, 2, 0, 162, 162, 356, 356, 2, 0, 180, 180, 221, 221, 5, 0, 30, 30, 281, 281, 322, 322, 345, 345, 347, 347, 2, 0, 64, 64, 94, 94, 2, 0, 345, 345, 347, 347, 2, 0, 200, 200, 224, 224, 9, 0, 30, 30, 160, 160, 165, 165, 179, 179, 219, 219, 227, 227, 335, 335, 338, 338, 438, 438, 3, 0, 113, 113, 277, 277, 329, 329, 2, 0, 53, 53, 78, 78, 3, 0, 173, 173, 252, 252, 255, 255, 5, 0, 30, 30, 88, 88, 182, 182, 232, 232, 362, 362, 2, 0, 92, 92, 226, 226, 1, 0, 448, 449, 2, 0, 92, 92, 407, 407, 2, 0, 334, 334, 407, 407, 2, 0, 211, 211, 289, 289, 3, 0, 314, 314, 350, 350, 445, 445, 2, 0, 64, 64, 68, 68, 5, 0, 212, 212, 322, 322, 343, 343, 354, 354, 455, 456, 2, 0, 10, 10, 53, 53, 3, 0, 211, 211, 289, 289, 442, 442, 3, 0, 175, 175, 316, 316, 342, 342, 4, 0, 88, 88, 182, 182, 232, 232, 362, 362, 2, 0, 151, 151, 245, 245, 2, 0, 306, 306, 326, 326, 1, 0, 31, 32, 2, 0, 99, 99, 342, 342, 2, 0, 201, 201, 327, 327, 2, 0, 213, 213, 245, 245, 2, 0, 313, 313, 407, 407, 2, 0, 207, 207, 261, 261, 4, 0, 113, 113, 115, 115, 119, 119, 126, 126, 2, 0, 353, 353, 477, 477, 2, 0, 384, 385, 399, 399, 1, 0, 384, 385, 1, 0, 411, 412, 1, 0, 18, 19, 2, 0, 117, 117, 122, 122, 5, 0, 10, 10, 16, 17, 21, 21, 23, 23, 25, 25, 1, 0, 12, 13, 3, 0, 9, 9, 14, 14, 27, 27, 2, 0, 30, 30, 56, 56, 3, 0, 39, 39, 73, 73, 95, 95, 2, 0, 166, 166, 188, 188, 2, 0, 297, 297, 450, 450, 2, 0, 208, 208, 282, 282, 3, 0, 30, 30, 34, 34, 90, 90, 6, 0, 9, 10, 12, 17, 21, 21, 23, 23, 25, 25, 27, 27, 2, 0, 20, 20, 22, 22, 1, 0, 483, 486, 11, 0, 124, 124, 129, 249, 251, 252, 254, 303, 305, 379, 433, 452, 455, 469, 471, 471, 473, 473, 475, 475, 478, 488, 5, 0, 106, 118, 120, 123, 125, 125, 127, 128, 472, 472, 4, 0, 30, 52, 54, 70, 72, 105, 454, 454, 5, 0, 304, 304, 418, 424, 504, 504, 513, 513, 521, 635, 2, 0, 62, 62, 116, 116, 2, 0, 10, 10, 20, 20, 2, 0, 167, 167, 507, 507, 2, 0, 144, 144, 210, 210, 36, 0, 33, 33, 35, 35, 43, 45, 53, 53, 57, 57, 61, 61, 92, 92, 116, 116, 123, 123, 130, 130, 144, 144, 153, 153, 157, 157, 161, 161, 167, 167, 172, 172, 207, 207, 210, 210, 232, 232, 240, 240, 258, 258, 261, 262, 272, 272, 286, 286, 300, 300, 306, 306, 312, 312, 316, 317, 326, 326, 353, 353, 433, 434, 477, 477, 490, 502, 506, 512, 514, 518, 520, 520, 11570, 0, 1626, 1, 0, 0, 0, 2, 1629, 1, 0, 0, 0, 4, 1631, 1, 0, 0, 0, 6, 1639, 1, 0, 0, 0, 8, 1767, 1, 0, 0, 0, 10, 1769, 1, 0, 0, 0, 12, 1773, 1, 0, 0, 0, 14, 1776, 1, 0, 0, 0, 16, 1784, 1, 0, 0, 0, 18, 1789, 1, 0, 0, 0, 20, 1795, 1, 0, 0, 0, 22, 1816, 1, 0, 0, 0, 24, 1828, 1, 0, 0, 0, 26, 1830, 1, 0, 0, 0, 28, 1836, 1, 0, 0, 0, 30, 1846, 1, 0, 0, 0, 32, 1848, 1, 0, 0, 0, 34, 1857, 1, 0, 0, 0, 36, 1865, 1, 0, 0, 0, 38, 1871, 1, 0, 0, 0, 40, 1878, 1, 0, 0, 0, 42, 1880, 1, 0, 0, 0, 44, 1898, 1, 0, 0, 0, 46, 1903, 1, 0, 0, 0, 48, 1912, 1, 0, 0, 0, 50, 1914, 1, 0, 0, 0, 52, 1928, 1, 0, 0, 0, 54, 1930, 1, 0, 0, 0, 56, 1959, 1, 0, 0, 0, 58, 1961, 1, 0, 0, 0, 60, 1969, 1, 0, 0, 0, 62, 1979, 1, 0, 0, 0, 64, 1986, 1, 0, 0, 0, 66, 1992, 1, 0, 0, 0, 68, 2009, 1, 0, 0, 0, 70, 2014, 1, 0, 0, 0, 72, 2018, 1, 0, 0, 0, 74, 2020, 1, 0, 0, 0, 76, 2031, 1, 0, 0, 0, 78, 2035, 1, 0, 0, 0, 80, 2040, 1, 0, 0, 0, 82, 2045, 1, 0, 0, 0, 84, 2047, 1, 0, 0, 0, 86, 2059, 1, 0, 0, 0, 88, 2066, 1, 0, 0, 0, 90, 2068, 1, 0, 0, 0, 92, 2070, 1, 0, 0, 0, 94, 2072, 1, 0, 0, 0, 96, 2184, 1, 0, 0, 0, 98, 2186, 1, 0, 0, 0, 100, 2202, 1, 0, 0, 0, 102, 2204, 1, 0, 0, 0, 104, 2460, 1, 0, 0, 0, 106, 2467, 1, 0, 0, 0, 108, 2472, 1, 0, 0, 0, 110, 2477, 1, 0, 0, 0, 112, 2482, 1, 0, 0, 0, 114, 2490, 1, 0, 0, 0, 116, 2492, 1, 0, 0, 0, 118, 2499, 1, 0, 0, 0, 120, 2501, 1, 0, 0, 0, 122, 2509, 1, 0, 0, 0, 124, 2521, 1, 0, 0, 0, 126, 2537, 1, 0, 0, 0, 128, 2565, 1, 0, 0, 0, 130, 2567, 1, 0, 0, 0, 132, 2570, 1, 0, 0, 0, 134, 2578, 1, 0, 0, 0, 136, 2583, 1, 0, 0, 0, 138, 2614, 1, 0, 0, 0, 140, 2616, 1, 0, 0, 0, 142, 2643, 1, 0, 0, 0, 144, 2645, 1, 0, 0, 0, 146, 2649, 1, 0, 0, 0, 148, 2654, 1, 0, 0, 0, 150, 2661, 1, 0, 0, 0, 152, 2666, 1, 0, 0, 0, 154, 2704, 1, 0, 0, 0, 156, 2708, 1, 0, 0, 0, 158, 2715, 1, 0, 0, 0, 160, 2719, 1, 0, 0, 0, 162, 2721, 1, 0, 0, 0, 164, 2729, 1, 0, 0, 0, 166, 2740, 1, 0, 0, 0, 168, 2742, 1, 0, 0, 0, 170, 2750, 1, 0, 0, 0, 172, 2752, 1, 0, 0, 0, 174, 2801, 1, 0, 0, 0, 176, 2805, 1, 0, 0, 0, 178, 2812, 1, 0, 0, 0, 180, 2814, 1, 0, 0, 0, 182, 2822, 1, 0, 0, 0, 184, 2833, 1, 0, 0, 0, 186, 2837, 1, 0, 0, 0, 188, 2839, 1, 0, 0, 0, 190, 2844, 1, 0, 0, 0, 192, 2854, 1, 0, 0, 0, 194, 2865, 1, 0, 0, 0, 196, 2905, 1, 0, 0, 0, 198, 2910, 1, 0, 0, 0, 200, 2917, 1, 0, 0, 0, 202, 2919, 1, 0, 0, 0, 204, 2927, 1, 0, 0, 0, 206, 2930, 1, 0, 0, 0, 208, 2937, 1, 0, 0, 0, 210, 2997, 1, 0, 0, 0, 212, 3002, 1, 0, 0, 0, 214, 3009, 1, 0, 0, 0, 216, 3011, 1, 0, 0, 0, 218, 3019, 1, 0, 0, 0, 220, 3027, 1, 0, 0, 0, 222, 3032, 1, 0, 0, 0, 224, 3034, 1, 0, 0, 0, 226, 3042, 1, 0, 0, 0, 228, 3058, 1, 0, 0, 0, 230, 3069, 1, 0, 0, 0, 232, 3071, 1, 0, 0, 0, 234, 3075, 1, 0, 0, 0, 236, 3085, 1, 0, 0, 0, 238, 3093, 1, 0, 0, 0, 240, 3097, 1, 0, 0, 0, 242, 3099, 1, 0, 0, 0, 244, 3106, 1, 0, 0, 0, 246, 3128, 1, 0, 0, 0, 248, 3133, 1, 0, 0, 0, 250, 3140, 1, 0, 0, 0, 252, 3152, 1, 0, 0, 0, 254, 3157, 1, 0, 0, 0, 256, 3164, 1, 0, 0, 0, 258, 3166, 1, 0, 0, 0, 260, 3170, 1, 0, 0, 0, 262, 3184, 1, 0, 0, 0, 264, 3195, 1, 0, 0, 0, 266, 3208, 1, 0, 0, 0, 268, 3222, 1, 0, 0, 0, 270, 3224, 1, 0, 0, 0, 272, 3238, 1, 0, 0, 0, 274, 3246, 1, 0, 0, 0, 276, 3248, 1, 0, 0, 0, 278, 3255, 1, 0, 0, 0, 280, 3266, 1, 0, 0, 0, 282, 3277, 1, 0, 0, 0, 284, 3284, 1, 0, 0, 0, 286, 3287, 1, 0, 0, 0, 288, 3321, 1, 0, 0, 0, 290, 3325, 1, 0, 0, 0, 292, 3333, 1, 0, 0, 0, 294, 3335, 1, 0, 0, 0, 296, 3343, 1, 0, 0, 0, 298, 3358, 1, 0, 0, 0, 300, 3360, 1, 0, 0, 0, 302, 3367, 1, 0, 0, 0, 304, 3373, 1, 0, 0, 0, 306, 3377, 1, 0, 0, 0, 308, 3381, 1, 0, 0, 0, 310, 3383, 1, 0, 0, 0, 312, 3394, 1, 0, 0, 0, 314, 3396, 1, 0, 0, 0, 316, 3404, 1, 0, 0, 0, 318, 3418, 1, 0, 0, 0, 320, 3428, 1, 0, 0, 0, 322, 3430, 1, 0, 0, 0, 324, 3439, 1, 0, 0, 0, 326, 3442, 1, 0, 0, 0, 328, 3549, 1, 0, 0, 0, 330, 3551, 1, 0, 0, 0, 332, 3567, 1, 0, 0, 0, 334, 3570, 1, 0, 0, 0, 336, 3576, 1, 0, 0, 0, 338, 3593, 1, 0, 0, 0, 340, 3601, 1, 0, 0, 0, 342, 3603, 1, 0, 0, 0, 344, 3611, 1, 0, 0, 0, 346, 3616, 1, 0, 0, 0, 348, 3631, 1, 0, 0, 0, 350, 3633, 1, 0, 0, 0, 352, 3636, 1, 0, 0, 0, 354, 3638, 1, 0, 0, 0, 356, 3665, 1, 0, 0, 0, 358, 3670, 1, 0, 0, 0, 360, 3672, 1, 0, 0, 0, 362, 3679, 1, 0, 0, 0, 364, 3681, 1, 0, 0, 0, 366, 3747, 1, 0, 0, 0, 368, 3749, 1, 0, 0, 0, 370, 3764, 1, 0, 0, 0, 372, 3772, 1, 0, 0, 0, 374, 3795, 1, 0, 0, 0, 376, 3799, 1, 0, 0, 0, 378, 3819, 1, 0, 0, 0, 380, 3821, 1, 0, 0, 0, 382, 3830, 1, 0, 0, 0, 384, 3841, 1, 0, 0, 0, 386, 3856, 1, 0, 0, 0, 388, 3865, 1, 0, 0, 0, 390, 3870, 1, 0, 0, 0, 392, 3875, 1, 0, 0, 0, 394, 3880, 1, 0, 0, 0, 396, 3885, 1, 0, 0, 0, 398, 3887, 1, 0, 0, 0, 400, 3889, 1, 0, 0, 0, 402, 3898, 1, 0, 0, 0, 404, 3938, 1, 0, 0, 0, 406, 3944, 1, 0, 0, 0, 408, 3946, 1, 0, 0, 0, 410, 3961, 1, 0, 0, 0, 412, 3966, 1, 0, 0, 0, 414, 3969, 1, 0, 0, 0, 416, 3973, 1, 0, 0, 0, 418, 3978, 1, 0, 0, 0, 420, 3980, 1, 0, 0, 0, 422, 3982, 1, 0, 0, 0, 424, 3989, 1, 0, 0, 0, 426, 3993, 1, 0, 0, 0, 428, 3995, 1, 0, 0, 0, 430, 4003, 1, 0, 0, 0, 432, 4005, 1, 0, 0, 0, 434, 4009, 1, 0, 0, 0, 436, 4022, 1, 0, 0, 0, 438, 4027, 1, 0, 0, 0, 440, 4032, 1, 0, 0, 0, 442, 4046, 1, 0, 0, 0, 444, 4074, 1, 0, 0, 0, 446, 4076, 1, 0, 0, 0, 448, 4084, 1, 0, 0, 0, 450, 4090, 1, 0, 0, 0, 452, 4098, 1, 0, 0, 0, 454, 4110, 1, 0, 0, 0, 456, 4112, 1, 0, 0, 0, 458, 4227, 1, 0, 0, 0, 460, 4229, 1, 0, 0, 0, 462, 4233, 1, 0, 0, 0, 464, 4241, 1, 0, 0, 0, 466, 4252, 1, 0, 0, 0, 468, 4254, 1, 0, 0, 0, 470, 4258, 1, 0, 0, 0, 472, 4266, 1, 0, 0, 0, 474, 4272, 1, 0, 0, 0, 476, 4274, 1, 0, 0, 0, 478, 4319, 1, 0, 0, 0, 480, 4325, 1, 0, 0, 0, 482, 4327, 1, 0, 0, 0, 484, 4341, 1, 0, 0, 0, 486, 4374, 1, 0, 0, 0, 488, 4378, 1, 0, 0, 0, 490, 4383, 1, 0, 0, 0, 492, 4392, 1, 0, 0, 0, 494, 4396, 1, 0, 0, 0, 496, 4398, 1, 0, 0, 0, 498, 4423, 1, 0, 0, 0, 500, 4425, 1, 0, 0, 0, 502, 4445, 1, 0, 0, 0, 504, 4465, 1, 0, 0, 0, 506, 4485, 1, 0, 0, 0, 508, 4487, 1, 0, 0, 0, 510, 4493, 1, 0, 0, 0, 512, 4578, 1, 0, 0, 0, 514, 4603, 1, 0, 0, 0, 516, 4610, 1, 0, 0, 0, 518, 4626, 1, 0, 0, 0, 520, 4628, 1, 0, 0, 0, 522, 4630, 1, 0, 0, 0, 524, 4638, 1, 0, 0, 0, 526, 4644, 1, 0, 0, 0, 528, 4648, 1, 0, 0, 0, 530, 4656, 1, 0, 0, 0, 532, 4667, 1, 0, 0, 0, 534, 4816, 1, 0, 0, 0, 536, 4820, 1, 0, 0, 0, 538, 4913, 1, 0, 0, 0, 540, 4918, 1, 0, 0, 0, 542, 4922, 1, 0, 0, 0, 544, 4928, 1, 0, 0, 0, 546, 4996, 1, 0, 0, 0, 548, 4998, 1, 0, 0, 0, 550, 5002, 1, 0, 0, 0, 552, 5004, 1, 0, 0, 0, 554, 5031, 1, 0, 0, 0, 556, 5048, 1, 0, 0, 0, 558, 5050, 1, 0, 0, 0, 560, 5067, 1, 0, 0, 0, 562, 5127, 1, 0, 0, 0, 564, 5129, 1, 0, 0, 0, 566, 5140, 1, 0, 0, 0, 568, 5146, 1, 0, 0, 0, 570, 5148, 1, 0, 0, 0, 572, 5172, 1, 0, 0, 0, 574, 5178, 1, 0, 0, 0, 576, 5184, 1, 0, 0, 0, 578, 5186, 1, 0, 0, 0, 580, 5195, 1, 0, 0, 0, 582, 5207, 1, 0, 0, 0, 584, 5236, 1, 0, 0, 0, 586, 5238, 1, 0, 0, 0, 588, 5275, 1, 0, 0, 0, 590, 5279, 1, 0, 0, 0, 592, 5283, 1, 0, 0, 0, 594, 5287, 1, 0, 0, 0, 596, 5292, 1, 0, 0, 0, 598, 5294, 1, 0, 0, 0, 600, 5313, 1, 0, 0, 0, 602, 5326, 1, 0, 0, 0, 604, 5334, 1, 0, 0, 0, 606, 5336, 1, 0, 0, 0, 608, 5347, 1, 0, 0, 0, 610, 5351, 1, 0, 0, 0, 612, 5356, 1, 0, 0, 0, 614, 5363, 1, 0, 0, 0, 616, 5365, 1, 0, 0, 0, 618, 5386, 1, 0, 0, 0, 620, 5388, 1, 0, 0, 0, 622, 5394, 1, 0, 0, 0, 624, 5402, 1, 0, 0, 0, 626, 5418, 1, 0, 0, 0, 628, 5420, 1, 0, 0, 0, 630, 5426, 1, 0, 0, 0, 632, 5447, 1, 0, 0, 0, 634, 5456, 1, 0, 0, 0, 636, 5462, 1, 0, 0, 0, 638, 5464, 1, 0, 0, 0, 640, 5480, 1, 0, 0, 0, 642, 5482, 1, 0, 0, 0, 644, 5487, 1, 0, 0, 0, 646, 5489, 1, 0, 0, 0, 648, 5504, 1, 0, 0, 0, 650, 5512, 1, 0, 0, 0, 652, 5515, 1, 0, 0, 0, 654, 5524, 1, 0, 0, 0, 656, 5565, 1, 0, 0, 0, 658, 5575, 1, 0, 0, 0, 660, 5582, 1, 0, 0, 0, 662, 5584, 1, 0, 0, 0, 664, 5599, 1, 0, 0, 0, 666, 5601, 1, 0, 0, 0, 668, 5604, 1, 0, 0, 0, 670, 5612, 1, 0, 0, 0, 672, 5619, 1, 0, 0, 0, 674, 5625, 1, 0, 0, 0, 676, 5663, 1, 0, 0, 0, 678, 5677, 1, 0, 0, 0, 680, 5691, 1, 0, 0, 0, 682, 5715, 1, 0, 0, 0, 684, 5722, 1, 0, 0, 0, 686, 5727, 1, 0, 0, 0, 688, 5735, 1, 0, 0, 0, 690, 5738, 1, 0, 0, 0, 692, 5742, 1, 0, 0, 0, 694, 5749, 1, 0, 0, 0, 696, 5785, 1, 0, 0, 0, 698, 5792, 1, 0, 0, 0, 700, 5794, 1, 0, 0, 0, 702, 5807, 1, 0, 0, 0, 704, 5809, 1, 0, 0, 0, 706, 5854, 1, 0, 0, 0, 708, 5856, 1, 0, 0, 0, 710, 5891, 1, 0, 0, 0, 712, 5893, 1, 0, 0, 0, 714, 5895, 1, 0, 0, 0, 716, 5897, 1, 0, 0, 0, 718, 5905, 1, 0, 0, 0, 720, 5919, 1, 0, 0, 0, 722, 6389, 1, 0, 0, 0, 724, 6393, 1, 0, 0, 0, 726, 6398, 1, 0, 0, 0, 728, 6457, 1, 0, 0, 0, 730, 6461, 1, 0, 0, 0, 732, 6680, 1, 0, 0, 0, 734, 6682, 1, 0, 0, 0, 736, 6690, 1, 0, 0, 0, 738, 6706, 1, 0, 0, 0, 740, 6713, 1, 0, 0, 0, 742, 6715, 1, 0, 0, 0, 744, 6906, 1, 0, 0, 0, 746, 6908, 1, 0, 0, 0, 748, 6916, 1, 0, 0, 0, 750, 6924, 1, 0, 0, 0, 752, 6953, 1, 0, 0, 0, 754, 6955, 1, 0, 0, 0, 756, 6964, 1, 0, 0, 0, 758, 6972, 1, 0, 0, 0, 760, 7011, 1, 0, 0, 0, 762, 7025, 1, 0, 0, 0, 764, 7027, 1, 0, 0, 0, 766, 7047, 1, 0, 0, 0, 768, 7049, 1, 0, 0, 0, 770, 7062, 1, 0, 0, 0, 772, 7066, 1, 0, 0, 0, 774, 7068, 1, 0, 0, 0, 776, 7073, 1, 0, 0, 0, 778, 7075, 1, 0, 0, 0, 780, 7082, 1, 0, 0, 0, 782, 7084, 1, 0, 0, 0, 784, 7091, 1, 0, 0, 0, 786, 7143, 1, 0, 0, 0, 788, 7148, 1, 0, 0, 0, 790, 7160, 1, 0, 0, 0, 792, 7162, 1, 0, 0, 0, 794, 7174, 1, 0, 0, 0, 796, 7182, 1, 0, 0, 0, 798, 7184, 1, 0, 0, 0, 800, 7216, 1, 0, 0, 0, 802, 7218, 1, 0, 0, 0, 804, 7221, 1, 0, 0, 0, 806, 7229, 1, 0, 0, 0, 808, 7232, 1, 0, 0, 0, 810, 7236, 1, 0, 0, 0, 812, 7251, 1, 0, 0, 0, 814, 7255, 1, 0, 0, 0, 816, 7257, 1, 0, 0, 0, 818, 7268, 1, 0, 0, 0, 820, 7273, 1, 0, 0, 0, 822, 7287, 1, 0, 0, 0, 824, 7295, 1, 0, 0, 0, 826, 7297, 1, 0, 0, 0, 828, 7303, 1, 0, 0, 0, 830, 7308, 1, 0, 0, 0, 832, 7315, 1, 0, 0, 0, 834, 7343, 1, 0, 0, 0, 836, 7345, 1, 0, 0, 0, 838, 7424, 1, 0, 0, 0, 840, 7426, 1, 0, 0, 0, 842, 7428, 1, 0, 0, 0, 844, 7452, 1, 0, 0, 0, 846, 7457, 1, 0, 0, 0, 848, 7472, 1, 0, 0, 0, 850, 7484, 1, 0, 0, 0, 852, 7486, 1, 0, 0, 0, 854, 7494, 1, 0, 0, 0, 856, 7496, 1, 0, 0, 0, 858, 7501, 1, 0, 0, 0, 860, 7506, 1, 0, 0, 0, 862, 7510, 1, 0, 0, 0, 864, 7514, 1, 0, 0, 0, 866, 7518, 1, 0, 0, 0, 868, 7522, 1, 0, 0, 0, 870, 7529, 1, 0, 0, 0, 872, 7531, 1, 0, 0, 0, 874, 7534, 1, 0, 0, 0, 876, 7544, 1, 0, 0, 0, 878, 7562, 1, 0, 0, 0, 880, 7573, 1, 0, 0, 0, 882, 7575, 1, 0, 0, 0, 884, 7583, 1, 0, 0, 0, 886, 7588, 1, 0, 0, 0, 888, 7593, 1, 0, 0, 0, 890, 7595, 1, 0, 0, 0, 892, 7606, 1, 0, 0, 0, 894, 7612, 1, 0, 0, 0, 896, 7641, 1, 0, 0, 0, 898, 7648, 1, 0, 0, 0, 900, 7660, 1, 0, 0, 0, 902, 7662, 1, 0, 0, 0, 904, 7670, 1, 0, 0, 0, 906, 7694, 1, 0, 0, 0, 908, 7696, 1, 0, 0, 0, 910, 7698, 1, 0, 0, 0, 912, 7706, 1, 0, 0, 0, 914, 7722, 1, 0, 0, 0, 916, 7733, 1, 0, 0, 0, 918, 7738, 1, 0, 0, 0, 920, 7740, 1, 0, 0, 0, 922, 7771, 1, 0, 0, 0, 924, 7790, 1, 0, 0, 0, 926, 7803, 1, 0, 0, 0, 928, 7810, 1, 0, 0, 0, 930, 7821, 1, 0, 0, 0, 932, 7823, 1, 0, 0, 0, 934, 7834, 1, 0, 0, 0, 936, 7848, 1, 0, 0, 0, 938, 7852, 1, 0, 0, 0, 940, 7858, 1, 0, 0, 0, 942, 7860, 1, 0, 0, 0, 944, 7869, 1, 0, 0, 0, 946, 7887, 1, 0, 0, 0, 948, 7889, 1, 0, 0, 0, 950, 7892, 1, 0, 0, 0, 952, 7900, 1, 0, 0, 0, 954, 7908, 1, 0, 0, 0, 956, 7917, 1, 0, 0, 0, 958, 7925, 1, 0, 0, 0, 960, 7929, 1, 0, 0, 0, 962, 7939, 1, 0, 0, 0, 964, 7962, 1, 0, 0, 0, 966, 7966, 1, 0, 0, 0, 968, 7994, 1, 0, 0, 0, 970, 8009, 1, 0, 0, 0, 972, 8011, 1, 0, 0, 0, 974, 8014, 1, 0, 0, 0, 976, 8020, 1, 0, 0, 0, 978, 8028, 1, 0, 0, 0, 980, 8040, 1, 0, 0, 0, 982, 8044, 1, 0, 0, 0, 984, 8054, 1, 0, 0, 0, 986, 8058, 1, 0, 0, 0, 988, 8074, 1, 0, 0, 0, 990, 8078, 1, 0, 0, 0, 992, 8083, 1, 0, 0, 0, 994, 8085, 1, 0, 0, 0, 996, 8095, 1, 0, 0, 0, 998, 8099, 1, 0, 0, 0, 1000, 8101, 1, 0, 0, 0, 1002, 8105, 1, 0, 0, 0, 1004, 8113, 1, 0, 0, 0, 1006, 8129, 1, 0, 0, 0, 1008, 8133, 1, 0, 0, 0, 1010, 8158, 1, 0, 0, 0, 1012, 8160, 1, 0, 0, 0, 1014, 8169, 1, 0, 0, 0, 1016, 8171, 1, 0, 0, 0, 1018, 8178, 1, 0, 0, 0, 1020, 8182, 1, 0, 0, 0, 1022, 8184, 1, 0, 0, 0, 1024, 8186, 1, 0, 0, 0, 1026, 8192, 1, 0, 0, 0, 1028, 8194, 1, 0, 0, 0, 1030, 8207, 1, 0, 0, 0, 1032, 8209, 1, 0, 0, 0, 1034, 8212, 1, 0, 0, 0, 1036, 8217, 1, 0, 0, 0, 1038, 8222, 1, 0, 0, 0, 1040, 8231, 1, 0, 0, 0, 1042, 8237, 1, 0, 0, 0, 1044, 8241, 1, 0, 0, 0, 1046, 8244, 1, 0, 0, 0, 1048, 8248, 1, 0, 0, 0, 1050, 8252, 1, 0, 0, 0, 1052, 8267, 1, 0, 0, 0, 1054, 8269, 1, 0, 0, 0, 1056, 8286, 1, 0, 0, 0, 1058, 8297, 1, 0, 0, 0, 1060, 8299, 1, 0, 0, 0, 1062, 8355, 1, 0, 0, 0, 1064, 8379, 1, 0, 0, 0, 1066, 8390, 1, 0, 0, 0, 1068, 8393, 1, 0, 0, 0, 1070, 8415, 1, 0, 0, 0, 1072, 8417, 1, 0, 0, 0, 1074, 8428, 1, 0, 0, 0, 1076, 8442, 1, 0, 0, 0, 1078, 8444, 1, 0, 0, 0, 1080, 8452, 1, 0, 0, 0, 1082, 8459, 1, 0, 0, 0, 1084, 8472, 1, 0, 0, 0, 1086, 8484, 1, 0, 0, 0, 1088, 8486, 1, 0, 0, 0, 1090, 8489, 1, 0, 0, 0, 1092, 8503, 1, 0, 0, 0, 1094, 8508, 1, 0, 0, 0, 1096, 8513, 1, 0, 0, 0, 1098, 8523, 1, 0, 0, 0, 1100, 8527, 1, 0, 0, 0, 1102, 8529, 1, 0, 0, 0, 1104, 8537, 1, 0, 0, 0, 1106, 8541, 1, 0, 0, 0, 1108, 8562, 1, 0, 0, 0, 1110, 8570, 1, 0, 0, 0, 1112, 8580, 1, 0, 0, 0, 1114, 8592, 1, 0, 0, 0, 1116, 8594, 1, 0, 0, 0, 1118, 8608, 1, 0, 0, 0, 1120, 8628, 1, 0, 0, 0, 1122, 8637, 1, 0, 0, 0, 1124, 8653, 1, 0, 0, 0, 1126, 8659, 1, 0, 0, 0, 1128, 8665, 1, 0, 0, 0, 1130, 8677, 1, 0, 0, 0, 1132, 8695, 1, 0, 0, 0, 1134, 8702, 1, 0, 0, 0, 1136, 8706, 1, 0, 0, 0, 1138, 8710, 1, 0, 0, 0, 1140, 8712, 1, 0, 0, 0, 1142, 8718, 1, 0, 0, 0, 1144, 8721, 1, 0, 0, 0, 1146, 8728, 1, 0, 0, 0, 1148, 8741, 1, 0, 0, 0, 1150, 8745, 1, 0, 0, 0, 1152, 8747, 1, 0, 0, 0, 1154, 8756, 1, 0, 0, 0, 1156, 8765, 1, 0, 0, 0, 1158, 8793, 1, 0, 0, 0, 1160, 8795, 1, 0, 0, 0, 1162, 8805, 1, 0, 0, 0, 1164, 8807, 1, 0, 0, 0, 1166, 8809, 1, 0, 0, 0, 1168, 8813, 1, 0, 0, 0, 1170, 8821, 1, 0, 0, 0, 1172, 8829, 1, 0, 0, 0, 1174, 8837, 1, 0, 0, 0, 1176, 8851, 1, 0, 0, 0, 1178, 8860, 1, 0, 0, 0, 1180, 8864, 1, 0, 0, 0, 1182, 8868, 1, 0, 0, 0, 1184, 8894, 1, 0, 0, 0, 1186, 8908, 1, 0, 0, 0, 1188, 8923, 1, 0, 0, 0, 1190, 8933, 1, 0, 0, 0, 1192, 8937, 1, 0, 0, 0, 1194, 8945, 1, 0, 0, 0, 1196, 8953, 1, 0, 0, 0, 1198, 8959, 1, 0, 0, 0, 1200, 8963, 1, 0, 0, 0, 1202, 8970, 1, 0, 0, 0, 1204, 8975, 1, 0, 0, 0, 1206, 8990, 1, 0, 0, 0, 1208, 9070, 1, 0, 0, 0, 1210, 9072, 1, 0, 0, 0, 1212, 9074, 1, 0, 0, 0, 1214, 9104, 1, 0, 0, 0, 1216, 9108, 1, 0, 0, 0, 1218, 9287, 1, 0, 0, 0, 1220, 9294, 1, 0, 0, 0, 1222, 9307, 1, 0, 0, 0, 1224, 9309, 1, 0, 0, 0, 1226, 9314, 1, 0, 0, 0, 1228, 9322, 1, 0, 0, 0, 1230, 9327, 1, 0, 0, 0, 1232, 9334, 1, 0, 0, 0, 1234, 9351, 1, 0, 0, 0, 1236, 9353, 1, 0, 0, 0, 1238, 9363, 1, 0, 0, 0, 1240, 9372, 1, 0, 0, 0, 1242, 9377, 1, 0, 0, 0, 1244, 9379, 1, 0, 0, 0, 1246, 9387, 1, 0, 0, 0, 1248, 9397, 1, 0, 0, 0, 1250, 9399, 1, 0, 0, 0, 1252, 9408, 1, 0, 0, 0, 1254, 9414, 1, 0, 0, 0, 1256, 9429, 1, 0, 0, 0, 1258, 9437, 1, 0, 0, 0, 1260, 9446, 1, 0, 0, 0, 1262, 9458, 1, 0, 0, 0, 1264, 9472, 1, 0, 0, 0, 1266, 9474, 1, 0, 0, 0, 1268, 9481, 1, 0, 0, 0, 1270, 9487, 1, 0, 0, 0, 1272, 9491, 1, 0, 0, 0, 1274, 9493, 1, 0, 0, 0, 1276, 9501, 1, 0, 0, 0, 1278, 9509, 1, 0, 0, 0, 1280, 9523, 1, 0, 0, 0, 1282, 9525, 1, 0, 0, 0, 1284, 9533, 1, 0, 0, 0, 1286, 9546, 1, 0, 0, 0, 1288, 9548, 1, 0, 0, 0, 1290, 9556, 1, 0, 0, 0, 1292, 9563, 1, 0, 0, 0, 1294, 9576, 1, 0, 0, 0, 1296, 9586, 1, 0, 0, 0, 1298, 9588, 1, 0, 0, 0, 1300, 9590, 1, 0, 0, 0, 1302, 9604, 1, 0, 0, 0, 1304, 9634, 1, 0, 0, 0, 1306, 9643, 1, 0, 0, 0, 1308, 9650, 1, 0, 0, 0, 1310, 9652, 1, 0, 0, 0, 1312, 9659, 1, 0, 0, 0, 1314, 9663, 1, 0, 0, 0, 1316, 9671, 1, 0, 0, 0, 1318, 9675, 1, 0, 0, 0, 1320, 9677, 1, 0, 0, 0, 1322, 9696, 1, 0, 0, 0, 1324, 9700, 1, 0, 0, 0, 1326, 9703, 1, 0, 0, 0, 1328, 9710, 1, 0, 0, 0, 1330, 9715, 1, 0, 0, 0, 1332, 9717, 1, 0, 0, 0, 1334, 9733, 1, 0, 0, 0, 1336, 9735, 1, 0, 0, 0, 1338, 9743, 1, 0, 0, 0, 1340, 9747, 1, 0, 0, 0, 1342, 9755, 1, 0, 0, 0, 1344, 9757, 1, 0, 0, 0, 1346, 9759, 1, 0, 0, 0, 1348, 9768, 1, 0, 0, 0, 1350, 9802, 1, 0, 0, 0, 1352, 9804, 1, 0, 0, 0, 1354, 9806, 1, 0, 0, 0, 1356, 9808, 1, 0, 0, 0, 1358, 9810, 1, 0, 0, 0, 1360, 9812, 1, 0, 0, 0, 1362, 9826, 1, 0, 0, 0, 1364, 9831, 1, 0, 0, 0, 1366, 9838, 1, 0, 0, 0, 1368, 9840, 1, 0, 0, 0, 1370, 9845, 1, 0, 0, 0, 1372, 9847, 1, 0, 0, 0, 1374, 9861, 1, 0, 0, 0, 1376, 9867, 1, 0, 0, 0, 1378, 9873, 1, 0, 0, 0, 1380, 9879, 1, 0, 0, 0, 1382, 9887, 1, 0, 0, 0, 1384, 9896, 1, 0, 0, 0, 1386, 9898, 1, 0, 0, 0, 1388, 9900, 1, 0, 0, 0, 1390, 9954, 1, 0, 0, 0, 1392, 9956, 1, 0, 0, 0, 1394, 9958, 1, 0, 0, 0, 1396, 9960, 1, 0, 0, 0, 1398, 9962, 1, 0, 0, 0, 1400, 9969, 1, 0, 0, 0, 1402, 9992, 1, 0, 0, 0, 1404, 9994, 1, 0, 0, 0, 1406, 10000, 1, 0, 0, 0, 1408, 10004, 1, 0, 0, 0, 1410, 10006, 1, 0, 0, 0, 1412, 10013, 1, 0, 0, 0, 1414, 10020, 1, 0, 0, 0, 1416, 10023, 1, 0, 0, 0, 1418, 10027, 1, 0, 0, 0, 1420, 10034, 1, 0, 0, 0, 1422, 10036, 1, 0, 0, 0, 1424, 10060, 1, 0, 0, 0, 1426, 10062, 1, 0, 0, 0, 1428, 10069, 1, 0, 0, 0, 1430, 10071, 1, 0, 0, 0, 1432, 10079, 1, 0, 0, 0, 1434, 10082, 1, 0, 0, 0, 1436, 10086, 1, 0, 0, 0, 1438, 10088, 1, 0, 0, 0, 1440, 10092, 1, 0, 0, 0, 1442, 10094, 1, 0, 0, 0, 1444, 10099, 1, 0, 0, 0, 1446, 10104, 1, 0, 0, 0, 1448, 10110, 1, 0, 0, 0, 1450, 10114, 1, 0, 0, 0, 1452, 10116, 1, 0, 0, 0, 1454, 10121, 1, 0, 0, 0, 1456, 10151, 1, 0, 0, 0, 1458, 10153, 1, 0, 0, 0, 1460, 10171, 1, 0, 0, 0, 1462, 10175, 1, 0, 0, 0, 1464, 10177, 1, 0, 0, 0, 1466, 10182, 1, 0, 0, 0, 1468, 10191, 1, 0, 0, 0, 1470, 10193, 1, 0, 0, 0, 1472, 10201, 1, 0, 0, 0, 1474, 10205, 1, 0, 0, 0, 1476, 10207, 1, 0, 0, 0, 1478, 10211, 1, 0, 0, 0, 1480, 10222, 1, 0, 0, 0, 1482, 10239, 1, 0, 0, 0, 1484, 10245, 1, 0, 0, 0, 1486, 10247, 1, 0, 0, 0, 1488, 10257, 1, 0, 0, 0, 1490, 10260, 1, 0, 0, 0, 1492, 10264, 1, 0, 0, 0, 1494, 10272, 1, 0, 0, 0, 1496, 10274, 1, 0, 0, 0, 1498, 10277, 1, 0, 0, 0, 1500, 10282, 1, 0, 0, 0, 1502, 10287, 1, 0, 0, 0, 1504, 10309, 1, 0, 0, 0, 1506, 10323, 1, 0, 0, 0, 1508, 10327, 1, 0, 0, 0, 1510, 10332, 1, 0, 0, 0, 1512, 10334, 1, 0, 0, 0, 1514, 10336, 1, 0, 0, 0, 1516, 10348, 1, 0, 0, 0, 1518, 10350, 1, 0, 0, 0, 1520, 10355, 1, 0, 0, 0, 1522, 10357, 1, 0, 0, 0, 1524, 10375, 1, 0, 0, 0, 1526, 10403, 1, 0, 0, 0, 1528, 10413, 1, 0, 0, 0, 1530, 10422, 1, 0, 0, 0, 1532, 10427, 1, 0, 0, 0, 1534, 10429, 1, 0, 0, 0, 1536, 10433, 1, 0, 0, 0, 1538, 10441, 1, 0, 0, 0, 1540, 10449, 1, 0, 0, 0, 1542, 10451, 1, 0, 0, 0, 1544, 10458, 1, 0, 0, 0, 1546, 10461, 1, 0, 0, 0, 1548, 10477, 1, 0, 0, 0, 1550, 10479, 1, 0, 0, 0, 1552, 10493, 1, 0, 0, 0, 1554, 10495, 1, 0, 0, 0, 1556, 10522, 1, 0, 0, 0, 1558, 10524, 1, 0, 0, 0, 1560, 10535, 1, 0, 0, 0, 1562, 10541, 1, 0, 0, 0, 1564, 10545, 1, 0, 0, 0, 1566, 10547, 1, 0, 0, 0, 1568, 10555, 1, 0, 0, 0, 1570, 10560, 1, 0, 0, 0, 1572, 10579, 1, 0, 0, 0, 1574, 10581, 1, 0, 0, 0, 1576, 10586, 1, 0, 0, 0, 1578, 10590, 1, 0, 0, 0, 1580, 10593, 1, 0, 0, 0, 1582, 10597, 1, 0, 0, 0, 1584, 10607, 1, 0, 0, 0, 1586, 10621, 1, 0, 0, 0, 1588, 10625, 1, 0, 0, 0, 1590, 10630, 1, 0, 0, 0, 1592, 10633, 1, 0, 0, 0, 1594, 10637, 1, 0, 0, 0, 1596, 10642, 1, 0, 0, 0, 1598, 10653, 1, 0, 0, 0, 1600, 10657, 1, 0, 0, 0, 1602, 10661, 1, 0, 0, 0, 1604, 10665, 1, 0, 0, 0, 1606, 10670, 1, 0, 0, 0, 1608, 10674, 1, 0, 0, 0, 1610, 10676, 1, 0, 0, 0, 1612, 10678, 1, 0, 0, 0, 1614, 10686, 1, 0, 0, 0, 1616, 10688, 1, 0, 0, 0, 1618, 10690, 1, 0, 0, 0, 1620, 10692, 1, 0, 0, 0, 1622, 10694, 1, 0, 0, 0, 1624, 10702, 1, 0, 0, 0, 1626, 1627, 3, 4, 2, 0, 1627, 1628, 5, 0, 0, 1, 1628, 1, 1, 0, 0, 0, 1629, 1630, 3, 1398, 699, 0, 1630, 3, 1, 0, 0, 0, 1631, 1632, 3, 6, 3, 0, 1632, 5, 1, 0, 0, 0, 1633, 1635, 3, 8, 4, 0, 1634, 1636, 5, 7, 0, 0, 1635, 1634, 1, 0, 0, 0, 1635, 1636, 1, 0, 0, 0, 1636, 1638, 1, 0, 0, 0, 1637, 1633, 1, 0, 0, 0, 1638, 1641, 1, 0, 0, 0, 1639, 1637, 1, 0, 0, 0, 1639, 1640, 1, 0, 0, 0, 1640, 7, 1, 0, 0, 0, 1641, 1639, 1, 0, 0, 0, 1642, 1768, 3, 452, 226, 0, 1643, 1768, 3, 826, 413, 0, 1644, 1768, 3, 816, 408, 0, 1645, 1768, 3, 818, 409, 0, 1646, 1768, 3, 578, 289, 0, 1647, 1768, 3, 832, 416, 0, 1648, 1768, 3, 478, 239, 0, 1649, 1768, 3, 322, 161, 0, 1650, 1768, 3, 328, 164, 0, 1651, 1768, 3, 338, 169, 0, 1652, 1768, 3, 364, 182, 0, 1653, 1768, 3, 670, 335, 0, 1654, 1768, 3, 38, 19, 0, 1655, 1768, 3, 728, 364, 0, 1656, 1768, 3, 732, 366, 0, 1657, 1768, 3, 744, 372, 0, 1658, 1768, 3, 734, 367, 0, 1659, 1768, 3, 742, 371, 0, 1660, 1768, 3, 384, 192, 0, 1661, 1768, 3, 280, 140, 0, 1662, 1768, 3, 828, 414, 0, 1663, 1768, 3, 96, 48, 0, 1664, 1768, 3, 720, 360, 0, 1665, 1768, 3, 134, 67, 0, 1666, 1768, 3, 752, 376, 0, 1667, 1768, 3, 32, 16, 0, 1668, 1768, 3, 28, 14, 0, 1669, 1768, 3, 760, 380, 0, 1670, 1768, 3, 262, 131, 0, 1671, 1768, 3, 838, 419, 0, 1672, 1768, 3, 836, 418, 0, 1673, 1768, 3, 380, 190, 0, 1674, 1768, 3, 850, 425, 0, 1675, 1768, 3, 12, 6, 0, 1676, 1768, 3, 92, 46, 0, 1677, 1768, 3, 140, 70, 0, 1678, 1768, 3, 844, 422, 0, 1679, 1768, 3, 534, 267, 0, 1680, 1768, 3, 86, 43, 0, 1681, 1768, 3, 142, 71, 0, 1682, 1768, 3, 400, 200, 0, 1683, 1768, 3, 264, 132, 0, 1684, 1768, 3, 456, 228, 0, 1685, 1768, 3, 696, 348, 0, 1686, 1768, 3, 842, 421, 0, 1687, 1768, 3, 830, 415, 0, 1688, 1768, 3, 316, 158, 0, 1689, 1768, 3, 330, 165, 0, 1690, 1768, 3, 356, 178, 0, 1691, 1768, 3, 366, 183, 0, 1692, 1768, 3, 616, 308, 0, 1693, 1768, 3, 36, 18, 0, 1694, 1768, 3, 270, 135, 0, 1695, 1768, 3, 482, 241, 0, 1696, 1768, 3, 496, 248, 0, 1697, 1768, 3, 746, 373, 0, 1698, 1768, 3, 498, 249, 0, 1699, 1768, 3, 382, 191, 0, 1700, 1768, 3, 296, 148, 0, 1701, 1768, 3, 42, 21, 0, 1702, 1768, 3, 278, 139, 0, 1703, 1768, 3, 172, 86, 0, 1704, 1768, 3, 754, 377, 0, 1705, 1768, 3, 260, 130, 0, 1706, 1768, 3, 310, 155, 0, 1707, 1768, 3, 704, 352, 0, 1708, 1768, 3, 404, 202, 0, 1709, 1768, 3, 444, 222, 0, 1710, 1768, 3, 14, 7, 0, 1711, 1768, 3, 26, 13, 0, 1712, 1768, 3, 374, 187, 0, 1713, 1768, 3, 804, 402, 0, 1714, 1768, 3, 900, 450, 0, 1715, 1768, 3, 952, 476, 0, 1716, 1768, 3, 458, 229, 0, 1717, 1768, 3, 928, 464, 0, 1718, 1768, 3, 94, 47, 0, 1719, 1768, 3, 690, 345, 0, 1720, 1768, 3, 700, 350, 0, 1721, 1768, 3, 504, 252, 0, 1722, 1768, 3, 506, 253, 0, 1723, 1768, 3, 508, 254, 0, 1724, 1768, 3, 512, 256, 0, 1725, 1768, 3, 762, 381, 0, 1726, 1768, 3, 314, 157, 0, 1727, 1768, 3, 708, 354, 0, 1728, 1768, 3, 34, 17, 0, 1729, 1768, 3, 378, 189, 0, 1730, 1768, 3, 820, 410, 0, 1731, 1768, 3, 896, 448, 0, 1732, 1768, 3, 878, 439, 0, 1733, 1768, 3, 544, 272, 0, 1734, 1768, 3, 552, 276, 0, 1735, 1768, 3, 570, 285, 0, 1736, 1768, 3, 368, 184, 0, 1737, 1768, 3, 588, 294, 0, 1738, 1768, 3, 902, 451, 0, 1739, 1768, 3, 920, 460, 0, 1740, 1768, 3, 782, 391, 0, 1741, 1768, 3, 276, 138, 0, 1742, 1768, 3, 802, 401, 0, 1743, 1768, 3, 932, 466, 0, 1744, 1768, 3, 778, 389, 0, 1745, 1768, 3, 890, 445, 0, 1746, 1768, 3, 510, 255, 0, 1747, 1768, 3, 710, 355, 0, 1748, 1768, 3, 678, 339, 0, 1749, 1768, 3, 676, 338, 0, 1750, 1768, 3, 680, 340, 0, 1751, 1768, 3, 722, 361, 0, 1752, 1768, 3, 554, 277, 0, 1753, 1768, 3, 572, 286, 0, 1754, 1768, 3, 764, 382, 0, 1755, 1768, 3, 538, 269, 0, 1756, 1768, 3, 960, 480, 0, 1757, 1768, 3, 786, 393, 0, 1758, 1768, 3, 530, 265, 0, 1759, 1768, 3, 784, 392, 0, 1760, 1768, 3, 942, 471, 0, 1761, 1768, 3, 848, 424, 0, 1762, 1768, 3, 74, 37, 0, 1763, 1768, 3, 50, 25, 0, 1764, 1768, 3, 84, 42, 0, 1765, 1768, 3, 798, 399, 0, 1766, 1768, 3, 10, 5, 0, 1767, 1642, 1, 0, 0, 0, 1767, 1643, 1, 0, 0, 0, 1767, 1644, 1, 0, 0, 0, 1767, 1645, 1, 0, 0, 0, 1767, 1646, 1, 0, 0, 0, 1767, 1647, 1, 0, 0, 0, 1767, 1648, 1, 0, 0, 0, 1767, 1649, 1, 0, 0, 0, 1767, 1650, 1, 0, 0, 0, 1767, 1651, 1, 0, 0, 0, 1767, 1652, 1, 0, 0, 0, 1767, 1653, 1, 0, 0, 0, 1767, 1654, 1, 0, 0, 0, 1767, 1655, 1, 0, 0, 0, 1767, 1656, 1, 0, 0, 0, 1767, 1657, 1, 0, 0, 0, 1767, 1658, 1, 0, 0, 0, 1767, 1659, 1, 0, 0, 0, 1767, 1660, 1, 0, 0, 0, 1767, 1661, 1, 0, 0, 0, 1767, 1662, 1, 0, 0, 0, 1767, 1663, 1, 0, 0, 0, 1767, 1664, 1, 0, 0, 0, 1767, 1665, 1, 0, 0, 0, 1767, 1666, 1, 0, 0, 0, 1767, 1667, 1, 0, 0, 0, 1767, 1668, 1, 0, 0, 0, 1767, 1669, 1, 0, 0, 0, 1767, 1670, 1, 0, 0, 0, 1767, 1671, 1, 0, 0, 0, 1767, 1672, 1, 0, 0, 0, 1767, 1673, 1, 0, 0, 0, 1767, 1674, 1, 0, 0, 0, 1767, 1675, 1, 0, 0, 0, 1767, 1676, 1, 0, 0, 0, 1767, 1677, 1, 0, 0, 0, 1767, 1678, 1, 0, 0, 0, 1767, 1679, 1, 0, 0, 0, 1767, 1680, 1, 0, 0, 0, 1767, 1681, 1, 0, 0, 0, 1767, 1682, 1, 0, 0, 0, 1767, 1683, 1, 0, 0, 0, 1767, 1684, 1, 0, 0, 0, 1767, 1685, 1, 0, 0, 0, 1767, 1686, 1, 0, 0, 0, 1767, 1687, 1, 0, 0, 0, 1767, 1688, 1, 0, 0, 0, 1767, 1689, 1, 0, 0, 0, 1767, 1690, 1, 0, 0, 0, 1767, 1691, 1, 0, 0, 0, 1767, 1692, 1, 0, 0, 0, 1767, 1693, 1, 0, 0, 0, 1767, 1694, 1, 0, 0, 0, 1767, 1695, 1, 0, 0, 0, 1767, 1696, 1, 0, 0, 0, 1767, 1697, 1, 0, 0, 0, 1767, 1698, 1, 0, 0, 0, 1767, 1699, 1, 0, 0, 0, 1767, 1700, 1, 0, 0, 0, 1767, 1701, 1, 0, 0, 0, 1767, 1702, 1, 0, 0, 0, 1767, 1703, 1, 0, 0, 0, 1767, 1704, 1, 0, 0, 0, 1767, 1705, 1, 0, 0, 0, 1767, 1706, 1, 0, 0, 0, 1767, 1707, 1, 0, 0, 0, 1767, 1708, 1, 0, 0, 0, 1767, 1709, 1, 0, 0, 0, 1767, 1710, 1, 0, 0, 0, 1767, 1711, 1, 0, 0, 0, 1767, 1712, 1, 0, 0, 0, 1767, 1713, 1, 0, 0, 0, 1767, 1714, 1, 0, 0, 0, 1767, 1715, 1, 0, 0, 0, 1767, 1716, 1, 0, 0, 0, 1767, 1717, 1, 0, 0, 0, 1767, 1718, 1, 0, 0, 0, 1767, 1719, 1, 0, 0, 0, 1767, 1720, 1, 0, 0, 0, 1767, 1721, 1, 0, 0, 0, 1767, 1722, 1, 0, 0, 0, 1767, 1723, 1, 0, 0, 0, 1767, 1724, 1, 0, 0, 0, 1767, 1725, 1, 0, 0, 0, 1767, 1726, 1, 0, 0, 0, 1767, 1727, 1, 0, 0, 0, 1767, 1728, 1, 0, 0, 0, 1767, 1729, 1, 0, 0, 0, 1767, 1730, 1, 0, 0, 0, 1767, 1731, 1, 0, 0, 0, 1767, 1732, 1, 0, 0, 0, 1767, 1733, 1, 0, 0, 0, 1767, 1734, 1, 0, 0, 0, 1767, 1735, 1, 0, 0, 0, 1767, 1736, 1, 0, 0, 0, 1767, 1737, 1, 0, 0, 0, 1767, 1738, 1, 0, 0, 0, 1767, 1739, 1, 0, 0, 0, 1767, 1740, 1, 0, 0, 0, 1767, 1741, 1, 0, 0, 0, 1767, 1742, 1, 0, 0, 0, 1767, 1743, 1, 0, 0, 0, 1767, 1744, 1, 0, 0, 0, 1767, 1745, 1, 0, 0, 0, 1767, 1746, 1, 0, 0, 0, 1767, 1747, 1, 0, 0, 0, 1767, 1748, 1, 0, 0, 0, 1767, 1749, 1, 0, 0, 0, 1767, 1750, 1, 0, 0, 0, 1767, 1751, 1, 0, 0, 0, 1767, 1752, 1, 0, 0, 0, 1767, 1753, 1, 0, 0, 0, 1767, 1754, 1, 0, 0, 0, 1767, 1755, 1, 0, 0, 0, 1767, 1756, 1, 0, 0, 0, 1767, 1757, 1, 0, 0, 0, 1767, 1758, 1, 0, 0, 0, 1767, 1759, 1, 0, 0, 0, 1767, 1760, 1, 0, 0, 0, 1767, 1761, 1, 0, 0, 0, 1767, 1762, 1, 0, 0, 0, 1767, 1763, 1, 0, 0, 0, 1767, 1764, 1, 0, 0, 0, 1767, 1765, 1, 0, 0, 0, 1767, 1766, 1, 0, 0, 0, 1768, 9, 1, 0, 0, 0, 1769, 1771, 5, 668, 0, 0, 1770, 1772, 5, 669, 0, 0, 1771, 1770, 1, 0, 0, 0, 1771, 1772, 1, 0, 0, 0, 1772, 11, 1, 0, 0, 0, 1773, 1774, 5, 433, 0, 0, 1774, 1775, 3, 1212, 606, 0, 1775, 13, 1, 0, 0, 0, 1776, 1777, 5, 46, 0, 0, 1777, 1778, 5, 311, 0, 0, 1778, 1779, 3, 1368, 684, 0, 1779, 1780, 3, 16, 8, 0, 1780, 1781, 3, 18, 9, 0, 1781, 15, 1, 0, 0, 0, 1782, 1785, 5, 105, 0, 0, 1783, 1785, 1, 0, 0, 0, 1784, 1782, 1, 0, 0, 0, 1784, 1783, 1, 0, 0, 0, 1785, 17, 1, 0, 0, 0, 1786, 1788, 3, 24, 12, 0, 1787, 1786, 1, 0, 0, 0, 1788, 1791, 1, 0, 0, 0, 1789, 1787, 1, 0, 0, 0, 1789, 1790, 1, 0, 0, 0, 1790, 19, 1, 0, 0, 0, 1791, 1789, 1, 0, 0, 0, 1792, 1794, 3, 22, 11, 0, 1793, 1792, 1, 0, 0, 0, 1794, 1797, 1, 0, 0, 0, 1795, 1793, 1, 0, 0, 0, 1795, 1796, 1, 0, 0, 0, 1796, 21, 1, 0, 0, 0, 1797, 1795, 1, 0, 0, 0, 1798, 1801, 5, 280, 0, 0, 1799, 1802, 3, 1360, 680, 0, 1800, 1802, 5, 78, 0, 0, 1801, 1799, 1, 0, 0, 0, 1801, 1800, 1, 0, 0, 0, 1802, 1817, 1, 0, 0, 0, 1803, 1804, 7, 0, 0, 0, 1804, 1805, 5, 280, 0, 0, 1805, 1817, 3, 1360, 680, 0, 1806, 1817, 5, 228, 0, 0, 1807, 1808, 5, 164, 0, 0, 1808, 1809, 5, 74, 0, 0, 1809, 1817, 3, 1366, 683, 0, 1810, 1811, 5, 364, 0, 0, 1811, 1812, 5, 361, 0, 0, 1812, 1817, 3, 1360, 680, 0, 1813, 1814, 5, 99, 0, 0, 1814, 1817, 3, 1372, 686, 0, 1815, 1817, 3, 1384, 692, 0, 1816, 1798, 1, 0, 0, 0, 1816, 1803, 1, 0, 0, 0, 1816, 1806, 1, 0, 0, 0, 1816, 1807, 1, 0, 0, 0, 1816, 1810, 1, 0, 0, 0, 1816, 1813, 1, 0, 0, 0, 1816, 1815, 1, 0, 0, 0, 1817, 23, 1, 0, 0, 0, 1818, 1829, 3, 22, 11, 0, 1819, 1820, 5, 341, 0, 0, 1820, 1829, 3, 1358, 679, 0, 1821, 1822, 5, 134, 0, 0, 1822, 1829, 3, 1372, 686, 0, 1823, 1824, 5, 311, 0, 0, 1824, 1829, 3, 1372, 686, 0, 1825, 1826, 5, 68, 0, 0, 1826, 1827, 7, 1, 0, 0, 1827, 1829, 3, 1372, 686, 0, 1828, 1818, 1, 0, 0, 0, 1828, 1819, 1, 0, 0, 0, 1828, 1821, 1, 0, 0, 0, 1828, 1823, 1, 0, 0, 0, 1828, 1825, 1, 0, 0, 0, 1829, 25, 1, 0, 0, 0, 1830, 1831, 5, 46, 0, 0, 1831, 1832, 5, 99, 0, 0, 1832, 1833, 3, 1368, 684, 0, 1833, 1834, 3, 16, 8, 0, 1834, 1835, 3, 18, 9, 0, 1835, 27, 1, 0, 0, 0, 1836, 1837, 5, 138, 0, 0, 1837, 1838, 7, 2, 0, 0, 1838, 1839, 3, 1370, 685, 0, 1839, 1840, 3, 16, 8, 0, 1840, 1841, 3, 20, 10, 0, 1841, 29, 1, 0, 0, 0, 1842, 1847, 1, 0, 0, 0, 1843, 1844, 5, 68, 0, 0, 1844, 1845, 5, 175, 0, 0, 1845, 1847, 3, 1342, 671, 0, 1846, 1842, 1, 0, 0, 0, 1846, 1843, 1, 0, 0, 0, 1847, 31, 1, 0, 0, 0, 1848, 1849, 5, 138, 0, 0, 1849, 1851, 7, 2, 0, 0, 1850, 1852, 5, 30, 0, 0, 1851, 1850, 1, 0, 0, 0, 1851, 1852, 1, 0, 0, 0, 1852, 1853, 1, 0, 0, 0, 1853, 1854, 3, 1370, 685, 0, 1854, 1855, 3, 30, 15, 0, 1855, 1856, 3, 80, 40, 0, 1856, 33, 1, 0, 0, 0, 1857, 1858, 5, 191, 0, 0, 1858, 1861, 7, 3, 0, 0, 1859, 1860, 5, 220, 0, 0, 1860, 1862, 5, 389, 0, 0, 1861, 1859, 1, 0, 0, 0, 1861, 1862, 1, 0, 0, 0, 1862, 1863, 1, 0, 0, 0, 1863, 1864, 3, 1372, 686, 0, 1864, 35, 1, 0, 0, 0, 1865, 1866, 5, 46, 0, 0, 1866, 1867, 5, 66, 0, 0, 1867, 1868, 3, 1368, 684, 0, 1868, 1869, 3, 16, 8, 0, 1869, 1870, 3, 18, 9, 0, 1870, 37, 1, 0, 0, 0, 1871, 1872, 5, 138, 0, 0, 1872, 1873, 5, 66, 0, 0, 1873, 1874, 3, 1370, 685, 0, 1874, 1875, 3, 40, 20, 0, 1875, 1876, 5, 99, 0, 0, 1876, 1877, 3, 1372, 686, 0, 1877, 39, 1, 0, 0, 0, 1878, 1879, 7, 4, 0, 0, 1879, 41, 1, 0, 0, 0, 1880, 1881, 5, 46, 0, 0, 1881, 1885, 5, 316, 0, 0, 1882, 1883, 5, 220, 0, 0, 1883, 1884, 5, 77, 0, 0, 1884, 1886, 5, 389, 0, 0, 1885, 1882, 1, 0, 0, 0, 1885, 1886, 1, 0, 0, 0, 1886, 1892, 1, 0, 0, 0, 1887, 1888, 3, 44, 22, 0, 1888, 1889, 5, 106, 0, 0, 1889, 1890, 3, 1370, 685, 0, 1890, 1893, 1, 0, 0, 0, 1891, 1893, 3, 1374, 687, 0, 1892, 1887, 1, 0, 0, 0, 1892, 1891, 1, 0, 0, 0, 1893, 1894, 1, 0, 0, 0, 1894, 1895, 3, 46, 23, 0, 1895, 43, 1, 0, 0, 0, 1896, 1899, 3, 1374, 687, 0, 1897, 1899, 1, 0, 0, 0, 1898, 1896, 1, 0, 0, 0, 1898, 1897, 1, 0, 0, 0, 1899, 45, 1, 0, 0, 0, 1900, 1902, 3, 48, 24, 0, 1901, 1900, 1, 0, 0, 0, 1902, 1905, 1, 0, 0, 0, 1903, 1901, 1, 0, 0, 0, 1903, 1904, 1, 0, 0, 0, 1904, 47, 1, 0, 0, 0, 1905, 1903, 1, 0, 0, 0, 1906, 1913, 3, 172, 86, 0, 1907, 1913, 3, 588, 294, 0, 1908, 1913, 3, 278, 139, 0, 1909, 1913, 3, 404, 202, 0, 1910, 1913, 3, 552, 276, 0, 1911, 1913, 3, 798, 399, 0, 1912, 1906, 1, 0, 0, 0, 1912, 1907, 1, 0, 0, 0, 1912, 1908, 1, 0, 0, 0, 1912, 1909, 1, 0, 0, 0, 1912, 1910, 1, 0, 0, 0, 1912, 1911, 1, 0, 0, 0, 1913, 49, 1, 0, 0, 0, 1914, 1916, 5, 326, 0, 0, 1915, 1917, 7, 5, 0, 0, 1916, 1915, 1, 0, 0, 0, 1916, 1917, 1, 0, 0, 0, 1917, 1918, 1, 0, 0, 0, 1918, 1919, 3, 52, 26, 0, 1919, 51, 1, 0, 0, 0, 1920, 1921, 5, 349, 0, 0, 1921, 1929, 3, 792, 396, 0, 1922, 1923, 5, 325, 0, 0, 1923, 1924, 5, 154, 0, 0, 1924, 1925, 5, 36, 0, 0, 1925, 1926, 5, 349, 0, 0, 1926, 1929, 3, 792, 396, 0, 1927, 1929, 3, 56, 28, 0, 1928, 1920, 1, 0, 0, 0, 1928, 1922, 1, 0, 0, 0, 1928, 1927, 1, 0, 0, 0, 1929, 53, 1, 0, 0, 0, 1930, 1931, 3, 58, 29, 0, 1931, 1932, 7, 6, 0, 0, 1932, 1933, 3, 60, 30, 0, 1933, 55, 1, 0, 0, 0, 1934, 1960, 3, 54, 27, 0, 1935, 1936, 3, 58, 29, 0, 1936, 1937, 5, 64, 0, 0, 1937, 1938, 5, 434, 0, 0, 1938, 1960, 1, 0, 0, 0, 1939, 1940, 5, 411, 0, 0, 1940, 1941, 5, 379, 0, 0, 1941, 1960, 3, 68, 34, 0, 1942, 1943, 5, 152, 0, 0, 1943, 1960, 3, 1360, 680, 0, 1944, 1945, 5, 316, 0, 0, 1945, 1960, 3, 1360, 680, 0, 1946, 1947, 5, 260, 0, 0, 1947, 1960, 3, 70, 35, 0, 1948, 1949, 5, 311, 0, 0, 1949, 1960, 3, 72, 36, 0, 1950, 1951, 5, 325, 0, 0, 1951, 1952, 5, 106, 0, 0, 1952, 1960, 3, 72, 36, 0, 1953, 1954, 5, 376, 0, 0, 1954, 1955, 5, 272, 0, 0, 1955, 1960, 3, 1230, 615, 0, 1956, 1957, 5, 349, 0, 0, 1957, 1958, 5, 330, 0, 0, 1958, 1960, 3, 1360, 680, 0, 1959, 1934, 1, 0, 0, 0, 1959, 1935, 1, 0, 0, 0, 1959, 1939, 1, 0, 0, 0, 1959, 1942, 1, 0, 0, 0, 1959, 1944, 1, 0, 0, 0, 1959, 1946, 1, 0, 0, 0, 1959, 1948, 1, 0, 0, 0, 1959, 1950, 1, 0, 0, 0, 1959, 1953, 1, 0, 0, 0, 1959, 1956, 1, 0, 0, 0, 1960, 57, 1, 0, 0, 0, 1961, 1966, 3, 1374, 687, 0, 1962, 1963, 5, 11, 0, 0, 1963, 1965, 3, 1374, 687, 0, 1964, 1962, 1, 0, 0, 0, 1965, 1968, 1, 0, 0, 0, 1966, 1964, 1, 0, 0, 0, 1966, 1967, 1, 0, 0, 0, 1967, 59, 1, 0, 0, 0, 1968, 1966, 1, 0, 0, 0, 1969, 1974, 3, 62, 31, 0, 1970, 1971, 5, 6, 0, 0, 1971, 1973, 3, 62, 31, 0, 1972, 1970, 1, 0, 0, 0, 1973, 1976, 1, 0, 0, 0, 1974, 1972, 1, 0, 0, 0, 1974, 1975, 1, 0, 0, 0, 1975, 61, 1, 0, 0, 0, 1976, 1974, 1, 0, 0, 0, 1977, 1980, 3, 66, 33, 0, 1978, 1980, 3, 292, 146, 0, 1979, 1977, 1, 0, 0, 0, 1979, 1978, 1, 0, 0, 0, 1980, 63, 1, 0, 0, 0, 1981, 1982, 5, 293, 0, 0, 1982, 1987, 7, 7, 0, 0, 1983, 1984, 5, 303, 0, 0, 1984, 1987, 5, 293, 0, 0, 1985, 1987, 5, 323, 0, 0, 1986, 1981, 1, 0, 0, 0, 1986, 1983, 1, 0, 0, 0, 1986, 1985, 1, 0, 0, 0, 1987, 65, 1, 0, 0, 0, 1988, 1993, 5, 96, 0, 0, 1989, 1993, 5, 60, 0, 0, 1990, 1993, 5, 80, 0, 0, 1991, 1993, 3, 72, 36, 0, 1992, 1988, 1, 0, 0, 0, 1992, 1989, 1, 0, 0, 0, 1992, 1990, 1, 0, 0, 0, 1992, 1991, 1, 0, 0, 0, 1993, 67, 1, 0, 0, 0, 1994, 2010, 3, 1360, 680, 0, 1995, 2010, 3, 1384, 692, 0, 1996, 1997, 3, 1154, 577, 0, 1997, 1998, 3, 1360, 680, 0, 1998, 1999, 3, 1158, 579, 0, 1999, 2010, 1, 0, 0, 0, 2000, 2001, 3, 1154, 577, 0, 2001, 2002, 5, 2, 0, 0, 2002, 2003, 3, 1358, 679, 0, 2003, 2004, 5, 3, 0, 0, 2004, 2005, 3, 1360, 680, 0, 2005, 2010, 1, 0, 0, 0, 2006, 2010, 3, 292, 146, 0, 2007, 2010, 5, 53, 0, 0, 2008, 2010, 5, 245, 0, 0, 2009, 1994, 1, 0, 0, 0, 2009, 1995, 1, 0, 0, 0, 2009, 1996, 1, 0, 0, 0, 2009, 2000, 1, 0, 0, 0, 2009, 2006, 1, 0, 0, 0, 2009, 2007, 1, 0, 0, 0, 2009, 2008, 1, 0, 0, 0, 2010, 69, 1, 0, 0, 0, 2011, 2015, 3, 1360, 680, 0, 2012, 2015, 5, 53, 0, 0, 2013, 2015, 1, 0, 0, 0, 2014, 2011, 1, 0, 0, 0, 2014, 2012, 1, 0, 0, 0, 2014, 2013, 1, 0, 0, 0, 2015, 71, 1, 0, 0, 0, 2016, 2019, 3, 1380, 690, 0, 2017, 2019, 3, 1360, 680, 0, 2018, 2016, 1, 0, 0, 0, 2018, 2017, 1, 0, 0, 0, 2019, 73, 1, 0, 0, 0, 2020, 2021, 5, 306, 0, 0, 2021, 2022, 3, 76, 38, 0, 2022, 75, 1, 0, 0, 0, 2023, 2032, 3, 78, 39, 0, 2024, 2025, 5, 411, 0, 0, 2025, 2032, 5, 379, 0, 0, 2026, 2027, 5, 349, 0, 0, 2027, 2028, 5, 235, 0, 0, 2028, 2032, 5, 242, 0, 0, 2029, 2030, 5, 325, 0, 0, 2030, 2032, 5, 106, 0, 0, 2031, 2023, 1, 0, 0, 0, 2031, 2024, 1, 0, 0, 0, 2031, 2026, 1, 0, 0, 0, 2031, 2029, 1, 0, 0, 0, 2032, 77, 1, 0, 0, 0, 2033, 2036, 3, 58, 29, 0, 2034, 2036, 5, 30, 0, 0, 2035, 2033, 1, 0, 0, 0, 2035, 2034, 1, 0, 0, 0, 2036, 79, 1, 0, 0, 0, 2037, 2038, 5, 326, 0, 0, 2038, 2041, 3, 52, 26, 0, 2039, 2041, 3, 74, 37, 0, 2040, 2037, 1, 0, 0, 0, 2040, 2039, 1, 0, 0, 0, 2041, 81, 1, 0, 0, 0, 2042, 2043, 5, 326, 0, 0, 2043, 2046, 3, 56, 28, 0, 2044, 2046, 3, 74, 37, 0, 2045, 2042, 1, 0, 0, 0, 2045, 2044, 1, 0, 0, 0, 2046, 83, 1, 0, 0, 0, 2047, 2057, 5, 328, 0, 0, 2048, 2058, 3, 58, 29, 0, 2049, 2050, 5, 411, 0, 0, 2050, 2058, 5, 379, 0, 0, 2051, 2052, 5, 349, 0, 0, 2052, 2053, 5, 235, 0, 0, 2053, 2058, 5, 242, 0, 0, 2054, 2055, 5, 325, 0, 0, 2055, 2058, 5, 106, 0, 0, 2056, 2058, 5, 30, 0, 0, 2057, 2048, 1, 0, 0, 0, 2057, 2049, 1, 0, 0, 0, 2057, 2051, 1, 0, 0, 0, 2057, 2054, 1, 0, 0, 0, 2057, 2056, 1, 0, 0, 0, 2058, 85, 1, 0, 0, 0, 2059, 2060, 5, 326, 0, 0, 2060, 2061, 5, 165, 0, 0, 2061, 2062, 3, 88, 44, 0, 2062, 2063, 3, 90, 45, 0, 2063, 87, 1, 0, 0, 0, 2064, 2067, 5, 30, 0, 0, 2065, 2067, 3, 1336, 668, 0, 2066, 2064, 1, 0, 0, 0, 2066, 2065, 1, 0, 0, 0, 2067, 89, 1, 0, 0, 0, 2068, 2069, 7, 8, 0, 0, 2069, 91, 1, 0, 0, 0, 2070, 2071, 5, 155, 0, 0, 2071, 93, 1, 0, 0, 0, 2072, 2073, 5, 187, 0, 0, 2073, 2074, 7, 9, 0, 0, 2074, 95, 1, 0, 0, 0, 2075, 2076, 5, 138, 0, 0, 2076, 2079, 5, 92, 0, 0, 2077, 2078, 5, 220, 0, 0, 2078, 2080, 5, 389, 0, 0, 2079, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2081, 1, 0, 0, 0, 2081, 2084, 3, 1076, 538, 0, 2082, 2085, 3, 98, 49, 0, 2083, 2085, 3, 100, 50, 0, 2084, 2082, 1, 0, 0, 0, 2084, 2083, 1, 0, 0, 0, 2085, 2185, 1, 0, 0, 0, 2086, 2087, 5, 138, 0, 0, 2087, 2088, 5, 92, 0, 0, 2088, 2089, 5, 30, 0, 0, 2089, 2090, 5, 68, 0, 0, 2090, 2091, 5, 344, 0, 0, 2091, 2095, 3, 1342, 671, 0, 2092, 2093, 5, 274, 0, 0, 2093, 2094, 5, 147, 0, 0, 2094, 2096, 3, 1372, 686, 0, 2095, 2092, 1, 0, 0, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2097, 1, 0, 0, 0, 2097, 2098, 5, 326, 0, 0, 2098, 2099, 5, 344, 0, 0, 2099, 2100, 3, 1342, 671, 0, 2100, 2101, 3, 938, 469, 0, 2101, 2185, 1, 0, 0, 0, 2102, 2103, 5, 138, 0, 0, 2103, 2106, 5, 226, 0, 0, 2104, 2105, 5, 220, 0, 0, 2105, 2107, 5, 389, 0, 0, 2106, 2104, 1, 0, 0, 0, 2106, 2107, 1, 0, 0, 0, 2107, 2108, 1, 0, 0, 0, 2108, 2111, 3, 1338, 669, 0, 2109, 2112, 3, 98, 49, 0, 2110, 2112, 3, 102, 51, 0, 2111, 2109, 1, 0, 0, 0, 2111, 2110, 1, 0, 0, 0, 2112, 2185, 1, 0, 0, 0, 2113, 2114, 5, 138, 0, 0, 2114, 2115, 5, 226, 0, 0, 2115, 2116, 5, 30, 0, 0, 2116, 2117, 5, 68, 0, 0, 2117, 2118, 5, 344, 0, 0, 2118, 2122, 3, 1342, 671, 0, 2119, 2120, 5, 274, 0, 0, 2120, 2121, 5, 147, 0, 0, 2121, 2123, 3, 1372, 686, 0, 2122, 2119, 1, 0, 0, 0, 2122, 2123, 1, 0, 0, 0, 2123, 2124, 1, 0, 0, 0, 2124, 2125, 5, 326, 0, 0, 2125, 2126, 5, 344, 0, 0, 2126, 2127, 3, 1342, 671, 0, 2127, 2128, 3, 938, 469, 0, 2128, 2185, 1, 0, 0, 0, 2129, 2130, 5, 138, 0, 0, 2130, 2133, 5, 321, 0, 0, 2131, 2132, 5, 220, 0, 0, 2132, 2134, 5, 389, 0, 0, 2133, 2131, 1, 0, 0, 0, 2133, 2134, 1, 0, 0, 0, 2134, 2135, 1, 0, 0, 0, 2135, 2136, 3, 1338, 669, 0, 2136, 2137, 3, 98, 49, 0, 2137, 2185, 1, 0, 0, 0, 2138, 2139, 5, 138, 0, 0, 2139, 2142, 5, 369, 0, 0, 2140, 2141, 5, 220, 0, 0, 2141, 2143, 5, 389, 0, 0, 2142, 2140, 1, 0, 0, 0, 2142, 2143, 1, 0, 0, 0, 2143, 2144, 1, 0, 0, 0, 2144, 2145, 3, 1338, 669, 0, 2145, 2146, 3, 98, 49, 0, 2146, 2185, 1, 0, 0, 0, 2147, 2148, 5, 138, 0, 0, 2148, 2149, 5, 251, 0, 0, 2149, 2152, 5, 369, 0, 0, 2150, 2151, 5, 220, 0, 0, 2151, 2153, 5, 389, 0, 0, 2152, 2150, 1, 0, 0, 0, 2152, 2153, 1, 0, 0, 0, 2153, 2154, 1, 0, 0, 0, 2154, 2155, 3, 1338, 669, 0, 2155, 2156, 3, 98, 49, 0, 2156, 2185, 1, 0, 0, 0, 2157, 2158, 5, 138, 0, 0, 2158, 2159, 5, 251, 0, 0, 2159, 2160, 5, 369, 0, 0, 2160, 2161, 5, 30, 0, 0, 2161, 2162, 5, 68, 0, 0, 2162, 2163, 5, 344, 0, 0, 2163, 2167, 3, 1342, 671, 0, 2164, 2165, 5, 274, 0, 0, 2165, 2166, 5, 147, 0, 0, 2166, 2168, 3, 1372, 686, 0, 2167, 2164, 1, 0, 0, 0, 2167, 2168, 1, 0, 0, 0, 2168, 2169, 1, 0, 0, 0, 2169, 2170, 5, 326, 0, 0, 2170, 2171, 5, 344, 0, 0, 2171, 2172, 3, 1342, 671, 0, 2172, 2173, 3, 938, 469, 0, 2173, 2185, 1, 0, 0, 0, 2174, 2175, 5, 138, 0, 0, 2175, 2176, 5, 63, 0, 0, 2176, 2179, 5, 92, 0, 0, 2177, 2178, 5, 220, 0, 0, 2178, 2180, 5, 389, 0, 0, 2179, 2177, 1, 0, 0, 0, 2179, 2180, 1, 0, 0, 0, 2180, 2181, 1, 0, 0, 0, 2181, 2182, 3, 1076, 538, 0, 2182, 2183, 3, 98, 49, 0, 2183, 2185, 1, 0, 0, 0, 2184, 2075, 1, 0, 0, 0, 2184, 2086, 1, 0, 0, 0, 2184, 2102, 1, 0, 0, 0, 2184, 2113, 1, 0, 0, 0, 2184, 2129, 1, 0, 0, 0, 2184, 2138, 1, 0, 0, 0, 2184, 2147, 1, 0, 0, 0, 2184, 2157, 1, 0, 0, 0, 2184, 2174, 1, 0, 0, 0, 2185, 97, 1, 0, 0, 0, 2186, 2191, 3, 104, 52, 0, 2187, 2188, 5, 6, 0, 0, 2188, 2190, 3, 104, 52, 0, 2189, 2187, 1, 0, 0, 0, 2190, 2193, 1, 0, 0, 0, 2191, 2189, 1, 0, 0, 0, 2191, 2192, 1, 0, 0, 0, 2192, 99, 1, 0, 0, 0, 2193, 2191, 1, 0, 0, 0, 2194, 2195, 5, 435, 0, 0, 2195, 2196, 5, 278, 0, 0, 2196, 2197, 3, 1338, 669, 0, 2197, 2198, 3, 128, 64, 0, 2198, 2203, 1, 0, 0, 0, 2199, 2200, 5, 436, 0, 0, 2200, 2201, 5, 278, 0, 0, 2201, 2203, 3, 1338, 669, 0, 2202, 2194, 1, 0, 0, 0, 2202, 2199, 1, 0, 0, 0, 2203, 101, 1, 0, 0, 0, 2204, 2205, 5, 435, 0, 0, 2205, 2206, 5, 278, 0, 0, 2206, 2207, 3, 1338, 669, 0, 2207, 103, 1, 0, 0, 0, 2208, 2209, 5, 133, 0, 0, 2209, 2461, 3, 188, 94, 0, 2210, 2211, 5, 133, 0, 0, 2211, 2212, 5, 220, 0, 0, 2212, 2213, 5, 77, 0, 0, 2213, 2214, 5, 389, 0, 0, 2214, 2461, 3, 188, 94, 0, 2215, 2216, 5, 133, 0, 0, 2216, 2217, 5, 44, 0, 0, 2217, 2461, 3, 188, 94, 0, 2218, 2219, 5, 133, 0, 0, 2219, 2220, 5, 44, 0, 0, 2220, 2221, 5, 220, 0, 0, 2221, 2222, 5, 77, 0, 0, 2222, 2223, 5, 389, 0, 0, 2223, 2461, 3, 188, 94, 0, 2224, 2225, 5, 138, 0, 0, 2225, 2226, 3, 724, 362, 0, 2226, 2227, 3, 1374, 687, 0, 2227, 2228, 3, 106, 53, 0, 2228, 2461, 1, 0, 0, 0, 2229, 2230, 5, 138, 0, 0, 2230, 2231, 3, 724, 362, 0, 2231, 2232, 3, 1374, 687, 0, 2232, 2233, 5, 191, 0, 0, 2233, 2234, 5, 77, 0, 0, 2234, 2235, 5, 78, 0, 0, 2235, 2461, 1, 0, 0, 0, 2236, 2237, 5, 138, 0, 0, 2237, 2238, 3, 724, 362, 0, 2238, 2239, 3, 1374, 687, 0, 2239, 2240, 5, 326, 0, 0, 2240, 2241, 5, 77, 0, 0, 2241, 2242, 5, 78, 0, 0, 2242, 2461, 1, 0, 0, 0, 2243, 2244, 5, 138, 0, 0, 2244, 2245, 3, 724, 362, 0, 2245, 2246, 3, 1374, 687, 0, 2246, 2247, 5, 191, 0, 0, 2247, 2248, 5, 437, 0, 0, 2248, 2461, 1, 0, 0, 0, 2249, 2250, 5, 138, 0, 0, 2250, 2251, 3, 724, 362, 0, 2251, 2252, 3, 1374, 687, 0, 2252, 2253, 5, 191, 0, 0, 2253, 2254, 5, 437, 0, 0, 2254, 2255, 5, 220, 0, 0, 2255, 2256, 5, 389, 0, 0, 2256, 2461, 1, 0, 0, 0, 2257, 2258, 5, 138, 0, 0, 2258, 2259, 3, 724, 362, 0, 2259, 2260, 3, 1374, 687, 0, 2260, 2261, 5, 326, 0, 0, 2261, 2262, 5, 335, 0, 0, 2262, 2263, 3, 1366, 683, 0, 2263, 2461, 1, 0, 0, 0, 2264, 2265, 5, 138, 0, 0, 2265, 2266, 3, 724, 362, 0, 2266, 2267, 3, 1358, 679, 0, 2267, 2268, 5, 326, 0, 0, 2268, 2269, 5, 335, 0, 0, 2269, 2270, 3, 1366, 683, 0, 2270, 2461, 1, 0, 0, 0, 2271, 2272, 5, 138, 0, 0, 2272, 2273, 3, 724, 362, 0, 2273, 2274, 3, 1374, 687, 0, 2274, 2275, 5, 326, 0, 0, 2275, 2276, 3, 116, 58, 0, 2276, 2461, 1, 0, 0, 0, 2277, 2278, 5, 138, 0, 0, 2278, 2279, 3, 724, 362, 0, 2279, 2280, 3, 1374, 687, 0, 2280, 2281, 5, 306, 0, 0, 2281, 2282, 3, 116, 58, 0, 2282, 2461, 1, 0, 0, 0, 2283, 2284, 5, 138, 0, 0, 2284, 2285, 3, 724, 362, 0, 2285, 2286, 3, 1374, 687, 0, 2286, 2287, 5, 326, 0, 0, 2287, 2288, 5, 338, 0, 0, 2288, 2289, 3, 1374, 687, 0, 2289, 2461, 1, 0, 0, 0, 2290, 2291, 5, 138, 0, 0, 2291, 2292, 3, 724, 362, 0, 2292, 2293, 3, 1374, 687, 0, 2293, 2294, 5, 133, 0, 0, 2294, 2295, 5, 438, 0, 0, 2295, 2296, 3, 198, 99, 0, 2296, 2297, 5, 36, 0, 0, 2297, 2298, 5, 219, 0, 0, 2298, 2299, 3, 284, 142, 0, 2299, 2461, 1, 0, 0, 0, 2300, 2301, 5, 138, 0, 0, 2301, 2302, 3, 724, 362, 0, 2302, 2303, 3, 1374, 687, 0, 2303, 2304, 3, 124, 62, 0, 2304, 2461, 1, 0, 0, 0, 2305, 2306, 5, 138, 0, 0, 2306, 2307, 3, 724, 362, 0, 2307, 2308, 3, 1374, 687, 0, 2308, 2309, 5, 191, 0, 0, 2309, 2310, 5, 219, 0, 0, 2310, 2461, 1, 0, 0, 0, 2311, 2312, 5, 138, 0, 0, 2312, 2313, 3, 724, 362, 0, 2313, 2314, 3, 1374, 687, 0, 2314, 2315, 5, 191, 0, 0, 2315, 2316, 5, 219, 0, 0, 2316, 2317, 5, 220, 0, 0, 2317, 2318, 5, 389, 0, 0, 2318, 2461, 1, 0, 0, 0, 2319, 2320, 5, 191, 0, 0, 2320, 2321, 3, 724, 362, 0, 2321, 2322, 5, 220, 0, 0, 2322, 2323, 5, 389, 0, 0, 2323, 2324, 3, 1374, 687, 0, 2324, 2325, 3, 108, 54, 0, 2325, 2461, 1, 0, 0, 0, 2326, 2327, 5, 191, 0, 0, 2327, 2328, 3, 724, 362, 0, 2328, 2329, 3, 1374, 687, 0, 2329, 2330, 3, 108, 54, 0, 2330, 2461, 1, 0, 0, 0, 2331, 2332, 5, 138, 0, 0, 2332, 2333, 3, 724, 362, 0, 2333, 2334, 3, 1374, 687, 0, 2334, 2335, 3, 726, 363, 0, 2335, 2336, 5, 353, 0, 0, 2336, 2337, 3, 1120, 560, 0, 2337, 2338, 3, 110, 55, 0, 2338, 2339, 3, 112, 56, 0, 2339, 2461, 1, 0, 0, 0, 2340, 2341, 5, 138, 0, 0, 2341, 2342, 3, 724, 362, 0, 2342, 2343, 3, 1374, 687, 0, 2343, 2344, 3, 344, 172, 0, 2344, 2461, 1, 0, 0, 0, 2345, 2346, 5, 133, 0, 0, 2346, 2461, 3, 208, 104, 0, 2347, 2348, 5, 138, 0, 0, 2348, 2349, 5, 45, 0, 0, 2349, 2350, 3, 1342, 671, 0, 2350, 2351, 3, 440, 220, 0, 2351, 2461, 1, 0, 0, 0, 2352, 2353, 5, 365, 0, 0, 2353, 2354, 5, 45, 0, 0, 2354, 2461, 3, 1342, 671, 0, 2355, 2356, 5, 191, 0, 0, 2356, 2357, 5, 45, 0, 0, 2357, 2358, 5, 220, 0, 0, 2358, 2359, 5, 389, 0, 0, 2359, 2360, 3, 1342, 671, 0, 2360, 2361, 3, 108, 54, 0, 2361, 2461, 1, 0, 0, 0, 2362, 2363, 5, 191, 0, 0, 2363, 2364, 5, 45, 0, 0, 2364, 2365, 3, 1342, 671, 0, 2365, 2366, 3, 108, 54, 0, 2366, 2461, 1, 0, 0, 0, 2367, 2368, 5, 326, 0, 0, 2368, 2369, 5, 372, 0, 0, 2369, 2461, 5, 270, 0, 0, 2370, 2371, 5, 158, 0, 0, 2371, 2372, 5, 80, 0, 0, 2372, 2461, 3, 1342, 671, 0, 2373, 2374, 5, 326, 0, 0, 2374, 2375, 5, 372, 0, 0, 2375, 2461, 5, 158, 0, 0, 2376, 2377, 5, 326, 0, 0, 2377, 2461, 5, 439, 0, 0, 2378, 2379, 5, 326, 0, 0, 2379, 2461, 5, 360, 0, 0, 2380, 2381, 5, 193, 0, 0, 2381, 2382, 5, 350, 0, 0, 2382, 2461, 3, 1342, 671, 0, 2383, 2384, 5, 193, 0, 0, 2384, 2385, 5, 139, 0, 0, 2385, 2386, 5, 350, 0, 0, 2386, 2461, 3, 1342, 671, 0, 2387, 2388, 5, 193, 0, 0, 2388, 2389, 5, 305, 0, 0, 2389, 2390, 5, 350, 0, 0, 2390, 2461, 3, 1342, 671, 0, 2391, 2392, 5, 193, 0, 0, 2392, 2393, 5, 350, 0, 0, 2393, 2461, 5, 30, 0, 0, 2394, 2395, 5, 193, 0, 0, 2395, 2396, 5, 350, 0, 0, 2396, 2461, 5, 99, 0, 0, 2397, 2398, 5, 186, 0, 0, 2398, 2399, 5, 350, 0, 0, 2399, 2461, 3, 1342, 671, 0, 2400, 2401, 5, 186, 0, 0, 2401, 2402, 5, 350, 0, 0, 2402, 2461, 5, 30, 0, 0, 2403, 2404, 5, 186, 0, 0, 2404, 2405, 5, 350, 0, 0, 2405, 2461, 5, 99, 0, 0, 2406, 2407, 5, 193, 0, 0, 2407, 2408, 5, 314, 0, 0, 2408, 2461, 3, 1342, 671, 0, 2409, 2410, 5, 193, 0, 0, 2410, 2411, 5, 139, 0, 0, 2411, 2412, 5, 314, 0, 0, 2412, 2461, 3, 1342, 671, 0, 2413, 2414, 5, 193, 0, 0, 2414, 2415, 5, 305, 0, 0, 2415, 2416, 5, 314, 0, 0, 2416, 2461, 3, 1342, 671, 0, 2417, 2418, 5, 186, 0, 0, 2418, 2419, 5, 314, 0, 0, 2419, 2461, 3, 1342, 671, 0, 2420, 2421, 5, 228, 0, 0, 2421, 2461, 3, 1338, 669, 0, 2422, 2423, 5, 262, 0, 0, 2423, 2424, 5, 228, 0, 0, 2424, 2461, 3, 1338, 669, 0, 2425, 2426, 5, 268, 0, 0, 2426, 2461, 3, 524, 262, 0, 2427, 2428, 5, 77, 0, 0, 2428, 2461, 5, 268, 0, 0, 2429, 2430, 5, 275, 0, 0, 2430, 2431, 5, 94, 0, 0, 2431, 2461, 3, 1370, 685, 0, 2432, 2433, 5, 326, 0, 0, 2433, 2434, 5, 344, 0, 0, 2434, 2461, 3, 1342, 671, 0, 2435, 2436, 5, 326, 0, 0, 2436, 2461, 3, 116, 58, 0, 2437, 2438, 5, 306, 0, 0, 2438, 2461, 3, 116, 58, 0, 2439, 2440, 5, 305, 0, 0, 2440, 2441, 5, 219, 0, 0, 2441, 2461, 3, 114, 57, 0, 2442, 2443, 5, 193, 0, 0, 2443, 2444, 5, 407, 0, 0, 2444, 2445, 5, 242, 0, 0, 2445, 2461, 5, 320, 0, 0, 2446, 2447, 5, 186, 0, 0, 2447, 2448, 5, 407, 0, 0, 2448, 2449, 5, 242, 0, 0, 2449, 2461, 5, 320, 0, 0, 2450, 2451, 5, 209, 0, 0, 2451, 2452, 5, 407, 0, 0, 2452, 2453, 5, 242, 0, 0, 2453, 2461, 5, 320, 0, 0, 2454, 2455, 5, 262, 0, 0, 2455, 2456, 5, 209, 0, 0, 2456, 2457, 5, 407, 0, 0, 2457, 2458, 5, 242, 0, 0, 2458, 2461, 5, 320, 0, 0, 2459, 2461, 3, 344, 172, 0, 2460, 2208, 1, 0, 0, 0, 2460, 2210, 1, 0, 0, 0, 2460, 2215, 1, 0, 0, 0, 2460, 2218, 1, 0, 0, 0, 2460, 2224, 1, 0, 0, 0, 2460, 2229, 1, 0, 0, 0, 2460, 2236, 1, 0, 0, 0, 2460, 2243, 1, 0, 0, 0, 2460, 2249, 1, 0, 0, 0, 2460, 2257, 1, 0, 0, 0, 2460, 2264, 1, 0, 0, 0, 2460, 2271, 1, 0, 0, 0, 2460, 2277, 1, 0, 0, 0, 2460, 2283, 1, 0, 0, 0, 2460, 2290, 1, 0, 0, 0, 2460, 2300, 1, 0, 0, 0, 2460, 2305, 1, 0, 0, 0, 2460, 2311, 1, 0, 0, 0, 2460, 2319, 1, 0, 0, 0, 2460, 2326, 1, 0, 0, 0, 2460, 2331, 1, 0, 0, 0, 2460, 2340, 1, 0, 0, 0, 2460, 2345, 1, 0, 0, 0, 2460, 2347, 1, 0, 0, 0, 2460, 2352, 1, 0, 0, 0, 2460, 2355, 1, 0, 0, 0, 2460, 2362, 1, 0, 0, 0, 2460, 2367, 1, 0, 0, 0, 2460, 2370, 1, 0, 0, 0, 2460, 2373, 1, 0, 0, 0, 2460, 2376, 1, 0, 0, 0, 2460, 2378, 1, 0, 0, 0, 2460, 2380, 1, 0, 0, 0, 2460, 2383, 1, 0, 0, 0, 2460, 2387, 1, 0, 0, 0, 2460, 2391, 1, 0, 0, 0, 2460, 2394, 1, 0, 0, 0, 2460, 2397, 1, 0, 0, 0, 2460, 2400, 1, 0, 0, 0, 2460, 2403, 1, 0, 0, 0, 2460, 2406, 1, 0, 0, 0, 2460, 2409, 1, 0, 0, 0, 2460, 2413, 1, 0, 0, 0, 2460, 2417, 1, 0, 0, 0, 2460, 2420, 1, 0, 0, 0, 2460, 2422, 1, 0, 0, 0, 2460, 2425, 1, 0, 0, 0, 2460, 2427, 1, 0, 0, 0, 2460, 2429, 1, 0, 0, 0, 2460, 2432, 1, 0, 0, 0, 2460, 2435, 1, 0, 0, 0, 2460, 2437, 1, 0, 0, 0, 2460, 2439, 1, 0, 0, 0, 2460, 2442, 1, 0, 0, 0, 2460, 2446, 1, 0, 0, 0, 2460, 2450, 1, 0, 0, 0, 2460, 2454, 1, 0, 0, 0, 2460, 2459, 1, 0, 0, 0, 2461, 105, 1, 0, 0, 0, 2462, 2463, 5, 326, 0, 0, 2463, 2464, 5, 53, 0, 0, 2464, 2468, 3, 1164, 582, 0, 2465, 2466, 5, 191, 0, 0, 2466, 2468, 5, 53, 0, 0, 2467, 2462, 1, 0, 0, 0, 2467, 2465, 1, 0, 0, 0, 2468, 107, 1, 0, 0, 0, 2469, 2473, 5, 150, 0, 0, 2470, 2473, 5, 308, 0, 0, 2471, 2473, 1, 0, 0, 0, 2472, 2469, 1, 0, 0, 0, 2472, 2470, 1, 0, 0, 0, 2472, 2471, 1, 0, 0, 0, 2473, 109, 1, 0, 0, 0, 2474, 2475, 5, 43, 0, 0, 2475, 2478, 3, 524, 262, 0, 2476, 2478, 1, 0, 0, 0, 2477, 2474, 1, 0, 0, 0, 2477, 2476, 1, 0, 0, 0, 2478, 111, 1, 0, 0, 0, 2479, 2480, 5, 100, 0, 0, 2480, 2483, 3, 1164, 582, 0, 2481, 2483, 1, 0, 0, 0, 2482, 2479, 1, 0, 0, 0, 2482, 2481, 1, 0, 0, 0, 2483, 113, 1, 0, 0, 0, 2484, 2491, 5, 263, 0, 0, 2485, 2491, 5, 113, 0, 0, 2486, 2491, 5, 53, 0, 0, 2487, 2488, 5, 100, 0, 0, 2488, 2489, 5, 226, 0, 0, 2489, 2491, 3, 1342, 671, 0, 2490, 2484, 1, 0, 0, 0, 2490, 2485, 1, 0, 0, 0, 2490, 2486, 1, 0, 0, 0, 2490, 2487, 1, 0, 0, 0, 2491, 115, 1, 0, 0, 0, 2492, 2493, 5, 2, 0, 0, 2493, 2494, 3, 120, 60, 0, 2494, 2495, 5, 3, 0, 0, 2495, 117, 1, 0, 0, 0, 2496, 2497, 5, 105, 0, 0, 2497, 2500, 3, 116, 58, 0, 2498, 2500, 1, 0, 0, 0, 2499, 2496, 1, 0, 0, 0, 2499, 2498, 1, 0, 0, 0, 2500, 119, 1, 0, 0, 0, 2501, 2506, 3, 122, 61, 0, 2502, 2503, 5, 6, 0, 0, 2503, 2505, 3, 122, 61, 0, 2504, 2502, 1, 0, 0, 0, 2505, 2508, 1, 0, 0, 0, 2506, 2504, 1, 0, 0, 0, 2506, 2507, 1, 0, 0, 0, 2507, 121, 1, 0, 0, 0, 2508, 2506, 1, 0, 0, 0, 2509, 2518, 3, 1382, 691, 0, 2510, 2511, 5, 10, 0, 0, 2511, 2519, 3, 466, 233, 0, 2512, 2513, 5, 11, 0, 0, 2513, 2516, 3, 1382, 691, 0, 2514, 2515, 5, 10, 0, 0, 2515, 2517, 3, 466, 233, 0, 2516, 2514, 1, 0, 0, 0, 2516, 2517, 1, 0, 0, 0, 2517, 2519, 1, 0, 0, 0, 2518, 2510, 1, 0, 0, 0, 2518, 2512, 1, 0, 0, 0, 2518, 2519, 1, 0, 0, 0, 2519, 123, 1, 0, 0, 0, 2520, 2522, 3, 126, 63, 0, 2521, 2520, 1, 0, 0, 0, 2522, 2523, 1, 0, 0, 0, 2523, 2521, 1, 0, 0, 0, 2523, 2524, 1, 0, 0, 0, 2524, 125, 1, 0, 0, 0, 2525, 2529, 5, 307, 0, 0, 2526, 2527, 3, 16, 8, 0, 2527, 2528, 3, 292, 146, 0, 2528, 2530, 1, 0, 0, 0, 2529, 2526, 1, 0, 0, 0, 2529, 2530, 1, 0, 0, 0, 2530, 2538, 1, 0, 0, 0, 2531, 2535, 5, 326, 0, 0, 2532, 2536, 3, 288, 144, 0, 2533, 2534, 5, 438, 0, 0, 2534, 2536, 3, 198, 99, 0, 2535, 2532, 1, 0, 0, 0, 2535, 2533, 1, 0, 0, 0, 2536, 2538, 1, 0, 0, 0, 2537, 2525, 1, 0, 0, 0, 2537, 2531, 1, 0, 0, 0, 2538, 127, 1, 0, 0, 0, 2539, 2540, 5, 62, 0, 0, 2540, 2541, 5, 415, 0, 0, 2541, 2542, 5, 105, 0, 0, 2542, 2543, 5, 2, 0, 0, 2543, 2544, 3, 132, 66, 0, 2544, 2545, 5, 3, 0, 0, 2545, 2566, 1, 0, 0, 0, 2546, 2547, 5, 62, 0, 0, 2547, 2548, 5, 415, 0, 0, 2548, 2549, 5, 68, 0, 0, 2549, 2550, 5, 2, 0, 0, 2550, 2551, 3, 1282, 641, 0, 2551, 2552, 5, 3, 0, 0, 2552, 2566, 1, 0, 0, 0, 2553, 2554, 5, 62, 0, 0, 2554, 2555, 5, 415, 0, 0, 2555, 2556, 5, 64, 0, 0, 2556, 2557, 5, 2, 0, 0, 2557, 2558, 3, 1282, 641, 0, 2558, 2559, 5, 3, 0, 0, 2559, 2560, 5, 94, 0, 0, 2560, 2561, 5, 2, 0, 0, 2561, 2562, 3, 1282, 641, 0, 2562, 2563, 5, 3, 0, 0, 2563, 2566, 1, 0, 0, 0, 2564, 2566, 5, 53, 0, 0, 2565, 2539, 1, 0, 0, 0, 2565, 2546, 1, 0, 0, 0, 2565, 2553, 1, 0, 0, 0, 2565, 2564, 1, 0, 0, 0, 2566, 129, 1, 0, 0, 0, 2567, 2568, 3, 1380, 690, 0, 2568, 2569, 3, 1358, 679, 0, 2569, 131, 1, 0, 0, 0, 2570, 2575, 3, 130, 65, 0, 2571, 2572, 5, 6, 0, 0, 2572, 2574, 3, 130, 65, 0, 2573, 2571, 1, 0, 0, 0, 2574, 2577, 1, 0, 0, 0, 2575, 2573, 1, 0, 0, 0, 2575, 2576, 1, 0, 0, 0, 2576, 133, 1, 0, 0, 0, 2577, 2575, 1, 0, 0, 0, 2578, 2579, 5, 138, 0, 0, 2579, 2580, 5, 353, 0, 0, 2580, 2581, 3, 524, 262, 0, 2581, 2582, 3, 136, 68, 0, 2582, 135, 1, 0, 0, 0, 2583, 2588, 3, 138, 69, 0, 2584, 2585, 5, 6, 0, 0, 2585, 2587, 3, 138, 69, 0, 2586, 2584, 1, 0, 0, 0, 2587, 2590, 1, 0, 0, 0, 2588, 2586, 1, 0, 0, 0, 2588, 2589, 1, 0, 0, 0, 2589, 137, 1, 0, 0, 0, 2590, 2588, 1, 0, 0, 0, 2591, 2592, 5, 133, 0, 0, 2592, 2593, 5, 143, 0, 0, 2593, 2594, 3, 1104, 552, 0, 2594, 2595, 3, 108, 54, 0, 2595, 2615, 1, 0, 0, 0, 2596, 2597, 5, 191, 0, 0, 2597, 2600, 5, 143, 0, 0, 2598, 2599, 5, 220, 0, 0, 2599, 2601, 5, 389, 0, 0, 2600, 2598, 1, 0, 0, 0, 2600, 2601, 1, 0, 0, 0, 2601, 2602, 1, 0, 0, 0, 2602, 2603, 3, 1374, 687, 0, 2603, 2604, 3, 108, 54, 0, 2604, 2615, 1, 0, 0, 0, 2605, 2606, 5, 138, 0, 0, 2606, 2607, 5, 143, 0, 0, 2607, 2608, 3, 1374, 687, 0, 2608, 2609, 3, 726, 363, 0, 2609, 2610, 5, 353, 0, 0, 2610, 2611, 3, 1120, 560, 0, 2611, 2612, 3, 110, 55, 0, 2612, 2613, 3, 108, 54, 0, 2613, 2615, 1, 0, 0, 0, 2614, 2591, 1, 0, 0, 0, 2614, 2596, 1, 0, 0, 0, 2614, 2605, 1, 0, 0, 0, 2615, 139, 1, 0, 0, 0, 2616, 2619, 5, 157, 0, 0, 2617, 2620, 3, 954, 477, 0, 2618, 2620, 5, 30, 0, 0, 2619, 2617, 1, 0, 0, 0, 2619, 2618, 1, 0, 0, 0, 2620, 141, 1, 0, 0, 0, 2621, 2622, 5, 169, 0, 0, 2622, 2623, 3, 156, 78, 0, 2623, 2624, 3, 1338, 669, 0, 2624, 2625, 3, 214, 107, 0, 2625, 2626, 3, 144, 72, 0, 2626, 2627, 3, 146, 73, 0, 2627, 2628, 3, 148, 74, 0, 2628, 2629, 3, 158, 79, 0, 2629, 2630, 3, 16, 8, 0, 2630, 2631, 3, 150, 75, 0, 2631, 2632, 3, 1096, 548, 0, 2632, 2644, 1, 0, 0, 0, 2633, 2634, 5, 169, 0, 0, 2634, 2635, 5, 2, 0, 0, 2635, 2636, 3, 894, 447, 0, 2636, 2637, 5, 3, 0, 0, 2637, 2638, 5, 94, 0, 0, 2638, 2639, 3, 146, 73, 0, 2639, 2640, 3, 148, 74, 0, 2640, 2641, 3, 16, 8, 0, 2641, 2642, 3, 150, 75, 0, 2642, 2644, 1, 0, 0, 0, 2643, 2621, 1, 0, 0, 0, 2643, 2633, 1, 0, 0, 0, 2644, 143, 1, 0, 0, 0, 2645, 2646, 7, 10, 0, 0, 2646, 145, 1, 0, 0, 0, 2647, 2650, 5, 290, 0, 0, 2648, 2650, 1, 0, 0, 0, 2649, 2647, 1, 0, 0, 0, 2649, 2648, 1, 0, 0, 0, 2650, 147, 1, 0, 0, 0, 2651, 2655, 3, 1360, 680, 0, 2652, 2655, 5, 336, 0, 0, 2653, 2655, 5, 337, 0, 0, 2654, 2651, 1, 0, 0, 0, 2654, 2652, 1, 0, 0, 0, 2654, 2653, 1, 0, 0, 0, 2655, 149, 1, 0, 0, 0, 2656, 2662, 3, 152, 76, 0, 2657, 2658, 5, 2, 0, 0, 2658, 2659, 3, 162, 81, 0, 2659, 2660, 5, 3, 0, 0, 2660, 2662, 1, 0, 0, 0, 2661, 2656, 1, 0, 0, 0, 2661, 2657, 1, 0, 0, 0, 2662, 151, 1, 0, 0, 0, 2663, 2665, 3, 154, 77, 0, 2664, 2663, 1, 0, 0, 0, 2665, 2668, 1, 0, 0, 0, 2666, 2664, 1, 0, 0, 0, 2666, 2667, 1, 0, 0, 0, 2667, 153, 1, 0, 0, 0, 2668, 2666, 1, 0, 0, 0, 2669, 2705, 5, 107, 0, 0, 2670, 2705, 5, 112, 0, 0, 2671, 2672, 5, 183, 0, 0, 2672, 2673, 3, 834, 417, 0, 2673, 2674, 3, 1360, 680, 0, 2674, 2705, 1, 0, 0, 0, 2675, 2676, 5, 78, 0, 0, 2676, 2677, 3, 834, 417, 0, 2677, 2678, 3, 1360, 680, 0, 2678, 2705, 1, 0, 0, 0, 2679, 2705, 5, 171, 0, 0, 2680, 2705, 5, 216, 0, 0, 2681, 2682, 5, 291, 0, 0, 2682, 2683, 3, 834, 417, 0, 2683, 2684, 3, 1360, 680, 0, 2684, 2705, 1, 0, 0, 0, 2685, 2686, 5, 197, 0, 0, 2686, 2687, 3, 834, 417, 0, 2687, 2688, 3, 1360, 680, 0, 2688, 2705, 1, 0, 0, 0, 2689, 2690, 5, 209, 0, 0, 2690, 2691, 5, 291, 0, 0, 2691, 2705, 3, 216, 108, 0, 2692, 2693, 5, 209, 0, 0, 2693, 2694, 5, 291, 0, 0, 2694, 2705, 5, 9, 0, 0, 2695, 2696, 5, 209, 0, 0, 2696, 2697, 5, 77, 0, 0, 2697, 2698, 5, 78, 0, 0, 2698, 2705, 3, 216, 108, 0, 2699, 2700, 5, 209, 0, 0, 2700, 2701, 5, 78, 0, 0, 2701, 2705, 3, 216, 108, 0, 2702, 2703, 5, 194, 0, 0, 2703, 2705, 3, 1360, 680, 0, 2704, 2669, 1, 0, 0, 0, 2704, 2670, 1, 0, 0, 0, 2704, 2671, 1, 0, 0, 0, 2704, 2675, 1, 0, 0, 0, 2704, 2679, 1, 0, 0, 0, 2704, 2680, 1, 0, 0, 0, 2704, 2681, 1, 0, 0, 0, 2704, 2685, 1, 0, 0, 0, 2704, 2689, 1, 0, 0, 0, 2704, 2692, 1, 0, 0, 0, 2704, 2695, 1, 0, 0, 0, 2704, 2699, 1, 0, 0, 0, 2704, 2702, 1, 0, 0, 0, 2705, 155, 1, 0, 0, 0, 2706, 2709, 5, 107, 0, 0, 2707, 2709, 1, 0, 0, 0, 2708, 2706, 1, 0, 0, 0, 2708, 2707, 1, 0, 0, 0, 2709, 157, 1, 0, 0, 0, 2710, 2711, 3, 160, 80, 0, 2711, 2712, 5, 184, 0, 0, 2712, 2713, 3, 1360, 680, 0, 2713, 2716, 1, 0, 0, 0, 2714, 2716, 1, 0, 0, 0, 2715, 2710, 1, 0, 0, 0, 2715, 2714, 1, 0, 0, 0, 2716, 159, 1, 0, 0, 0, 2717, 2720, 5, 100, 0, 0, 2718, 2720, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2719, 2718, 1, 0, 0, 0, 2720, 161, 1, 0, 0, 0, 2721, 2726, 3, 164, 82, 0, 2722, 2723, 5, 6, 0, 0, 2723, 2725, 3, 164, 82, 0, 2724, 2722, 1, 0, 0, 0, 2725, 2728, 1, 0, 0, 0, 2726, 2724, 1, 0, 0, 0, 2726, 2727, 1, 0, 0, 0, 2727, 163, 1, 0, 0, 0, 2728, 2726, 1, 0, 0, 0, 2729, 2730, 3, 1382, 691, 0, 2730, 2731, 3, 166, 83, 0, 2731, 165, 1, 0, 0, 0, 2732, 2741, 3, 66, 33, 0, 2733, 2741, 3, 292, 146, 0, 2734, 2741, 5, 9, 0, 0, 2735, 2736, 5, 2, 0, 0, 2736, 2737, 3, 168, 84, 0, 2737, 2738, 5, 3, 0, 0, 2738, 2741, 1, 0, 0, 0, 2739, 2741, 1, 0, 0, 0, 2740, 2732, 1, 0, 0, 0, 2740, 2733, 1, 0, 0, 0, 2740, 2734, 1, 0, 0, 0, 2740, 2735, 1, 0, 0, 0, 2740, 2739, 1, 0, 0, 0, 2741, 167, 1, 0, 0, 0, 2742, 2747, 3, 170, 85, 0, 2743, 2744, 5, 6, 0, 0, 2744, 2746, 3, 170, 85, 0, 2745, 2743, 1, 0, 0, 0, 2746, 2749, 1, 0, 0, 0, 2747, 2745, 1, 0, 0, 0, 2747, 2748, 1, 0, 0, 0, 2748, 169, 1, 0, 0, 0, 2749, 2747, 1, 0, 0, 0, 2750, 2751, 3, 66, 33, 0, 2751, 171, 1, 0, 0, 0, 2752, 2753, 5, 46, 0, 0, 2753, 2754, 3, 174, 87, 0, 2754, 2758, 5, 92, 0, 0, 2755, 2756, 5, 220, 0, 0, 2756, 2757, 5, 77, 0, 0, 2757, 2759, 5, 389, 0, 0, 2758, 2755, 1, 0, 0, 0, 2758, 2759, 1, 0, 0, 0, 2759, 2760, 1, 0, 0, 0, 2760, 2791, 3, 1338, 669, 0, 2761, 2762, 5, 2, 0, 0, 2762, 2763, 3, 176, 88, 0, 2763, 2764, 5, 3, 0, 0, 2764, 2765, 3, 238, 119, 0, 2765, 2766, 3, 240, 120, 0, 2766, 2767, 3, 248, 124, 0, 2767, 2768, 3, 250, 125, 0, 2768, 2769, 3, 252, 126, 0, 2769, 2770, 3, 254, 127, 0, 2770, 2792, 1, 0, 0, 0, 2771, 2772, 5, 268, 0, 0, 2772, 2773, 3, 524, 262, 0, 2773, 2774, 3, 178, 89, 0, 2774, 2775, 3, 240, 120, 0, 2775, 2776, 3, 248, 124, 0, 2776, 2777, 3, 250, 125, 0, 2777, 2778, 3, 252, 126, 0, 2778, 2779, 3, 254, 127, 0, 2779, 2792, 1, 0, 0, 0, 2780, 2781, 5, 278, 0, 0, 2781, 2782, 5, 268, 0, 0, 2782, 2783, 3, 1338, 669, 0, 2783, 2784, 3, 178, 89, 0, 2784, 2785, 3, 128, 64, 0, 2785, 2786, 3, 240, 120, 0, 2786, 2787, 3, 248, 124, 0, 2787, 2788, 3, 250, 125, 0, 2788, 2789, 3, 252, 126, 0, 2789, 2790, 3, 254, 127, 0, 2790, 2792, 1, 0, 0, 0, 2791, 2761, 1, 0, 0, 0, 2791, 2771, 1, 0, 0, 0, 2791, 2780, 1, 0, 0, 0, 2792, 173, 1, 0, 0, 0, 2793, 2802, 5, 347, 0, 0, 2794, 2802, 5, 345, 0, 0, 2795, 2796, 5, 245, 0, 0, 2796, 2802, 7, 11, 0, 0, 2797, 2798, 5, 213, 0, 0, 2798, 2802, 7, 11, 0, 0, 2799, 2802, 5, 360, 0, 0, 2800, 2802, 1, 0, 0, 0, 2801, 2793, 1, 0, 0, 0, 2801, 2794, 1, 0, 0, 0, 2801, 2795, 1, 0, 0, 0, 2801, 2797, 1, 0, 0, 0, 2801, 2799, 1, 0, 0, 0, 2801, 2800, 1, 0, 0, 0, 2802, 175, 1, 0, 0, 0, 2803, 2806, 3, 180, 90, 0, 2804, 2806, 1, 0, 0, 0, 2805, 2803, 1, 0, 0, 0, 2805, 2804, 1, 0, 0, 0, 2806, 177, 1, 0, 0, 0, 2807, 2808, 5, 2, 0, 0, 2808, 2809, 3, 182, 91, 0, 2809, 2810, 5, 3, 0, 0, 2810, 2813, 1, 0, 0, 0, 2811, 2813, 1, 0, 0, 0, 2812, 2807, 1, 0, 0, 0, 2812, 2811, 1, 0, 0, 0, 2813, 179, 1, 0, 0, 0, 2814, 2819, 3, 184, 92, 0, 2815, 2816, 5, 6, 0, 0, 2816, 2818, 3, 184, 92, 0, 2817, 2815, 1, 0, 0, 0, 2818, 2821, 1, 0, 0, 0, 2819, 2817, 1, 0, 0, 0, 2819, 2820, 1, 0, 0, 0, 2820, 181, 1, 0, 0, 0, 2821, 2819, 1, 0, 0, 0, 2822, 2827, 3, 186, 93, 0, 2823, 2824, 5, 6, 0, 0, 2824, 2826, 3, 186, 93, 0, 2825, 2823, 1, 0, 0, 0, 2826, 2829, 1, 0, 0, 0, 2827, 2825, 1, 0, 0, 0, 2827, 2828, 1, 0, 0, 0, 2828, 183, 1, 0, 0, 0, 2829, 2827, 1, 0, 0, 0, 2830, 2834, 3, 208, 104, 0, 2831, 2834, 3, 202, 101, 0, 2832, 2834, 3, 188, 94, 0, 2833, 2830, 1, 0, 0, 0, 2833, 2831, 1, 0, 0, 0, 2833, 2832, 1, 0, 0, 0, 2834, 185, 1, 0, 0, 0, 2835, 2838, 3, 190, 95, 0, 2836, 2838, 3, 208, 104, 0, 2837, 2835, 1, 0, 0, 0, 2837, 2836, 1, 0, 0, 0, 2838, 187, 1, 0, 0, 0, 2839, 2840, 3, 1374, 687, 0, 2840, 2841, 3, 1120, 560, 0, 2841, 2842, 3, 340, 170, 0, 2842, 2843, 3, 192, 96, 0, 2843, 189, 1, 0, 0, 0, 2844, 2847, 3, 1374, 687, 0, 2845, 2846, 5, 105, 0, 0, 2846, 2848, 5, 273, 0, 0, 2847, 2845, 1, 0, 0, 0, 2847, 2848, 1, 0, 0, 0, 2848, 2849, 1, 0, 0, 0, 2849, 2850, 3, 192, 96, 0, 2850, 191, 1, 0, 0, 0, 2851, 2853, 3, 194, 97, 0, 2852, 2851, 1, 0, 0, 0, 2853, 2856, 1, 0, 0, 0, 2854, 2852, 1, 0, 0, 0, 2854, 2855, 1, 0, 0, 0, 2855, 193, 1, 0, 0, 0, 2856, 2854, 1, 0, 0, 0, 2857, 2858, 5, 45, 0, 0, 2858, 2859, 3, 1342, 671, 0, 2859, 2860, 3, 196, 98, 0, 2860, 2866, 1, 0, 0, 0, 2861, 2866, 3, 196, 98, 0, 2862, 2866, 3, 200, 100, 0, 2863, 2864, 5, 43, 0, 0, 2864, 2866, 3, 524, 262, 0, 2865, 2857, 1, 0, 0, 0, 2865, 2861, 1, 0, 0, 0, 2865, 2862, 1, 0, 0, 0, 2865, 2863, 1, 0, 0, 0, 2866, 195, 1, 0, 0, 0, 2867, 2868, 5, 77, 0, 0, 2868, 2906, 5, 78, 0, 0, 2869, 2906, 5, 78, 0, 0, 2870, 2871, 5, 98, 0, 0, 2871, 2872, 3, 664, 332, 0, 2872, 2873, 3, 256, 128, 0, 2873, 2906, 1, 0, 0, 0, 2874, 2875, 5, 85, 0, 0, 2875, 2876, 5, 236, 0, 0, 2876, 2877, 3, 664, 332, 0, 2877, 2878, 3, 256, 128, 0, 2878, 2906, 1, 0, 0, 0, 2879, 2880, 5, 42, 0, 0, 2880, 2881, 5, 2, 0, 0, 2881, 2882, 3, 1164, 582, 0, 2882, 2883, 5, 3, 0, 0, 2883, 2884, 3, 212, 106, 0, 2884, 2906, 1, 0, 0, 0, 2885, 2886, 5, 53, 0, 0, 2886, 2906, 3, 1206, 603, 0, 2887, 2888, 5, 438, 0, 0, 2888, 2889, 3, 198, 99, 0, 2889, 2897, 5, 36, 0, 0, 2890, 2891, 5, 219, 0, 0, 2891, 2898, 3, 284, 142, 0, 2892, 2893, 5, 2, 0, 0, 2893, 2894, 3, 1164, 582, 0, 2894, 2895, 5, 3, 0, 0, 2895, 2896, 5, 440, 0, 0, 2896, 2898, 1, 0, 0, 0, 2897, 2890, 1, 0, 0, 0, 2897, 2892, 1, 0, 0, 0, 2898, 2906, 1, 0, 0, 0, 2899, 2900, 5, 86, 0, 0, 2900, 2901, 3, 1338, 669, 0, 2901, 2902, 3, 214, 107, 0, 2902, 2903, 3, 222, 111, 0, 2903, 2904, 3, 230, 115, 0, 2904, 2906, 1, 0, 0, 0, 2905, 2867, 1, 0, 0, 0, 2905, 2869, 1, 0, 0, 0, 2905, 2870, 1, 0, 0, 0, 2905, 2874, 1, 0, 0, 0, 2905, 2879, 1, 0, 0, 0, 2905, 2885, 1, 0, 0, 0, 2905, 2887, 1, 0, 0, 0, 2905, 2899, 1, 0, 0, 0, 2906, 197, 1, 0, 0, 0, 2907, 2911, 5, 139, 0, 0, 2908, 2909, 5, 147, 0, 0, 2909, 2911, 5, 53, 0, 0, 2910, 2907, 1, 0, 0, 0, 2910, 2908, 1, 0, 0, 0, 2911, 199, 1, 0, 0, 0, 2912, 2918, 5, 54, 0, 0, 2913, 2914, 5, 77, 0, 0, 2914, 2918, 5, 54, 0, 0, 2915, 2916, 5, 69, 0, 0, 2916, 2918, 7, 8, 0, 0, 2917, 2912, 1, 0, 0, 0, 2917, 2913, 1, 0, 0, 0, 2917, 2915, 1, 0, 0, 0, 2918, 201, 1, 0, 0, 0, 2919, 2920, 5, 120, 0, 0, 2920, 2921, 3, 1338, 669, 0, 2921, 2922, 3, 204, 102, 0, 2922, 203, 1, 0, 0, 0, 2923, 2924, 7, 12, 0, 0, 2924, 2926, 3, 206, 103, 0, 2925, 2923, 1, 0, 0, 0, 2926, 2929, 1, 0, 0, 0, 2927, 2925, 1, 0, 0, 0, 2927, 2928, 1, 0, 0, 0, 2928, 205, 1, 0, 0, 0, 2929, 2927, 1, 0, 0, 0, 2930, 2931, 7, 13, 0, 0, 2931, 207, 1, 0, 0, 0, 2932, 2933, 5, 45, 0, 0, 2933, 2934, 3, 1342, 671, 0, 2934, 2935, 3, 210, 105, 0, 2935, 2938, 1, 0, 0, 0, 2936, 2938, 3, 210, 105, 0, 2937, 2932, 1, 0, 0, 0, 2937, 2936, 1, 0, 0, 0, 2938, 209, 1, 0, 0, 0, 2939, 2940, 5, 42, 0, 0, 2940, 2941, 5, 2, 0, 0, 2941, 2942, 3, 1164, 582, 0, 2942, 2943, 5, 3, 0, 0, 2943, 2944, 3, 440, 220, 0, 2944, 2998, 1, 0, 0, 0, 2945, 2957, 5, 98, 0, 0, 2946, 2947, 5, 2, 0, 0, 2947, 2948, 3, 216, 108, 0, 2948, 2949, 5, 3, 0, 0, 2949, 2950, 3, 220, 110, 0, 2950, 2951, 3, 664, 332, 0, 2951, 2952, 3, 256, 128, 0, 2952, 2953, 3, 440, 220, 0, 2953, 2958, 1, 0, 0, 0, 2954, 2955, 3, 258, 129, 0, 2955, 2956, 3, 440, 220, 0, 2956, 2958, 1, 0, 0, 0, 2957, 2946, 1, 0, 0, 0, 2957, 2954, 1, 0, 0, 0, 2958, 2998, 1, 0, 0, 0, 2959, 2960, 5, 85, 0, 0, 2960, 2972, 5, 236, 0, 0, 2961, 2962, 5, 2, 0, 0, 2962, 2963, 3, 216, 108, 0, 2963, 2964, 5, 3, 0, 0, 2964, 2965, 3, 220, 110, 0, 2965, 2966, 3, 664, 332, 0, 2966, 2967, 3, 256, 128, 0, 2967, 2968, 3, 440, 220, 0, 2968, 2973, 1, 0, 0, 0, 2969, 2970, 3, 258, 129, 0, 2970, 2971, 3, 440, 220, 0, 2971, 2973, 1, 0, 0, 0, 2972, 2961, 1, 0, 0, 0, 2972, 2969, 1, 0, 0, 0, 2973, 2998, 1, 0, 0, 0, 2974, 2975, 5, 199, 0, 0, 2975, 2976, 3, 596, 298, 0, 2976, 2977, 5, 2, 0, 0, 2977, 2978, 3, 224, 112, 0, 2978, 2979, 5, 3, 0, 0, 2979, 2980, 3, 220, 110, 0, 2980, 2981, 3, 664, 332, 0, 2981, 2982, 3, 256, 128, 0, 2982, 2983, 3, 228, 114, 0, 2983, 2984, 3, 440, 220, 0, 2984, 2998, 1, 0, 0, 0, 2985, 2986, 5, 63, 0, 0, 2986, 2987, 5, 236, 0, 0, 2987, 2988, 5, 2, 0, 0, 2988, 2989, 3, 216, 108, 0, 2989, 2990, 5, 3, 0, 0, 2990, 2991, 5, 86, 0, 0, 2991, 2992, 3, 1338, 669, 0, 2992, 2993, 3, 214, 107, 0, 2993, 2994, 3, 222, 111, 0, 2994, 2995, 3, 230, 115, 0, 2995, 2996, 3, 440, 220, 0, 2996, 2998, 1, 0, 0, 0, 2997, 2939, 1, 0, 0, 0, 2997, 2945, 1, 0, 0, 0, 2997, 2959, 1, 0, 0, 0, 2997, 2974, 1, 0, 0, 0, 2997, 2985, 1, 0, 0, 0, 2998, 211, 1, 0, 0, 0, 2999, 3000, 5, 262, 0, 0, 3000, 3003, 5, 228, 0, 0, 3001, 3003, 1, 0, 0, 0, 3002, 2999, 1, 0, 0, 0, 3002, 3001, 1, 0, 0, 0, 3003, 213, 1, 0, 0, 0, 3004, 3005, 5, 2, 0, 0, 3005, 3006, 3, 216, 108, 0, 3006, 3007, 5, 3, 0, 0, 3007, 3010, 1, 0, 0, 0, 3008, 3010, 1, 0, 0, 0, 3009, 3004, 1, 0, 0, 0, 3009, 3008, 1, 0, 0, 0, 3010, 215, 1, 0, 0, 0, 3011, 3016, 3, 218, 109, 0, 3012, 3013, 5, 6, 0, 0, 3013, 3015, 3, 218, 109, 0, 3014, 3012, 1, 0, 0, 0, 3015, 3018, 1, 0, 0, 0, 3016, 3014, 1, 0, 0, 0, 3016, 3017, 1, 0, 0, 0, 3017, 217, 1, 0, 0, 0, 3018, 3016, 1, 0, 0, 0, 3019, 3020, 3, 1374, 687, 0, 3020, 219, 1, 0, 0, 0, 3021, 3022, 5, 441, 0, 0, 3022, 3023, 5, 2, 0, 0, 3023, 3024, 3, 216, 108, 0, 3024, 3025, 5, 3, 0, 0, 3025, 3028, 1, 0, 0, 0, 3026, 3028, 1, 0, 0, 0, 3027, 3021, 1, 0, 0, 0, 3027, 3026, 1, 0, 0, 0, 3028, 221, 1, 0, 0, 0, 3029, 3030, 5, 249, 0, 0, 3030, 3033, 7, 14, 0, 0, 3031, 3033, 1, 0, 0, 0, 3032, 3029, 1, 0, 0, 0, 3032, 3031, 1, 0, 0, 0, 3033, 223, 1, 0, 0, 0, 3034, 3039, 3, 226, 113, 0, 3035, 3036, 5, 6, 0, 0, 3036, 3038, 3, 226, 113, 0, 3037, 3035, 1, 0, 0, 0, 3038, 3041, 1, 0, 0, 0, 3039, 3037, 1, 0, 0, 0, 3039, 3040, 1, 0, 0, 0, 3040, 225, 1, 0, 0, 0, 3041, 3039, 1, 0, 0, 0, 3042, 3043, 3, 602, 301, 0, 3043, 3050, 5, 105, 0, 0, 3044, 3051, 3, 684, 342, 0, 3045, 3046, 5, 271, 0, 0, 3046, 3047, 5, 2, 0, 0, 3047, 3048, 3, 684, 342, 0, 3048, 3049, 5, 3, 0, 0, 3049, 3051, 1, 0, 0, 0, 3050, 3044, 1, 0, 0, 0, 3050, 3045, 1, 0, 0, 0, 3051, 227, 1, 0, 0, 0, 3052, 3053, 5, 103, 0, 0, 3053, 3054, 5, 2, 0, 0, 3054, 3055, 3, 1164, 582, 0, 3055, 3056, 5, 3, 0, 0, 3056, 3059, 1, 0, 0, 0, 3057, 3059, 1, 0, 0, 0, 3058, 3052, 1, 0, 0, 0, 3058, 3057, 1, 0, 0, 0, 3059, 229, 1, 0, 0, 0, 3060, 3070, 3, 232, 116, 0, 3061, 3070, 3, 234, 117, 0, 3062, 3063, 3, 232, 116, 0, 3063, 3064, 3, 234, 117, 0, 3064, 3070, 1, 0, 0, 0, 3065, 3066, 3, 234, 117, 0, 3066, 3067, 3, 232, 116, 0, 3067, 3070, 1, 0, 0, 0, 3068, 3070, 1, 0, 0, 0, 3069, 3060, 1, 0, 0, 0, 3069, 3061, 1, 0, 0, 0, 3069, 3062, 1, 0, 0, 0, 3069, 3065, 1, 0, 0, 0, 3069, 3068, 1, 0, 0, 0, 3070, 231, 1, 0, 0, 0, 3071, 3072, 5, 80, 0, 0, 3072, 3073, 5, 362, 0, 0, 3073, 3074, 3, 236, 118, 0, 3074, 233, 1, 0, 0, 0, 3075, 3076, 5, 80, 0, 0, 3076, 3077, 5, 182, 0, 0, 3077, 3078, 3, 236, 118, 0, 3078, 235, 1, 0, 0, 0, 3079, 3080, 5, 262, 0, 0, 3080, 3086, 5, 132, 0, 0, 3081, 3086, 5, 308, 0, 0, 3082, 3086, 5, 150, 0, 0, 3083, 3084, 5, 326, 0, 0, 3084, 3086, 7, 15, 0, 0, 3085, 3079, 1, 0, 0, 0, 3085, 3081, 1, 0, 0, 0, 3085, 3082, 1, 0, 0, 0, 3085, 3083, 1, 0, 0, 0, 3086, 237, 1, 0, 0, 0, 3087, 3088, 5, 229, 0, 0, 3088, 3089, 5, 2, 0, 0, 3089, 3090, 3, 1336, 668, 0, 3090, 3091, 5, 3, 0, 0, 3091, 3094, 1, 0, 0, 0, 3092, 3094, 1, 0, 0, 0, 3093, 3087, 1, 0, 0, 0, 3093, 3092, 1, 0, 0, 0, 3094, 239, 1, 0, 0, 0, 3095, 3098, 3, 242, 121, 0, 3096, 3098, 1, 0, 0, 0, 3097, 3095, 1, 0, 0, 0, 3097, 3096, 1, 0, 0, 0, 3098, 241, 1, 0, 0, 0, 3099, 3100, 5, 278, 0, 0, 3100, 3101, 5, 147, 0, 0, 3101, 3102, 3, 1374, 687, 0, 3102, 3103, 5, 2, 0, 0, 3103, 3104, 3, 244, 122, 0, 3104, 3105, 5, 3, 0, 0, 3105, 243, 1, 0, 0, 0, 3106, 3111, 3, 246, 123, 0, 3107, 3108, 5, 6, 0, 0, 3108, 3110, 3, 246, 123, 0, 3109, 3107, 1, 0, 0, 0, 3110, 3113, 1, 0, 0, 0, 3111, 3109, 1, 0, 0, 0, 3111, 3112, 1, 0, 0, 0, 3112, 245, 1, 0, 0, 0, 3113, 3111, 1, 0, 0, 0, 3114, 3115, 3, 1374, 687, 0, 3115, 3116, 3, 608, 304, 0, 3116, 3117, 3, 610, 305, 0, 3117, 3129, 1, 0, 0, 0, 3118, 3119, 3, 1216, 608, 0, 3119, 3120, 3, 608, 304, 0, 3120, 3121, 3, 610, 305, 0, 3121, 3129, 1, 0, 0, 0, 3122, 3123, 5, 2, 0, 0, 3123, 3124, 3, 1164, 582, 0, 3124, 3125, 5, 3, 0, 0, 3125, 3126, 3, 608, 304, 0, 3126, 3127, 3, 610, 305, 0, 3127, 3129, 1, 0, 0, 0, 3128, 3114, 1, 0, 0, 0, 3128, 3118, 1, 0, 0, 0, 3128, 3122, 1, 0, 0, 0, 3129, 247, 1, 0, 0, 0, 3130, 3131, 5, 100, 0, 0, 3131, 3134, 3, 1342, 671, 0, 3132, 3134, 1, 0, 0, 0, 3133, 3130, 1, 0, 0, 0, 3133, 3132, 1, 0, 0, 0, 3134, 249, 1, 0, 0, 0, 3135, 3136, 5, 105, 0, 0, 3136, 3141, 3, 116, 58, 0, 3137, 3138, 5, 372, 0, 0, 3138, 3141, 5, 270, 0, 0, 3139, 3141, 1, 0, 0, 0, 3140, 3135, 1, 0, 0, 0, 3140, 3137, 1, 0, 0, 0, 3140, 3139, 1, 0, 0, 0, 3141, 251, 1, 0, 0, 0, 3142, 3143, 5, 80, 0, 0, 3143, 3149, 5, 161, 0, 0, 3144, 3150, 5, 191, 0, 0, 3145, 3146, 5, 182, 0, 0, 3146, 3150, 5, 313, 0, 0, 3147, 3148, 5, 285, 0, 0, 3148, 3150, 5, 313, 0, 0, 3149, 3144, 1, 0, 0, 0, 3149, 3145, 1, 0, 0, 0, 3149, 3147, 1, 0, 0, 0, 3150, 3153, 1, 0, 0, 0, 3151, 3153, 1, 0, 0, 0, 3152, 3142, 1, 0, 0, 0, 3152, 3151, 1, 0, 0, 0, 3153, 253, 1, 0, 0, 0, 3154, 3155, 5, 344, 0, 0, 3155, 3158, 3, 1342, 671, 0, 3156, 3158, 1, 0, 0, 0, 3157, 3154, 1, 0, 0, 0, 3157, 3156, 1, 0, 0, 0, 3158, 255, 1, 0, 0, 0, 3159, 3160, 5, 100, 0, 0, 3160, 3161, 5, 226, 0, 0, 3161, 3162, 5, 344, 0, 0, 3162, 3165, 3, 1342, 671, 0, 3163, 3165, 1, 0, 0, 0, 3164, 3159, 1, 0, 0, 0, 3164, 3163, 1, 0, 0, 0, 3165, 257, 1, 0, 0, 0, 3166, 3167, 5, 100, 0, 0, 3167, 3168, 5, 226, 0, 0, 3168, 3169, 3, 1342, 671, 0, 3169, 259, 1, 0, 0, 0, 3170, 3171, 5, 46, 0, 0, 3171, 3175, 5, 335, 0, 0, 3172, 3173, 5, 220, 0, 0, 3173, 3174, 5, 77, 0, 0, 3174, 3176, 5, 389, 0, 0, 3175, 3172, 1, 0, 0, 0, 3175, 3176, 1, 0, 0, 0, 3176, 3177, 1, 0, 0, 0, 3177, 3178, 3, 524, 262, 0, 3178, 3179, 3, 870, 435, 0, 3179, 3180, 5, 80, 0, 0, 3180, 3181, 3, 1282, 641, 0, 3181, 3182, 5, 64, 0, 0, 3182, 3183, 3, 1058, 529, 0, 3183, 261, 1, 0, 0, 0, 3184, 3185, 5, 138, 0, 0, 3185, 3188, 5, 335, 0, 0, 3186, 3187, 5, 220, 0, 0, 3187, 3189, 5, 389, 0, 0, 3188, 3186, 1, 0, 0, 0, 3188, 3189, 1, 0, 0, 0, 3189, 3190, 1, 0, 0, 0, 3190, 3191, 3, 524, 262, 0, 3191, 3192, 5, 326, 0, 0, 3192, 3193, 5, 335, 0, 0, 3193, 3194, 3, 1366, 683, 0, 3194, 263, 1, 0, 0, 0, 3195, 3196, 5, 46, 0, 0, 3196, 3197, 3, 174, 87, 0, 3197, 3201, 5, 92, 0, 0, 3198, 3199, 5, 220, 0, 0, 3199, 3200, 5, 77, 0, 0, 3200, 3202, 5, 389, 0, 0, 3201, 3198, 1, 0, 0, 0, 3201, 3202, 1, 0, 0, 0, 3202, 3203, 1, 0, 0, 0, 3203, 3204, 3, 266, 133, 0, 3204, 3205, 5, 36, 0, 0, 3205, 3206, 3, 960, 480, 0, 3206, 3207, 3, 268, 134, 0, 3207, 265, 1, 0, 0, 0, 3208, 3209, 3, 1338, 669, 0, 3209, 3210, 3, 214, 107, 0, 3210, 3211, 3, 248, 124, 0, 3211, 3212, 3, 250, 125, 0, 3212, 3213, 3, 252, 126, 0, 3213, 3214, 3, 254, 127, 0, 3214, 267, 1, 0, 0, 0, 3215, 3219, 5, 105, 0, 0, 3216, 3220, 5, 174, 0, 0, 3217, 3218, 5, 262, 0, 0, 3218, 3220, 5, 174, 0, 0, 3219, 3216, 1, 0, 0, 0, 3219, 3217, 1, 0, 0, 0, 3220, 3223, 1, 0, 0, 0, 3221, 3223, 1, 0, 0, 0, 3222, 3215, 1, 0, 0, 0, 3222, 3221, 1, 0, 0, 0, 3223, 269, 1, 0, 0, 0, 3224, 3225, 5, 46, 0, 0, 3225, 3226, 3, 274, 137, 0, 3226, 3227, 5, 251, 0, 0, 3227, 3231, 5, 369, 0, 0, 3228, 3229, 5, 220, 0, 0, 3229, 3230, 5, 77, 0, 0, 3230, 3232, 5, 389, 0, 0, 3231, 3228, 1, 0, 0, 0, 3231, 3232, 1, 0, 0, 0, 3232, 3233, 1, 0, 0, 0, 3233, 3234, 3, 272, 136, 0, 3234, 3235, 5, 36, 0, 0, 3235, 3236, 3, 960, 480, 0, 3236, 3237, 3, 268, 134, 0, 3237, 271, 1, 0, 0, 0, 3238, 3239, 3, 1338, 669, 0, 3239, 3240, 3, 214, 107, 0, 3240, 3241, 3, 248, 124, 0, 3241, 3242, 3, 118, 59, 0, 3242, 3243, 3, 254, 127, 0, 3243, 273, 1, 0, 0, 0, 3244, 3247, 5, 360, 0, 0, 3245, 3247, 1, 0, 0, 0, 3246, 3244, 1, 0, 0, 0, 3246, 3245, 1, 0, 0, 0, 3247, 275, 1, 0, 0, 0, 3248, 3249, 5, 298, 0, 0, 3249, 3250, 5, 251, 0, 0, 3250, 3251, 5, 369, 0, 0, 3251, 3252, 3, 592, 296, 0, 3252, 3253, 3, 1338, 669, 0, 3253, 3254, 3, 268, 134, 0, 3254, 277, 1, 0, 0, 0, 3255, 3256, 5, 46, 0, 0, 3256, 3257, 3, 174, 87, 0, 3257, 3261, 5, 321, 0, 0, 3258, 3259, 5, 220, 0, 0, 3259, 3260, 5, 77, 0, 0, 3260, 3262, 5, 389, 0, 0, 3261, 3258, 1, 0, 0, 0, 3261, 3262, 1, 0, 0, 0, 3262, 3263, 1, 0, 0, 0, 3263, 3264, 3, 1338, 669, 0, 3264, 3265, 3, 282, 141, 0, 3265, 279, 1, 0, 0, 0, 3266, 3267, 5, 138, 0, 0, 3267, 3270, 5, 321, 0, 0, 3268, 3269, 5, 220, 0, 0, 3269, 3271, 5, 389, 0, 0, 3270, 3268, 1, 0, 0, 0, 3270, 3271, 1, 0, 0, 0, 3271, 3272, 1, 0, 0, 0, 3272, 3273, 3, 1338, 669, 0, 3273, 3274, 3, 286, 143, 0, 3274, 281, 1, 0, 0, 0, 3275, 3278, 3, 286, 143, 0, 3276, 3278, 1, 0, 0, 0, 3277, 3275, 1, 0, 0, 0, 3277, 3276, 1, 0, 0, 0, 3278, 283, 1, 0, 0, 0, 3279, 3280, 5, 2, 0, 0, 3280, 3281, 3, 286, 143, 0, 3281, 3282, 5, 3, 0, 0, 3282, 3285, 1, 0, 0, 0, 3283, 3285, 1, 0, 0, 0, 3284, 3279, 1, 0, 0, 0, 3284, 3283, 1, 0, 0, 0, 3285, 285, 1, 0, 0, 0, 3286, 3288, 3, 288, 144, 0, 3287, 3286, 1, 0, 0, 0, 3288, 3289, 1, 0, 0, 0, 3289, 3287, 1, 0, 0, 0, 3289, 3290, 1, 0, 0, 0, 3290, 287, 1, 0, 0, 0, 3291, 3292, 5, 36, 0, 0, 3292, 3322, 3, 1124, 562, 0, 3293, 3294, 5, 148, 0, 0, 3294, 3322, 3, 292, 146, 0, 3295, 3322, 5, 173, 0, 0, 3296, 3297, 5, 225, 0, 0, 3297, 3298, 3, 290, 145, 0, 3298, 3299, 3, 292, 146, 0, 3299, 3322, 1, 0, 0, 0, 3300, 3301, 5, 252, 0, 0, 3301, 3322, 3, 292, 146, 0, 3302, 3303, 5, 255, 0, 0, 3303, 3322, 3, 292, 146, 0, 3304, 3305, 5, 262, 0, 0, 3305, 3322, 7, 16, 0, 0, 3306, 3307, 5, 274, 0, 0, 3307, 3308, 5, 147, 0, 0, 3308, 3322, 3, 524, 262, 0, 3309, 3310, 5, 321, 0, 0, 3310, 3311, 5, 259, 0, 0, 3311, 3322, 3, 524, 262, 0, 3312, 3313, 5, 333, 0, 0, 3313, 3314, 3, 16, 8, 0, 3314, 3315, 3, 292, 146, 0, 3315, 3322, 1, 0, 0, 0, 3316, 3317, 5, 307, 0, 0, 3317, 3319, 3, 16, 8, 0, 3318, 3320, 3, 292, 146, 0, 3319, 3318, 1, 0, 0, 0, 3319, 3320, 1, 0, 0, 0, 3320, 3322, 1, 0, 0, 0, 3321, 3291, 1, 0, 0, 0, 3321, 3293, 1, 0, 0, 0, 3321, 3295, 1, 0, 0, 0, 3321, 3296, 1, 0, 0, 0, 3321, 3300, 1, 0, 0, 0, 3321, 3302, 1, 0, 0, 0, 3321, 3304, 1, 0, 0, 0, 3321, 3306, 1, 0, 0, 0, 3321, 3309, 1, 0, 0, 0, 3321, 3312, 1, 0, 0, 0, 3321, 3316, 1, 0, 0, 0, 3322, 289, 1, 0, 0, 0, 3323, 3326, 5, 147, 0, 0, 3324, 3326, 1, 0, 0, 0, 3325, 3323, 1, 0, 0, 0, 3325, 3324, 1, 0, 0, 0, 3326, 291, 1, 0, 0, 0, 3327, 3334, 3, 1356, 678, 0, 3328, 3329, 5, 12, 0, 0, 3329, 3334, 3, 1356, 678, 0, 3330, 3331, 5, 13, 0, 0, 3331, 3334, 3, 1356, 678, 0, 3332, 3334, 3, 1366, 683, 0, 3333, 3327, 1, 0, 0, 0, 3333, 3328, 1, 0, 0, 0, 3333, 3330, 1, 0, 0, 0, 3333, 3332, 1, 0, 0, 0, 3334, 293, 1, 0, 0, 0, 3335, 3340, 3, 292, 146, 0, 3336, 3337, 5, 6, 0, 0, 3337, 3339, 3, 292, 146, 0, 3338, 3336, 1, 0, 0, 0, 3339, 3342, 1, 0, 0, 0, 3340, 3338, 1, 0, 0, 0, 3340, 3341, 1, 0, 0, 0, 3341, 295, 1, 0, 0, 0, 3342, 3340, 1, 0, 0, 0, 3343, 3344, 5, 46, 0, 0, 3344, 3345, 3, 618, 309, 0, 3345, 3346, 3, 298, 149, 0, 3346, 3347, 3, 308, 154, 0, 3347, 3348, 5, 238, 0, 0, 3348, 3354, 3, 1342, 671, 0, 3349, 3350, 5, 215, 0, 0, 3350, 3351, 3, 300, 150, 0, 3351, 3352, 3, 302, 151, 0, 3352, 3353, 3, 306, 153, 0, 3353, 3355, 1, 0, 0, 0, 3354, 3349, 1, 0, 0, 0, 3354, 3355, 1, 0, 0, 0, 3355, 297, 1, 0, 0, 0, 3356, 3359, 5, 352, 0, 0, 3357, 3359, 1, 0, 0, 0, 3358, 3356, 1, 0, 0, 0, 3358, 3357, 1, 0, 0, 0, 3359, 299, 1, 0, 0, 0, 3360, 3362, 3, 1342, 671, 0, 3361, 3363, 3, 526, 263, 0, 3362, 3361, 1, 0, 0, 0, 3362, 3363, 1, 0, 0, 0, 3363, 301, 1, 0, 0, 0, 3364, 3365, 5, 230, 0, 0, 3365, 3368, 3, 300, 150, 0, 3366, 3368, 1, 0, 0, 0, 3367, 3364, 1, 0, 0, 0, 3367, 3366, 1, 0, 0, 0, 3368, 303, 1, 0, 0, 0, 3369, 3370, 5, 366, 0, 0, 3370, 3374, 3, 300, 150, 0, 3371, 3372, 5, 262, 0, 0, 3372, 3374, 5, 366, 0, 0, 3373, 3369, 1, 0, 0, 0, 3373, 3371, 1, 0, 0, 0, 3374, 305, 1, 0, 0, 0, 3375, 3378, 3, 304, 152, 0, 3376, 3378, 1, 0, 0, 0, 3377, 3375, 1, 0, 0, 0, 3377, 3376, 1, 0, 0, 0, 3378, 307, 1, 0, 0, 0, 3379, 3382, 5, 288, 0, 0, 3380, 3382, 1, 0, 0, 0, 3381, 3379, 1, 0, 0, 0, 3381, 3380, 1, 0, 0, 0, 3382, 309, 1, 0, 0, 0, 3383, 3384, 5, 46, 0, 0, 3384, 3385, 5, 344, 0, 0, 3385, 3386, 3, 1342, 671, 0, 3386, 3387, 3, 312, 156, 0, 3387, 3388, 5, 246, 0, 0, 3388, 3389, 3, 1360, 680, 0, 3389, 3390, 3, 118, 59, 0, 3390, 311, 1, 0, 0, 0, 3391, 3392, 5, 275, 0, 0, 3392, 3395, 3, 1370, 685, 0, 3393, 3395, 1, 0, 0, 0, 3394, 3391, 1, 0, 0, 0, 3394, 3393, 1, 0, 0, 0, 3395, 313, 1, 0, 0, 0, 3396, 3397, 5, 191, 0, 0, 3397, 3400, 5, 344, 0, 0, 3398, 3399, 5, 220, 0, 0, 3399, 3401, 5, 389, 0, 0, 3400, 3398, 1, 0, 0, 0, 3400, 3401, 1, 0, 0, 0, 3401, 3402, 1, 0, 0, 0, 3402, 3403, 3, 1342, 671, 0, 3403, 315, 1, 0, 0, 0, 3404, 3405, 5, 46, 0, 0, 3405, 3409, 5, 204, 0, 0, 3406, 3407, 5, 220, 0, 0, 3407, 3408, 5, 77, 0, 0, 3408, 3410, 5, 389, 0, 0, 3409, 3406, 1, 0, 0, 0, 3409, 3410, 1, 0, 0, 0, 3410, 3411, 1, 0, 0, 0, 3411, 3412, 3, 1342, 671, 0, 3412, 3413, 3, 16, 8, 0, 3413, 3414, 3, 318, 159, 0, 3414, 317, 1, 0, 0, 0, 3415, 3417, 3, 320, 160, 0, 3416, 3415, 1, 0, 0, 0, 3417, 3420, 1, 0, 0, 0, 3418, 3416, 1, 0, 0, 0, 3418, 3419, 1, 0, 0, 0, 3419, 319, 1, 0, 0, 0, 3420, 3418, 1, 0, 0, 0, 3421, 3422, 5, 316, 0, 0, 3422, 3429, 3, 1342, 671, 0, 3423, 3424, 5, 368, 0, 0, 3424, 3429, 3, 72, 36, 0, 3425, 3426, 5, 64, 0, 0, 3426, 3429, 3, 72, 36, 0, 3427, 3429, 5, 150, 0, 0, 3428, 3421, 1, 0, 0, 0, 3428, 3423, 1, 0, 0, 0, 3428, 3425, 1, 0, 0, 0, 3428, 3427, 1, 0, 0, 0, 3429, 321, 1, 0, 0, 0, 3430, 3431, 5, 138, 0, 0, 3431, 3432, 5, 204, 0, 0, 3432, 3433, 3, 1342, 671, 0, 3433, 3434, 5, 362, 0, 0, 3434, 3435, 3, 324, 162, 0, 3435, 323, 1, 0, 0, 0, 3436, 3438, 3, 326, 163, 0, 3437, 3436, 1, 0, 0, 0, 3438, 3441, 1, 0, 0, 0, 3439, 3437, 1, 0, 0, 0, 3439, 3440, 1, 0, 0, 0, 3440, 325, 1, 0, 0, 0, 3441, 3439, 1, 0, 0, 0, 3442, 3443, 5, 94, 0, 0, 3443, 3444, 3, 72, 36, 0, 3444, 327, 1, 0, 0, 0, 3445, 3446, 5, 138, 0, 0, 3446, 3447, 5, 204, 0, 0, 3447, 3448, 3, 1342, 671, 0, 3448, 3449, 3, 40, 20, 0, 3449, 3450, 3, 516, 258, 0, 3450, 3451, 3, 1342, 671, 0, 3451, 3550, 1, 0, 0, 0, 3452, 3453, 5, 138, 0, 0, 3453, 3454, 5, 204, 0, 0, 3454, 3455, 3, 1342, 671, 0, 3455, 3456, 3, 40, 20, 0, 3456, 3457, 3, 514, 257, 0, 3457, 3458, 3, 524, 262, 0, 3458, 3550, 1, 0, 0, 0, 3459, 3460, 5, 138, 0, 0, 3460, 3461, 5, 204, 0, 0, 3461, 3462, 3, 1342, 671, 0, 3462, 3463, 3, 40, 20, 0, 3463, 3464, 5, 136, 0, 0, 3464, 3465, 3, 650, 325, 0, 3465, 3550, 1, 0, 0, 0, 3466, 3467, 5, 138, 0, 0, 3467, 3468, 5, 204, 0, 0, 3468, 3469, 3, 1342, 671, 0, 3469, 3470, 3, 40, 20, 0, 3470, 3471, 5, 41, 0, 0, 3471, 3472, 5, 2, 0, 0, 3472, 3473, 3, 1120, 560, 0, 3473, 3474, 5, 36, 0, 0, 3474, 3475, 3, 1120, 560, 0, 3475, 3476, 5, 3, 0, 0, 3476, 3550, 1, 0, 0, 0, 3477, 3478, 5, 138, 0, 0, 3478, 3479, 5, 204, 0, 0, 3479, 3480, 3, 1342, 671, 0, 3480, 3481, 3, 40, 20, 0, 3481, 3482, 5, 189, 0, 0, 3482, 3483, 3, 1120, 560, 0, 3483, 3550, 1, 0, 0, 0, 3484, 3485, 5, 138, 0, 0, 3485, 3486, 5, 204, 0, 0, 3486, 3487, 3, 1342, 671, 0, 3487, 3488, 3, 40, 20, 0, 3488, 3489, 5, 211, 0, 0, 3489, 3490, 3, 626, 313, 0, 3490, 3550, 1, 0, 0, 0, 3491, 3492, 5, 138, 0, 0, 3492, 3493, 5, 204, 0, 0, 3493, 3494, 3, 1342, 671, 0, 3494, 3495, 3, 40, 20, 0, 3495, 3496, 5, 271, 0, 0, 3496, 3497, 3, 688, 344, 0, 3497, 3550, 1, 0, 0, 0, 3498, 3499, 5, 138, 0, 0, 3499, 3500, 5, 204, 0, 0, 3500, 3501, 3, 1342, 671, 0, 3501, 3502, 3, 40, 20, 0, 3502, 3503, 5, 271, 0, 0, 3503, 3504, 5, 156, 0, 0, 3504, 3505, 3, 524, 262, 0, 3505, 3506, 5, 100, 0, 0, 3506, 3507, 3, 1342, 671, 0, 3507, 3550, 1, 0, 0, 0, 3508, 3509, 5, 138, 0, 0, 3509, 3510, 5, 204, 0, 0, 3510, 3511, 3, 1342, 671, 0, 3511, 3512, 3, 40, 20, 0, 3512, 3513, 5, 271, 0, 0, 3513, 3514, 5, 206, 0, 0, 3514, 3515, 3, 524, 262, 0, 3515, 3516, 5, 100, 0, 0, 3516, 3517, 3, 1342, 671, 0, 3517, 3550, 1, 0, 0, 0, 3518, 3519, 5, 138, 0, 0, 3519, 3520, 5, 204, 0, 0, 3520, 3521, 3, 1342, 671, 0, 3521, 3522, 3, 40, 20, 0, 3522, 3523, 5, 289, 0, 0, 3523, 3524, 3, 626, 313, 0, 3524, 3550, 1, 0, 0, 0, 3525, 3526, 5, 138, 0, 0, 3526, 3527, 5, 204, 0, 0, 3527, 3528, 3, 1342, 671, 0, 3528, 3529, 3, 40, 20, 0, 3529, 3530, 5, 442, 0, 0, 3530, 3531, 3, 626, 313, 0, 3531, 3550, 1, 0, 0, 0, 3532, 3533, 5, 138, 0, 0, 3533, 3534, 5, 204, 0, 0, 3534, 3535, 3, 1342, 671, 0, 3535, 3536, 3, 40, 20, 0, 3536, 3537, 5, 443, 0, 0, 3537, 3538, 5, 62, 0, 0, 3538, 3539, 3, 1120, 560, 0, 3539, 3540, 5, 238, 0, 0, 3540, 3541, 3, 1342, 671, 0, 3541, 3550, 1, 0, 0, 0, 3542, 3543, 5, 138, 0, 0, 3543, 3544, 5, 204, 0, 0, 3544, 3545, 3, 1342, 671, 0, 3545, 3546, 3, 40, 20, 0, 3546, 3547, 5, 353, 0, 0, 3547, 3548, 3, 1120, 560, 0, 3548, 3550, 1, 0, 0, 0, 3549, 3445, 1, 0, 0, 0, 3549, 3452, 1, 0, 0, 0, 3549, 3459, 1, 0, 0, 0, 3549, 3466, 1, 0, 0, 0, 3549, 3477, 1, 0, 0, 0, 3549, 3484, 1, 0, 0, 0, 3549, 3491, 1, 0, 0, 0, 3549, 3498, 1, 0, 0, 0, 3549, 3508, 1, 0, 0, 0, 3549, 3518, 1, 0, 0, 0, 3549, 3525, 1, 0, 0, 0, 3549, 3532, 1, 0, 0, 0, 3549, 3542, 1, 0, 0, 0, 3550, 329, 1, 0, 0, 0, 3551, 3552, 5, 46, 0, 0, 3552, 3553, 5, 63, 0, 0, 3553, 3554, 5, 174, 0, 0, 3554, 3555, 5, 374, 0, 0, 3555, 3556, 3, 1342, 671, 0, 3556, 3557, 3, 336, 168, 0, 3557, 3558, 3, 340, 170, 0, 3558, 331, 1, 0, 0, 0, 3559, 3560, 5, 215, 0, 0, 3560, 3568, 3, 300, 150, 0, 3561, 3562, 5, 262, 0, 0, 3562, 3568, 5, 215, 0, 0, 3563, 3564, 5, 366, 0, 0, 3564, 3568, 3, 300, 150, 0, 3565, 3566, 5, 262, 0, 0, 3566, 3568, 5, 366, 0, 0, 3567, 3559, 1, 0, 0, 0, 3567, 3561, 1, 0, 0, 0, 3567, 3563, 1, 0, 0, 0, 3567, 3565, 1, 0, 0, 0, 3568, 333, 1, 0, 0, 0, 3569, 3571, 3, 332, 166, 0, 3570, 3569, 1, 0, 0, 0, 3571, 3572, 1, 0, 0, 0, 3572, 3570, 1, 0, 0, 0, 3572, 3573, 1, 0, 0, 0, 3573, 335, 1, 0, 0, 0, 3574, 3577, 3, 334, 167, 0, 3575, 3577, 1, 0, 0, 0, 3576, 3574, 1, 0, 0, 0, 3576, 3575, 1, 0, 0, 0, 3577, 337, 1, 0, 0, 0, 3578, 3579, 5, 138, 0, 0, 3579, 3580, 5, 63, 0, 0, 3580, 3581, 5, 174, 0, 0, 3581, 3582, 5, 374, 0, 0, 3582, 3583, 3, 1342, 671, 0, 3583, 3584, 3, 336, 168, 0, 3584, 3585, 3, 344, 172, 0, 3585, 3594, 1, 0, 0, 0, 3586, 3587, 5, 138, 0, 0, 3587, 3588, 5, 63, 0, 0, 3588, 3589, 5, 174, 0, 0, 3589, 3590, 5, 374, 0, 0, 3590, 3591, 3, 1342, 671, 0, 3591, 3592, 3, 334, 167, 0, 3592, 3594, 1, 0, 0, 0, 3593, 3578, 1, 0, 0, 0, 3593, 3586, 1, 0, 0, 0, 3594, 339, 1, 0, 0, 0, 3595, 3596, 5, 273, 0, 0, 3596, 3597, 5, 2, 0, 0, 3597, 3598, 3, 342, 171, 0, 3598, 3599, 5, 3, 0, 0, 3599, 3602, 1, 0, 0, 0, 3600, 3602, 1, 0, 0, 0, 3601, 3595, 1, 0, 0, 0, 3601, 3600, 1, 0, 0, 0, 3602, 341, 1, 0, 0, 0, 3603, 3608, 3, 350, 175, 0, 3604, 3605, 5, 6, 0, 0, 3605, 3607, 3, 350, 175, 0, 3606, 3604, 1, 0, 0, 0, 3607, 3610, 1, 0, 0, 0, 3608, 3606, 1, 0, 0, 0, 3608, 3609, 1, 0, 0, 0, 3609, 343, 1, 0, 0, 0, 3610, 3608, 1, 0, 0, 0, 3611, 3612, 5, 273, 0, 0, 3612, 3613, 5, 2, 0, 0, 3613, 3614, 3, 346, 173, 0, 3614, 3615, 5, 3, 0, 0, 3615, 345, 1, 0, 0, 0, 3616, 3621, 3, 348, 174, 0, 3617, 3618, 5, 6, 0, 0, 3618, 3620, 3, 348, 174, 0, 3619, 3617, 1, 0, 0, 0, 3620, 3623, 1, 0, 0, 0, 3621, 3619, 1, 0, 0, 0, 3621, 3622, 1, 0, 0, 0, 3622, 347, 1, 0, 0, 0, 3623, 3621, 1, 0, 0, 0, 3624, 3632, 3, 350, 175, 0, 3625, 3626, 5, 326, 0, 0, 3626, 3632, 3, 350, 175, 0, 3627, 3628, 5, 133, 0, 0, 3628, 3632, 3, 350, 175, 0, 3629, 3630, 5, 191, 0, 0, 3630, 3632, 3, 352, 176, 0, 3631, 3624, 1, 0, 0, 0, 3631, 3625, 1, 0, 0, 0, 3631, 3627, 1, 0, 0, 0, 3631, 3629, 1, 0, 0, 0, 3632, 349, 1, 0, 0, 0, 3633, 3634, 3, 352, 176, 0, 3634, 3635, 3, 354, 177, 0, 3635, 351, 1, 0, 0, 0, 3636, 3637, 3, 1382, 691, 0, 3637, 353, 1, 0, 0, 0, 3638, 3639, 3, 1360, 680, 0, 3639, 355, 1, 0, 0, 0, 3640, 3641, 5, 46, 0, 0, 3641, 3642, 5, 324, 0, 0, 3642, 3643, 3, 1342, 671, 0, 3643, 3644, 3, 358, 179, 0, 3644, 3645, 3, 362, 181, 0, 3645, 3646, 5, 63, 0, 0, 3646, 3647, 5, 174, 0, 0, 3647, 3648, 5, 374, 0, 0, 3648, 3649, 3, 1342, 671, 0, 3649, 3650, 3, 340, 170, 0, 3650, 3666, 1, 0, 0, 0, 3651, 3652, 5, 46, 0, 0, 3652, 3653, 5, 324, 0, 0, 3653, 3654, 5, 220, 0, 0, 3654, 3655, 5, 77, 0, 0, 3655, 3656, 5, 389, 0, 0, 3656, 3657, 3, 1342, 671, 0, 3657, 3658, 3, 358, 179, 0, 3658, 3659, 3, 362, 181, 0, 3659, 3660, 5, 63, 0, 0, 3660, 3661, 5, 174, 0, 0, 3661, 3662, 5, 374, 0, 0, 3662, 3663, 3, 1342, 671, 0, 3663, 3664, 3, 340, 170, 0, 3664, 3666, 1, 0, 0, 0, 3665, 3640, 1, 0, 0, 0, 3665, 3651, 1, 0, 0, 0, 3666, 357, 1, 0, 0, 0, 3667, 3668, 5, 353, 0, 0, 3668, 3671, 3, 1360, 680, 0, 3669, 3671, 1, 0, 0, 0, 3670, 3667, 1, 0, 0, 0, 3670, 3669, 1, 0, 0, 0, 3671, 359, 1, 0, 0, 0, 3672, 3675, 5, 368, 0, 0, 3673, 3676, 3, 1360, 680, 0, 3674, 3676, 5, 78, 0, 0, 3675, 3673, 1, 0, 0, 0, 3675, 3674, 1, 0, 0, 0, 3676, 361, 1, 0, 0, 0, 3677, 3680, 3, 360, 180, 0, 3678, 3680, 1, 0, 0, 0, 3679, 3677, 1, 0, 0, 0, 3679, 3678, 1, 0, 0, 0, 3680, 363, 1, 0, 0, 0, 3681, 3682, 5, 138, 0, 0, 3682, 3683, 5, 324, 0, 0, 3683, 3689, 3, 1342, 671, 0, 3684, 3690, 3, 344, 172, 0, 3685, 3687, 3, 360, 180, 0, 3686, 3688, 3, 344, 172, 0, 3687, 3686, 1, 0, 0, 0, 3687, 3688, 1, 0, 0, 0, 3688, 3690, 1, 0, 0, 0, 3689, 3684, 1, 0, 0, 0, 3689, 3685, 1, 0, 0, 0, 3690, 365, 1, 0, 0, 0, 3691, 3692, 5, 46, 0, 0, 3692, 3693, 5, 63, 0, 0, 3693, 3694, 5, 92, 0, 0, 3694, 3695, 3, 1338, 669, 0, 3695, 3696, 5, 2, 0, 0, 3696, 3697, 3, 176, 88, 0, 3697, 3698, 5, 3, 0, 0, 3698, 3699, 3, 238, 119, 0, 3699, 3700, 5, 324, 0, 0, 3700, 3701, 3, 1342, 671, 0, 3701, 3702, 3, 340, 170, 0, 3702, 3748, 1, 0, 0, 0, 3703, 3704, 5, 46, 0, 0, 3704, 3705, 5, 63, 0, 0, 3705, 3706, 5, 92, 0, 0, 3706, 3707, 5, 220, 0, 0, 3707, 3708, 5, 77, 0, 0, 3708, 3709, 5, 389, 0, 0, 3709, 3710, 3, 1338, 669, 0, 3710, 3711, 5, 2, 0, 0, 3711, 3712, 3, 176, 88, 0, 3712, 3713, 5, 3, 0, 0, 3713, 3714, 3, 238, 119, 0, 3714, 3715, 5, 324, 0, 0, 3715, 3716, 3, 1342, 671, 0, 3716, 3717, 3, 340, 170, 0, 3717, 3748, 1, 0, 0, 0, 3718, 3719, 5, 46, 0, 0, 3719, 3720, 5, 63, 0, 0, 3720, 3721, 5, 92, 0, 0, 3721, 3722, 3, 1338, 669, 0, 3722, 3723, 5, 278, 0, 0, 3723, 3724, 5, 268, 0, 0, 3724, 3725, 3, 1338, 669, 0, 3725, 3726, 3, 178, 89, 0, 3726, 3727, 3, 128, 64, 0, 3727, 3728, 5, 324, 0, 0, 3728, 3729, 3, 1342, 671, 0, 3729, 3730, 3, 340, 170, 0, 3730, 3748, 1, 0, 0, 0, 3731, 3732, 5, 46, 0, 0, 3732, 3733, 5, 63, 0, 0, 3733, 3734, 5, 92, 0, 0, 3734, 3735, 5, 220, 0, 0, 3735, 3736, 5, 77, 0, 0, 3736, 3737, 5, 389, 0, 0, 3737, 3738, 3, 1338, 669, 0, 3738, 3739, 5, 278, 0, 0, 3739, 3740, 5, 268, 0, 0, 3740, 3741, 3, 1338, 669, 0, 3741, 3742, 3, 178, 89, 0, 3742, 3743, 3, 128, 64, 0, 3743, 3744, 5, 324, 0, 0, 3744, 3745, 3, 1342, 671, 0, 3745, 3746, 3, 340, 170, 0, 3746, 3748, 1, 0, 0, 0, 3747, 3691, 1, 0, 0, 0, 3747, 3703, 1, 0, 0, 0, 3747, 3718, 1, 0, 0, 0, 3747, 3731, 1, 0, 0, 0, 3748, 367, 1, 0, 0, 0, 3749, 3750, 5, 444, 0, 0, 3750, 3751, 5, 63, 0, 0, 3751, 3752, 5, 316, 0, 0, 3752, 3753, 3, 1342, 671, 0, 3753, 3754, 3, 372, 186, 0, 3754, 3755, 5, 64, 0, 0, 3755, 3756, 5, 324, 0, 0, 3756, 3757, 3, 1342, 671, 0, 3757, 3758, 5, 71, 0, 0, 3758, 3759, 3, 1342, 671, 0, 3759, 3760, 3, 340, 170, 0, 3760, 369, 1, 0, 0, 0, 3761, 3762, 5, 74, 0, 0, 3762, 3765, 5, 94, 0, 0, 3763, 3765, 5, 59, 0, 0, 3764, 3761, 1, 0, 0, 0, 3764, 3763, 1, 0, 0, 0, 3765, 371, 1, 0, 0, 0, 3766, 3767, 3, 370, 185, 0, 3767, 3768, 5, 2, 0, 0, 3768, 3769, 3, 1078, 539, 0, 3769, 3770, 5, 3, 0, 0, 3770, 3773, 1, 0, 0, 0, 3771, 3773, 1, 0, 0, 0, 3772, 3766, 1, 0, 0, 0, 3772, 3771, 1, 0, 0, 0, 3773, 373, 1, 0, 0, 0, 3774, 3775, 5, 46, 0, 0, 3775, 3776, 5, 99, 0, 0, 3776, 3777, 5, 248, 0, 0, 3777, 3778, 5, 62, 0, 0, 3778, 3779, 3, 376, 188, 0, 3779, 3780, 5, 324, 0, 0, 3780, 3781, 3, 1342, 671, 0, 3781, 3782, 3, 340, 170, 0, 3782, 3796, 1, 0, 0, 0, 3783, 3784, 5, 46, 0, 0, 3784, 3785, 5, 99, 0, 0, 3785, 3786, 5, 248, 0, 0, 3786, 3787, 5, 220, 0, 0, 3787, 3788, 5, 77, 0, 0, 3788, 3789, 5, 389, 0, 0, 3789, 3790, 5, 62, 0, 0, 3790, 3791, 3, 376, 188, 0, 3791, 3792, 5, 324, 0, 0, 3792, 3793, 3, 1342, 671, 0, 3793, 3794, 3, 340, 170, 0, 3794, 3796, 1, 0, 0, 0, 3795, 3774, 1, 0, 0, 0, 3795, 3783, 1, 0, 0, 0, 3796, 375, 1, 0, 0, 0, 3797, 3800, 3, 1370, 685, 0, 3798, 3800, 5, 99, 0, 0, 3799, 3797, 1, 0, 0, 0, 3799, 3798, 1, 0, 0, 0, 3800, 377, 1, 0, 0, 0, 3801, 3802, 5, 191, 0, 0, 3802, 3803, 5, 99, 0, 0, 3803, 3804, 5, 248, 0, 0, 3804, 3805, 5, 62, 0, 0, 3805, 3806, 3, 376, 188, 0, 3806, 3807, 5, 324, 0, 0, 3807, 3808, 3, 1342, 671, 0, 3808, 3820, 1, 0, 0, 0, 3809, 3810, 5, 191, 0, 0, 3810, 3811, 5, 99, 0, 0, 3811, 3812, 5, 248, 0, 0, 3812, 3813, 5, 220, 0, 0, 3813, 3814, 5, 389, 0, 0, 3814, 3815, 5, 62, 0, 0, 3815, 3816, 3, 376, 188, 0, 3816, 3817, 5, 324, 0, 0, 3817, 3818, 3, 1342, 671, 0, 3818, 3820, 1, 0, 0, 0, 3819, 3801, 1, 0, 0, 0, 3819, 3809, 1, 0, 0, 0, 3820, 379, 1, 0, 0, 0, 3821, 3822, 5, 138, 0, 0, 3822, 3823, 5, 99, 0, 0, 3823, 3824, 5, 248, 0, 0, 3824, 3825, 5, 62, 0, 0, 3825, 3826, 3, 376, 188, 0, 3826, 3827, 5, 324, 0, 0, 3827, 3828, 3, 1342, 671, 0, 3828, 3829, 3, 344, 172, 0, 3829, 381, 1, 0, 0, 0, 3830, 3831, 5, 46, 0, 0, 3831, 3832, 5, 445, 0, 0, 3832, 3833, 3, 1342, 671, 0, 3833, 3834, 5, 80, 0, 0, 3834, 3835, 3, 1338, 669, 0, 3835, 3836, 3, 394, 197, 0, 3836, 3837, 3, 396, 198, 0, 3837, 3838, 3, 390, 195, 0, 3838, 3839, 3, 386, 193, 0, 3839, 3840, 3, 388, 194, 0, 3840, 383, 1, 0, 0, 0, 3841, 3842, 5, 138, 0, 0, 3842, 3843, 5, 445, 0, 0, 3843, 3844, 3, 1342, 671, 0, 3844, 3845, 5, 80, 0, 0, 3845, 3846, 3, 1338, 669, 0, 3846, 3847, 3, 392, 196, 0, 3847, 3848, 3, 386, 193, 0, 3848, 3849, 3, 388, 194, 0, 3849, 385, 1, 0, 0, 0, 3850, 3851, 5, 100, 0, 0, 3851, 3852, 5, 2, 0, 0, 3852, 3853, 3, 1164, 582, 0, 3853, 3854, 5, 3, 0, 0, 3854, 3857, 1, 0, 0, 0, 3855, 3857, 1, 0, 0, 0, 3856, 3850, 1, 0, 0, 0, 3856, 3855, 1, 0, 0, 0, 3857, 387, 1, 0, 0, 0, 3858, 3859, 5, 105, 0, 0, 3859, 3860, 5, 42, 0, 0, 3860, 3861, 5, 2, 0, 0, 3861, 3862, 3, 1164, 582, 0, 3862, 3863, 5, 3, 0, 0, 3863, 3866, 1, 0, 0, 0, 3864, 3866, 1, 0, 0, 0, 3865, 3858, 1, 0, 0, 0, 3865, 3864, 1, 0, 0, 0, 3866, 389, 1, 0, 0, 0, 3867, 3868, 5, 94, 0, 0, 3868, 3871, 3, 1372, 686, 0, 3869, 3871, 1, 0, 0, 0, 3870, 3867, 1, 0, 0, 0, 3870, 3869, 1, 0, 0, 0, 3871, 391, 1, 0, 0, 0, 3872, 3873, 5, 94, 0, 0, 3873, 3876, 3, 1372, 686, 0, 3874, 3876, 1, 0, 0, 0, 3875, 3872, 1, 0, 0, 0, 3875, 3874, 1, 0, 0, 0, 3876, 393, 1, 0, 0, 0, 3877, 3878, 5, 36, 0, 0, 3878, 3881, 3, 1384, 692, 0, 3879, 3881, 1, 0, 0, 0, 3880, 3877, 1, 0, 0, 0, 3880, 3879, 1, 0, 0, 0, 3881, 395, 1, 0, 0, 0, 3882, 3883, 5, 62, 0, 0, 3883, 3886, 3, 398, 199, 0, 3884, 3886, 1, 0, 0, 0, 3885, 3882, 1, 0, 0, 0, 3885, 3884, 1, 0, 0, 0, 3886, 397, 1, 0, 0, 0, 3887, 3888, 7, 17, 0, 0, 3888, 399, 1, 0, 0, 0, 3889, 3890, 5, 46, 0, 0, 3890, 3891, 5, 131, 0, 0, 3891, 3892, 5, 446, 0, 0, 3892, 3893, 3, 1342, 671, 0, 3893, 3894, 5, 353, 0, 0, 3894, 3895, 3, 402, 201, 0, 3895, 3896, 5, 215, 0, 0, 3896, 3897, 3, 300, 150, 0, 3897, 401, 1, 0, 0, 0, 3898, 3899, 7, 18, 0, 0, 3899, 403, 1, 0, 0, 0, 3900, 3901, 5, 46, 0, 0, 3901, 3902, 5, 350, 0, 0, 3902, 3903, 3, 1342, 671, 0, 3903, 3904, 3, 406, 203, 0, 3904, 3905, 3, 408, 204, 0, 3905, 3906, 5, 80, 0, 0, 3906, 3907, 3, 1338, 669, 0, 3907, 3908, 3, 412, 206, 0, 3908, 3909, 3, 424, 212, 0, 3909, 3910, 3, 430, 215, 0, 3910, 3911, 5, 202, 0, 0, 3911, 3912, 3, 432, 216, 0, 3912, 3913, 3, 1348, 674, 0, 3913, 3914, 5, 2, 0, 0, 3914, 3915, 3, 434, 217, 0, 3915, 3916, 5, 3, 0, 0, 3916, 3939, 1, 0, 0, 0, 3917, 3918, 5, 46, 0, 0, 3918, 3919, 5, 45, 0, 0, 3919, 3920, 5, 350, 0, 0, 3920, 3921, 3, 1342, 671, 0, 3921, 3922, 5, 135, 0, 0, 3922, 3923, 3, 408, 204, 0, 3923, 3924, 5, 80, 0, 0, 3924, 3925, 3, 1338, 669, 0, 3925, 3926, 3, 438, 219, 0, 3926, 3927, 3, 440, 220, 0, 3927, 3928, 5, 62, 0, 0, 3928, 3929, 5, 192, 0, 0, 3929, 3930, 5, 407, 0, 0, 3930, 3931, 3, 430, 215, 0, 3931, 3932, 5, 202, 0, 0, 3932, 3933, 3, 432, 216, 0, 3933, 3934, 3, 1348, 674, 0, 3934, 3935, 5, 2, 0, 0, 3935, 3936, 3, 434, 217, 0, 3936, 3937, 5, 3, 0, 0, 3937, 3939, 1, 0, 0, 0, 3938, 3900, 1, 0, 0, 0, 3938, 3917, 1, 0, 0, 0, 3939, 405, 1, 0, 0, 0, 3940, 3945, 5, 145, 0, 0, 3941, 3945, 5, 135, 0, 0, 3942, 3943, 5, 233, 0, 0, 3943, 3945, 5, 268, 0, 0, 3944, 3940, 1, 0, 0, 0, 3944, 3941, 1, 0, 0, 0, 3944, 3942, 1, 0, 0, 0, 3945, 407, 1, 0, 0, 0, 3946, 3951, 3, 410, 205, 0, 3947, 3948, 5, 82, 0, 0, 3948, 3950, 3, 410, 205, 0, 3949, 3947, 1, 0, 0, 0, 3950, 3953, 1, 0, 0, 0, 3951, 3949, 1, 0, 0, 0, 3951, 3952, 1, 0, 0, 0, 3952, 409, 1, 0, 0, 0, 3953, 3951, 1, 0, 0, 0, 3954, 3962, 5, 232, 0, 0, 3955, 3962, 5, 182, 0, 0, 3956, 3962, 5, 362, 0, 0, 3957, 3958, 5, 362, 0, 0, 3958, 3959, 5, 268, 0, 0, 3959, 3962, 3, 216, 108, 0, 3960, 3962, 5, 351, 0, 0, 3961, 3954, 1, 0, 0, 0, 3961, 3955, 1, 0, 0, 0, 3961, 3956, 1, 0, 0, 0, 3961, 3957, 1, 0, 0, 0, 3961, 3960, 1, 0, 0, 0, 3962, 411, 1, 0, 0, 0, 3963, 3964, 5, 447, 0, 0, 3964, 3967, 3, 414, 207, 0, 3965, 3967, 1, 0, 0, 0, 3966, 3963, 1, 0, 0, 0, 3966, 3965, 1, 0, 0, 0, 3967, 413, 1, 0, 0, 0, 3968, 3970, 3, 416, 208, 0, 3969, 3968, 1, 0, 0, 0, 3970, 3971, 1, 0, 0, 0, 3971, 3969, 1, 0, 0, 0, 3971, 3972, 1, 0, 0, 0, 3972, 415, 1, 0, 0, 0, 3973, 3974, 3, 418, 209, 0, 3974, 3975, 3, 420, 210, 0, 3975, 3976, 3, 834, 417, 0, 3976, 3977, 3, 422, 211, 0, 3977, 417, 1, 0, 0, 0, 3978, 3979, 7, 19, 0, 0, 3979, 419, 1, 0, 0, 0, 3980, 3981, 7, 20, 0, 0, 3981, 421, 1, 0, 0, 0, 3982, 3983, 3, 1374, 687, 0, 3983, 423, 1, 0, 0, 0, 3984, 3985, 5, 62, 0, 0, 3985, 3986, 3, 426, 213, 0, 3986, 3987, 3, 428, 214, 0, 3987, 3990, 1, 0, 0, 0, 3988, 3990, 1, 0, 0, 0, 3989, 3984, 1, 0, 0, 0, 3989, 3988, 1, 0, 0, 0, 3990, 425, 1, 0, 0, 0, 3991, 3994, 5, 192, 0, 0, 3992, 3994, 1, 0, 0, 0, 3993, 3991, 1, 0, 0, 0, 3993, 3992, 1, 0, 0, 0, 3994, 427, 1, 0, 0, 0, 3995, 3996, 7, 21, 0, 0, 3996, 429, 1, 0, 0, 0, 3997, 3998, 5, 102, 0, 0, 3998, 3999, 5, 2, 0, 0, 3999, 4000, 3, 1164, 582, 0, 4000, 4001, 5, 3, 0, 0, 4001, 4004, 1, 0, 0, 0, 4002, 4004, 1, 0, 0, 0, 4003, 3997, 1, 0, 0, 0, 4003, 4002, 1, 0, 0, 0, 4004, 431, 1, 0, 0, 0, 4005, 4006, 7, 22, 0, 0, 4006, 433, 1, 0, 0, 0, 4007, 4010, 3, 436, 218, 0, 4008, 4010, 1, 0, 0, 0, 4009, 4007, 1, 0, 0, 0, 4009, 4008, 1, 0, 0, 0, 4010, 4015, 1, 0, 0, 0, 4011, 4012, 5, 6, 0, 0, 4012, 4014, 3, 436, 218, 0, 4013, 4011, 1, 0, 0, 0, 4014, 4017, 1, 0, 0, 0, 4015, 4013, 1, 0, 0, 0, 4015, 4016, 1, 0, 0, 0, 4016, 435, 1, 0, 0, 0, 4017, 4015, 1, 0, 0, 0, 4018, 4023, 3, 1358, 679, 0, 4019, 4023, 3, 1356, 678, 0, 4020, 4023, 3, 1360, 680, 0, 4021, 4023, 3, 1382, 691, 0, 4022, 4018, 1, 0, 0, 0, 4022, 4019, 1, 0, 0, 0, 4022, 4020, 1, 0, 0, 0, 4022, 4021, 1, 0, 0, 0, 4023, 437, 1, 0, 0, 0, 4024, 4025, 5, 64, 0, 0, 4025, 4028, 3, 1338, 669, 0, 4026, 4028, 1, 0, 0, 0, 4027, 4024, 1, 0, 0, 0, 4027, 4026, 1, 0, 0, 0, 4028, 439, 1, 0, 0, 0, 4029, 4031, 3, 442, 221, 0, 4030, 4029, 1, 0, 0, 0, 4031, 4034, 1, 0, 0, 0, 4032, 4030, 1, 0, 0, 0, 4032, 4033, 1, 0, 0, 0, 4033, 441, 1, 0, 0, 0, 4034, 4032, 1, 0, 0, 0, 4035, 4036, 5, 77, 0, 0, 4036, 4047, 5, 54, 0, 0, 4037, 4047, 5, 54, 0, 0, 4038, 4039, 5, 69, 0, 0, 4039, 4047, 5, 221, 0, 0, 4040, 4041, 5, 69, 0, 0, 4041, 4047, 5, 180, 0, 0, 4042, 4043, 5, 77, 0, 0, 4043, 4047, 5, 364, 0, 0, 4044, 4045, 5, 262, 0, 0, 4045, 4047, 5, 228, 0, 0, 4046, 4035, 1, 0, 0, 0, 4046, 4037, 1, 0, 0, 0, 4046, 4038, 1, 0, 0, 0, 4046, 4040, 1, 0, 0, 0, 4046, 4042, 1, 0, 0, 0, 4046, 4044, 1, 0, 0, 0, 4047, 443, 1, 0, 0, 0, 4048, 4049, 5, 46, 0, 0, 4049, 4050, 5, 198, 0, 0, 4050, 4051, 5, 350, 0, 0, 4051, 4052, 3, 1342, 671, 0, 4052, 4053, 5, 80, 0, 0, 4053, 4054, 3, 1382, 691, 0, 4054, 4055, 5, 202, 0, 0, 4055, 4056, 3, 432, 216, 0, 4056, 4057, 3, 1348, 674, 0, 4057, 4058, 5, 2, 0, 0, 4058, 4059, 5, 3, 0, 0, 4059, 4075, 1, 0, 0, 0, 4060, 4061, 5, 46, 0, 0, 4061, 4062, 5, 198, 0, 0, 4062, 4063, 5, 350, 0, 0, 4063, 4064, 3, 1342, 671, 0, 4064, 4065, 5, 80, 0, 0, 4065, 4066, 3, 1382, 691, 0, 4066, 4067, 5, 102, 0, 0, 4067, 4068, 3, 446, 223, 0, 4068, 4069, 5, 202, 0, 0, 4069, 4070, 3, 432, 216, 0, 4070, 4071, 3, 1348, 674, 0, 4071, 4072, 5, 2, 0, 0, 4072, 4073, 5, 3, 0, 0, 4073, 4075, 1, 0, 0, 0, 4074, 4048, 1, 0, 0, 0, 4074, 4060, 1, 0, 0, 0, 4075, 445, 1, 0, 0, 0, 4076, 4081, 3, 448, 224, 0, 4077, 4078, 5, 33, 0, 0, 4078, 4080, 3, 448, 224, 0, 4079, 4077, 1, 0, 0, 0, 4080, 4083, 1, 0, 0, 0, 4081, 4079, 1, 0, 0, 0, 4081, 4082, 1, 0, 0, 0, 4082, 447, 1, 0, 0, 0, 4083, 4081, 1, 0, 0, 0, 4084, 4085, 3, 1374, 687, 0, 4085, 4086, 5, 68, 0, 0, 4086, 4087, 5, 2, 0, 0, 4087, 4088, 3, 450, 225, 0, 4088, 4089, 5, 3, 0, 0, 4089, 449, 1, 0, 0, 0, 4090, 4095, 3, 1360, 680, 0, 4091, 4092, 5, 6, 0, 0, 4092, 4094, 3, 1360, 680, 0, 4093, 4091, 1, 0, 0, 0, 4094, 4097, 1, 0, 0, 0, 4095, 4093, 1, 0, 0, 0, 4095, 4096, 1, 0, 0, 0, 4096, 451, 1, 0, 0, 0, 4097, 4095, 1, 0, 0, 0, 4098, 4099, 5, 138, 0, 0, 4099, 4100, 5, 198, 0, 0, 4100, 4101, 5, 350, 0, 0, 4101, 4102, 3, 1342, 671, 0, 4102, 4103, 3, 454, 227, 0, 4103, 453, 1, 0, 0, 0, 4104, 4111, 5, 193, 0, 0, 4105, 4106, 5, 193, 0, 0, 4106, 4111, 5, 305, 0, 0, 4107, 4108, 5, 193, 0, 0, 4108, 4111, 5, 139, 0, 0, 4109, 4111, 5, 186, 0, 0, 4110, 4104, 1, 0, 0, 0, 4110, 4105, 1, 0, 0, 0, 4110, 4107, 1, 0, 0, 0, 4110, 4109, 1, 0, 0, 0, 4111, 455, 1, 0, 0, 0, 4112, 4113, 5, 46, 0, 0, 4113, 4114, 5, 140, 0, 0, 4114, 4115, 3, 524, 262, 0, 4115, 4116, 5, 42, 0, 0, 4116, 4117, 5, 2, 0, 0, 4117, 4118, 3, 1164, 582, 0, 4118, 4119, 5, 3, 0, 0, 4119, 4120, 3, 440, 220, 0, 4120, 457, 1, 0, 0, 0, 4121, 4122, 5, 46, 0, 0, 4122, 4123, 3, 618, 309, 0, 4123, 4124, 5, 136, 0, 0, 4124, 4125, 3, 1348, 674, 0, 4125, 4126, 3, 646, 323, 0, 4126, 4127, 3, 460, 230, 0, 4127, 4228, 1, 0, 0, 0, 4128, 4129, 5, 46, 0, 0, 4129, 4130, 3, 618, 309, 0, 4130, 4131, 5, 136, 0, 0, 4131, 4132, 3, 1348, 674, 0, 4132, 4133, 3, 468, 234, 0, 4133, 4228, 1, 0, 0, 0, 4134, 4135, 5, 46, 0, 0, 4135, 4136, 5, 271, 0, 0, 4136, 4137, 3, 684, 342, 0, 4137, 4138, 3, 460, 230, 0, 4138, 4228, 1, 0, 0, 0, 4139, 4140, 5, 46, 0, 0, 4140, 4141, 5, 353, 0, 0, 4141, 4142, 3, 524, 262, 0, 4142, 4143, 3, 460, 230, 0, 4143, 4228, 1, 0, 0, 0, 4144, 4145, 5, 46, 0, 0, 4145, 4146, 5, 353, 0, 0, 4146, 4228, 3, 524, 262, 0, 4147, 4148, 5, 46, 0, 0, 4148, 4149, 5, 353, 0, 0, 4149, 4150, 3, 524, 262, 0, 4150, 4151, 5, 36, 0, 0, 4151, 4152, 5, 2, 0, 0, 4152, 4153, 3, 1100, 550, 0, 4153, 4154, 5, 3, 0, 0, 4154, 4228, 1, 0, 0, 0, 4155, 4156, 5, 46, 0, 0, 4156, 4157, 5, 353, 0, 0, 4157, 4158, 3, 524, 262, 0, 4158, 4159, 5, 36, 0, 0, 4159, 4160, 5, 196, 0, 0, 4160, 4161, 5, 2, 0, 0, 4161, 4162, 3, 474, 237, 0, 4162, 4163, 5, 3, 0, 0, 4163, 4228, 1, 0, 0, 0, 4164, 4165, 5, 46, 0, 0, 4165, 4166, 5, 353, 0, 0, 4166, 4167, 3, 524, 262, 0, 4167, 4168, 5, 36, 0, 0, 4168, 4169, 5, 292, 0, 0, 4169, 4170, 3, 460, 230, 0, 4170, 4228, 1, 0, 0, 0, 4171, 4172, 5, 46, 0, 0, 4172, 4173, 5, 348, 0, 0, 4173, 4174, 5, 318, 0, 0, 4174, 4175, 5, 276, 0, 0, 4175, 4176, 3, 524, 262, 0, 4176, 4177, 3, 460, 230, 0, 4177, 4228, 1, 0, 0, 0, 4178, 4179, 5, 46, 0, 0, 4179, 4180, 5, 348, 0, 0, 4180, 4181, 5, 318, 0, 0, 4181, 4182, 5, 185, 0, 0, 4182, 4183, 3, 524, 262, 0, 4183, 4184, 3, 460, 230, 0, 4184, 4228, 1, 0, 0, 0, 4185, 4186, 5, 46, 0, 0, 4186, 4187, 5, 348, 0, 0, 4187, 4188, 5, 318, 0, 0, 4188, 4189, 5, 346, 0, 0, 4189, 4190, 3, 524, 262, 0, 4190, 4191, 3, 460, 230, 0, 4191, 4228, 1, 0, 0, 0, 4192, 4193, 5, 46, 0, 0, 4193, 4194, 5, 348, 0, 0, 4194, 4195, 5, 318, 0, 0, 4195, 4196, 5, 163, 0, 0, 4196, 4197, 3, 524, 262, 0, 4197, 4198, 3, 460, 230, 0, 4198, 4228, 1, 0, 0, 0, 4199, 4200, 5, 46, 0, 0, 4200, 4201, 5, 108, 0, 0, 4201, 4202, 3, 524, 262, 0, 4202, 4203, 3, 460, 230, 0, 4203, 4228, 1, 0, 0, 0, 4204, 4205, 5, 46, 0, 0, 4205, 4206, 5, 108, 0, 0, 4206, 4207, 5, 220, 0, 0, 4207, 4208, 5, 77, 0, 0, 4208, 4209, 5, 389, 0, 0, 4209, 4210, 3, 524, 262, 0, 4210, 4211, 3, 460, 230, 0, 4211, 4228, 1, 0, 0, 0, 4212, 4213, 5, 46, 0, 0, 4213, 4214, 5, 108, 0, 0, 4214, 4215, 3, 524, 262, 0, 4215, 4216, 5, 64, 0, 0, 4216, 4217, 3, 524, 262, 0, 4217, 4228, 1, 0, 0, 0, 4218, 4219, 5, 46, 0, 0, 4219, 4220, 5, 108, 0, 0, 4220, 4221, 5, 220, 0, 0, 4221, 4222, 5, 77, 0, 0, 4222, 4223, 5, 389, 0, 0, 4223, 4224, 3, 524, 262, 0, 4224, 4225, 5, 64, 0, 0, 4225, 4226, 3, 524, 262, 0, 4226, 4228, 1, 0, 0, 0, 4227, 4121, 1, 0, 0, 0, 4227, 4128, 1, 0, 0, 0, 4227, 4134, 1, 0, 0, 0, 4227, 4139, 1, 0, 0, 0, 4227, 4144, 1, 0, 0, 0, 4227, 4147, 1, 0, 0, 0, 4227, 4155, 1, 0, 0, 0, 4227, 4164, 1, 0, 0, 0, 4227, 4171, 1, 0, 0, 0, 4227, 4178, 1, 0, 0, 0, 4227, 4185, 1, 0, 0, 0, 4227, 4192, 1, 0, 0, 0, 4227, 4199, 1, 0, 0, 0, 4227, 4204, 1, 0, 0, 0, 4227, 4212, 1, 0, 0, 0, 4227, 4218, 1, 0, 0, 0, 4228, 459, 1, 0, 0, 0, 4229, 4230, 5, 2, 0, 0, 4230, 4231, 3, 462, 231, 0, 4231, 4232, 5, 3, 0, 0, 4232, 461, 1, 0, 0, 0, 4233, 4238, 3, 464, 232, 0, 4234, 4235, 5, 6, 0, 0, 4235, 4237, 3, 464, 232, 0, 4236, 4234, 1, 0, 0, 0, 4237, 4240, 1, 0, 0, 0, 4238, 4236, 1, 0, 0, 0, 4238, 4239, 1, 0, 0, 0, 4239, 463, 1, 0, 0, 0, 4240, 4238, 1, 0, 0, 0, 4241, 4244, 3, 1382, 691, 0, 4242, 4243, 5, 10, 0, 0, 4243, 4245, 3, 466, 233, 0, 4244, 4242, 1, 0, 0, 0, 4244, 4245, 1, 0, 0, 0, 4245, 465, 1, 0, 0, 0, 4246, 4253, 3, 640, 320, 0, 4247, 4253, 3, 1394, 697, 0, 4248, 4253, 3, 1278, 639, 0, 4249, 4253, 3, 292, 146, 0, 4250, 4253, 3, 1360, 680, 0, 4251, 4253, 5, 400, 0, 0, 4252, 4246, 1, 0, 0, 0, 4252, 4247, 1, 0, 0, 0, 4252, 4248, 1, 0, 0, 0, 4252, 4249, 1, 0, 0, 0, 4252, 4250, 1, 0, 0, 0, 4252, 4251, 1, 0, 0, 0, 4253, 467, 1, 0, 0, 0, 4254, 4255, 5, 2, 0, 0, 4255, 4256, 3, 470, 235, 0, 4256, 4257, 5, 3, 0, 0, 4257, 469, 1, 0, 0, 0, 4258, 4263, 3, 472, 236, 0, 4259, 4260, 5, 6, 0, 0, 4260, 4262, 3, 472, 236, 0, 4261, 4259, 1, 0, 0, 0, 4262, 4265, 1, 0, 0, 0, 4263, 4261, 1, 0, 0, 0, 4263, 4264, 1, 0, 0, 0, 4264, 471, 1, 0, 0, 0, 4265, 4263, 1, 0, 0, 0, 4266, 4267, 3, 1384, 692, 0, 4267, 4268, 5, 10, 0, 0, 4268, 4269, 3, 466, 233, 0, 4269, 473, 1, 0, 0, 0, 4270, 4273, 3, 476, 238, 0, 4271, 4273, 1, 0, 0, 0, 4272, 4270, 1, 0, 0, 0, 4272, 4271, 1, 0, 0, 0, 4273, 475, 1, 0, 0, 0, 4274, 4279, 3, 1360, 680, 0, 4275, 4276, 5, 6, 0, 0, 4276, 4278, 3, 1360, 680, 0, 4277, 4275, 1, 0, 0, 0, 4278, 4281, 1, 0, 0, 0, 4279, 4277, 1, 0, 0, 0, 4279, 4280, 1, 0, 0, 0, 4280, 477, 1, 0, 0, 0, 4281, 4279, 1, 0, 0, 0, 4282, 4283, 5, 138, 0, 0, 4283, 4284, 5, 353, 0, 0, 4284, 4285, 3, 524, 262, 0, 4285, 4286, 5, 133, 0, 0, 4286, 4287, 5, 450, 0, 0, 4287, 4288, 3, 480, 240, 0, 4288, 4289, 3, 1360, 680, 0, 4289, 4320, 1, 0, 0, 0, 4290, 4291, 5, 138, 0, 0, 4291, 4292, 5, 353, 0, 0, 4292, 4293, 3, 524, 262, 0, 4293, 4294, 5, 133, 0, 0, 4294, 4295, 5, 450, 0, 0, 4295, 4296, 3, 480, 240, 0, 4296, 4297, 3, 1360, 680, 0, 4297, 4298, 5, 145, 0, 0, 4298, 4299, 3, 1360, 680, 0, 4299, 4320, 1, 0, 0, 0, 4300, 4301, 5, 138, 0, 0, 4301, 4302, 5, 353, 0, 0, 4302, 4303, 3, 524, 262, 0, 4303, 4304, 5, 133, 0, 0, 4304, 4305, 5, 450, 0, 0, 4305, 4306, 3, 480, 240, 0, 4306, 4307, 3, 1360, 680, 0, 4307, 4308, 5, 135, 0, 0, 4308, 4309, 3, 1360, 680, 0, 4309, 4320, 1, 0, 0, 0, 4310, 4311, 5, 138, 0, 0, 4311, 4312, 5, 353, 0, 0, 4312, 4313, 3, 524, 262, 0, 4313, 4314, 5, 302, 0, 0, 4314, 4315, 5, 450, 0, 0, 4315, 4316, 3, 1360, 680, 0, 4316, 4317, 5, 94, 0, 0, 4317, 4318, 3, 1360, 680, 0, 4318, 4320, 1, 0, 0, 0, 4319, 4282, 1, 0, 0, 0, 4319, 4290, 1, 0, 0, 0, 4319, 4300, 1, 0, 0, 0, 4319, 4310, 1, 0, 0, 0, 4320, 479, 1, 0, 0, 0, 4321, 4322, 5, 220, 0, 0, 4322, 4323, 5, 77, 0, 0, 4323, 4326, 5, 389, 0, 0, 4324, 4326, 1, 0, 0, 0, 4325, 4321, 1, 0, 0, 0, 4325, 4324, 1, 0, 0, 0, 4326, 481, 1, 0, 0, 0, 4327, 4328, 5, 46, 0, 0, 4328, 4329, 5, 271, 0, 0, 4329, 4330, 5, 156, 0, 0, 4330, 4331, 3, 524, 262, 0, 4331, 4332, 3, 488, 244, 0, 4332, 4333, 5, 62, 0, 0, 4333, 4334, 5, 353, 0, 0, 4334, 4335, 3, 1120, 560, 0, 4335, 4336, 5, 100, 0, 0, 4336, 4337, 3, 1342, 671, 0, 4337, 4338, 3, 490, 245, 0, 4338, 4339, 5, 36, 0, 0, 4339, 4340, 3, 484, 242, 0, 4340, 483, 1, 0, 0, 0, 4341, 4346, 3, 486, 243, 0, 4342, 4343, 5, 6, 0, 0, 4343, 4345, 3, 486, 243, 0, 4344, 4342, 1, 0, 0, 0, 4345, 4348, 1, 0, 0, 0, 4346, 4344, 1, 0, 0, 0, 4346, 4347, 1, 0, 0, 0, 4347, 485, 1, 0, 0, 0, 4348, 4346, 1, 0, 0, 0, 4349, 4350, 5, 271, 0, 0, 4350, 4351, 3, 1358, 679, 0, 4351, 4352, 3, 684, 342, 0, 4352, 4353, 3, 492, 246, 0, 4353, 4354, 3, 494, 247, 0, 4354, 4375, 1, 0, 0, 0, 4355, 4356, 5, 271, 0, 0, 4356, 4357, 3, 1358, 679, 0, 4357, 4358, 3, 688, 344, 0, 4358, 4359, 3, 492, 246, 0, 4359, 4360, 3, 494, 247, 0, 4360, 4375, 1, 0, 0, 0, 4361, 4362, 5, 211, 0, 0, 4362, 4363, 3, 1358, 679, 0, 4363, 4364, 3, 626, 313, 0, 4364, 4375, 1, 0, 0, 0, 4365, 4366, 5, 211, 0, 0, 4366, 4367, 3, 1358, 679, 0, 4367, 4368, 5, 2, 0, 0, 4368, 4369, 3, 1288, 644, 0, 4369, 4370, 5, 3, 0, 0, 4370, 4371, 3, 626, 313, 0, 4371, 4375, 1, 0, 0, 0, 4372, 4373, 5, 338, 0, 0, 4373, 4375, 3, 1120, 560, 0, 4374, 4349, 1, 0, 0, 0, 4374, 4355, 1, 0, 0, 0, 4374, 4361, 1, 0, 0, 0, 4374, 4365, 1, 0, 0, 0, 4374, 4372, 1, 0, 0, 0, 4375, 487, 1, 0, 0, 0, 4376, 4379, 5, 53, 0, 0, 4377, 4379, 1, 0, 0, 0, 4378, 4376, 1, 0, 0, 0, 4378, 4377, 1, 0, 0, 0, 4379, 489, 1, 0, 0, 0, 4380, 4381, 5, 206, 0, 0, 4381, 4384, 3, 524, 262, 0, 4382, 4384, 1, 0, 0, 0, 4383, 4380, 1, 0, 0, 0, 4383, 4382, 1, 0, 0, 0, 4384, 491, 1, 0, 0, 0, 4385, 4386, 5, 62, 0, 0, 4386, 4393, 5, 318, 0, 0, 4387, 4388, 5, 62, 0, 0, 4388, 4389, 5, 83, 0, 0, 4389, 4390, 5, 147, 0, 0, 4390, 4393, 3, 524, 262, 0, 4391, 4393, 1, 0, 0, 0, 4392, 4385, 1, 0, 0, 0, 4392, 4387, 1, 0, 0, 0, 4392, 4391, 1, 0, 0, 0, 4393, 493, 1, 0, 0, 0, 4394, 4397, 5, 295, 0, 0, 4395, 4397, 1, 0, 0, 0, 4396, 4394, 1, 0, 0, 0, 4396, 4395, 1, 0, 0, 0, 4397, 495, 1, 0, 0, 0, 4398, 4399, 5, 46, 0, 0, 4399, 4400, 5, 271, 0, 0, 4400, 4401, 5, 206, 0, 0, 4401, 4402, 3, 524, 262, 0, 4402, 4403, 5, 100, 0, 0, 4403, 4404, 3, 1342, 671, 0, 4404, 497, 1, 0, 0, 0, 4405, 4406, 5, 138, 0, 0, 4406, 4407, 5, 271, 0, 0, 4407, 4408, 5, 206, 0, 0, 4408, 4409, 3, 524, 262, 0, 4409, 4410, 5, 100, 0, 0, 4410, 4411, 3, 1342, 671, 0, 4411, 4412, 5, 133, 0, 0, 4412, 4413, 3, 484, 242, 0, 4413, 4424, 1, 0, 0, 0, 4414, 4415, 5, 138, 0, 0, 4415, 4416, 5, 271, 0, 0, 4416, 4417, 5, 206, 0, 0, 4417, 4418, 3, 524, 262, 0, 4418, 4419, 5, 100, 0, 0, 4419, 4420, 3, 1342, 671, 0, 4420, 4421, 5, 191, 0, 0, 4421, 4422, 3, 500, 250, 0, 4422, 4424, 1, 0, 0, 0, 4423, 4405, 1, 0, 0, 0, 4423, 4414, 1, 0, 0, 0, 4424, 499, 1, 0, 0, 0, 4425, 4430, 3, 502, 251, 0, 4426, 4427, 5, 6, 0, 0, 4427, 4429, 3, 502, 251, 0, 4428, 4426, 1, 0, 0, 0, 4429, 4432, 1, 0, 0, 0, 4430, 4428, 1, 0, 0, 0, 4430, 4431, 1, 0, 0, 0, 4431, 501, 1, 0, 0, 0, 4432, 4430, 1, 0, 0, 0, 4433, 4434, 5, 271, 0, 0, 4434, 4435, 3, 1358, 679, 0, 4435, 4436, 5, 2, 0, 0, 4436, 4437, 3, 1288, 644, 0, 4437, 4438, 5, 3, 0, 0, 4438, 4446, 1, 0, 0, 0, 4439, 4440, 5, 211, 0, 0, 4440, 4441, 3, 1358, 679, 0, 4441, 4442, 5, 2, 0, 0, 4442, 4443, 3, 1288, 644, 0, 4443, 4444, 5, 3, 0, 0, 4444, 4446, 1, 0, 0, 0, 4445, 4433, 1, 0, 0, 0, 4445, 4439, 1, 0, 0, 0, 4446, 503, 1, 0, 0, 0, 4447, 4448, 5, 191, 0, 0, 4448, 4449, 5, 271, 0, 0, 4449, 4450, 5, 156, 0, 0, 4450, 4451, 3, 524, 262, 0, 4451, 4452, 5, 100, 0, 0, 4452, 4453, 3, 1342, 671, 0, 4453, 4454, 3, 108, 54, 0, 4454, 4466, 1, 0, 0, 0, 4455, 4456, 5, 191, 0, 0, 4456, 4457, 5, 271, 0, 0, 4457, 4458, 5, 156, 0, 0, 4458, 4459, 5, 220, 0, 0, 4459, 4460, 5, 389, 0, 0, 4460, 4461, 3, 524, 262, 0, 4461, 4462, 5, 100, 0, 0, 4462, 4463, 3, 1342, 671, 0, 4463, 4464, 3, 108, 54, 0, 4464, 4466, 1, 0, 0, 0, 4465, 4447, 1, 0, 0, 0, 4465, 4455, 1, 0, 0, 0, 4466, 505, 1, 0, 0, 0, 4467, 4468, 5, 191, 0, 0, 4468, 4469, 5, 271, 0, 0, 4469, 4470, 5, 206, 0, 0, 4470, 4471, 3, 524, 262, 0, 4471, 4472, 5, 100, 0, 0, 4472, 4473, 3, 1342, 671, 0, 4473, 4474, 3, 108, 54, 0, 4474, 4486, 1, 0, 0, 0, 4475, 4476, 5, 191, 0, 0, 4476, 4477, 5, 271, 0, 0, 4477, 4478, 5, 206, 0, 0, 4478, 4479, 5, 220, 0, 0, 4479, 4480, 5, 389, 0, 0, 4480, 4481, 3, 524, 262, 0, 4481, 4482, 5, 100, 0, 0, 4482, 4483, 3, 1342, 671, 0, 4483, 4484, 3, 108, 54, 0, 4484, 4486, 1, 0, 0, 0, 4485, 4467, 1, 0, 0, 0, 4485, 4475, 1, 0, 0, 0, 4486, 507, 1, 0, 0, 0, 4487, 4488, 5, 191, 0, 0, 4488, 4489, 5, 274, 0, 0, 4489, 4490, 5, 147, 0, 0, 4490, 4491, 3, 1372, 686, 0, 4491, 4492, 3, 108, 54, 0, 4492, 509, 1, 0, 0, 0, 4493, 4494, 5, 294, 0, 0, 4494, 4495, 5, 274, 0, 0, 4495, 4496, 5, 147, 0, 0, 4496, 4497, 3, 1372, 686, 0, 4497, 4498, 5, 94, 0, 0, 4498, 4499, 3, 1370, 685, 0, 4499, 511, 1, 0, 0, 0, 4500, 4501, 5, 191, 0, 0, 4501, 4502, 3, 514, 257, 0, 4502, 4503, 5, 220, 0, 0, 4503, 4504, 5, 389, 0, 0, 4504, 4505, 3, 522, 261, 0, 4505, 4506, 3, 108, 54, 0, 4506, 4579, 1, 0, 0, 0, 4507, 4508, 5, 191, 0, 0, 4508, 4509, 3, 514, 257, 0, 4509, 4510, 3, 522, 261, 0, 4510, 4511, 3, 108, 54, 0, 4511, 4579, 1, 0, 0, 0, 4512, 4513, 5, 191, 0, 0, 4513, 4514, 3, 518, 259, 0, 4514, 4515, 5, 220, 0, 0, 4515, 4516, 5, 389, 0, 0, 4516, 4517, 3, 1340, 670, 0, 4517, 4518, 3, 108, 54, 0, 4518, 4579, 1, 0, 0, 0, 4519, 4520, 5, 191, 0, 0, 4520, 4521, 3, 518, 259, 0, 4521, 4522, 3, 1340, 670, 0, 4522, 4523, 3, 108, 54, 0, 4523, 4579, 1, 0, 0, 0, 4524, 4525, 5, 191, 0, 0, 4525, 4526, 3, 520, 260, 0, 4526, 4527, 3, 1342, 671, 0, 4527, 4528, 5, 80, 0, 0, 4528, 4529, 3, 524, 262, 0, 4529, 4530, 3, 108, 54, 0, 4530, 4579, 1, 0, 0, 0, 4531, 4532, 5, 191, 0, 0, 4532, 4533, 3, 520, 260, 0, 4533, 4534, 5, 220, 0, 0, 4534, 4535, 5, 389, 0, 0, 4535, 4536, 3, 1342, 671, 0, 4536, 4537, 5, 80, 0, 0, 4537, 4538, 3, 524, 262, 0, 4538, 4539, 3, 108, 54, 0, 4539, 4579, 1, 0, 0, 0, 4540, 4541, 5, 191, 0, 0, 4541, 4542, 5, 353, 0, 0, 4542, 4543, 3, 528, 264, 0, 4543, 4544, 3, 108, 54, 0, 4544, 4579, 1, 0, 0, 0, 4545, 4546, 5, 191, 0, 0, 4546, 4547, 5, 353, 0, 0, 4547, 4548, 5, 220, 0, 0, 4548, 4549, 5, 389, 0, 0, 4549, 4550, 3, 528, 264, 0, 4550, 4551, 3, 108, 54, 0, 4551, 4579, 1, 0, 0, 0, 4552, 4553, 5, 191, 0, 0, 4553, 4554, 5, 189, 0, 0, 4554, 4555, 3, 528, 264, 0, 4555, 4556, 3, 108, 54, 0, 4556, 4579, 1, 0, 0, 0, 4557, 4558, 5, 191, 0, 0, 4558, 4559, 5, 189, 0, 0, 4559, 4560, 5, 220, 0, 0, 4560, 4561, 5, 389, 0, 0, 4561, 4562, 3, 528, 264, 0, 4562, 4563, 3, 108, 54, 0, 4563, 4579, 1, 0, 0, 0, 4564, 4565, 5, 191, 0, 0, 4565, 4566, 5, 226, 0, 0, 4566, 4567, 5, 109, 0, 0, 4567, 4568, 3, 522, 261, 0, 4568, 4569, 3, 108, 54, 0, 4569, 4579, 1, 0, 0, 0, 4570, 4571, 5, 191, 0, 0, 4571, 4572, 5, 226, 0, 0, 4572, 4573, 5, 109, 0, 0, 4573, 4574, 5, 220, 0, 0, 4574, 4575, 5, 389, 0, 0, 4575, 4576, 3, 522, 261, 0, 4576, 4577, 3, 108, 54, 0, 4577, 4579, 1, 0, 0, 0, 4578, 4500, 1, 0, 0, 0, 4578, 4507, 1, 0, 0, 0, 4578, 4512, 1, 0, 0, 0, 4578, 4519, 1, 0, 0, 0, 4578, 4524, 1, 0, 0, 0, 4578, 4531, 1, 0, 0, 0, 4578, 4540, 1, 0, 0, 0, 4578, 4545, 1, 0, 0, 0, 4578, 4552, 1, 0, 0, 0, 4578, 4557, 1, 0, 0, 0, 4578, 4564, 1, 0, 0, 0, 4578, 4570, 1, 0, 0, 0, 4579, 513, 1, 0, 0, 0, 4580, 4604, 5, 92, 0, 0, 4581, 4604, 5, 321, 0, 0, 4582, 4604, 5, 369, 0, 0, 4583, 4584, 5, 251, 0, 0, 4584, 4604, 5, 369, 0, 0, 4585, 4604, 5, 226, 0, 0, 4586, 4587, 5, 63, 0, 0, 4587, 4604, 5, 92, 0, 0, 4588, 4604, 5, 108, 0, 0, 4589, 4604, 5, 168, 0, 0, 4590, 4604, 5, 335, 0, 0, 4591, 4592, 5, 348, 0, 0, 4592, 4593, 5, 318, 0, 0, 4593, 4604, 5, 276, 0, 0, 4594, 4595, 5, 348, 0, 0, 4595, 4596, 5, 318, 0, 0, 4596, 4604, 5, 185, 0, 0, 4597, 4598, 5, 348, 0, 0, 4598, 4599, 5, 318, 0, 0, 4599, 4604, 5, 346, 0, 0, 4600, 4601, 5, 348, 0, 0, 4601, 4602, 5, 318, 0, 0, 4602, 4604, 5, 163, 0, 0, 4603, 4580, 1, 0, 0, 0, 4603, 4581, 1, 0, 0, 0, 4603, 4582, 1, 0, 0, 0, 4603, 4583, 1, 0, 0, 0, 4603, 4585, 1, 0, 0, 0, 4603, 4586, 1, 0, 0, 0, 4603, 4588, 1, 0, 0, 0, 4603, 4589, 1, 0, 0, 0, 4603, 4590, 1, 0, 0, 0, 4603, 4591, 1, 0, 0, 0, 4603, 4594, 1, 0, 0, 0, 4603, 4597, 1, 0, 0, 0, 4603, 4600, 1, 0, 0, 0, 4604, 515, 1, 0, 0, 0, 4605, 4611, 3, 518, 259, 0, 4606, 4611, 5, 175, 0, 0, 4607, 4611, 5, 311, 0, 0, 4608, 4611, 5, 451, 0, 0, 4609, 4611, 5, 344, 0, 0, 4610, 4605, 1, 0, 0, 0, 4610, 4606, 1, 0, 0, 0, 4610, 4607, 1, 0, 0, 0, 4610, 4608, 1, 0, 0, 0, 4610, 4609, 1, 0, 0, 0, 4611, 517, 1, 0, 0, 0, 4612, 4613, 5, 131, 0, 0, 4613, 4627, 5, 446, 0, 0, 4614, 4615, 5, 198, 0, 0, 4615, 4627, 5, 350, 0, 0, 4616, 4627, 5, 204, 0, 0, 4617, 4618, 5, 63, 0, 0, 4618, 4619, 5, 174, 0, 0, 4619, 4627, 5, 374, 0, 0, 4620, 4621, 3, 308, 154, 0, 4621, 4622, 5, 238, 0, 0, 4622, 4627, 1, 0, 0, 0, 4623, 4627, 5, 452, 0, 0, 4624, 4627, 5, 316, 0, 0, 4625, 4627, 5, 324, 0, 0, 4626, 4612, 1, 0, 0, 0, 4626, 4614, 1, 0, 0, 0, 4626, 4616, 1, 0, 0, 0, 4626, 4617, 1, 0, 0, 0, 4626, 4620, 1, 0, 0, 0, 4626, 4623, 1, 0, 0, 0, 4626, 4624, 1, 0, 0, 0, 4626, 4625, 1, 0, 0, 0, 4627, 519, 1, 0, 0, 0, 4628, 4629, 7, 23, 0, 0, 4629, 521, 1, 0, 0, 0, 4630, 4635, 3, 524, 262, 0, 4631, 4632, 5, 6, 0, 0, 4632, 4634, 3, 524, 262, 0, 4633, 4631, 1, 0, 0, 0, 4634, 4637, 1, 0, 0, 0, 4635, 4633, 1, 0, 0, 0, 4635, 4636, 1, 0, 0, 0, 4636, 523, 1, 0, 0, 0, 4637, 4635, 1, 0, 0, 0, 4638, 4640, 3, 1374, 687, 0, 4639, 4641, 3, 526, 263, 0, 4640, 4639, 1, 0, 0, 0, 4640, 4641, 1, 0, 0, 0, 4641, 525, 1, 0, 0, 0, 4642, 4643, 5, 11, 0, 0, 4643, 4645, 3, 1344, 672, 0, 4644, 4642, 1, 0, 0, 0, 4645, 4646, 1, 0, 0, 0, 4646, 4644, 1, 0, 0, 0, 4646, 4647, 1, 0, 0, 0, 4647, 527, 1, 0, 0, 0, 4648, 4653, 3, 1120, 560, 0, 4649, 4650, 5, 6, 0, 0, 4650, 4652, 3, 1120, 560, 0, 4651, 4649, 1, 0, 0, 0, 4652, 4655, 1, 0, 0, 0, 4653, 4651, 1, 0, 0, 0, 4653, 4654, 1, 0, 0, 0, 4654, 529, 1, 0, 0, 0, 4655, 4653, 1, 0, 0, 0, 4656, 4657, 5, 351, 0, 0, 4657, 4658, 3, 990, 495, 0, 4658, 4659, 3, 1078, 539, 0, 4659, 4660, 3, 532, 266, 0, 4660, 4661, 3, 108, 54, 0, 4661, 531, 1, 0, 0, 0, 4662, 4663, 5, 167, 0, 0, 4663, 4668, 5, 219, 0, 0, 4664, 4665, 5, 307, 0, 0, 4665, 4668, 5, 219, 0, 0, 4666, 4668, 1, 0, 0, 0, 4667, 4662, 1, 0, 0, 0, 4667, 4664, 1, 0, 0, 0, 4667, 4666, 1, 0, 0, 0, 4668, 533, 1, 0, 0, 0, 4669, 4670, 5, 159, 0, 0, 4670, 4671, 5, 80, 0, 0, 4671, 4672, 3, 514, 257, 0, 4672, 4673, 3, 524, 262, 0, 4673, 4674, 5, 116, 0, 0, 4674, 4675, 3, 536, 268, 0, 4675, 4817, 1, 0, 0, 0, 4676, 4677, 5, 159, 0, 0, 4677, 4678, 5, 80, 0, 0, 4678, 4679, 5, 44, 0, 0, 4679, 4680, 3, 524, 262, 0, 4680, 4681, 5, 116, 0, 0, 4681, 4682, 3, 536, 268, 0, 4682, 4817, 1, 0, 0, 0, 4683, 4684, 5, 159, 0, 0, 4684, 4685, 5, 80, 0, 0, 4685, 4686, 3, 516, 258, 0, 4686, 4687, 3, 1342, 671, 0, 4687, 4688, 5, 116, 0, 0, 4688, 4689, 3, 536, 268, 0, 4689, 4817, 1, 0, 0, 0, 4690, 4691, 5, 159, 0, 0, 4691, 4692, 5, 80, 0, 0, 4692, 4693, 5, 353, 0, 0, 4693, 4694, 3, 1120, 560, 0, 4694, 4695, 5, 116, 0, 0, 4695, 4696, 3, 536, 268, 0, 4696, 4817, 1, 0, 0, 0, 4697, 4698, 5, 159, 0, 0, 4698, 4699, 5, 80, 0, 0, 4699, 4700, 5, 189, 0, 0, 4700, 4701, 3, 1120, 560, 0, 4701, 4702, 5, 116, 0, 0, 4702, 4703, 3, 536, 268, 0, 4703, 4817, 1, 0, 0, 0, 4704, 4705, 5, 159, 0, 0, 4705, 4706, 5, 80, 0, 0, 4706, 4707, 5, 136, 0, 0, 4707, 4708, 3, 650, 325, 0, 4708, 4709, 5, 116, 0, 0, 4709, 4710, 3, 536, 268, 0, 4710, 4817, 1, 0, 0, 0, 4711, 4712, 5, 159, 0, 0, 4712, 4713, 5, 80, 0, 0, 4713, 4714, 5, 211, 0, 0, 4714, 4715, 3, 626, 313, 0, 4715, 4716, 5, 116, 0, 0, 4716, 4717, 3, 536, 268, 0, 4717, 4817, 1, 0, 0, 0, 4718, 4719, 5, 159, 0, 0, 4719, 4720, 5, 80, 0, 0, 4720, 4721, 5, 271, 0, 0, 4721, 4722, 3, 688, 344, 0, 4722, 4723, 5, 116, 0, 0, 4723, 4724, 3, 536, 268, 0, 4724, 4817, 1, 0, 0, 0, 4725, 4726, 5, 159, 0, 0, 4726, 4727, 5, 80, 0, 0, 4727, 4728, 5, 45, 0, 0, 4728, 4729, 3, 1342, 671, 0, 4729, 4730, 5, 80, 0, 0, 4730, 4731, 3, 524, 262, 0, 4731, 4732, 5, 116, 0, 0, 4732, 4733, 3, 536, 268, 0, 4733, 4817, 1, 0, 0, 0, 4734, 4735, 5, 159, 0, 0, 4735, 4736, 5, 80, 0, 0, 4736, 4737, 5, 45, 0, 0, 4737, 4738, 3, 1342, 671, 0, 4738, 4739, 5, 80, 0, 0, 4739, 4740, 5, 189, 0, 0, 4740, 4741, 3, 524, 262, 0, 4741, 4742, 5, 116, 0, 0, 4742, 4743, 3, 536, 268, 0, 4743, 4817, 1, 0, 0, 0, 4744, 4745, 5, 159, 0, 0, 4745, 4746, 5, 80, 0, 0, 4746, 4747, 3, 520, 260, 0, 4747, 4748, 3, 1342, 671, 0, 4748, 4749, 5, 80, 0, 0, 4749, 4750, 3, 524, 262, 0, 4750, 4751, 5, 116, 0, 0, 4751, 4752, 3, 536, 268, 0, 4752, 4817, 1, 0, 0, 0, 4753, 4754, 5, 159, 0, 0, 4754, 4755, 5, 80, 0, 0, 4755, 4756, 5, 289, 0, 0, 4756, 4757, 3, 626, 313, 0, 4757, 4758, 5, 116, 0, 0, 4758, 4759, 3, 536, 268, 0, 4759, 4817, 1, 0, 0, 0, 4760, 4761, 5, 159, 0, 0, 4761, 4762, 5, 80, 0, 0, 4762, 4763, 5, 442, 0, 0, 4763, 4764, 3, 626, 313, 0, 4764, 4765, 5, 116, 0, 0, 4765, 4766, 3, 536, 268, 0, 4766, 4817, 1, 0, 0, 0, 4767, 4768, 5, 159, 0, 0, 4768, 4769, 5, 80, 0, 0, 4769, 4770, 5, 443, 0, 0, 4770, 4771, 5, 62, 0, 0, 4771, 4772, 3, 1120, 560, 0, 4772, 4773, 5, 238, 0, 0, 4773, 4774, 3, 1342, 671, 0, 4774, 4775, 5, 116, 0, 0, 4775, 4776, 3, 536, 268, 0, 4776, 4817, 1, 0, 0, 0, 4777, 4778, 5, 159, 0, 0, 4778, 4779, 5, 80, 0, 0, 4779, 4780, 5, 271, 0, 0, 4780, 4781, 5, 156, 0, 0, 4781, 4782, 3, 524, 262, 0, 4782, 4783, 5, 100, 0, 0, 4783, 4784, 3, 1342, 671, 0, 4784, 4785, 5, 116, 0, 0, 4785, 4786, 3, 536, 268, 0, 4786, 4817, 1, 0, 0, 0, 4787, 4788, 5, 159, 0, 0, 4788, 4789, 5, 80, 0, 0, 4789, 4790, 5, 271, 0, 0, 4790, 4791, 5, 206, 0, 0, 4791, 4792, 3, 524, 262, 0, 4792, 4793, 5, 100, 0, 0, 4793, 4794, 3, 1342, 671, 0, 4794, 4795, 5, 116, 0, 0, 4795, 4796, 3, 536, 268, 0, 4796, 4817, 1, 0, 0, 0, 4797, 4798, 5, 159, 0, 0, 4798, 4799, 5, 80, 0, 0, 4799, 4800, 5, 239, 0, 0, 4800, 4801, 5, 267, 0, 0, 4801, 4802, 3, 292, 146, 0, 4802, 4803, 5, 116, 0, 0, 4803, 4804, 3, 536, 268, 0, 4804, 4817, 1, 0, 0, 0, 4805, 4806, 5, 159, 0, 0, 4806, 4807, 5, 80, 0, 0, 4807, 4808, 5, 41, 0, 0, 4808, 4809, 5, 2, 0, 0, 4809, 4810, 3, 1120, 560, 0, 4810, 4811, 5, 36, 0, 0, 4811, 4812, 3, 1120, 560, 0, 4812, 4813, 5, 3, 0, 0, 4813, 4814, 5, 116, 0, 0, 4814, 4815, 3, 536, 268, 0, 4815, 4817, 1, 0, 0, 0, 4816, 4669, 1, 0, 0, 0, 4816, 4676, 1, 0, 0, 0, 4816, 4683, 1, 0, 0, 0, 4816, 4690, 1, 0, 0, 0, 4816, 4697, 1, 0, 0, 0, 4816, 4704, 1, 0, 0, 0, 4816, 4711, 1, 0, 0, 0, 4816, 4718, 1, 0, 0, 0, 4816, 4725, 1, 0, 0, 0, 4816, 4734, 1, 0, 0, 0, 4816, 4744, 1, 0, 0, 0, 4816, 4753, 1, 0, 0, 0, 4816, 4760, 1, 0, 0, 0, 4816, 4767, 1, 0, 0, 0, 4816, 4777, 1, 0, 0, 0, 4816, 4787, 1, 0, 0, 0, 4816, 4797, 1, 0, 0, 0, 4816, 4805, 1, 0, 0, 0, 4817, 535, 1, 0, 0, 0, 4818, 4821, 3, 1360, 680, 0, 4819, 4821, 5, 78, 0, 0, 4820, 4818, 1, 0, 0, 0, 4820, 4819, 1, 0, 0, 0, 4821, 537, 1, 0, 0, 0, 4822, 4823, 5, 320, 0, 0, 4823, 4824, 5, 237, 0, 0, 4824, 4825, 3, 540, 270, 0, 4825, 4826, 5, 80, 0, 0, 4826, 4827, 3, 514, 257, 0, 4827, 4828, 3, 524, 262, 0, 4828, 4829, 5, 116, 0, 0, 4829, 4830, 3, 542, 271, 0, 4830, 4914, 1, 0, 0, 0, 4831, 4832, 5, 320, 0, 0, 4832, 4833, 5, 237, 0, 0, 4833, 4834, 3, 540, 270, 0, 4834, 4835, 5, 80, 0, 0, 4835, 4836, 5, 44, 0, 0, 4836, 4837, 3, 524, 262, 0, 4837, 4838, 5, 116, 0, 0, 4838, 4839, 3, 542, 271, 0, 4839, 4914, 1, 0, 0, 0, 4840, 4841, 5, 320, 0, 0, 4841, 4842, 5, 237, 0, 0, 4842, 4843, 3, 540, 270, 0, 4843, 4844, 5, 80, 0, 0, 4844, 4845, 3, 516, 258, 0, 4845, 4846, 3, 1342, 671, 0, 4846, 4847, 5, 116, 0, 0, 4847, 4848, 3, 542, 271, 0, 4848, 4914, 1, 0, 0, 0, 4849, 4850, 5, 320, 0, 0, 4850, 4851, 5, 237, 0, 0, 4851, 4852, 3, 540, 270, 0, 4852, 4853, 5, 80, 0, 0, 4853, 4854, 5, 353, 0, 0, 4854, 4855, 3, 1120, 560, 0, 4855, 4856, 5, 116, 0, 0, 4856, 4857, 3, 542, 271, 0, 4857, 4914, 1, 0, 0, 0, 4858, 4859, 5, 320, 0, 0, 4859, 4860, 5, 237, 0, 0, 4860, 4861, 3, 540, 270, 0, 4861, 4862, 5, 80, 0, 0, 4862, 4863, 5, 189, 0, 0, 4863, 4864, 3, 1120, 560, 0, 4864, 4865, 5, 116, 0, 0, 4865, 4866, 3, 542, 271, 0, 4866, 4914, 1, 0, 0, 0, 4867, 4868, 5, 320, 0, 0, 4868, 4869, 5, 237, 0, 0, 4869, 4870, 3, 540, 270, 0, 4870, 4871, 5, 80, 0, 0, 4871, 4872, 5, 136, 0, 0, 4872, 4873, 3, 650, 325, 0, 4873, 4874, 5, 116, 0, 0, 4874, 4875, 3, 542, 271, 0, 4875, 4914, 1, 0, 0, 0, 4876, 4877, 5, 320, 0, 0, 4877, 4878, 5, 237, 0, 0, 4878, 4879, 3, 540, 270, 0, 4879, 4880, 5, 80, 0, 0, 4880, 4881, 5, 211, 0, 0, 4881, 4882, 3, 626, 313, 0, 4882, 4883, 5, 116, 0, 0, 4883, 4884, 3, 542, 271, 0, 4884, 4914, 1, 0, 0, 0, 4885, 4886, 5, 320, 0, 0, 4886, 4887, 5, 237, 0, 0, 4887, 4888, 3, 540, 270, 0, 4888, 4889, 5, 80, 0, 0, 4889, 4890, 5, 239, 0, 0, 4890, 4891, 5, 267, 0, 0, 4891, 4892, 3, 292, 146, 0, 4892, 4893, 5, 116, 0, 0, 4893, 4894, 3, 542, 271, 0, 4894, 4914, 1, 0, 0, 0, 4895, 4896, 5, 320, 0, 0, 4896, 4897, 5, 237, 0, 0, 4897, 4898, 3, 540, 270, 0, 4898, 4899, 5, 80, 0, 0, 4899, 4900, 5, 289, 0, 0, 4900, 4901, 3, 626, 313, 0, 4901, 4902, 5, 116, 0, 0, 4902, 4903, 3, 542, 271, 0, 4903, 4914, 1, 0, 0, 0, 4904, 4905, 5, 320, 0, 0, 4905, 4906, 5, 237, 0, 0, 4906, 4907, 3, 540, 270, 0, 4907, 4908, 5, 80, 0, 0, 4908, 4909, 5, 442, 0, 0, 4909, 4910, 3, 626, 313, 0, 4910, 4911, 5, 116, 0, 0, 4911, 4912, 3, 542, 271, 0, 4912, 4914, 1, 0, 0, 0, 4913, 4822, 1, 0, 0, 0, 4913, 4831, 1, 0, 0, 0, 4913, 4840, 1, 0, 0, 0, 4913, 4849, 1, 0, 0, 0, 4913, 4858, 1, 0, 0, 0, 4913, 4867, 1, 0, 0, 0, 4913, 4876, 1, 0, 0, 0, 4913, 4885, 1, 0, 0, 0, 4913, 4895, 1, 0, 0, 0, 4913, 4904, 1, 0, 0, 0, 4914, 539, 1, 0, 0, 0, 4915, 4916, 5, 62, 0, 0, 4916, 4919, 3, 72, 36, 0, 4917, 4919, 1, 0, 0, 0, 4918, 4915, 1, 0, 0, 0, 4918, 4917, 1, 0, 0, 0, 4919, 541, 1, 0, 0, 0, 4920, 4923, 3, 1360, 680, 0, 4921, 4923, 5, 78, 0, 0, 4922, 4920, 1, 0, 0, 0, 4922, 4921, 1, 0, 0, 0, 4923, 543, 1, 0, 0, 0, 4924, 4925, 5, 61, 0, 0, 4925, 4929, 3, 546, 273, 0, 4926, 4927, 5, 258, 0, 0, 4927, 4929, 3, 546, 273, 0, 4928, 4924, 1, 0, 0, 0, 4928, 4926, 1, 0, 0, 0, 4929, 545, 1, 0, 0, 0, 4930, 4997, 3, 954, 477, 0, 4931, 4932, 3, 548, 274, 0, 4932, 4933, 3, 954, 477, 0, 4933, 4997, 1, 0, 0, 0, 4934, 4935, 5, 261, 0, 0, 4935, 4936, 3, 550, 275, 0, 4936, 4937, 3, 954, 477, 0, 4937, 4997, 1, 0, 0, 0, 4938, 4939, 5, 286, 0, 0, 4939, 4940, 3, 550, 275, 0, 4940, 4941, 3, 954, 477, 0, 4941, 4997, 1, 0, 0, 0, 4942, 4943, 5, 207, 0, 0, 4943, 4944, 3, 550, 275, 0, 4944, 4945, 3, 954, 477, 0, 4945, 4997, 1, 0, 0, 0, 4946, 4947, 5, 240, 0, 0, 4947, 4948, 3, 550, 275, 0, 4948, 4949, 3, 954, 477, 0, 4949, 4997, 1, 0, 0, 0, 4950, 4951, 5, 130, 0, 0, 4951, 4952, 3, 1366, 683, 0, 4952, 4953, 3, 550, 275, 0, 4953, 4954, 3, 954, 477, 0, 4954, 4997, 1, 0, 0, 0, 4955, 4956, 5, 300, 0, 0, 4956, 4957, 3, 1366, 683, 0, 4957, 4958, 3, 550, 275, 0, 4958, 4959, 3, 954, 477, 0, 4959, 4997, 1, 0, 0, 0, 4960, 4961, 3, 1366, 683, 0, 4961, 4962, 3, 550, 275, 0, 4962, 4963, 3, 954, 477, 0, 4963, 4997, 1, 0, 0, 0, 4964, 4965, 5, 30, 0, 0, 4965, 4966, 3, 550, 275, 0, 4966, 4967, 3, 954, 477, 0, 4967, 4997, 1, 0, 0, 0, 4968, 4969, 5, 210, 0, 0, 4969, 4970, 3, 550, 275, 0, 4970, 4971, 3, 954, 477, 0, 4971, 4997, 1, 0, 0, 0, 4972, 4973, 5, 210, 0, 0, 4973, 4974, 3, 1366, 683, 0, 4974, 4975, 3, 550, 275, 0, 4975, 4976, 3, 954, 477, 0, 4976, 4997, 1, 0, 0, 0, 4977, 4978, 5, 210, 0, 0, 4978, 4979, 5, 30, 0, 0, 4979, 4980, 3, 550, 275, 0, 4980, 4981, 3, 954, 477, 0, 4981, 4997, 1, 0, 0, 0, 4982, 4983, 5, 144, 0, 0, 4983, 4984, 3, 550, 275, 0, 4984, 4985, 3, 954, 477, 0, 4985, 4997, 1, 0, 0, 0, 4986, 4987, 5, 144, 0, 0, 4987, 4988, 3, 1366, 683, 0, 4988, 4989, 3, 550, 275, 0, 4989, 4990, 3, 954, 477, 0, 4990, 4997, 1, 0, 0, 0, 4991, 4992, 5, 144, 0, 0, 4992, 4993, 5, 30, 0, 0, 4993, 4994, 3, 550, 275, 0, 4994, 4995, 3, 954, 477, 0, 4995, 4997, 1, 0, 0, 0, 4996, 4930, 1, 0, 0, 0, 4996, 4931, 1, 0, 0, 0, 4996, 4934, 1, 0, 0, 0, 4996, 4938, 1, 0, 0, 0, 4996, 4942, 1, 0, 0, 0, 4996, 4946, 1, 0, 0, 0, 4996, 4950, 1, 0, 0, 0, 4996, 4955, 1, 0, 0, 0, 4996, 4960, 1, 0, 0, 0, 4996, 4964, 1, 0, 0, 0, 4996, 4968, 1, 0, 0, 0, 4996, 4972, 1, 0, 0, 0, 4996, 4977, 1, 0, 0, 0, 4996, 4982, 1, 0, 0, 0, 4996, 4986, 1, 0, 0, 0, 4996, 4991, 1, 0, 0, 0, 4997, 547, 1, 0, 0, 0, 4998, 4999, 7, 24, 0, 0, 4999, 549, 1, 0, 0, 0, 5000, 5003, 3, 548, 274, 0, 5001, 5003, 1, 0, 0, 0, 5002, 5000, 1, 0, 0, 0, 5002, 5001, 1, 0, 0, 0, 5003, 551, 1, 0, 0, 0, 5004, 5005, 5, 65, 0, 0, 5005, 5006, 3, 556, 278, 0, 5006, 5007, 5, 80, 0, 0, 5007, 5008, 3, 562, 281, 0, 5008, 5009, 5, 94, 0, 0, 5009, 5010, 3, 564, 282, 0, 5010, 5011, 3, 568, 284, 0, 5011, 553, 1, 0, 0, 0, 5012, 5013, 5, 310, 0, 0, 5013, 5014, 3, 556, 278, 0, 5014, 5015, 5, 80, 0, 0, 5015, 5016, 3, 562, 281, 0, 5016, 5017, 5, 64, 0, 0, 5017, 5018, 3, 564, 282, 0, 5018, 5019, 3, 108, 54, 0, 5019, 5032, 1, 0, 0, 0, 5020, 5021, 5, 310, 0, 0, 5021, 5022, 5, 65, 0, 0, 5022, 5023, 5, 272, 0, 0, 5023, 5024, 5, 62, 0, 0, 5024, 5025, 3, 556, 278, 0, 5025, 5026, 5, 80, 0, 0, 5026, 5027, 3, 562, 281, 0, 5027, 5028, 5, 64, 0, 0, 5028, 5029, 3, 564, 282, 0, 5029, 5030, 3, 108, 54, 0, 5030, 5032, 1, 0, 0, 0, 5031, 5012, 1, 0, 0, 0, 5031, 5020, 1, 0, 0, 0, 5032, 555, 1, 0, 0, 0, 5033, 5049, 3, 558, 279, 0, 5034, 5049, 5, 30, 0, 0, 5035, 5036, 5, 30, 0, 0, 5036, 5049, 5, 287, 0, 0, 5037, 5038, 5, 30, 0, 0, 5038, 5039, 5, 2, 0, 0, 5039, 5040, 3, 216, 108, 0, 5040, 5041, 5, 3, 0, 0, 5041, 5049, 1, 0, 0, 0, 5042, 5043, 5, 30, 0, 0, 5043, 5044, 5, 287, 0, 0, 5044, 5045, 5, 2, 0, 0, 5045, 5046, 3, 216, 108, 0, 5046, 5047, 5, 3, 0, 0, 5047, 5049, 1, 0, 0, 0, 5048, 5033, 1, 0, 0, 0, 5048, 5034, 1, 0, 0, 0, 5048, 5035, 1, 0, 0, 0, 5048, 5037, 1, 0, 0, 0, 5048, 5042, 1, 0, 0, 0, 5049, 557, 1, 0, 0, 0, 5050, 5055, 3, 560, 280, 0, 5051, 5052, 5, 6, 0, 0, 5052, 5054, 3, 560, 280, 0, 5053, 5051, 1, 0, 0, 0, 5054, 5057, 1, 0, 0, 0, 5055, 5053, 1, 0, 0, 0, 5055, 5056, 1, 0, 0, 0, 5056, 559, 1, 0, 0, 0, 5057, 5055, 1, 0, 0, 0, 5058, 5059, 5, 88, 0, 0, 5059, 5068, 3, 214, 107, 0, 5060, 5061, 5, 86, 0, 0, 5061, 5068, 3, 214, 107, 0, 5062, 5063, 5, 46, 0, 0, 5063, 5068, 3, 214, 107, 0, 5064, 5065, 3, 1374, 687, 0, 5065, 5066, 3, 214, 107, 0, 5066, 5068, 1, 0, 0, 0, 5067, 5058, 1, 0, 0, 0, 5067, 5060, 1, 0, 0, 0, 5067, 5062, 1, 0, 0, 0, 5067, 5064, 1, 0, 0, 0, 5068, 561, 1, 0, 0, 0, 5069, 5128, 3, 1336, 668, 0, 5070, 5071, 5, 92, 0, 0, 5071, 5128, 3, 1336, 668, 0, 5072, 5073, 5, 321, 0, 0, 5073, 5128, 3, 1336, 668, 0, 5074, 5075, 5, 63, 0, 0, 5075, 5076, 5, 174, 0, 0, 5076, 5077, 5, 374, 0, 0, 5077, 5128, 3, 1340, 670, 0, 5078, 5079, 5, 63, 0, 0, 5079, 5080, 5, 324, 0, 0, 5080, 5128, 3, 1340, 670, 0, 5081, 5082, 5, 211, 0, 0, 5082, 5128, 3, 624, 312, 0, 5083, 5084, 5, 289, 0, 0, 5084, 5128, 3, 624, 312, 0, 5085, 5086, 5, 442, 0, 0, 5086, 5128, 3, 624, 312, 0, 5087, 5088, 5, 175, 0, 0, 5088, 5128, 3, 1340, 670, 0, 5089, 5090, 5, 189, 0, 0, 5090, 5128, 3, 522, 261, 0, 5091, 5092, 5, 238, 0, 0, 5092, 5128, 3, 1340, 670, 0, 5093, 5094, 5, 239, 0, 0, 5094, 5095, 5, 267, 0, 0, 5095, 5128, 3, 294, 147, 0, 5096, 5097, 5, 316, 0, 0, 5097, 5128, 3, 1340, 670, 0, 5098, 5099, 5, 344, 0, 0, 5099, 5128, 3, 1340, 670, 0, 5100, 5101, 5, 353, 0, 0, 5101, 5128, 3, 522, 261, 0, 5102, 5103, 5, 30, 0, 0, 5103, 5104, 5, 343, 0, 0, 5104, 5105, 5, 68, 0, 0, 5105, 5106, 5, 316, 0, 0, 5106, 5128, 3, 1340, 670, 0, 5107, 5108, 5, 30, 0, 0, 5108, 5109, 5, 322, 0, 0, 5109, 5110, 5, 68, 0, 0, 5110, 5111, 5, 316, 0, 0, 5111, 5128, 3, 1340, 670, 0, 5112, 5113, 5, 30, 0, 0, 5113, 5114, 5, 212, 0, 0, 5114, 5115, 5, 68, 0, 0, 5115, 5116, 5, 316, 0, 0, 5116, 5128, 3, 1340, 670, 0, 5117, 5118, 5, 30, 0, 0, 5118, 5119, 5, 457, 0, 0, 5119, 5120, 5, 68, 0, 0, 5120, 5121, 5, 316, 0, 0, 5121, 5128, 3, 1340, 670, 0, 5122, 5123, 5, 30, 0, 0, 5123, 5124, 5, 455, 0, 0, 5124, 5125, 5, 68, 0, 0, 5125, 5126, 5, 316, 0, 0, 5126, 5128, 3, 1340, 670, 0, 5127, 5069, 1, 0, 0, 0, 5127, 5070, 1, 0, 0, 0, 5127, 5072, 1, 0, 0, 0, 5127, 5074, 1, 0, 0, 0, 5127, 5078, 1, 0, 0, 0, 5127, 5081, 1, 0, 0, 0, 5127, 5083, 1, 0, 0, 0, 5127, 5085, 1, 0, 0, 0, 5127, 5087, 1, 0, 0, 0, 5127, 5089, 1, 0, 0, 0, 5127, 5091, 1, 0, 0, 0, 5127, 5093, 1, 0, 0, 0, 5127, 5096, 1, 0, 0, 0, 5127, 5098, 1, 0, 0, 0, 5127, 5100, 1, 0, 0, 0, 5127, 5102, 1, 0, 0, 0, 5127, 5107, 1, 0, 0, 0, 5127, 5112, 1, 0, 0, 0, 5127, 5117, 1, 0, 0, 0, 5127, 5122, 1, 0, 0, 0, 5128, 563, 1, 0, 0, 0, 5129, 5134, 3, 566, 283, 0, 5130, 5131, 5, 6, 0, 0, 5131, 5133, 3, 566, 283, 0, 5132, 5130, 1, 0, 0, 0, 5133, 5136, 1, 0, 0, 0, 5134, 5132, 1, 0, 0, 0, 5134, 5135, 1, 0, 0, 0, 5135, 565, 1, 0, 0, 0, 5136, 5134, 1, 0, 0, 0, 5137, 5141, 3, 1370, 685, 0, 5138, 5139, 5, 66, 0, 0, 5139, 5141, 3, 1370, 685, 0, 5140, 5137, 1, 0, 0, 0, 5140, 5138, 1, 0, 0, 0, 5141, 567, 1, 0, 0, 0, 5142, 5143, 5, 105, 0, 0, 5143, 5144, 5, 65, 0, 0, 5144, 5147, 5, 272, 0, 0, 5145, 5147, 1, 0, 0, 0, 5146, 5142, 1, 0, 0, 0, 5146, 5145, 1, 0, 0, 0, 5147, 569, 1, 0, 0, 0, 5148, 5149, 5, 65, 0, 0, 5149, 5150, 3, 558, 279, 0, 5150, 5151, 5, 94, 0, 0, 5151, 5152, 3, 1372, 686, 0, 5152, 5153, 3, 574, 287, 0, 5153, 5154, 3, 576, 288, 0, 5154, 571, 1, 0, 0, 0, 5155, 5156, 5, 310, 0, 0, 5156, 5157, 3, 558, 279, 0, 5157, 5158, 5, 64, 0, 0, 5158, 5159, 3, 1372, 686, 0, 5159, 5160, 3, 576, 288, 0, 5160, 5161, 3, 108, 54, 0, 5161, 5173, 1, 0, 0, 0, 5162, 5163, 5, 310, 0, 0, 5163, 5164, 5, 134, 0, 0, 5164, 5165, 5, 272, 0, 0, 5165, 5166, 5, 62, 0, 0, 5166, 5167, 3, 558, 279, 0, 5167, 5168, 5, 64, 0, 0, 5168, 5169, 3, 1372, 686, 0, 5169, 5170, 3, 576, 288, 0, 5170, 5171, 3, 108, 54, 0, 5171, 5173, 1, 0, 0, 0, 5172, 5155, 1, 0, 0, 0, 5172, 5162, 1, 0, 0, 0, 5173, 573, 1, 0, 0, 0, 5174, 5175, 5, 105, 0, 0, 5175, 5176, 5, 134, 0, 0, 5176, 5179, 5, 272, 0, 0, 5177, 5179, 1, 0, 0, 0, 5178, 5174, 1, 0, 0, 0, 5178, 5177, 1, 0, 0, 0, 5179, 575, 1, 0, 0, 0, 5180, 5181, 5, 214, 0, 0, 5181, 5182, 5, 147, 0, 0, 5182, 5185, 3, 1370, 685, 0, 5183, 5185, 1, 0, 0, 0, 5184, 5180, 1, 0, 0, 0, 5184, 5183, 1, 0, 0, 0, 5185, 577, 1, 0, 0, 0, 5186, 5187, 5, 138, 0, 0, 5187, 5188, 5, 53, 0, 0, 5188, 5189, 5, 287, 0, 0, 5189, 5190, 3, 580, 290, 0, 5190, 5191, 3, 584, 292, 0, 5191, 579, 1, 0, 0, 0, 5192, 5194, 3, 582, 291, 0, 5193, 5192, 1, 0, 0, 0, 5194, 5197, 1, 0, 0, 0, 5195, 5193, 1, 0, 0, 0, 5195, 5196, 1, 0, 0, 0, 5196, 581, 1, 0, 0, 0, 5197, 5195, 1, 0, 0, 0, 5198, 5199, 5, 68, 0, 0, 5199, 5200, 5, 316, 0, 0, 5200, 5208, 3, 1340, 670, 0, 5201, 5202, 5, 62, 0, 0, 5202, 5203, 5, 311, 0, 0, 5203, 5208, 3, 1372, 686, 0, 5204, 5205, 5, 62, 0, 0, 5205, 5206, 5, 99, 0, 0, 5206, 5208, 3, 1372, 686, 0, 5207, 5198, 1, 0, 0, 0, 5207, 5201, 1, 0, 0, 0, 5207, 5204, 1, 0, 0, 0, 5208, 583, 1, 0, 0, 0, 5209, 5210, 5, 65, 0, 0, 5210, 5211, 3, 556, 278, 0, 5211, 5212, 5, 80, 0, 0, 5212, 5213, 3, 586, 293, 0, 5213, 5214, 5, 94, 0, 0, 5214, 5215, 3, 564, 282, 0, 5215, 5216, 3, 568, 284, 0, 5216, 5237, 1, 0, 0, 0, 5217, 5218, 5, 310, 0, 0, 5218, 5219, 3, 556, 278, 0, 5219, 5220, 5, 80, 0, 0, 5220, 5221, 3, 586, 293, 0, 5221, 5222, 5, 64, 0, 0, 5222, 5223, 3, 564, 282, 0, 5223, 5224, 3, 108, 54, 0, 5224, 5237, 1, 0, 0, 0, 5225, 5226, 5, 310, 0, 0, 5226, 5227, 5, 65, 0, 0, 5227, 5228, 5, 272, 0, 0, 5228, 5229, 5, 62, 0, 0, 5229, 5230, 3, 556, 278, 0, 5230, 5231, 5, 80, 0, 0, 5231, 5232, 3, 586, 293, 0, 5232, 5233, 5, 64, 0, 0, 5233, 5234, 3, 564, 282, 0, 5234, 5235, 3, 108, 54, 0, 5235, 5237, 1, 0, 0, 0, 5236, 5209, 1, 0, 0, 0, 5236, 5217, 1, 0, 0, 0, 5236, 5225, 1, 0, 0, 0, 5237, 585, 1, 0, 0, 0, 5238, 5239, 7, 25, 0, 0, 5239, 587, 1, 0, 0, 0, 5240, 5241, 5, 46, 0, 0, 5241, 5242, 3, 590, 295, 0, 5242, 5243, 5, 226, 0, 0, 5243, 5244, 3, 592, 296, 0, 5244, 5245, 3, 594, 297, 0, 5245, 5246, 5, 80, 0, 0, 5246, 5247, 3, 1076, 538, 0, 5247, 5248, 3, 596, 298, 0, 5248, 5249, 5, 2, 0, 0, 5249, 5250, 3, 598, 299, 0, 5250, 5251, 5, 3, 0, 0, 5251, 5252, 3, 604, 302, 0, 5252, 5253, 3, 118, 59, 0, 5253, 5254, 3, 254, 127, 0, 5254, 5255, 3, 1096, 548, 0, 5255, 5276, 1, 0, 0, 0, 5256, 5257, 5, 46, 0, 0, 5257, 5258, 3, 590, 295, 0, 5258, 5259, 5, 226, 0, 0, 5259, 5260, 3, 592, 296, 0, 5260, 5261, 5, 220, 0, 0, 5261, 5262, 5, 77, 0, 0, 5262, 5263, 5, 389, 0, 0, 5263, 5264, 3, 1342, 671, 0, 5264, 5265, 5, 80, 0, 0, 5265, 5266, 3, 1076, 538, 0, 5266, 5267, 3, 596, 298, 0, 5267, 5268, 5, 2, 0, 0, 5268, 5269, 3, 598, 299, 0, 5269, 5270, 5, 3, 0, 0, 5270, 5271, 3, 604, 302, 0, 5271, 5272, 3, 118, 59, 0, 5272, 5273, 3, 254, 127, 0, 5273, 5274, 3, 1096, 548, 0, 5274, 5276, 1, 0, 0, 0, 5275, 5240, 1, 0, 0, 0, 5275, 5256, 1, 0, 0, 0, 5276, 589, 1, 0, 0, 0, 5277, 5280, 5, 98, 0, 0, 5278, 5280, 1, 0, 0, 0, 5279, 5277, 1, 0, 0, 0, 5279, 5278, 1, 0, 0, 0, 5280, 591, 1, 0, 0, 0, 5281, 5284, 5, 109, 0, 0, 5282, 5284, 1, 0, 0, 0, 5283, 5281, 1, 0, 0, 0, 5283, 5282, 1, 0, 0, 0, 5284, 593, 1, 0, 0, 0, 5285, 5288, 3, 1342, 671, 0, 5286, 5288, 1, 0, 0, 0, 5287, 5285, 1, 0, 0, 0, 5287, 5286, 1, 0, 0, 0, 5288, 595, 1, 0, 0, 0, 5289, 5290, 5, 100, 0, 0, 5290, 5293, 3, 1342, 671, 0, 5291, 5293, 1, 0, 0, 0, 5292, 5289, 1, 0, 0, 0, 5292, 5291, 1, 0, 0, 0, 5293, 597, 1, 0, 0, 0, 5294, 5299, 3, 602, 301, 0, 5295, 5296, 5, 6, 0, 0, 5296, 5298, 3, 602, 301, 0, 5297, 5295, 1, 0, 0, 0, 5298, 5301, 1, 0, 0, 0, 5299, 5297, 1, 0, 0, 0, 5299, 5300, 1, 0, 0, 0, 5300, 599, 1, 0, 0, 0, 5301, 5299, 1, 0, 0, 0, 5302, 5303, 3, 608, 304, 0, 5303, 5304, 3, 610, 305, 0, 5304, 5305, 3, 612, 306, 0, 5305, 5306, 3, 614, 307, 0, 5306, 5314, 1, 0, 0, 0, 5307, 5308, 3, 608, 304, 0, 5308, 5309, 3, 524, 262, 0, 5309, 5310, 3, 116, 58, 0, 5310, 5311, 3, 612, 306, 0, 5311, 5312, 3, 614, 307, 0, 5312, 5314, 1, 0, 0, 0, 5313, 5302, 1, 0, 0, 0, 5313, 5307, 1, 0, 0, 0, 5314, 601, 1, 0, 0, 0, 5315, 5316, 3, 1374, 687, 0, 5316, 5317, 3, 600, 300, 0, 5317, 5327, 1, 0, 0, 0, 5318, 5319, 3, 1216, 608, 0, 5319, 5320, 3, 600, 300, 0, 5320, 5327, 1, 0, 0, 0, 5321, 5322, 5, 2, 0, 0, 5322, 5323, 3, 1164, 582, 0, 5323, 5324, 5, 3, 0, 0, 5324, 5325, 3, 600, 300, 0, 5325, 5327, 1, 0, 0, 0, 5326, 5315, 1, 0, 0, 0, 5326, 5318, 1, 0, 0, 0, 5326, 5321, 1, 0, 0, 0, 5327, 603, 1, 0, 0, 0, 5328, 5329, 5, 441, 0, 0, 5329, 5330, 5, 2, 0, 0, 5330, 5331, 3, 606, 303, 0, 5331, 5332, 5, 3, 0, 0, 5332, 5335, 1, 0, 0, 0, 5333, 5335, 1, 0, 0, 0, 5334, 5328, 1, 0, 0, 0, 5334, 5333, 1, 0, 0, 0, 5335, 605, 1, 0, 0, 0, 5336, 5341, 3, 602, 301, 0, 5337, 5338, 5, 6, 0, 0, 5338, 5340, 3, 602, 301, 0, 5339, 5337, 1, 0, 0, 0, 5340, 5343, 1, 0, 0, 0, 5341, 5339, 1, 0, 0, 0, 5341, 5342, 1, 0, 0, 0, 5342, 607, 1, 0, 0, 0, 5343, 5341, 1, 0, 0, 0, 5344, 5345, 5, 43, 0, 0, 5345, 5348, 3, 524, 262, 0, 5346, 5348, 1, 0, 0, 0, 5347, 5344, 1, 0, 0, 0, 5347, 5346, 1, 0, 0, 0, 5348, 609, 1, 0, 0, 0, 5349, 5352, 3, 524, 262, 0, 5350, 5352, 1, 0, 0, 0, 5351, 5349, 1, 0, 0, 0, 5351, 5350, 1, 0, 0, 0, 5352, 611, 1, 0, 0, 0, 5353, 5357, 5, 37, 0, 0, 5354, 5357, 5, 55, 0, 0, 5355, 5357, 1, 0, 0, 0, 5356, 5353, 1, 0, 0, 0, 5356, 5354, 1, 0, 0, 0, 5356, 5355, 1, 0, 0, 0, 5357, 613, 1, 0, 0, 0, 5358, 5359, 5, 266, 0, 0, 5359, 5364, 5, 207, 0, 0, 5360, 5361, 5, 266, 0, 0, 5361, 5364, 5, 240, 0, 0, 5362, 5364, 1, 0, 0, 0, 5363, 5358, 1, 0, 0, 0, 5363, 5360, 1, 0, 0, 0, 5363, 5362, 1, 0, 0, 0, 5364, 615, 1, 0, 0, 0, 5365, 5366, 5, 46, 0, 0, 5366, 5367, 3, 618, 309, 0, 5367, 5368, 7, 22, 0, 0, 5368, 5369, 3, 1348, 674, 0, 5369, 5379, 3, 628, 314, 0, 5370, 5377, 5, 309, 0, 0, 5371, 5378, 3, 638, 319, 0, 5372, 5373, 5, 92, 0, 0, 5373, 5374, 5, 2, 0, 0, 5374, 5375, 3, 668, 334, 0, 5375, 5376, 5, 3, 0, 0, 5376, 5378, 1, 0, 0, 0, 5377, 5371, 1, 0, 0, 0, 5377, 5372, 1, 0, 0, 0, 5378, 5380, 1, 0, 0, 0, 5379, 5370, 1, 0, 0, 0, 5379, 5380, 1, 0, 0, 0, 5380, 5381, 1, 0, 0, 0, 5381, 5382, 3, 654, 327, 0, 5382, 617, 1, 0, 0, 0, 5383, 5384, 5, 82, 0, 0, 5384, 5387, 5, 304, 0, 0, 5385, 5387, 1, 0, 0, 0, 5386, 5383, 1, 0, 0, 0, 5386, 5385, 1, 0, 0, 0, 5387, 619, 1, 0, 0, 0, 5388, 5390, 5, 2, 0, 0, 5389, 5391, 3, 622, 311, 0, 5390, 5389, 1, 0, 0, 0, 5390, 5391, 1, 0, 0, 0, 5391, 5392, 1, 0, 0, 0, 5392, 5393, 5, 3, 0, 0, 5393, 621, 1, 0, 0, 0, 5394, 5399, 3, 632, 316, 0, 5395, 5396, 5, 6, 0, 0, 5396, 5398, 3, 632, 316, 0, 5397, 5395, 1, 0, 0, 0, 5398, 5401, 1, 0, 0, 0, 5399, 5397, 1, 0, 0, 0, 5399, 5400, 1, 0, 0, 0, 5400, 623, 1, 0, 0, 0, 5401, 5399, 1, 0, 0, 0, 5402, 5407, 3, 626, 313, 0, 5403, 5404, 5, 6, 0, 0, 5404, 5406, 3, 626, 313, 0, 5405, 5403, 1, 0, 0, 0, 5406, 5409, 1, 0, 0, 0, 5407, 5405, 1, 0, 0, 0, 5407, 5408, 1, 0, 0, 0, 5408, 625, 1, 0, 0, 0, 5409, 5407, 1, 0, 0, 0, 5410, 5411, 3, 1348, 674, 0, 5411, 5412, 3, 620, 310, 0, 5412, 5419, 1, 0, 0, 0, 5413, 5419, 3, 1392, 696, 0, 5414, 5416, 3, 1374, 687, 0, 5415, 5417, 3, 1326, 663, 0, 5416, 5415, 1, 0, 0, 0, 5416, 5417, 1, 0, 0, 0, 5417, 5419, 1, 0, 0, 0, 5418, 5410, 1, 0, 0, 0, 5418, 5413, 1, 0, 0, 0, 5418, 5414, 1, 0, 0, 0, 5419, 627, 1, 0, 0, 0, 5420, 5422, 5, 2, 0, 0, 5421, 5423, 3, 630, 315, 0, 5422, 5421, 1, 0, 0, 0, 5422, 5423, 1, 0, 0, 0, 5423, 5424, 1, 0, 0, 0, 5424, 5425, 5, 3, 0, 0, 5425, 629, 1, 0, 0, 0, 5426, 5431, 3, 642, 321, 0, 5427, 5428, 5, 6, 0, 0, 5428, 5430, 3, 642, 321, 0, 5429, 5427, 1, 0, 0, 0, 5430, 5433, 1, 0, 0, 0, 5431, 5429, 1, 0, 0, 0, 5431, 5432, 1, 0, 0, 0, 5432, 631, 1, 0, 0, 0, 5433, 5431, 1, 0, 0, 0, 5434, 5436, 3, 634, 317, 0, 5435, 5437, 3, 636, 318, 0, 5436, 5435, 1, 0, 0, 0, 5436, 5437, 1, 0, 0, 0, 5437, 5438, 1, 0, 0, 0, 5438, 5439, 3, 640, 320, 0, 5439, 5448, 1, 0, 0, 0, 5440, 5442, 3, 636, 318, 0, 5441, 5443, 3, 634, 317, 0, 5442, 5441, 1, 0, 0, 0, 5442, 5443, 1, 0, 0, 0, 5443, 5444, 1, 0, 0, 0, 5444, 5445, 3, 640, 320, 0, 5445, 5448, 1, 0, 0, 0, 5446, 5448, 3, 640, 320, 0, 5447, 5434, 1, 0, 0, 0, 5447, 5440, 1, 0, 0, 0, 5447, 5446, 1, 0, 0, 0, 5448, 633, 1, 0, 0, 0, 5449, 5451, 5, 68, 0, 0, 5450, 5452, 5, 453, 0, 0, 5451, 5450, 1, 0, 0, 0, 5451, 5452, 1, 0, 0, 0, 5452, 5457, 1, 0, 0, 0, 5453, 5457, 5, 453, 0, 0, 5454, 5457, 5, 393, 0, 0, 5455, 5457, 5, 101, 0, 0, 5456, 5449, 1, 0, 0, 0, 5456, 5453, 1, 0, 0, 0, 5456, 5454, 1, 0, 0, 0, 5456, 5455, 1, 0, 0, 0, 5457, 635, 1, 0, 0, 0, 5458, 5463, 3, 1378, 689, 0, 5459, 5463, 3, 1396, 698, 0, 5460, 5463, 5, 119, 0, 0, 5461, 5463, 5, 126, 0, 0, 5462, 5458, 1, 0, 0, 0, 5462, 5459, 1, 0, 0, 0, 5462, 5460, 1, 0, 0, 0, 5462, 5461, 1, 0, 0, 0, 5463, 637, 1, 0, 0, 0, 5464, 5465, 3, 640, 320, 0, 5465, 639, 1, 0, 0, 0, 5466, 5481, 3, 1120, 560, 0, 5467, 5469, 5, 408, 0, 0, 5468, 5467, 1, 0, 0, 0, 5468, 5469, 1, 0, 0, 0, 5469, 5474, 1, 0, 0, 0, 5470, 5475, 3, 1396, 698, 0, 5471, 5475, 3, 1378, 689, 0, 5472, 5475, 5, 119, 0, 0, 5473, 5475, 5, 126, 0, 0, 5474, 5470, 1, 0, 0, 0, 5474, 5471, 1, 0, 0, 0, 5474, 5472, 1, 0, 0, 0, 5474, 5473, 1, 0, 0, 0, 5475, 5476, 1, 0, 0, 0, 5476, 5477, 3, 526, 263, 0, 5477, 5478, 5, 27, 0, 0, 5478, 5479, 5, 353, 0, 0, 5479, 5481, 1, 0, 0, 0, 5480, 5466, 1, 0, 0, 0, 5480, 5468, 1, 0, 0, 0, 5481, 641, 1, 0, 0, 0, 5482, 5485, 3, 632, 316, 0, 5483, 5484, 7, 26, 0, 0, 5484, 5486, 3, 1164, 582, 0, 5485, 5483, 1, 0, 0, 0, 5485, 5486, 1, 0, 0, 0, 5486, 643, 1, 0, 0, 0, 5487, 5488, 3, 632, 316, 0, 5488, 645, 1, 0, 0, 0, 5489, 5500, 5, 2, 0, 0, 5490, 5501, 5, 9, 0, 0, 5491, 5501, 3, 648, 324, 0, 5492, 5493, 5, 83, 0, 0, 5493, 5494, 5, 147, 0, 0, 5494, 5501, 3, 648, 324, 0, 5495, 5496, 3, 648, 324, 0, 5496, 5497, 5, 83, 0, 0, 5497, 5498, 5, 147, 0, 0, 5498, 5499, 3, 648, 324, 0, 5499, 5501, 1, 0, 0, 0, 5500, 5490, 1, 0, 0, 0, 5500, 5491, 1, 0, 0, 0, 5500, 5492, 1, 0, 0, 0, 5500, 5495, 1, 0, 0, 0, 5501, 5502, 1, 0, 0, 0, 5502, 5503, 5, 3, 0, 0, 5503, 647, 1, 0, 0, 0, 5504, 5509, 3, 644, 322, 0, 5505, 5506, 5, 6, 0, 0, 5506, 5508, 3, 644, 322, 0, 5507, 5505, 1, 0, 0, 0, 5508, 5511, 1, 0, 0, 0, 5509, 5507, 1, 0, 0, 0, 5509, 5510, 1, 0, 0, 0, 5510, 649, 1, 0, 0, 0, 5511, 5509, 1, 0, 0, 0, 5512, 5513, 3, 1348, 674, 0, 5513, 5514, 3, 646, 323, 0, 5514, 651, 1, 0, 0, 0, 5515, 5520, 3, 650, 325, 0, 5516, 5517, 5, 6, 0, 0, 5517, 5519, 3, 650, 325, 0, 5518, 5516, 1, 0, 0, 0, 5519, 5522, 1, 0, 0, 0, 5520, 5518, 1, 0, 0, 0, 5520, 5521, 1, 0, 0, 0, 5521, 653, 1, 0, 0, 0, 5522, 5520, 1, 0, 0, 0, 5523, 5525, 3, 658, 329, 0, 5524, 5523, 1, 0, 0, 0, 5525, 5526, 1, 0, 0, 0, 5526, 5524, 1, 0, 0, 0, 5526, 5527, 1, 0, 0, 0, 5527, 5528, 1, 0, 0, 0, 5528, 5529, 6, 327, -1, 0, 5529, 655, 1, 0, 0, 0, 5530, 5531, 5, 149, 0, 0, 5531, 5532, 5, 80, 0, 0, 5532, 5533, 5, 78, 0, 0, 5533, 5566, 5, 458, 0, 0, 5534, 5535, 5, 309, 0, 0, 5535, 5536, 5, 78, 0, 0, 5536, 5537, 5, 80, 0, 0, 5537, 5538, 5, 78, 0, 0, 5538, 5566, 5, 458, 0, 0, 5539, 5566, 5, 339, 0, 0, 5540, 5566, 5, 222, 0, 0, 5541, 5566, 5, 331, 0, 0, 5542, 5566, 5, 370, 0, 0, 5543, 5544, 5, 205, 0, 0, 5544, 5545, 5, 320, 0, 0, 5545, 5566, 5, 181, 0, 0, 5546, 5547, 5, 205, 0, 0, 5547, 5548, 5, 320, 0, 0, 5548, 5566, 5, 234, 0, 0, 5549, 5550, 5, 320, 0, 0, 5550, 5566, 5, 181, 0, 0, 5551, 5552, 5, 320, 0, 0, 5552, 5566, 5, 234, 0, 0, 5553, 5566, 5, 241, 0, 0, 5554, 5555, 5, 77, 0, 0, 5555, 5566, 5, 241, 0, 0, 5556, 5557, 5, 170, 0, 0, 5557, 5566, 3, 292, 146, 0, 5558, 5559, 5, 313, 0, 0, 5559, 5566, 3, 292, 146, 0, 5560, 5561, 5, 459, 0, 0, 5561, 5566, 3, 524, 262, 0, 5562, 5566, 3, 82, 41, 0, 5563, 5564, 5, 460, 0, 0, 5564, 5566, 3, 1374, 687, 0, 5565, 5530, 1, 0, 0, 0, 5565, 5534, 1, 0, 0, 0, 5565, 5539, 1, 0, 0, 0, 5565, 5540, 1, 0, 0, 0, 5565, 5541, 1, 0, 0, 0, 5565, 5542, 1, 0, 0, 0, 5565, 5543, 1, 0, 0, 0, 5565, 5546, 1, 0, 0, 0, 5565, 5549, 1, 0, 0, 0, 5565, 5551, 1, 0, 0, 0, 5565, 5553, 1, 0, 0, 0, 5565, 5554, 1, 0, 0, 0, 5565, 5556, 1, 0, 0, 0, 5565, 5558, 1, 0, 0, 0, 5565, 5560, 1, 0, 0, 0, 5565, 5562, 1, 0, 0, 0, 5565, 5563, 1, 0, 0, 0, 5566, 657, 1, 0, 0, 0, 5567, 5568, 5, 36, 0, 0, 5568, 5576, 3, 660, 330, 0, 5569, 5570, 5, 238, 0, 0, 5570, 5576, 3, 72, 36, 0, 5571, 5572, 5, 443, 0, 0, 5572, 5576, 3, 662, 331, 0, 5573, 5576, 5, 104, 0, 0, 5574, 5576, 3, 656, 328, 0, 5575, 5567, 1, 0, 0, 0, 5575, 5569, 1, 0, 0, 0, 5575, 5571, 1, 0, 0, 0, 5575, 5573, 1, 0, 0, 0, 5575, 5574, 1, 0, 0, 0, 5576, 659, 1, 0, 0, 0, 5577, 5583, 3, 1360, 680, 0, 5578, 5579, 3, 1360, 680, 0, 5579, 5580, 5, 6, 0, 0, 5580, 5581, 3, 1360, 680, 0, 5581, 5583, 1, 0, 0, 0, 5582, 5577, 1, 0, 0, 0, 5582, 5578, 1, 0, 0, 0, 5583, 661, 1, 0, 0, 0, 5584, 5585, 5, 62, 0, 0, 5585, 5586, 5, 353, 0, 0, 5586, 5593, 3, 1120, 560, 0, 5587, 5588, 5, 6, 0, 0, 5588, 5589, 5, 62, 0, 0, 5589, 5590, 5, 353, 0, 0, 5590, 5592, 3, 1120, 560, 0, 5591, 5587, 1, 0, 0, 0, 5592, 5595, 1, 0, 0, 0, 5593, 5591, 1, 0, 0, 0, 5593, 5594, 1, 0, 0, 0, 5594, 663, 1, 0, 0, 0, 5595, 5593, 1, 0, 0, 0, 5596, 5597, 5, 105, 0, 0, 5597, 5600, 3, 460, 230, 0, 5598, 5600, 1, 0, 0, 0, 5599, 5596, 1, 0, 0, 0, 5599, 5598, 1, 0, 0, 0, 5600, 665, 1, 0, 0, 0, 5601, 5602, 3, 636, 318, 0, 5602, 5603, 3, 640, 320, 0, 5603, 667, 1, 0, 0, 0, 5604, 5609, 3, 666, 333, 0, 5605, 5606, 5, 6, 0, 0, 5606, 5608, 3, 666, 333, 0, 5607, 5605, 1, 0, 0, 0, 5608, 5611, 1, 0, 0, 0, 5609, 5607, 1, 0, 0, 0, 5609, 5610, 1, 0, 0, 0, 5610, 669, 1, 0, 0, 0, 5611, 5609, 1, 0, 0, 0, 5612, 5613, 5, 138, 0, 0, 5613, 5614, 7, 27, 0, 0, 5614, 5615, 3, 626, 313, 0, 5615, 5616, 3, 672, 336, 0, 5616, 5617, 3, 674, 337, 0, 5617, 671, 1, 0, 0, 0, 5618, 5620, 3, 656, 328, 0, 5619, 5618, 1, 0, 0, 0, 5620, 5621, 1, 0, 0, 0, 5621, 5619, 1, 0, 0, 0, 5621, 5622, 1, 0, 0, 0, 5622, 673, 1, 0, 0, 0, 5623, 5626, 5, 308, 0, 0, 5624, 5626, 1, 0, 0, 0, 5625, 5623, 1, 0, 0, 0, 5625, 5624, 1, 0, 0, 0, 5626, 675, 1, 0, 0, 0, 5627, 5628, 5, 191, 0, 0, 5628, 5629, 5, 211, 0, 0, 5629, 5630, 3, 624, 312, 0, 5630, 5631, 3, 108, 54, 0, 5631, 5664, 1, 0, 0, 0, 5632, 5633, 5, 191, 0, 0, 5633, 5634, 5, 211, 0, 0, 5634, 5635, 5, 220, 0, 0, 5635, 5636, 5, 389, 0, 0, 5636, 5637, 3, 624, 312, 0, 5637, 5638, 3, 108, 54, 0, 5638, 5664, 1, 0, 0, 0, 5639, 5640, 5, 191, 0, 0, 5640, 5641, 5, 289, 0, 0, 5641, 5642, 3, 624, 312, 0, 5642, 5643, 3, 108, 54, 0, 5643, 5664, 1, 0, 0, 0, 5644, 5645, 5, 191, 0, 0, 5645, 5646, 5, 289, 0, 0, 5646, 5647, 5, 220, 0, 0, 5647, 5648, 5, 389, 0, 0, 5648, 5649, 3, 624, 312, 0, 5649, 5650, 3, 108, 54, 0, 5650, 5664, 1, 0, 0, 0, 5651, 5652, 5, 191, 0, 0, 5652, 5653, 5, 442, 0, 0, 5653, 5654, 3, 624, 312, 0, 5654, 5655, 3, 108, 54, 0, 5655, 5664, 1, 0, 0, 0, 5656, 5657, 5, 191, 0, 0, 5657, 5658, 5, 442, 0, 0, 5658, 5659, 5, 220, 0, 0, 5659, 5660, 5, 389, 0, 0, 5660, 5661, 3, 624, 312, 0, 5661, 5662, 3, 108, 54, 0, 5662, 5664, 1, 0, 0, 0, 5663, 5627, 1, 0, 0, 0, 5663, 5632, 1, 0, 0, 0, 5663, 5639, 1, 0, 0, 0, 5663, 5644, 1, 0, 0, 0, 5663, 5651, 1, 0, 0, 0, 5663, 5656, 1, 0, 0, 0, 5664, 677, 1, 0, 0, 0, 5665, 5666, 5, 191, 0, 0, 5666, 5667, 5, 136, 0, 0, 5667, 5668, 3, 652, 326, 0, 5668, 5669, 3, 108, 54, 0, 5669, 5678, 1, 0, 0, 0, 5670, 5671, 5, 191, 0, 0, 5671, 5672, 5, 136, 0, 0, 5672, 5673, 5, 220, 0, 0, 5673, 5674, 5, 389, 0, 0, 5674, 5675, 3, 652, 326, 0, 5675, 5676, 3, 108, 54, 0, 5676, 5678, 1, 0, 0, 0, 5677, 5665, 1, 0, 0, 0, 5677, 5670, 1, 0, 0, 0, 5678, 679, 1, 0, 0, 0, 5679, 5680, 5, 191, 0, 0, 5680, 5681, 5, 271, 0, 0, 5681, 5682, 3, 686, 343, 0, 5682, 5683, 3, 108, 54, 0, 5683, 5692, 1, 0, 0, 0, 5684, 5685, 5, 191, 0, 0, 5685, 5686, 5, 271, 0, 0, 5686, 5687, 5, 220, 0, 0, 5687, 5688, 5, 389, 0, 0, 5688, 5689, 3, 686, 343, 0, 5689, 5690, 3, 108, 54, 0, 5690, 5692, 1, 0, 0, 0, 5691, 5679, 1, 0, 0, 0, 5691, 5684, 1, 0, 0, 0, 5692, 681, 1, 0, 0, 0, 5693, 5694, 5, 2, 0, 0, 5694, 5695, 3, 1120, 560, 0, 5695, 5696, 5, 3, 0, 0, 5696, 5716, 1, 0, 0, 0, 5697, 5698, 5, 2, 0, 0, 5698, 5699, 3, 1120, 560, 0, 5699, 5700, 5, 6, 0, 0, 5700, 5701, 3, 1120, 560, 0, 5701, 5702, 5, 3, 0, 0, 5702, 5716, 1, 0, 0, 0, 5703, 5704, 5, 2, 0, 0, 5704, 5705, 5, 400, 0, 0, 5705, 5706, 5, 6, 0, 0, 5706, 5707, 3, 1120, 560, 0, 5707, 5708, 5, 3, 0, 0, 5708, 5716, 1, 0, 0, 0, 5709, 5710, 5, 2, 0, 0, 5710, 5711, 3, 1120, 560, 0, 5711, 5712, 5, 6, 0, 0, 5712, 5713, 5, 400, 0, 0, 5713, 5714, 5, 3, 0, 0, 5714, 5716, 1, 0, 0, 0, 5715, 5693, 1, 0, 0, 0, 5715, 5697, 1, 0, 0, 0, 5715, 5703, 1, 0, 0, 0, 5715, 5709, 1, 0, 0, 0, 5716, 683, 1, 0, 0, 0, 5717, 5718, 3, 1374, 687, 0, 5718, 5719, 5, 11, 0, 0, 5719, 5721, 1, 0, 0, 0, 5720, 5717, 1, 0, 0, 0, 5721, 5724, 1, 0, 0, 0, 5722, 5720, 1, 0, 0, 0, 5722, 5723, 1, 0, 0, 0, 5723, 5725, 1, 0, 0, 0, 5724, 5722, 1, 0, 0, 0, 5725, 5726, 3, 1272, 636, 0, 5726, 685, 1, 0, 0, 0, 5727, 5732, 3, 688, 344, 0, 5728, 5729, 5, 6, 0, 0, 5729, 5731, 3, 688, 344, 0, 5730, 5728, 1, 0, 0, 0, 5731, 5734, 1, 0, 0, 0, 5732, 5730, 1, 0, 0, 0, 5732, 5733, 1, 0, 0, 0, 5733, 687, 1, 0, 0, 0, 5734, 5732, 1, 0, 0, 0, 5735, 5736, 3, 684, 342, 0, 5736, 5737, 3, 682, 341, 0, 5737, 689, 1, 0, 0, 0, 5738, 5739, 5, 57, 0, 0, 5739, 5740, 3, 692, 346, 0, 5740, 691, 1, 0, 0, 0, 5741, 5743, 3, 694, 347, 0, 5742, 5741, 1, 0, 0, 0, 5743, 5744, 1, 0, 0, 0, 5744, 5742, 1, 0, 0, 0, 5744, 5745, 1, 0, 0, 0, 5745, 693, 1, 0, 0, 0, 5746, 5750, 3, 1360, 680, 0, 5747, 5748, 5, 238, 0, 0, 5748, 5750, 3, 72, 36, 0, 5749, 5746, 1, 0, 0, 0, 5749, 5747, 1, 0, 0, 0, 5750, 695, 1, 0, 0, 0, 5751, 5752, 5, 46, 0, 0, 5752, 5753, 5, 41, 0, 0, 5753, 5754, 5, 2, 0, 0, 5754, 5755, 3, 1120, 560, 0, 5755, 5756, 5, 36, 0, 0, 5756, 5757, 3, 1120, 560, 0, 5757, 5758, 5, 3, 0, 0, 5758, 5759, 5, 105, 0, 0, 5759, 5760, 5, 211, 0, 0, 5760, 5761, 3, 626, 313, 0, 5761, 5762, 3, 698, 349, 0, 5762, 5786, 1, 0, 0, 0, 5763, 5764, 5, 46, 0, 0, 5764, 5765, 5, 41, 0, 0, 5765, 5766, 5, 2, 0, 0, 5766, 5767, 3, 1120, 560, 0, 5767, 5768, 5, 36, 0, 0, 5768, 5769, 3, 1120, 560, 0, 5769, 5770, 5, 3, 0, 0, 5770, 5771, 5, 372, 0, 0, 5771, 5772, 5, 211, 0, 0, 5772, 5773, 3, 698, 349, 0, 5773, 5786, 1, 0, 0, 0, 5774, 5775, 5, 46, 0, 0, 5775, 5776, 5, 41, 0, 0, 5776, 5777, 5, 2, 0, 0, 5777, 5778, 3, 1120, 560, 0, 5778, 5779, 5, 36, 0, 0, 5779, 5780, 3, 1120, 560, 0, 5780, 5781, 5, 3, 0, 0, 5781, 5782, 5, 105, 0, 0, 5782, 5783, 5, 393, 0, 0, 5783, 5784, 3, 698, 349, 0, 5784, 5786, 1, 0, 0, 0, 5785, 5751, 1, 0, 0, 0, 5785, 5763, 1, 0, 0, 0, 5785, 5774, 1, 0, 0, 0, 5786, 697, 1, 0, 0, 0, 5787, 5788, 5, 36, 0, 0, 5788, 5793, 5, 223, 0, 0, 5789, 5790, 5, 36, 0, 0, 5790, 5793, 5, 141, 0, 0, 5791, 5793, 1, 0, 0, 0, 5792, 5787, 1, 0, 0, 0, 5792, 5789, 1, 0, 0, 0, 5792, 5791, 1, 0, 0, 0, 5793, 699, 1, 0, 0, 0, 5794, 5795, 5, 191, 0, 0, 5795, 5796, 5, 41, 0, 0, 5796, 5797, 3, 702, 351, 0, 5797, 5798, 5, 2, 0, 0, 5798, 5799, 3, 1120, 560, 0, 5799, 5800, 5, 36, 0, 0, 5800, 5801, 3, 1120, 560, 0, 5801, 5802, 5, 3, 0, 0, 5802, 5803, 3, 108, 54, 0, 5803, 701, 1, 0, 0, 0, 5804, 5805, 5, 220, 0, 0, 5805, 5808, 5, 389, 0, 0, 5806, 5808, 1, 0, 0, 0, 5807, 5804, 1, 0, 0, 0, 5807, 5806, 1, 0, 0, 0, 5808, 703, 1, 0, 0, 0, 5809, 5810, 5, 46, 0, 0, 5810, 5811, 3, 618, 309, 0, 5811, 5812, 5, 443, 0, 0, 5812, 5813, 5, 62, 0, 0, 5813, 5814, 3, 1120, 560, 0, 5814, 5815, 5, 238, 0, 0, 5815, 5816, 3, 1342, 671, 0, 5816, 5817, 5, 2, 0, 0, 5817, 5818, 3, 706, 353, 0, 5818, 5819, 5, 3, 0, 0, 5819, 705, 1, 0, 0, 0, 5820, 5821, 5, 64, 0, 0, 5821, 5822, 5, 461, 0, 0, 5822, 5823, 5, 105, 0, 0, 5823, 5824, 5, 211, 0, 0, 5824, 5825, 3, 626, 313, 0, 5825, 5826, 5, 6, 0, 0, 5826, 5827, 5, 94, 0, 0, 5827, 5828, 5, 461, 0, 0, 5828, 5829, 5, 105, 0, 0, 5829, 5830, 5, 211, 0, 0, 5830, 5831, 3, 626, 313, 0, 5831, 5855, 1, 0, 0, 0, 5832, 5833, 5, 94, 0, 0, 5833, 5834, 5, 461, 0, 0, 5834, 5835, 5, 105, 0, 0, 5835, 5836, 5, 211, 0, 0, 5836, 5837, 3, 626, 313, 0, 5837, 5838, 5, 6, 0, 0, 5838, 5839, 5, 64, 0, 0, 5839, 5840, 5, 461, 0, 0, 5840, 5841, 5, 105, 0, 0, 5841, 5842, 5, 211, 0, 0, 5842, 5843, 3, 626, 313, 0, 5843, 5855, 1, 0, 0, 0, 5844, 5845, 5, 64, 0, 0, 5845, 5846, 5, 461, 0, 0, 5846, 5847, 5, 105, 0, 0, 5847, 5848, 5, 211, 0, 0, 5848, 5855, 3, 626, 313, 0, 5849, 5850, 5, 94, 0, 0, 5850, 5851, 5, 461, 0, 0, 5851, 5852, 5, 105, 0, 0, 5852, 5853, 5, 211, 0, 0, 5853, 5855, 3, 626, 313, 0, 5854, 5820, 1, 0, 0, 0, 5854, 5832, 1, 0, 0, 0, 5854, 5844, 1, 0, 0, 0, 5854, 5849, 1, 0, 0, 0, 5855, 707, 1, 0, 0, 0, 5856, 5857, 5, 191, 0, 0, 5857, 5858, 5, 443, 0, 0, 5858, 5859, 3, 702, 351, 0, 5859, 5860, 5, 62, 0, 0, 5860, 5861, 3, 1120, 560, 0, 5861, 5862, 5, 238, 0, 0, 5862, 5863, 3, 1342, 671, 0, 5863, 5864, 3, 108, 54, 0, 5864, 709, 1, 0, 0, 0, 5865, 5866, 5, 299, 0, 0, 5866, 5867, 3, 712, 356, 0, 5867, 5868, 3, 592, 296, 0, 5868, 5869, 3, 1338, 669, 0, 5869, 5892, 1, 0, 0, 0, 5870, 5871, 5, 299, 0, 0, 5871, 5872, 3, 714, 357, 0, 5872, 5873, 3, 592, 296, 0, 5873, 5874, 3, 1342, 671, 0, 5874, 5892, 1, 0, 0, 0, 5875, 5876, 5, 299, 0, 0, 5876, 5877, 5, 2, 0, 0, 5877, 5878, 3, 716, 358, 0, 5878, 5879, 5, 3, 0, 0, 5879, 5880, 3, 712, 356, 0, 5880, 5881, 3, 592, 296, 0, 5881, 5882, 3, 1338, 669, 0, 5882, 5892, 1, 0, 0, 0, 5883, 5884, 5, 299, 0, 0, 5884, 5885, 5, 2, 0, 0, 5885, 5886, 3, 716, 358, 0, 5886, 5887, 5, 3, 0, 0, 5887, 5888, 3, 714, 357, 0, 5888, 5889, 3, 592, 296, 0, 5889, 5890, 3, 1342, 671, 0, 5890, 5892, 1, 0, 0, 0, 5891, 5865, 1, 0, 0, 0, 5891, 5870, 1, 0, 0, 0, 5891, 5875, 1, 0, 0, 0, 5891, 5883, 1, 0, 0, 0, 5892, 711, 1, 0, 0, 0, 5893, 5894, 7, 18, 0, 0, 5894, 713, 1, 0, 0, 0, 5895, 5896, 7, 28, 0, 0, 5896, 715, 1, 0, 0, 0, 5897, 5902, 3, 718, 359, 0, 5898, 5899, 5, 6, 0, 0, 5899, 5901, 3, 718, 359, 0, 5900, 5898, 1, 0, 0, 0, 5901, 5904, 1, 0, 0, 0, 5902, 5900, 1, 0, 0, 0, 5902, 5903, 1, 0, 0, 0, 5903, 717, 1, 0, 0, 0, 5904, 5902, 1, 0, 0, 0, 5905, 5906, 5, 128, 0, 0, 5906, 719, 1, 0, 0, 0, 5907, 5908, 5, 138, 0, 0, 5908, 5909, 5, 344, 0, 0, 5909, 5910, 3, 1342, 671, 0, 5910, 5911, 5, 326, 0, 0, 5911, 5912, 3, 116, 58, 0, 5912, 5920, 1, 0, 0, 0, 5913, 5914, 5, 138, 0, 0, 5914, 5915, 5, 344, 0, 0, 5915, 5916, 3, 1342, 671, 0, 5916, 5917, 5, 306, 0, 0, 5917, 5918, 3, 116, 58, 0, 5918, 5920, 1, 0, 0, 0, 5919, 5907, 1, 0, 0, 0, 5919, 5913, 1, 0, 0, 0, 5920, 721, 1, 0, 0, 0, 5921, 5922, 5, 138, 0, 0, 5922, 5923, 5, 136, 0, 0, 5923, 5924, 3, 650, 325, 0, 5924, 5925, 5, 302, 0, 0, 5925, 5926, 5, 94, 0, 0, 5926, 5927, 3, 1342, 671, 0, 5927, 6390, 1, 0, 0, 0, 5928, 5929, 5, 138, 0, 0, 5929, 5930, 5, 108, 0, 0, 5930, 5931, 3, 524, 262, 0, 5931, 5932, 5, 302, 0, 0, 5932, 5933, 5, 94, 0, 0, 5933, 5934, 3, 1342, 671, 0, 5934, 6390, 1, 0, 0, 0, 5935, 5936, 5, 138, 0, 0, 5936, 5937, 5, 168, 0, 0, 5937, 5938, 3, 524, 262, 0, 5938, 5939, 5, 302, 0, 0, 5939, 5940, 5, 94, 0, 0, 5940, 5941, 3, 1342, 671, 0, 5941, 6390, 1, 0, 0, 0, 5942, 5943, 5, 138, 0, 0, 5943, 5944, 5, 175, 0, 0, 5944, 5945, 3, 1342, 671, 0, 5945, 5946, 5, 302, 0, 0, 5946, 5947, 5, 94, 0, 0, 5947, 5948, 3, 1342, 671, 0, 5948, 6390, 1, 0, 0, 0, 5949, 5950, 5, 138, 0, 0, 5950, 5951, 5, 189, 0, 0, 5951, 5952, 3, 524, 262, 0, 5952, 5953, 5, 302, 0, 0, 5953, 5954, 5, 94, 0, 0, 5954, 5955, 3, 1342, 671, 0, 5955, 6390, 1, 0, 0, 0, 5956, 5957, 5, 138, 0, 0, 5957, 5958, 5, 189, 0, 0, 5958, 5959, 3, 524, 262, 0, 5959, 5960, 5, 302, 0, 0, 5960, 5961, 5, 45, 0, 0, 5961, 5962, 3, 1342, 671, 0, 5962, 5963, 5, 94, 0, 0, 5963, 5964, 3, 1342, 671, 0, 5964, 6390, 1, 0, 0, 0, 5965, 5966, 5, 138, 0, 0, 5966, 5967, 5, 63, 0, 0, 5967, 5968, 5, 174, 0, 0, 5968, 5969, 5, 374, 0, 0, 5969, 5970, 3, 1342, 671, 0, 5970, 5971, 5, 302, 0, 0, 5971, 5972, 5, 94, 0, 0, 5972, 5973, 3, 1342, 671, 0, 5973, 6390, 1, 0, 0, 0, 5974, 5975, 5, 138, 0, 0, 5975, 5976, 5, 211, 0, 0, 5976, 5977, 3, 626, 313, 0, 5977, 5978, 5, 302, 0, 0, 5978, 5979, 5, 94, 0, 0, 5979, 5980, 3, 1342, 671, 0, 5980, 6390, 1, 0, 0, 0, 5981, 5982, 5, 138, 0, 0, 5982, 5983, 5, 66, 0, 0, 5983, 5984, 3, 1368, 684, 0, 5984, 5985, 5, 302, 0, 0, 5985, 5986, 5, 94, 0, 0, 5986, 5987, 3, 1368, 684, 0, 5987, 6390, 1, 0, 0, 0, 5988, 5989, 5, 138, 0, 0, 5989, 5990, 3, 308, 154, 0, 5990, 5991, 5, 238, 0, 0, 5991, 5992, 3, 1342, 671, 0, 5992, 5993, 5, 302, 0, 0, 5993, 5994, 5, 94, 0, 0, 5994, 5995, 3, 1342, 671, 0, 5995, 6390, 1, 0, 0, 0, 5996, 5997, 5, 138, 0, 0, 5997, 5998, 5, 271, 0, 0, 5998, 5999, 5, 156, 0, 0, 5999, 6000, 3, 524, 262, 0, 6000, 6001, 5, 100, 0, 0, 6001, 6002, 3, 1342, 671, 0, 6002, 6003, 5, 302, 0, 0, 6003, 6004, 5, 94, 0, 0, 6004, 6005, 3, 1342, 671, 0, 6005, 6390, 1, 0, 0, 0, 6006, 6007, 5, 138, 0, 0, 6007, 6008, 5, 271, 0, 0, 6008, 6009, 5, 206, 0, 0, 6009, 6010, 3, 524, 262, 0, 6010, 6011, 5, 100, 0, 0, 6011, 6012, 3, 1342, 671, 0, 6012, 6013, 5, 302, 0, 0, 6013, 6014, 5, 94, 0, 0, 6014, 6015, 3, 1342, 671, 0, 6015, 6390, 1, 0, 0, 0, 6016, 6017, 5, 138, 0, 0, 6017, 6018, 5, 445, 0, 0, 6018, 6019, 3, 1342, 671, 0, 6019, 6020, 5, 80, 0, 0, 6020, 6021, 3, 1338, 669, 0, 6021, 6022, 5, 302, 0, 0, 6022, 6023, 5, 94, 0, 0, 6023, 6024, 3, 1342, 671, 0, 6024, 6390, 1, 0, 0, 0, 6025, 6026, 5, 138, 0, 0, 6026, 6027, 5, 445, 0, 0, 6027, 6028, 5, 220, 0, 0, 6028, 6029, 5, 389, 0, 0, 6029, 6030, 3, 1342, 671, 0, 6030, 6031, 5, 80, 0, 0, 6031, 6032, 3, 1338, 669, 0, 6032, 6033, 5, 302, 0, 0, 6033, 6034, 5, 94, 0, 0, 6034, 6035, 3, 1342, 671, 0, 6035, 6390, 1, 0, 0, 0, 6036, 6037, 5, 138, 0, 0, 6037, 6038, 5, 289, 0, 0, 6038, 6039, 3, 626, 313, 0, 6039, 6040, 5, 302, 0, 0, 6040, 6041, 5, 94, 0, 0, 6041, 6042, 3, 1342, 671, 0, 6042, 6390, 1, 0, 0, 0, 6043, 6044, 5, 138, 0, 0, 6044, 6045, 5, 452, 0, 0, 6045, 6046, 3, 1342, 671, 0, 6046, 6047, 5, 302, 0, 0, 6047, 6048, 5, 94, 0, 0, 6048, 6049, 3, 1342, 671, 0, 6049, 6390, 1, 0, 0, 0, 6050, 6051, 5, 138, 0, 0, 6051, 6052, 5, 442, 0, 0, 6052, 6053, 3, 626, 313, 0, 6053, 6054, 5, 302, 0, 0, 6054, 6055, 5, 94, 0, 0, 6055, 6056, 3, 1342, 671, 0, 6056, 6390, 1, 0, 0, 0, 6057, 6058, 5, 138, 0, 0, 6058, 6059, 5, 316, 0, 0, 6059, 6060, 3, 1342, 671, 0, 6060, 6061, 5, 302, 0, 0, 6061, 6062, 5, 94, 0, 0, 6062, 6063, 3, 1342, 671, 0, 6063, 6390, 1, 0, 0, 0, 6064, 6065, 5, 138, 0, 0, 6065, 6066, 5, 324, 0, 0, 6066, 6067, 3, 1342, 671, 0, 6067, 6068, 5, 302, 0, 0, 6068, 6069, 5, 94, 0, 0, 6069, 6070, 3, 1342, 671, 0, 6070, 6390, 1, 0, 0, 0, 6071, 6072, 5, 138, 0, 0, 6072, 6073, 5, 451, 0, 0, 6073, 6074, 3, 1342, 671, 0, 6074, 6075, 5, 302, 0, 0, 6075, 6076, 5, 94, 0, 0, 6076, 6077, 3, 1342, 671, 0, 6077, 6390, 1, 0, 0, 0, 6078, 6079, 5, 138, 0, 0, 6079, 6080, 5, 92, 0, 0, 6080, 6081, 3, 1076, 538, 0, 6081, 6082, 5, 302, 0, 0, 6082, 6083, 5, 94, 0, 0, 6083, 6084, 3, 1342, 671, 0, 6084, 6390, 1, 0, 0, 0, 6085, 6086, 5, 138, 0, 0, 6086, 6087, 5, 92, 0, 0, 6087, 6088, 5, 220, 0, 0, 6088, 6089, 5, 389, 0, 0, 6089, 6090, 3, 1076, 538, 0, 6090, 6091, 5, 302, 0, 0, 6091, 6092, 5, 94, 0, 0, 6092, 6093, 3, 1342, 671, 0, 6093, 6390, 1, 0, 0, 0, 6094, 6095, 5, 138, 0, 0, 6095, 6096, 5, 321, 0, 0, 6096, 6097, 3, 1338, 669, 0, 6097, 6098, 5, 302, 0, 0, 6098, 6099, 5, 94, 0, 0, 6099, 6100, 3, 1342, 671, 0, 6100, 6390, 1, 0, 0, 0, 6101, 6102, 5, 138, 0, 0, 6102, 6103, 5, 321, 0, 0, 6103, 6104, 5, 220, 0, 0, 6104, 6105, 5, 389, 0, 0, 6105, 6106, 3, 1338, 669, 0, 6106, 6107, 5, 302, 0, 0, 6107, 6108, 5, 94, 0, 0, 6108, 6109, 3, 1342, 671, 0, 6109, 6390, 1, 0, 0, 0, 6110, 6111, 5, 138, 0, 0, 6111, 6112, 5, 369, 0, 0, 6112, 6113, 3, 1338, 669, 0, 6113, 6114, 5, 302, 0, 0, 6114, 6115, 5, 94, 0, 0, 6115, 6116, 3, 1342, 671, 0, 6116, 6390, 1, 0, 0, 0, 6117, 6118, 5, 138, 0, 0, 6118, 6119, 5, 369, 0, 0, 6119, 6120, 5, 220, 0, 0, 6120, 6121, 5, 389, 0, 0, 6121, 6122, 3, 1338, 669, 0, 6122, 6123, 5, 302, 0, 0, 6123, 6124, 5, 94, 0, 0, 6124, 6125, 3, 1342, 671, 0, 6125, 6390, 1, 0, 0, 0, 6126, 6127, 5, 138, 0, 0, 6127, 6128, 5, 251, 0, 0, 6128, 6129, 5, 369, 0, 0, 6129, 6130, 3, 1338, 669, 0, 6130, 6131, 5, 302, 0, 0, 6131, 6132, 5, 94, 0, 0, 6132, 6133, 3, 1342, 671, 0, 6133, 6390, 1, 0, 0, 0, 6134, 6135, 5, 138, 0, 0, 6135, 6136, 5, 251, 0, 0, 6136, 6137, 5, 369, 0, 0, 6137, 6138, 5, 220, 0, 0, 6138, 6139, 5, 389, 0, 0, 6139, 6140, 3, 1338, 669, 0, 6140, 6141, 5, 302, 0, 0, 6141, 6142, 5, 94, 0, 0, 6142, 6143, 3, 1342, 671, 0, 6143, 6390, 1, 0, 0, 0, 6144, 6145, 5, 138, 0, 0, 6145, 6146, 5, 226, 0, 0, 6146, 6147, 3, 1338, 669, 0, 6147, 6148, 5, 302, 0, 0, 6148, 6149, 5, 94, 0, 0, 6149, 6150, 3, 1342, 671, 0, 6150, 6390, 1, 0, 0, 0, 6151, 6152, 5, 138, 0, 0, 6152, 6153, 5, 226, 0, 0, 6153, 6154, 5, 220, 0, 0, 6154, 6155, 5, 389, 0, 0, 6155, 6156, 3, 1338, 669, 0, 6156, 6157, 5, 302, 0, 0, 6157, 6158, 5, 94, 0, 0, 6158, 6159, 3, 1342, 671, 0, 6159, 6390, 1, 0, 0, 0, 6160, 6161, 5, 138, 0, 0, 6161, 6162, 5, 63, 0, 0, 6162, 6163, 5, 92, 0, 0, 6163, 6164, 3, 1076, 538, 0, 6164, 6165, 5, 302, 0, 0, 6165, 6166, 5, 94, 0, 0, 6166, 6167, 3, 1342, 671, 0, 6167, 6390, 1, 0, 0, 0, 6168, 6169, 5, 138, 0, 0, 6169, 6170, 5, 63, 0, 0, 6170, 6171, 5, 92, 0, 0, 6171, 6172, 5, 220, 0, 0, 6172, 6173, 5, 389, 0, 0, 6173, 6174, 3, 1076, 538, 0, 6174, 6175, 5, 302, 0, 0, 6175, 6176, 5, 94, 0, 0, 6176, 6177, 3, 1342, 671, 0, 6177, 6390, 1, 0, 0, 0, 6178, 6179, 5, 138, 0, 0, 6179, 6180, 5, 92, 0, 0, 6180, 6181, 3, 1076, 538, 0, 6181, 6182, 5, 302, 0, 0, 6182, 6183, 3, 724, 362, 0, 6183, 6184, 3, 1342, 671, 0, 6184, 6185, 5, 94, 0, 0, 6185, 6186, 3, 1342, 671, 0, 6186, 6390, 1, 0, 0, 0, 6187, 6188, 5, 138, 0, 0, 6188, 6189, 5, 92, 0, 0, 6189, 6190, 5, 220, 0, 0, 6190, 6191, 5, 389, 0, 0, 6191, 6192, 3, 1076, 538, 0, 6192, 6193, 5, 302, 0, 0, 6193, 6194, 3, 724, 362, 0, 6194, 6195, 3, 1342, 671, 0, 6195, 6196, 5, 94, 0, 0, 6196, 6197, 3, 1342, 671, 0, 6197, 6390, 1, 0, 0, 0, 6198, 6199, 5, 138, 0, 0, 6199, 6200, 5, 369, 0, 0, 6200, 6201, 3, 1338, 669, 0, 6201, 6202, 5, 302, 0, 0, 6202, 6203, 3, 724, 362, 0, 6203, 6204, 3, 1342, 671, 0, 6204, 6205, 5, 94, 0, 0, 6205, 6206, 3, 1342, 671, 0, 6206, 6390, 1, 0, 0, 0, 6207, 6208, 5, 138, 0, 0, 6208, 6209, 5, 369, 0, 0, 6209, 6210, 5, 220, 0, 0, 6210, 6211, 5, 389, 0, 0, 6211, 6212, 3, 1338, 669, 0, 6212, 6213, 5, 302, 0, 0, 6213, 6214, 3, 724, 362, 0, 6214, 6215, 3, 1342, 671, 0, 6215, 6216, 5, 94, 0, 0, 6216, 6217, 3, 1342, 671, 0, 6217, 6390, 1, 0, 0, 0, 6218, 6219, 5, 138, 0, 0, 6219, 6220, 5, 251, 0, 0, 6220, 6221, 5, 369, 0, 0, 6221, 6222, 3, 1338, 669, 0, 6222, 6223, 5, 302, 0, 0, 6223, 6224, 3, 724, 362, 0, 6224, 6225, 3, 1342, 671, 0, 6225, 6226, 5, 94, 0, 0, 6226, 6227, 3, 1342, 671, 0, 6227, 6390, 1, 0, 0, 0, 6228, 6229, 5, 138, 0, 0, 6229, 6230, 5, 251, 0, 0, 6230, 6231, 5, 369, 0, 0, 6231, 6232, 5, 220, 0, 0, 6232, 6233, 5, 389, 0, 0, 6233, 6234, 3, 1338, 669, 0, 6234, 6235, 5, 302, 0, 0, 6235, 6236, 3, 724, 362, 0, 6236, 6237, 3, 1342, 671, 0, 6237, 6238, 5, 94, 0, 0, 6238, 6239, 3, 1342, 671, 0, 6239, 6390, 1, 0, 0, 0, 6240, 6241, 5, 138, 0, 0, 6241, 6242, 5, 92, 0, 0, 6242, 6243, 3, 1076, 538, 0, 6243, 6244, 5, 302, 0, 0, 6244, 6245, 5, 45, 0, 0, 6245, 6246, 3, 1342, 671, 0, 6246, 6247, 5, 94, 0, 0, 6247, 6248, 3, 1342, 671, 0, 6248, 6390, 1, 0, 0, 0, 6249, 6250, 5, 138, 0, 0, 6250, 6251, 5, 92, 0, 0, 6251, 6252, 5, 220, 0, 0, 6252, 6253, 5, 389, 0, 0, 6253, 6254, 3, 1076, 538, 0, 6254, 6255, 5, 302, 0, 0, 6255, 6256, 5, 45, 0, 0, 6256, 6257, 3, 1342, 671, 0, 6257, 6258, 5, 94, 0, 0, 6258, 6259, 3, 1342, 671, 0, 6259, 6390, 1, 0, 0, 0, 6260, 6261, 5, 138, 0, 0, 6261, 6262, 5, 63, 0, 0, 6262, 6263, 5, 92, 0, 0, 6263, 6264, 3, 1076, 538, 0, 6264, 6265, 5, 302, 0, 0, 6265, 6266, 3, 724, 362, 0, 6266, 6267, 3, 1342, 671, 0, 6267, 6268, 5, 94, 0, 0, 6268, 6269, 3, 1342, 671, 0, 6269, 6390, 1, 0, 0, 0, 6270, 6271, 5, 138, 0, 0, 6271, 6272, 5, 63, 0, 0, 6272, 6273, 5, 92, 0, 0, 6273, 6274, 5, 220, 0, 0, 6274, 6275, 5, 389, 0, 0, 6275, 6276, 3, 1076, 538, 0, 6276, 6277, 5, 302, 0, 0, 6277, 6278, 3, 724, 362, 0, 6278, 6279, 3, 1342, 671, 0, 6279, 6280, 5, 94, 0, 0, 6280, 6281, 3, 1342, 671, 0, 6281, 6390, 1, 0, 0, 0, 6282, 6283, 5, 138, 0, 0, 6283, 6284, 5, 314, 0, 0, 6284, 6285, 3, 1342, 671, 0, 6285, 6286, 5, 80, 0, 0, 6286, 6287, 3, 1338, 669, 0, 6287, 6288, 5, 302, 0, 0, 6288, 6289, 5, 94, 0, 0, 6289, 6290, 3, 1342, 671, 0, 6290, 6390, 1, 0, 0, 0, 6291, 6292, 5, 138, 0, 0, 6292, 6293, 5, 350, 0, 0, 6293, 6294, 3, 1342, 671, 0, 6294, 6295, 5, 80, 0, 0, 6295, 6296, 3, 1338, 669, 0, 6296, 6297, 5, 302, 0, 0, 6297, 6298, 5, 94, 0, 0, 6298, 6299, 3, 1342, 671, 0, 6299, 6390, 1, 0, 0, 0, 6300, 6301, 5, 138, 0, 0, 6301, 6302, 5, 198, 0, 0, 6302, 6303, 5, 350, 0, 0, 6303, 6304, 3, 1342, 671, 0, 6304, 6305, 5, 302, 0, 0, 6305, 6306, 5, 94, 0, 0, 6306, 6307, 3, 1342, 671, 0, 6307, 6390, 1, 0, 0, 0, 6308, 6309, 5, 138, 0, 0, 6309, 6310, 5, 311, 0, 0, 6310, 6311, 3, 1368, 684, 0, 6311, 6312, 5, 302, 0, 0, 6312, 6313, 5, 94, 0, 0, 6313, 6314, 3, 1368, 684, 0, 6314, 6390, 1, 0, 0, 0, 6315, 6316, 5, 138, 0, 0, 6316, 6317, 5, 99, 0, 0, 6317, 6318, 3, 1368, 684, 0, 6318, 6319, 5, 302, 0, 0, 6319, 6320, 5, 94, 0, 0, 6320, 6321, 3, 1368, 684, 0, 6321, 6390, 1, 0, 0, 0, 6322, 6323, 5, 138, 0, 0, 6323, 6324, 5, 344, 0, 0, 6324, 6325, 3, 1342, 671, 0, 6325, 6326, 5, 302, 0, 0, 6326, 6327, 5, 94, 0, 0, 6327, 6328, 3, 1342, 671, 0, 6328, 6390, 1, 0, 0, 0, 6329, 6330, 5, 138, 0, 0, 6330, 6331, 5, 335, 0, 0, 6331, 6332, 3, 524, 262, 0, 6332, 6333, 5, 302, 0, 0, 6333, 6334, 5, 94, 0, 0, 6334, 6335, 3, 1342, 671, 0, 6335, 6390, 1, 0, 0, 0, 6336, 6337, 5, 138, 0, 0, 6337, 6338, 5, 348, 0, 0, 6338, 6339, 5, 318, 0, 0, 6339, 6340, 5, 276, 0, 0, 6340, 6341, 3, 524, 262, 0, 6341, 6342, 5, 302, 0, 0, 6342, 6343, 5, 94, 0, 0, 6343, 6344, 3, 1342, 671, 0, 6344, 6390, 1, 0, 0, 0, 6345, 6346, 5, 138, 0, 0, 6346, 6347, 5, 348, 0, 0, 6347, 6348, 5, 318, 0, 0, 6348, 6349, 5, 185, 0, 0, 6349, 6350, 3, 524, 262, 0, 6350, 6351, 5, 302, 0, 0, 6351, 6352, 5, 94, 0, 0, 6352, 6353, 3, 1342, 671, 0, 6353, 6390, 1, 0, 0, 0, 6354, 6355, 5, 138, 0, 0, 6355, 6356, 5, 348, 0, 0, 6356, 6357, 5, 318, 0, 0, 6357, 6358, 5, 346, 0, 0, 6358, 6359, 3, 524, 262, 0, 6359, 6360, 5, 302, 0, 0, 6360, 6361, 5, 94, 0, 0, 6361, 6362, 3, 1342, 671, 0, 6362, 6390, 1, 0, 0, 0, 6363, 6364, 5, 138, 0, 0, 6364, 6365, 5, 348, 0, 0, 6365, 6366, 5, 318, 0, 0, 6366, 6367, 5, 163, 0, 0, 6367, 6368, 3, 524, 262, 0, 6368, 6369, 5, 302, 0, 0, 6369, 6370, 5, 94, 0, 0, 6370, 6371, 3, 1342, 671, 0, 6371, 6390, 1, 0, 0, 0, 6372, 6373, 5, 138, 0, 0, 6373, 6374, 5, 353, 0, 0, 6374, 6375, 3, 524, 262, 0, 6375, 6376, 5, 302, 0, 0, 6376, 6377, 5, 94, 0, 0, 6377, 6378, 3, 1342, 671, 0, 6378, 6390, 1, 0, 0, 0, 6379, 6380, 5, 138, 0, 0, 6380, 6381, 5, 353, 0, 0, 6381, 6382, 3, 524, 262, 0, 6382, 6383, 5, 302, 0, 0, 6383, 6384, 5, 143, 0, 0, 6384, 6385, 3, 1342, 671, 0, 6385, 6386, 5, 94, 0, 0, 6386, 6387, 3, 1342, 671, 0, 6387, 6388, 3, 108, 54, 0, 6388, 6390, 1, 0, 0, 0, 6389, 5921, 1, 0, 0, 0, 6389, 5928, 1, 0, 0, 0, 6389, 5935, 1, 0, 0, 0, 6389, 5942, 1, 0, 0, 0, 6389, 5949, 1, 0, 0, 0, 6389, 5956, 1, 0, 0, 0, 6389, 5965, 1, 0, 0, 0, 6389, 5974, 1, 0, 0, 0, 6389, 5981, 1, 0, 0, 0, 6389, 5988, 1, 0, 0, 0, 6389, 5996, 1, 0, 0, 0, 6389, 6006, 1, 0, 0, 0, 6389, 6016, 1, 0, 0, 0, 6389, 6025, 1, 0, 0, 0, 6389, 6036, 1, 0, 0, 0, 6389, 6043, 1, 0, 0, 0, 6389, 6050, 1, 0, 0, 0, 6389, 6057, 1, 0, 0, 0, 6389, 6064, 1, 0, 0, 0, 6389, 6071, 1, 0, 0, 0, 6389, 6078, 1, 0, 0, 0, 6389, 6085, 1, 0, 0, 0, 6389, 6094, 1, 0, 0, 0, 6389, 6101, 1, 0, 0, 0, 6389, 6110, 1, 0, 0, 0, 6389, 6117, 1, 0, 0, 0, 6389, 6126, 1, 0, 0, 0, 6389, 6134, 1, 0, 0, 0, 6389, 6144, 1, 0, 0, 0, 6389, 6151, 1, 0, 0, 0, 6389, 6160, 1, 0, 0, 0, 6389, 6168, 1, 0, 0, 0, 6389, 6178, 1, 0, 0, 0, 6389, 6187, 1, 0, 0, 0, 6389, 6198, 1, 0, 0, 0, 6389, 6207, 1, 0, 0, 0, 6389, 6218, 1, 0, 0, 0, 6389, 6228, 1, 0, 0, 0, 6389, 6240, 1, 0, 0, 0, 6389, 6249, 1, 0, 0, 0, 6389, 6260, 1, 0, 0, 0, 6389, 6270, 1, 0, 0, 0, 6389, 6282, 1, 0, 0, 0, 6389, 6291, 1, 0, 0, 0, 6389, 6300, 1, 0, 0, 0, 6389, 6308, 1, 0, 0, 0, 6389, 6315, 1, 0, 0, 0, 6389, 6322, 1, 0, 0, 0, 6389, 6329, 1, 0, 0, 0, 6389, 6336, 1, 0, 0, 0, 6389, 6345, 1, 0, 0, 0, 6389, 6354, 1, 0, 0, 0, 6389, 6363, 1, 0, 0, 0, 6389, 6372, 1, 0, 0, 0, 6389, 6379, 1, 0, 0, 0, 6390, 723, 1, 0, 0, 0, 6391, 6394, 5, 44, 0, 0, 6392, 6394, 1, 0, 0, 0, 6393, 6391, 1, 0, 0, 0, 6393, 6392, 1, 0, 0, 0, 6394, 725, 1, 0, 0, 0, 6395, 6396, 5, 326, 0, 0, 6396, 6399, 5, 174, 0, 0, 6397, 6399, 1, 0, 0, 0, 6398, 6395, 1, 0, 0, 0, 6398, 6397, 1, 0, 0, 0, 6399, 727, 1, 0, 0, 0, 6400, 6401, 5, 138, 0, 0, 6401, 6402, 5, 211, 0, 0, 6402, 6403, 3, 626, 313, 0, 6403, 6404, 3, 730, 365, 0, 6404, 6405, 5, 462, 0, 0, 6405, 6406, 5, 80, 0, 0, 6406, 6407, 5, 204, 0, 0, 6407, 6408, 3, 1342, 671, 0, 6408, 6458, 1, 0, 0, 0, 6409, 6410, 5, 138, 0, 0, 6410, 6411, 5, 289, 0, 0, 6411, 6412, 3, 626, 313, 0, 6412, 6413, 3, 730, 365, 0, 6413, 6414, 5, 462, 0, 0, 6414, 6415, 5, 80, 0, 0, 6415, 6416, 5, 204, 0, 0, 6416, 6417, 3, 1342, 671, 0, 6417, 6458, 1, 0, 0, 0, 6418, 6419, 5, 138, 0, 0, 6419, 6420, 5, 442, 0, 0, 6420, 6421, 3, 626, 313, 0, 6421, 6422, 3, 730, 365, 0, 6422, 6423, 5, 462, 0, 0, 6423, 6424, 5, 80, 0, 0, 6424, 6425, 5, 204, 0, 0, 6425, 6426, 3, 1342, 671, 0, 6426, 6458, 1, 0, 0, 0, 6427, 6428, 5, 138, 0, 0, 6428, 6429, 5, 350, 0, 0, 6429, 6430, 3, 1342, 671, 0, 6430, 6431, 5, 80, 0, 0, 6431, 6432, 3, 1338, 669, 0, 6432, 6433, 3, 730, 365, 0, 6433, 6434, 5, 462, 0, 0, 6434, 6435, 5, 80, 0, 0, 6435, 6436, 5, 204, 0, 0, 6436, 6437, 3, 1342, 671, 0, 6437, 6458, 1, 0, 0, 0, 6438, 6439, 5, 138, 0, 0, 6439, 6440, 5, 251, 0, 0, 6440, 6441, 5, 369, 0, 0, 6441, 6442, 3, 1338, 669, 0, 6442, 6443, 3, 730, 365, 0, 6443, 6444, 5, 462, 0, 0, 6444, 6445, 5, 80, 0, 0, 6445, 6446, 5, 204, 0, 0, 6446, 6447, 3, 1342, 671, 0, 6447, 6458, 1, 0, 0, 0, 6448, 6449, 5, 138, 0, 0, 6449, 6450, 5, 226, 0, 0, 6450, 6451, 3, 1338, 669, 0, 6451, 6452, 3, 730, 365, 0, 6452, 6453, 5, 462, 0, 0, 6453, 6454, 5, 80, 0, 0, 6454, 6455, 5, 204, 0, 0, 6455, 6456, 3, 1342, 671, 0, 6456, 6458, 1, 0, 0, 0, 6457, 6400, 1, 0, 0, 0, 6457, 6409, 1, 0, 0, 0, 6457, 6418, 1, 0, 0, 0, 6457, 6427, 1, 0, 0, 0, 6457, 6438, 1, 0, 0, 0, 6457, 6448, 1, 0, 0, 0, 6458, 729, 1, 0, 0, 0, 6459, 6462, 5, 262, 0, 0, 6460, 6462, 1, 0, 0, 0, 6461, 6459, 1, 0, 0, 0, 6461, 6460, 1, 0, 0, 0, 6462, 731, 1, 0, 0, 0, 6463, 6464, 5, 138, 0, 0, 6464, 6465, 5, 136, 0, 0, 6465, 6466, 3, 650, 325, 0, 6466, 6467, 5, 326, 0, 0, 6467, 6468, 5, 316, 0, 0, 6468, 6469, 3, 1342, 671, 0, 6469, 6681, 1, 0, 0, 0, 6470, 6471, 5, 138, 0, 0, 6471, 6472, 5, 108, 0, 0, 6472, 6473, 3, 524, 262, 0, 6473, 6474, 5, 326, 0, 0, 6474, 6475, 5, 316, 0, 0, 6475, 6476, 3, 1342, 671, 0, 6476, 6681, 1, 0, 0, 0, 6477, 6478, 5, 138, 0, 0, 6478, 6479, 5, 168, 0, 0, 6479, 6480, 3, 524, 262, 0, 6480, 6481, 5, 326, 0, 0, 6481, 6482, 5, 316, 0, 0, 6482, 6483, 3, 1342, 671, 0, 6483, 6681, 1, 0, 0, 0, 6484, 6485, 5, 138, 0, 0, 6485, 6486, 5, 189, 0, 0, 6486, 6487, 3, 524, 262, 0, 6487, 6488, 5, 326, 0, 0, 6488, 6489, 5, 316, 0, 0, 6489, 6490, 3, 1342, 671, 0, 6490, 6681, 1, 0, 0, 0, 6491, 6492, 5, 138, 0, 0, 6492, 6493, 5, 204, 0, 0, 6493, 6494, 3, 1342, 671, 0, 6494, 6495, 5, 326, 0, 0, 6495, 6496, 5, 316, 0, 0, 6496, 6497, 3, 1342, 671, 0, 6497, 6681, 1, 0, 0, 0, 6498, 6499, 5, 138, 0, 0, 6499, 6500, 5, 211, 0, 0, 6500, 6501, 3, 626, 313, 0, 6501, 6502, 5, 326, 0, 0, 6502, 6503, 5, 316, 0, 0, 6503, 6504, 3, 1342, 671, 0, 6504, 6681, 1, 0, 0, 0, 6505, 6506, 5, 138, 0, 0, 6506, 6507, 5, 271, 0, 0, 6507, 6508, 3, 688, 344, 0, 6508, 6509, 5, 326, 0, 0, 6509, 6510, 5, 316, 0, 0, 6510, 6511, 3, 1342, 671, 0, 6511, 6681, 1, 0, 0, 0, 6512, 6513, 5, 138, 0, 0, 6513, 6514, 5, 271, 0, 0, 6514, 6515, 5, 156, 0, 0, 6515, 6516, 3, 524, 262, 0, 6516, 6517, 5, 100, 0, 0, 6517, 6518, 3, 1342, 671, 0, 6518, 6519, 5, 326, 0, 0, 6519, 6520, 5, 316, 0, 0, 6520, 6521, 3, 1342, 671, 0, 6521, 6681, 1, 0, 0, 0, 6522, 6523, 5, 138, 0, 0, 6523, 6524, 5, 271, 0, 0, 6524, 6525, 5, 206, 0, 0, 6525, 6526, 3, 524, 262, 0, 6526, 6527, 5, 100, 0, 0, 6527, 6528, 3, 1342, 671, 0, 6528, 6529, 5, 326, 0, 0, 6529, 6530, 5, 316, 0, 0, 6530, 6531, 3, 1342, 671, 0, 6531, 6681, 1, 0, 0, 0, 6532, 6533, 5, 138, 0, 0, 6533, 6534, 5, 289, 0, 0, 6534, 6535, 3, 626, 313, 0, 6535, 6536, 5, 326, 0, 0, 6536, 6537, 5, 316, 0, 0, 6537, 6538, 3, 1342, 671, 0, 6538, 6681, 1, 0, 0, 0, 6539, 6540, 5, 138, 0, 0, 6540, 6541, 5, 442, 0, 0, 6541, 6542, 3, 626, 313, 0, 6542, 6543, 5, 326, 0, 0, 6543, 6544, 5, 316, 0, 0, 6544, 6545, 3, 1342, 671, 0, 6545, 6681, 1, 0, 0, 0, 6546, 6547, 5, 138, 0, 0, 6547, 6548, 5, 92, 0, 0, 6548, 6549, 3, 1076, 538, 0, 6549, 6550, 5, 326, 0, 0, 6550, 6551, 5, 316, 0, 0, 6551, 6552, 3, 1342, 671, 0, 6552, 6681, 1, 0, 0, 0, 6553, 6554, 5, 138, 0, 0, 6554, 6555, 5, 92, 0, 0, 6555, 6556, 5, 220, 0, 0, 6556, 6557, 5, 389, 0, 0, 6557, 6558, 3, 1076, 538, 0, 6558, 6559, 5, 326, 0, 0, 6559, 6560, 5, 316, 0, 0, 6560, 6561, 3, 1342, 671, 0, 6561, 6681, 1, 0, 0, 0, 6562, 6563, 5, 138, 0, 0, 6563, 6564, 5, 335, 0, 0, 6564, 6565, 3, 524, 262, 0, 6565, 6566, 5, 326, 0, 0, 6566, 6567, 5, 316, 0, 0, 6567, 6568, 3, 1342, 671, 0, 6568, 6681, 1, 0, 0, 0, 6569, 6570, 5, 138, 0, 0, 6570, 6571, 5, 348, 0, 0, 6571, 6572, 5, 318, 0, 0, 6572, 6573, 5, 276, 0, 0, 6573, 6574, 3, 524, 262, 0, 6574, 6575, 5, 326, 0, 0, 6575, 6576, 5, 316, 0, 0, 6576, 6577, 3, 1342, 671, 0, 6577, 6681, 1, 0, 0, 0, 6578, 6579, 5, 138, 0, 0, 6579, 6580, 5, 348, 0, 0, 6580, 6581, 5, 318, 0, 0, 6581, 6582, 5, 185, 0, 0, 6582, 6583, 3, 524, 262, 0, 6583, 6584, 5, 326, 0, 0, 6584, 6585, 5, 316, 0, 0, 6585, 6586, 3, 1342, 671, 0, 6586, 6681, 1, 0, 0, 0, 6587, 6588, 5, 138, 0, 0, 6588, 6589, 5, 348, 0, 0, 6589, 6590, 5, 318, 0, 0, 6590, 6591, 5, 346, 0, 0, 6591, 6592, 3, 524, 262, 0, 6592, 6593, 5, 326, 0, 0, 6593, 6594, 5, 316, 0, 0, 6594, 6595, 3, 1342, 671, 0, 6595, 6681, 1, 0, 0, 0, 6596, 6597, 5, 138, 0, 0, 6597, 6598, 5, 348, 0, 0, 6598, 6599, 5, 318, 0, 0, 6599, 6600, 5, 163, 0, 0, 6600, 6601, 3, 524, 262, 0, 6601, 6602, 5, 326, 0, 0, 6602, 6603, 5, 316, 0, 0, 6603, 6604, 3, 1342, 671, 0, 6604, 6681, 1, 0, 0, 0, 6605, 6606, 5, 138, 0, 0, 6606, 6607, 5, 321, 0, 0, 6607, 6608, 3, 1338, 669, 0, 6608, 6609, 5, 326, 0, 0, 6609, 6610, 5, 316, 0, 0, 6610, 6611, 3, 1342, 671, 0, 6611, 6681, 1, 0, 0, 0, 6612, 6613, 5, 138, 0, 0, 6613, 6614, 5, 321, 0, 0, 6614, 6615, 5, 220, 0, 0, 6615, 6616, 5, 389, 0, 0, 6616, 6617, 3, 1338, 669, 0, 6617, 6618, 5, 326, 0, 0, 6618, 6619, 5, 316, 0, 0, 6619, 6620, 3, 1342, 671, 0, 6620, 6681, 1, 0, 0, 0, 6621, 6622, 5, 138, 0, 0, 6622, 6623, 5, 369, 0, 0, 6623, 6624, 3, 1338, 669, 0, 6624, 6625, 5, 326, 0, 0, 6625, 6626, 5, 316, 0, 0, 6626, 6627, 3, 1342, 671, 0, 6627, 6681, 1, 0, 0, 0, 6628, 6629, 5, 138, 0, 0, 6629, 6630, 5, 369, 0, 0, 6630, 6631, 5, 220, 0, 0, 6631, 6632, 5, 389, 0, 0, 6632, 6633, 3, 1338, 669, 0, 6633, 6634, 5, 326, 0, 0, 6634, 6635, 5, 316, 0, 0, 6635, 6636, 3, 1342, 671, 0, 6636, 6681, 1, 0, 0, 0, 6637, 6638, 5, 138, 0, 0, 6638, 6639, 5, 251, 0, 0, 6639, 6640, 5, 369, 0, 0, 6640, 6641, 3, 1338, 669, 0, 6641, 6642, 5, 326, 0, 0, 6642, 6643, 5, 316, 0, 0, 6643, 6644, 3, 1342, 671, 0, 6644, 6681, 1, 0, 0, 0, 6645, 6646, 5, 138, 0, 0, 6646, 6647, 5, 251, 0, 0, 6647, 6648, 5, 369, 0, 0, 6648, 6649, 5, 220, 0, 0, 6649, 6650, 5, 389, 0, 0, 6650, 6651, 3, 1338, 669, 0, 6651, 6652, 5, 326, 0, 0, 6652, 6653, 5, 316, 0, 0, 6653, 6654, 3, 1342, 671, 0, 6654, 6681, 1, 0, 0, 0, 6655, 6656, 5, 138, 0, 0, 6656, 6657, 5, 63, 0, 0, 6657, 6658, 5, 92, 0, 0, 6658, 6659, 3, 1076, 538, 0, 6659, 6660, 5, 326, 0, 0, 6660, 6661, 5, 316, 0, 0, 6661, 6662, 3, 1342, 671, 0, 6662, 6681, 1, 0, 0, 0, 6663, 6664, 5, 138, 0, 0, 6664, 6665, 5, 63, 0, 0, 6665, 6666, 5, 92, 0, 0, 6666, 6667, 5, 220, 0, 0, 6667, 6668, 5, 389, 0, 0, 6668, 6669, 3, 1076, 538, 0, 6669, 6670, 5, 326, 0, 0, 6670, 6671, 5, 316, 0, 0, 6671, 6672, 3, 1342, 671, 0, 6672, 6681, 1, 0, 0, 0, 6673, 6674, 5, 138, 0, 0, 6674, 6675, 5, 353, 0, 0, 6675, 6676, 3, 524, 262, 0, 6676, 6677, 5, 326, 0, 0, 6677, 6678, 5, 316, 0, 0, 6678, 6679, 3, 1342, 671, 0, 6679, 6681, 1, 0, 0, 0, 6680, 6463, 1, 0, 0, 0, 6680, 6470, 1, 0, 0, 0, 6680, 6477, 1, 0, 0, 0, 6680, 6484, 1, 0, 0, 0, 6680, 6491, 1, 0, 0, 0, 6680, 6498, 1, 0, 0, 0, 6680, 6505, 1, 0, 0, 0, 6680, 6512, 1, 0, 0, 0, 6680, 6522, 1, 0, 0, 0, 6680, 6532, 1, 0, 0, 0, 6680, 6539, 1, 0, 0, 0, 6680, 6546, 1, 0, 0, 0, 6680, 6553, 1, 0, 0, 0, 6680, 6562, 1, 0, 0, 0, 6680, 6569, 1, 0, 0, 0, 6680, 6578, 1, 0, 0, 0, 6680, 6587, 1, 0, 0, 0, 6680, 6596, 1, 0, 0, 0, 6680, 6605, 1, 0, 0, 0, 6680, 6612, 1, 0, 0, 0, 6680, 6621, 1, 0, 0, 0, 6680, 6628, 1, 0, 0, 0, 6680, 6637, 1, 0, 0, 0, 6680, 6645, 1, 0, 0, 0, 6680, 6655, 1, 0, 0, 0, 6680, 6663, 1, 0, 0, 0, 6680, 6673, 1, 0, 0, 0, 6681, 733, 1, 0, 0, 0, 6682, 6683, 5, 138, 0, 0, 6683, 6684, 5, 271, 0, 0, 6684, 6685, 3, 688, 344, 0, 6685, 6686, 5, 326, 0, 0, 6686, 6687, 5, 2, 0, 0, 6687, 6688, 3, 736, 368, 0, 6688, 6689, 5, 3, 0, 0, 6689, 735, 1, 0, 0, 0, 6690, 6695, 3, 738, 369, 0, 6691, 6692, 5, 6, 0, 0, 6692, 6694, 3, 738, 369, 0, 6693, 6691, 1, 0, 0, 0, 6694, 6697, 1, 0, 0, 0, 6695, 6693, 1, 0, 0, 0, 6695, 6696, 1, 0, 0, 0, 6696, 737, 1, 0, 0, 0, 6697, 6695, 1, 0, 0, 0, 6698, 6699, 3, 1382, 691, 0, 6699, 6700, 5, 10, 0, 0, 6700, 6701, 5, 400, 0, 0, 6701, 6707, 1, 0, 0, 0, 6702, 6703, 3, 1382, 691, 0, 6703, 6704, 5, 10, 0, 0, 6704, 6705, 3, 740, 370, 0, 6705, 6707, 1, 0, 0, 0, 6706, 6698, 1, 0, 0, 0, 6706, 6702, 1, 0, 0, 0, 6707, 739, 1, 0, 0, 0, 6708, 6714, 3, 640, 320, 0, 6709, 6714, 3, 1394, 697, 0, 6710, 6714, 3, 1278, 639, 0, 6711, 6714, 3, 292, 146, 0, 6712, 6714, 3, 1360, 680, 0, 6713, 6708, 1, 0, 0, 0, 6713, 6709, 1, 0, 0, 0, 6713, 6710, 1, 0, 0, 0, 6713, 6711, 1, 0, 0, 0, 6713, 6712, 1, 0, 0, 0, 6714, 741, 1, 0, 0, 0, 6715, 6716, 5, 138, 0, 0, 6716, 6717, 5, 353, 0, 0, 6717, 6718, 3, 524, 262, 0, 6718, 6719, 5, 326, 0, 0, 6719, 6720, 5, 2, 0, 0, 6720, 6721, 3, 736, 368, 0, 6721, 6722, 5, 3, 0, 0, 6722, 743, 1, 0, 0, 0, 6723, 6724, 5, 138, 0, 0, 6724, 6725, 5, 136, 0, 0, 6725, 6726, 3, 650, 325, 0, 6726, 6727, 5, 275, 0, 0, 6727, 6728, 5, 94, 0, 0, 6728, 6729, 3, 1370, 685, 0, 6729, 6907, 1, 0, 0, 0, 6730, 6731, 5, 138, 0, 0, 6731, 6732, 5, 108, 0, 0, 6732, 6733, 3, 524, 262, 0, 6733, 6734, 5, 275, 0, 0, 6734, 6735, 5, 94, 0, 0, 6735, 6736, 3, 1370, 685, 0, 6736, 6907, 1, 0, 0, 0, 6737, 6738, 5, 138, 0, 0, 6738, 6739, 5, 168, 0, 0, 6739, 6740, 3, 524, 262, 0, 6740, 6741, 5, 275, 0, 0, 6741, 6742, 5, 94, 0, 0, 6742, 6743, 3, 1370, 685, 0, 6743, 6907, 1, 0, 0, 0, 6744, 6745, 5, 138, 0, 0, 6745, 6746, 5, 175, 0, 0, 6746, 6747, 3, 1342, 671, 0, 6747, 6748, 5, 275, 0, 0, 6748, 6749, 5, 94, 0, 0, 6749, 6750, 3, 1370, 685, 0, 6750, 6907, 1, 0, 0, 0, 6751, 6752, 5, 138, 0, 0, 6752, 6753, 5, 189, 0, 0, 6753, 6754, 3, 524, 262, 0, 6754, 6755, 5, 275, 0, 0, 6755, 6756, 5, 94, 0, 0, 6756, 6757, 3, 1370, 685, 0, 6757, 6907, 1, 0, 0, 0, 6758, 6759, 5, 138, 0, 0, 6759, 6760, 5, 211, 0, 0, 6760, 6761, 3, 626, 313, 0, 6761, 6762, 5, 275, 0, 0, 6762, 6763, 5, 94, 0, 0, 6763, 6764, 3, 1370, 685, 0, 6764, 6907, 1, 0, 0, 0, 6765, 6766, 5, 138, 0, 0, 6766, 6767, 3, 308, 154, 0, 6767, 6768, 5, 238, 0, 0, 6768, 6769, 3, 1342, 671, 0, 6769, 6770, 5, 275, 0, 0, 6770, 6771, 5, 94, 0, 0, 6771, 6772, 3, 1370, 685, 0, 6772, 6907, 1, 0, 0, 0, 6773, 6774, 5, 138, 0, 0, 6774, 6775, 5, 239, 0, 0, 6775, 6776, 5, 267, 0, 0, 6776, 6777, 3, 292, 146, 0, 6777, 6778, 5, 275, 0, 0, 6778, 6779, 5, 94, 0, 0, 6779, 6780, 3, 1370, 685, 0, 6780, 6907, 1, 0, 0, 0, 6781, 6782, 5, 138, 0, 0, 6782, 6783, 5, 271, 0, 0, 6783, 6784, 3, 688, 344, 0, 6784, 6785, 5, 275, 0, 0, 6785, 6786, 5, 94, 0, 0, 6786, 6787, 3, 1370, 685, 0, 6787, 6907, 1, 0, 0, 0, 6788, 6789, 5, 138, 0, 0, 6789, 6790, 5, 271, 0, 0, 6790, 6791, 5, 156, 0, 0, 6791, 6792, 3, 524, 262, 0, 6792, 6793, 5, 100, 0, 0, 6793, 6794, 3, 1342, 671, 0, 6794, 6795, 5, 275, 0, 0, 6795, 6796, 5, 94, 0, 0, 6796, 6797, 3, 1370, 685, 0, 6797, 6907, 1, 0, 0, 0, 6798, 6799, 5, 138, 0, 0, 6799, 6800, 5, 271, 0, 0, 6800, 6801, 5, 206, 0, 0, 6801, 6802, 3, 524, 262, 0, 6802, 6803, 5, 100, 0, 0, 6803, 6804, 3, 1342, 671, 0, 6804, 6805, 5, 275, 0, 0, 6805, 6806, 5, 94, 0, 0, 6806, 6807, 3, 1370, 685, 0, 6807, 6907, 1, 0, 0, 0, 6808, 6809, 5, 138, 0, 0, 6809, 6810, 5, 289, 0, 0, 6810, 6811, 3, 626, 313, 0, 6811, 6812, 5, 275, 0, 0, 6812, 6813, 5, 94, 0, 0, 6813, 6814, 3, 1370, 685, 0, 6814, 6907, 1, 0, 0, 0, 6815, 6816, 5, 138, 0, 0, 6816, 6817, 5, 442, 0, 0, 6817, 6818, 3, 626, 313, 0, 6818, 6819, 5, 275, 0, 0, 6819, 6820, 5, 94, 0, 0, 6820, 6821, 3, 1370, 685, 0, 6821, 6907, 1, 0, 0, 0, 6822, 6823, 5, 138, 0, 0, 6823, 6824, 5, 316, 0, 0, 6824, 6825, 3, 1342, 671, 0, 6825, 6826, 5, 275, 0, 0, 6826, 6827, 5, 94, 0, 0, 6827, 6828, 3, 1370, 685, 0, 6828, 6907, 1, 0, 0, 0, 6829, 6830, 5, 138, 0, 0, 6830, 6831, 5, 353, 0, 0, 6831, 6832, 3, 524, 262, 0, 6832, 6833, 5, 275, 0, 0, 6833, 6834, 5, 94, 0, 0, 6834, 6835, 3, 1370, 685, 0, 6835, 6907, 1, 0, 0, 0, 6836, 6837, 5, 138, 0, 0, 6837, 6838, 5, 344, 0, 0, 6838, 6839, 3, 1342, 671, 0, 6839, 6840, 5, 275, 0, 0, 6840, 6841, 5, 94, 0, 0, 6841, 6842, 3, 1370, 685, 0, 6842, 6907, 1, 0, 0, 0, 6843, 6844, 5, 138, 0, 0, 6844, 6845, 5, 335, 0, 0, 6845, 6846, 3, 524, 262, 0, 6846, 6847, 5, 275, 0, 0, 6847, 6848, 5, 94, 0, 0, 6848, 6849, 3, 1370, 685, 0, 6849, 6907, 1, 0, 0, 0, 6850, 6851, 5, 138, 0, 0, 6851, 6852, 5, 348, 0, 0, 6852, 6853, 5, 318, 0, 0, 6853, 6854, 5, 185, 0, 0, 6854, 6855, 3, 524, 262, 0, 6855, 6856, 5, 275, 0, 0, 6856, 6857, 5, 94, 0, 0, 6857, 6858, 3, 1370, 685, 0, 6858, 6907, 1, 0, 0, 0, 6859, 6860, 5, 138, 0, 0, 6860, 6861, 5, 348, 0, 0, 6861, 6862, 5, 318, 0, 0, 6862, 6863, 5, 163, 0, 0, 6863, 6864, 3, 524, 262, 0, 6864, 6865, 5, 275, 0, 0, 6865, 6866, 5, 94, 0, 0, 6866, 6867, 3, 1370, 685, 0, 6867, 6907, 1, 0, 0, 0, 6868, 6869, 5, 138, 0, 0, 6869, 6870, 5, 63, 0, 0, 6870, 6871, 5, 174, 0, 0, 6871, 6872, 5, 374, 0, 0, 6872, 6873, 3, 1342, 671, 0, 6873, 6874, 5, 275, 0, 0, 6874, 6875, 5, 94, 0, 0, 6875, 6876, 3, 1370, 685, 0, 6876, 6907, 1, 0, 0, 0, 6877, 6878, 5, 138, 0, 0, 6878, 6879, 5, 324, 0, 0, 6879, 6880, 3, 1342, 671, 0, 6880, 6881, 5, 275, 0, 0, 6881, 6882, 5, 94, 0, 0, 6882, 6883, 3, 1370, 685, 0, 6883, 6907, 1, 0, 0, 0, 6884, 6885, 5, 138, 0, 0, 6885, 6886, 5, 198, 0, 0, 6886, 6887, 5, 350, 0, 0, 6887, 6888, 3, 1342, 671, 0, 6888, 6889, 5, 275, 0, 0, 6889, 6890, 5, 94, 0, 0, 6890, 6891, 3, 1370, 685, 0, 6891, 6907, 1, 0, 0, 0, 6892, 6893, 5, 138, 0, 0, 6893, 6894, 5, 452, 0, 0, 6894, 6895, 3, 1342, 671, 0, 6895, 6896, 5, 275, 0, 0, 6896, 6897, 5, 94, 0, 0, 6897, 6898, 3, 1370, 685, 0, 6898, 6907, 1, 0, 0, 0, 6899, 6900, 5, 138, 0, 0, 6900, 6901, 5, 451, 0, 0, 6901, 6902, 3, 1342, 671, 0, 6902, 6903, 5, 275, 0, 0, 6903, 6904, 5, 94, 0, 0, 6904, 6905, 3, 1370, 685, 0, 6905, 6907, 1, 0, 0, 0, 6906, 6723, 1, 0, 0, 0, 6906, 6730, 1, 0, 0, 0, 6906, 6737, 1, 0, 0, 0, 6906, 6744, 1, 0, 0, 0, 6906, 6751, 1, 0, 0, 0, 6906, 6758, 1, 0, 0, 0, 6906, 6765, 1, 0, 0, 0, 6906, 6773, 1, 0, 0, 0, 6906, 6781, 1, 0, 0, 0, 6906, 6788, 1, 0, 0, 0, 6906, 6798, 1, 0, 0, 0, 6906, 6808, 1, 0, 0, 0, 6906, 6815, 1, 0, 0, 0, 6906, 6822, 1, 0, 0, 0, 6906, 6829, 1, 0, 0, 0, 6906, 6836, 1, 0, 0, 0, 6906, 6843, 1, 0, 0, 0, 6906, 6850, 1, 0, 0, 0, 6906, 6859, 1, 0, 0, 0, 6906, 6868, 1, 0, 0, 0, 6906, 6877, 1, 0, 0, 0, 6906, 6884, 1, 0, 0, 0, 6906, 6892, 1, 0, 0, 0, 6906, 6899, 1, 0, 0, 0, 6907, 745, 1, 0, 0, 0, 6908, 6909, 5, 46, 0, 0, 6909, 6910, 5, 452, 0, 0, 6910, 6911, 3, 1342, 671, 0, 6911, 6912, 3, 748, 374, 0, 6912, 6913, 3, 664, 332, 0, 6913, 747, 1, 0, 0, 0, 6914, 6917, 3, 750, 375, 0, 6915, 6917, 1, 0, 0, 0, 6916, 6914, 1, 0, 0, 0, 6916, 6915, 1, 0, 0, 0, 6917, 749, 1, 0, 0, 0, 6918, 6919, 5, 62, 0, 0, 6919, 6920, 5, 92, 0, 0, 6920, 6925, 3, 1078, 539, 0, 6921, 6922, 5, 62, 0, 0, 6922, 6923, 5, 30, 0, 0, 6923, 6925, 5, 343, 0, 0, 6924, 6918, 1, 0, 0, 0, 6924, 6921, 1, 0, 0, 0, 6925, 751, 1, 0, 0, 0, 6926, 6927, 5, 138, 0, 0, 6927, 6928, 5, 452, 0, 0, 6928, 6929, 3, 1342, 671, 0, 6929, 6930, 5, 326, 0, 0, 6930, 6931, 3, 460, 230, 0, 6931, 6954, 1, 0, 0, 0, 6932, 6933, 5, 138, 0, 0, 6933, 6934, 5, 452, 0, 0, 6934, 6935, 3, 1342, 671, 0, 6935, 6936, 5, 133, 0, 0, 6936, 6937, 5, 92, 0, 0, 6937, 6938, 3, 1078, 539, 0, 6938, 6954, 1, 0, 0, 0, 6939, 6940, 5, 138, 0, 0, 6940, 6941, 5, 452, 0, 0, 6941, 6942, 3, 1342, 671, 0, 6942, 6943, 5, 326, 0, 0, 6943, 6944, 5, 92, 0, 0, 6944, 6945, 3, 1078, 539, 0, 6945, 6954, 1, 0, 0, 0, 6946, 6947, 5, 138, 0, 0, 6947, 6948, 5, 452, 0, 0, 6948, 6949, 3, 1342, 671, 0, 6949, 6950, 5, 191, 0, 0, 6950, 6951, 5, 92, 0, 0, 6951, 6952, 3, 1078, 539, 0, 6952, 6954, 1, 0, 0, 0, 6953, 6926, 1, 0, 0, 0, 6953, 6932, 1, 0, 0, 0, 6953, 6939, 1, 0, 0, 0, 6953, 6946, 1, 0, 0, 0, 6954, 753, 1, 0, 0, 0, 6955, 6956, 5, 46, 0, 0, 6956, 6957, 5, 451, 0, 0, 6957, 6958, 3, 1342, 671, 0, 6958, 6959, 5, 164, 0, 0, 6959, 6960, 3, 1360, 680, 0, 6960, 6961, 5, 452, 0, 0, 6961, 6962, 3, 756, 378, 0, 6962, 6963, 3, 664, 332, 0, 6963, 755, 1, 0, 0, 0, 6964, 6969, 3, 758, 379, 0, 6965, 6966, 5, 6, 0, 0, 6966, 6968, 3, 758, 379, 0, 6967, 6965, 1, 0, 0, 0, 6968, 6971, 1, 0, 0, 0, 6969, 6967, 1, 0, 0, 0, 6969, 6970, 1, 0, 0, 0, 6970, 757, 1, 0, 0, 0, 6971, 6969, 1, 0, 0, 0, 6972, 6973, 3, 1382, 691, 0, 6973, 759, 1, 0, 0, 0, 6974, 6975, 5, 138, 0, 0, 6975, 6976, 5, 451, 0, 0, 6976, 6977, 3, 1342, 671, 0, 6977, 6978, 5, 326, 0, 0, 6978, 6979, 3, 460, 230, 0, 6979, 7012, 1, 0, 0, 0, 6980, 6981, 5, 138, 0, 0, 6981, 6982, 5, 451, 0, 0, 6982, 6983, 3, 1342, 671, 0, 6983, 6984, 5, 164, 0, 0, 6984, 6985, 3, 1360, 680, 0, 6985, 7012, 1, 0, 0, 0, 6986, 6987, 5, 138, 0, 0, 6987, 6988, 5, 451, 0, 0, 6988, 6989, 3, 1342, 671, 0, 6989, 6990, 5, 298, 0, 0, 6990, 6991, 5, 452, 0, 0, 6991, 6992, 3, 664, 332, 0, 6992, 7012, 1, 0, 0, 0, 6993, 6994, 5, 138, 0, 0, 6994, 6995, 5, 451, 0, 0, 6995, 6996, 3, 1342, 671, 0, 6996, 6997, 5, 326, 0, 0, 6997, 6998, 5, 452, 0, 0, 6998, 6999, 3, 756, 378, 0, 6999, 7000, 3, 664, 332, 0, 7000, 7012, 1, 0, 0, 0, 7001, 7002, 5, 138, 0, 0, 7002, 7003, 5, 451, 0, 0, 7003, 7004, 3, 1342, 671, 0, 7004, 7005, 5, 193, 0, 0, 7005, 7012, 1, 0, 0, 0, 7006, 7007, 5, 138, 0, 0, 7007, 7008, 5, 451, 0, 0, 7008, 7009, 3, 1342, 671, 0, 7009, 7010, 5, 186, 0, 0, 7010, 7012, 1, 0, 0, 0, 7011, 6974, 1, 0, 0, 0, 7011, 6980, 1, 0, 0, 0, 7011, 6986, 1, 0, 0, 0, 7011, 6993, 1, 0, 0, 0, 7011, 7001, 1, 0, 0, 0, 7011, 7006, 1, 0, 0, 0, 7012, 761, 1, 0, 0, 0, 7013, 7014, 5, 191, 0, 0, 7014, 7015, 5, 451, 0, 0, 7015, 7016, 3, 1342, 671, 0, 7016, 7017, 3, 108, 54, 0, 7017, 7026, 1, 0, 0, 0, 7018, 7019, 5, 191, 0, 0, 7019, 7020, 5, 451, 0, 0, 7020, 7021, 5, 220, 0, 0, 7021, 7022, 5, 389, 0, 0, 7022, 7023, 3, 1342, 671, 0, 7023, 7024, 3, 108, 54, 0, 7024, 7026, 1, 0, 0, 0, 7025, 7013, 1, 0, 0, 0, 7025, 7018, 1, 0, 0, 0, 7026, 763, 1, 0, 0, 0, 7027, 7028, 5, 46, 0, 0, 7028, 7029, 3, 618, 309, 0, 7029, 7030, 5, 314, 0, 0, 7030, 7031, 3, 1342, 671, 0, 7031, 7032, 5, 36, 0, 0, 7032, 7033, 5, 80, 0, 0, 7033, 7034, 3, 774, 387, 0, 7034, 7035, 5, 94, 0, 0, 7035, 7036, 3, 1338, 669, 0, 7036, 7037, 3, 1096, 548, 0, 7037, 7038, 5, 57, 0, 0, 7038, 7039, 3, 776, 388, 0, 7039, 7040, 3, 766, 383, 0, 7040, 765, 1, 0, 0, 0, 7041, 7048, 5, 263, 0, 0, 7042, 7048, 3, 770, 385, 0, 7043, 7044, 5, 2, 0, 0, 7044, 7045, 3, 768, 384, 0, 7045, 7046, 5, 3, 0, 0, 7046, 7048, 1, 0, 0, 0, 7047, 7041, 1, 0, 0, 0, 7047, 7042, 1, 0, 0, 0, 7047, 7043, 1, 0, 0, 0, 7048, 767, 1, 0, 0, 0, 7049, 7054, 3, 772, 386, 0, 7050, 7051, 5, 7, 0, 0, 7051, 7053, 3, 772, 386, 0, 7052, 7050, 1, 0, 0, 0, 7053, 7056, 1, 0, 0, 0, 7054, 7052, 1, 0, 0, 0, 7054, 7055, 1, 0, 0, 0, 7055, 769, 1, 0, 0, 0, 7056, 7054, 1, 0, 0, 0, 7057, 7063, 3, 960, 480, 0, 7058, 7063, 3, 902, 451, 0, 7059, 7063, 3, 942, 471, 0, 7060, 7063, 3, 928, 464, 0, 7061, 7063, 3, 778, 389, 0, 7062, 7057, 1, 0, 0, 0, 7062, 7058, 1, 0, 0, 0, 7062, 7059, 1, 0, 0, 0, 7062, 7060, 1, 0, 0, 0, 7062, 7061, 1, 0, 0, 0, 7063, 771, 1, 0, 0, 0, 7064, 7067, 3, 770, 385, 0, 7065, 7067, 1, 0, 0, 0, 7066, 7064, 1, 0, 0, 0, 7066, 7065, 1, 0, 0, 0, 7067, 773, 1, 0, 0, 0, 7068, 7069, 7, 29, 0, 0, 7069, 775, 1, 0, 0, 0, 7070, 7074, 5, 233, 0, 0, 7071, 7074, 5, 137, 0, 0, 7072, 7074, 1, 0, 0, 0, 7073, 7070, 1, 0, 0, 0, 7073, 7071, 1, 0, 0, 0, 7073, 7072, 1, 0, 0, 0, 7074, 777, 1, 0, 0, 0, 7075, 7076, 5, 264, 0, 0, 7076, 7077, 3, 1374, 687, 0, 7077, 7078, 3, 780, 390, 0, 7078, 779, 1, 0, 0, 0, 7079, 7080, 5, 6, 0, 0, 7080, 7083, 3, 1360, 680, 0, 7081, 7083, 1, 0, 0, 0, 7082, 7079, 1, 0, 0, 0, 7082, 7081, 1, 0, 0, 0, 7083, 781, 1, 0, 0, 0, 7084, 7085, 5, 243, 0, 0, 7085, 7086, 3, 1374, 687, 0, 7086, 783, 1, 0, 0, 0, 7087, 7088, 5, 359, 0, 0, 7088, 7092, 3, 1374, 687, 0, 7089, 7090, 5, 359, 0, 0, 7090, 7092, 5, 9, 0, 0, 7091, 7087, 1, 0, 0, 0, 7091, 7089, 1, 0, 0, 0, 7092, 785, 1, 0, 0, 0, 7093, 7094, 5, 129, 0, 0, 7094, 7095, 3, 788, 394, 0, 7095, 7096, 3, 796, 398, 0, 7096, 7144, 1, 0, 0, 0, 7097, 7098, 5, 146, 0, 0, 7098, 7099, 3, 788, 394, 0, 7099, 7100, 3, 794, 397, 0, 7100, 7144, 1, 0, 0, 0, 7101, 7102, 5, 333, 0, 0, 7102, 7103, 5, 349, 0, 0, 7103, 7144, 3, 794, 397, 0, 7104, 7105, 5, 161, 0, 0, 7105, 7106, 3, 788, 394, 0, 7106, 7107, 3, 796, 398, 0, 7107, 7144, 1, 0, 0, 0, 7108, 7109, 5, 454, 0, 0, 7109, 7110, 3, 788, 394, 0, 7110, 7111, 3, 796, 398, 0, 7111, 7144, 1, 0, 0, 0, 7112, 7113, 5, 312, 0, 0, 7113, 7114, 3, 788, 394, 0, 7114, 7115, 3, 796, 398, 0, 7115, 7144, 1, 0, 0, 0, 7116, 7117, 5, 315, 0, 0, 7117, 7144, 3, 1374, 687, 0, 7118, 7119, 5, 301, 0, 0, 7119, 7120, 5, 315, 0, 0, 7120, 7144, 3, 1374, 687, 0, 7121, 7122, 5, 301, 0, 0, 7122, 7144, 3, 1374, 687, 0, 7123, 7124, 5, 312, 0, 0, 7124, 7125, 3, 788, 394, 0, 7125, 7126, 5, 94, 0, 0, 7126, 7127, 5, 315, 0, 0, 7127, 7128, 3, 1374, 687, 0, 7128, 7144, 1, 0, 0, 0, 7129, 7130, 5, 312, 0, 0, 7130, 7131, 3, 788, 394, 0, 7131, 7132, 5, 94, 0, 0, 7132, 7133, 3, 1374, 687, 0, 7133, 7144, 1, 0, 0, 0, 7134, 7135, 5, 283, 0, 0, 7135, 7136, 5, 349, 0, 0, 7136, 7144, 3, 1360, 680, 0, 7137, 7138, 5, 161, 0, 0, 7138, 7139, 5, 284, 0, 0, 7139, 7144, 3, 1360, 680, 0, 7140, 7141, 5, 312, 0, 0, 7141, 7142, 5, 284, 0, 0, 7142, 7144, 3, 1360, 680, 0, 7143, 7093, 1, 0, 0, 0, 7143, 7097, 1, 0, 0, 0, 7143, 7101, 1, 0, 0, 0, 7143, 7104, 1, 0, 0, 0, 7143, 7108, 1, 0, 0, 0, 7143, 7112, 1, 0, 0, 0, 7143, 7116, 1, 0, 0, 0, 7143, 7118, 1, 0, 0, 0, 7143, 7121, 1, 0, 0, 0, 7143, 7123, 1, 0, 0, 0, 7143, 7129, 1, 0, 0, 0, 7143, 7134, 1, 0, 0, 0, 7143, 7137, 1, 0, 0, 0, 7143, 7140, 1, 0, 0, 0, 7144, 787, 1, 0, 0, 0, 7145, 7149, 5, 373, 0, 0, 7146, 7149, 5, 349, 0, 0, 7147, 7149, 1, 0, 0, 0, 7148, 7145, 1, 0, 0, 0, 7148, 7146, 1, 0, 0, 0, 7148, 7147, 1, 0, 0, 0, 7149, 789, 1, 0, 0, 0, 7150, 7151, 5, 235, 0, 0, 7151, 7152, 5, 242, 0, 0, 7152, 7161, 3, 64, 32, 0, 7153, 7154, 5, 293, 0, 0, 7154, 7161, 5, 81, 0, 0, 7155, 7156, 5, 293, 0, 0, 7156, 7161, 5, 375, 0, 0, 7157, 7161, 5, 54, 0, 0, 7158, 7159, 5, 77, 0, 0, 7159, 7161, 5, 54, 0, 0, 7160, 7150, 1, 0, 0, 0, 7160, 7153, 1, 0, 0, 0, 7160, 7155, 1, 0, 0, 0, 7160, 7157, 1, 0, 0, 0, 7160, 7158, 1, 0, 0, 0, 7161, 791, 1, 0, 0, 0, 7162, 7169, 3, 790, 395, 0, 7163, 7165, 5, 6, 0, 0, 7164, 7163, 1, 0, 0, 0, 7164, 7165, 1, 0, 0, 0, 7165, 7166, 1, 0, 0, 0, 7166, 7168, 3, 790, 395, 0, 7167, 7164, 1, 0, 0, 0, 7168, 7171, 1, 0, 0, 0, 7169, 7167, 1, 0, 0, 0, 7169, 7170, 1, 0, 0, 0, 7170, 793, 1, 0, 0, 0, 7171, 7169, 1, 0, 0, 0, 7172, 7175, 3, 792, 396, 0, 7173, 7175, 1, 0, 0, 0, 7174, 7172, 1, 0, 0, 0, 7174, 7173, 1, 0, 0, 0, 7175, 795, 1, 0, 0, 0, 7176, 7178, 5, 33, 0, 0, 7177, 7179, 5, 262, 0, 0, 7178, 7177, 1, 0, 0, 0, 7178, 7179, 1, 0, 0, 0, 7179, 7180, 1, 0, 0, 0, 7180, 7183, 5, 153, 0, 0, 7181, 7183, 1, 0, 0, 0, 7182, 7176, 1, 0, 0, 0, 7182, 7181, 1, 0, 0, 0, 7183, 797, 1, 0, 0, 0, 7184, 7187, 5, 46, 0, 0, 7185, 7186, 5, 82, 0, 0, 7186, 7188, 5, 304, 0, 0, 7187, 7185, 1, 0, 0, 0, 7187, 7188, 1, 0, 0, 0, 7188, 7189, 1, 0, 0, 0, 7189, 7203, 3, 174, 87, 0, 7190, 7191, 5, 369, 0, 0, 7191, 7192, 3, 1338, 669, 0, 7192, 7193, 3, 214, 107, 0, 7193, 7194, 3, 118, 59, 0, 7194, 7204, 1, 0, 0, 0, 7195, 7196, 5, 296, 0, 0, 7196, 7197, 5, 369, 0, 0, 7197, 7198, 3, 1338, 669, 0, 7198, 7199, 5, 2, 0, 0, 7199, 7200, 3, 216, 108, 0, 7200, 7201, 5, 3, 0, 0, 7201, 7202, 3, 118, 59, 0, 7202, 7204, 1, 0, 0, 0, 7203, 7190, 1, 0, 0, 0, 7203, 7195, 1, 0, 0, 0, 7204, 7205, 1, 0, 0, 0, 7205, 7206, 5, 36, 0, 0, 7206, 7207, 3, 960, 480, 0, 7207, 7208, 3, 800, 400, 0, 7208, 799, 1, 0, 0, 0, 7209, 7211, 5, 105, 0, 0, 7210, 7212, 7, 30, 0, 0, 7211, 7210, 1, 0, 0, 0, 7211, 7212, 1, 0, 0, 0, 7212, 7213, 1, 0, 0, 0, 7213, 7214, 5, 42, 0, 0, 7214, 7217, 5, 272, 0, 0, 7215, 7217, 1, 0, 0, 0, 7216, 7209, 1, 0, 0, 0, 7216, 7215, 1, 0, 0, 0, 7217, 801, 1, 0, 0, 0, 7218, 7219, 5, 244, 0, 0, 7219, 7220, 3, 1346, 673, 0, 7220, 803, 1, 0, 0, 0, 7221, 7222, 5, 46, 0, 0, 7222, 7223, 5, 175, 0, 0, 7223, 7224, 3, 1342, 671, 0, 7224, 7225, 3, 16, 8, 0, 7225, 7226, 3, 806, 403, 0, 7226, 805, 1, 0, 0, 0, 7227, 7230, 3, 808, 404, 0, 7228, 7230, 1, 0, 0, 0, 7229, 7227, 1, 0, 0, 0, 7229, 7228, 1, 0, 0, 0, 7230, 807, 1, 0, 0, 0, 7231, 7233, 3, 810, 405, 0, 7232, 7231, 1, 0, 0, 0, 7233, 7234, 1, 0, 0, 0, 7234, 7232, 1, 0, 0, 0, 7234, 7235, 1, 0, 0, 0, 7235, 809, 1, 0, 0, 0, 7236, 7237, 3, 812, 406, 0, 7237, 7241, 3, 814, 407, 0, 7238, 7242, 3, 1366, 683, 0, 7239, 7242, 3, 66, 33, 0, 7240, 7242, 5, 53, 0, 0, 7241, 7238, 1, 0, 0, 0, 7241, 7239, 1, 0, 0, 0, 7241, 7240, 1, 0, 0, 0, 7242, 811, 1, 0, 0, 0, 7243, 7252, 3, 1384, 692, 0, 7244, 7245, 5, 164, 0, 0, 7245, 7252, 5, 74, 0, 0, 7246, 7252, 5, 194, 0, 0, 7247, 7252, 5, 246, 0, 0, 7248, 7252, 5, 275, 0, 0, 7249, 7252, 5, 344, 0, 0, 7250, 7252, 5, 346, 0, 0, 7251, 7243, 1, 0, 0, 0, 7251, 7244, 1, 0, 0, 0, 7251, 7246, 1, 0, 0, 0, 7251, 7247, 1, 0, 0, 0, 7251, 7248, 1, 0, 0, 0, 7251, 7249, 1, 0, 0, 0, 7251, 7250, 1, 0, 0, 0, 7252, 813, 1, 0, 0, 0, 7253, 7256, 5, 10, 0, 0, 7254, 7256, 1, 0, 0, 0, 7255, 7253, 1, 0, 0, 0, 7255, 7254, 1, 0, 0, 0, 7256, 815, 1, 0, 0, 0, 7257, 7258, 5, 138, 0, 0, 7258, 7259, 5, 175, 0, 0, 7259, 7266, 3, 1342, 671, 0, 7260, 7261, 5, 105, 0, 0, 7261, 7267, 3, 806, 403, 0, 7262, 7267, 3, 806, 403, 0, 7263, 7264, 5, 326, 0, 0, 7264, 7265, 5, 344, 0, 0, 7265, 7267, 3, 1342, 671, 0, 7266, 7260, 1, 0, 0, 0, 7266, 7262, 1, 0, 0, 0, 7266, 7263, 1, 0, 0, 0, 7267, 817, 1, 0, 0, 0, 7268, 7269, 5, 138, 0, 0, 7269, 7270, 5, 175, 0, 0, 7270, 7271, 3, 1342, 671, 0, 7271, 7272, 3, 80, 40, 0, 7272, 819, 1, 0, 0, 0, 7273, 7274, 5, 191, 0, 0, 7274, 7277, 5, 175, 0, 0, 7275, 7276, 5, 220, 0, 0, 7276, 7278, 5, 389, 0, 0, 7277, 7275, 1, 0, 0, 0, 7277, 7278, 1, 0, 0, 0, 7278, 7279, 1, 0, 0, 0, 7279, 7285, 3, 1342, 671, 0, 7280, 7281, 3, 16, 8, 0, 7281, 7282, 5, 2, 0, 0, 7282, 7283, 3, 822, 411, 0, 7283, 7284, 5, 3, 0, 0, 7284, 7286, 1, 0, 0, 0, 7285, 7280, 1, 0, 0, 0, 7285, 7286, 1, 0, 0, 0, 7286, 821, 1, 0, 0, 0, 7287, 7292, 3, 824, 412, 0, 7288, 7289, 5, 6, 0, 0, 7289, 7291, 3, 824, 412, 0, 7290, 7288, 1, 0, 0, 0, 7291, 7294, 1, 0, 0, 0, 7292, 7290, 1, 0, 0, 0, 7292, 7293, 1, 0, 0, 0, 7293, 823, 1, 0, 0, 0, 7294, 7292, 1, 0, 0, 0, 7295, 7296, 5, 209, 0, 0, 7296, 825, 1, 0, 0, 0, 7297, 7298, 5, 138, 0, 0, 7298, 7299, 5, 108, 0, 0, 7299, 7300, 3, 524, 262, 0, 7300, 7301, 5, 298, 0, 0, 7301, 7302, 5, 368, 0, 0, 7302, 827, 1, 0, 0, 0, 7303, 7304, 5, 138, 0, 0, 7304, 7305, 5, 342, 0, 0, 7305, 7306, 7, 31, 0, 0, 7306, 7307, 3, 54, 27, 0, 7307, 829, 1, 0, 0, 0, 7308, 7309, 5, 46, 0, 0, 7309, 7310, 5, 189, 0, 0, 7310, 7311, 3, 524, 262, 0, 7311, 7312, 3, 834, 417, 0, 7312, 7313, 3, 1120, 560, 0, 7313, 7314, 3, 192, 96, 0, 7314, 831, 1, 0, 0, 0, 7315, 7316, 5, 138, 0, 0, 7316, 7317, 5, 189, 0, 0, 7317, 7339, 3, 524, 262, 0, 7318, 7340, 3, 106, 53, 0, 7319, 7320, 5, 191, 0, 0, 7320, 7321, 5, 77, 0, 0, 7321, 7340, 5, 78, 0, 0, 7322, 7323, 5, 326, 0, 0, 7323, 7324, 5, 77, 0, 0, 7324, 7340, 5, 78, 0, 0, 7325, 7326, 5, 133, 0, 0, 7326, 7340, 3, 208, 104, 0, 7327, 7328, 5, 191, 0, 0, 7328, 7331, 5, 45, 0, 0, 7329, 7330, 5, 220, 0, 0, 7330, 7332, 5, 389, 0, 0, 7331, 7329, 1, 0, 0, 0, 7331, 7332, 1, 0, 0, 0, 7332, 7333, 1, 0, 0, 0, 7333, 7334, 3, 1342, 671, 0, 7334, 7335, 3, 108, 54, 0, 7335, 7340, 1, 0, 0, 0, 7336, 7337, 5, 365, 0, 0, 7337, 7338, 5, 45, 0, 0, 7338, 7340, 3, 1342, 671, 0, 7339, 7318, 1, 0, 0, 0, 7339, 7319, 1, 0, 0, 0, 7339, 7322, 1, 0, 0, 0, 7339, 7325, 1, 0, 0, 0, 7339, 7327, 1, 0, 0, 0, 7339, 7336, 1, 0, 0, 0, 7340, 833, 1, 0, 0, 0, 7341, 7344, 5, 36, 0, 0, 7342, 7344, 1, 0, 0, 0, 7343, 7341, 1, 0, 0, 0, 7343, 7342, 1, 0, 0, 0, 7344, 835, 1, 0, 0, 0, 7345, 7346, 5, 138, 0, 0, 7346, 7347, 5, 348, 0, 0, 7347, 7348, 5, 318, 0, 0, 7348, 7349, 5, 185, 0, 0, 7349, 7350, 3, 524, 262, 0, 7350, 7351, 3, 460, 230, 0, 7351, 837, 1, 0, 0, 0, 7352, 7353, 5, 138, 0, 0, 7353, 7354, 5, 348, 0, 0, 7354, 7355, 5, 318, 0, 0, 7355, 7356, 5, 163, 0, 0, 7356, 7357, 3, 524, 262, 0, 7357, 7358, 5, 133, 0, 0, 7358, 7359, 5, 248, 0, 0, 7359, 7360, 5, 62, 0, 0, 7360, 7361, 3, 1340, 670, 0, 7361, 7362, 3, 840, 420, 0, 7362, 7363, 3, 522, 261, 0, 7363, 7425, 1, 0, 0, 0, 7364, 7365, 5, 138, 0, 0, 7365, 7366, 5, 348, 0, 0, 7366, 7367, 5, 318, 0, 0, 7367, 7368, 5, 163, 0, 0, 7368, 7369, 3, 524, 262, 0, 7369, 7370, 5, 138, 0, 0, 7370, 7371, 5, 248, 0, 0, 7371, 7372, 5, 62, 0, 0, 7372, 7373, 3, 1340, 670, 0, 7373, 7374, 3, 840, 420, 0, 7374, 7375, 3, 522, 261, 0, 7375, 7425, 1, 0, 0, 0, 7376, 7377, 5, 138, 0, 0, 7377, 7378, 5, 348, 0, 0, 7378, 7379, 5, 318, 0, 0, 7379, 7380, 5, 163, 0, 0, 7380, 7381, 3, 524, 262, 0, 7381, 7382, 5, 138, 0, 0, 7382, 7383, 5, 248, 0, 0, 7383, 7384, 5, 304, 0, 0, 7384, 7385, 3, 524, 262, 0, 7385, 7386, 3, 840, 420, 0, 7386, 7387, 3, 524, 262, 0, 7387, 7425, 1, 0, 0, 0, 7388, 7389, 5, 138, 0, 0, 7389, 7390, 5, 348, 0, 0, 7390, 7391, 5, 318, 0, 0, 7391, 7392, 5, 163, 0, 0, 7392, 7393, 3, 524, 262, 0, 7393, 7394, 5, 138, 0, 0, 7394, 7395, 5, 248, 0, 0, 7395, 7396, 5, 62, 0, 0, 7396, 7397, 3, 1340, 670, 0, 7397, 7398, 5, 304, 0, 0, 7398, 7399, 3, 524, 262, 0, 7399, 7400, 3, 840, 420, 0, 7400, 7401, 3, 524, 262, 0, 7401, 7425, 1, 0, 0, 0, 7402, 7403, 5, 138, 0, 0, 7403, 7404, 5, 348, 0, 0, 7404, 7405, 5, 318, 0, 0, 7405, 7406, 5, 163, 0, 0, 7406, 7407, 3, 524, 262, 0, 7407, 7408, 5, 191, 0, 0, 7408, 7409, 5, 248, 0, 0, 7409, 7410, 5, 62, 0, 0, 7410, 7411, 3, 1340, 670, 0, 7411, 7425, 1, 0, 0, 0, 7412, 7413, 5, 138, 0, 0, 7413, 7414, 5, 348, 0, 0, 7414, 7415, 5, 318, 0, 0, 7415, 7416, 5, 163, 0, 0, 7416, 7417, 3, 524, 262, 0, 7417, 7418, 5, 191, 0, 0, 7418, 7419, 5, 248, 0, 0, 7419, 7420, 5, 220, 0, 0, 7420, 7421, 5, 389, 0, 0, 7421, 7422, 5, 62, 0, 0, 7422, 7423, 3, 1340, 670, 0, 7423, 7425, 1, 0, 0, 0, 7424, 7352, 1, 0, 0, 0, 7424, 7364, 1, 0, 0, 0, 7424, 7376, 1, 0, 0, 0, 7424, 7388, 1, 0, 0, 0, 7424, 7402, 1, 0, 0, 0, 7424, 7412, 1, 0, 0, 0, 7425, 839, 1, 0, 0, 0, 7426, 7427, 5, 105, 0, 0, 7427, 841, 1, 0, 0, 0, 7428, 7429, 5, 46, 0, 0, 7429, 7430, 3, 488, 244, 0, 7430, 7431, 5, 168, 0, 0, 7431, 7432, 3, 524, 262, 0, 7432, 7433, 5, 62, 0, 0, 7433, 7434, 3, 1360, 680, 0, 7434, 7435, 5, 94, 0, 0, 7435, 7436, 3, 1360, 680, 0, 7436, 7437, 5, 64, 0, 0, 7437, 7438, 3, 524, 262, 0, 7438, 843, 1, 0, 0, 0, 7439, 7440, 5, 158, 0, 0, 7440, 7441, 3, 864, 432, 0, 7441, 7442, 3, 1338, 669, 0, 7442, 7443, 3, 846, 423, 0, 7443, 7453, 1, 0, 0, 0, 7444, 7445, 5, 158, 0, 0, 7445, 7453, 3, 864, 432, 0, 7446, 7447, 5, 158, 0, 0, 7447, 7448, 3, 864, 432, 0, 7448, 7449, 3, 1342, 671, 0, 7449, 7450, 5, 80, 0, 0, 7450, 7451, 3, 1338, 669, 0, 7451, 7453, 1, 0, 0, 0, 7452, 7439, 1, 0, 0, 0, 7452, 7444, 1, 0, 0, 0, 7452, 7446, 1, 0, 0, 0, 7453, 845, 1, 0, 0, 0, 7454, 7455, 5, 100, 0, 0, 7455, 7458, 3, 1342, 671, 0, 7456, 7458, 1, 0, 0, 0, 7457, 7454, 1, 0, 0, 0, 7457, 7456, 1, 0, 0, 0, 7458, 847, 1, 0, 0, 0, 7459, 7460, 5, 363, 0, 0, 7460, 7461, 3, 866, 433, 0, 7461, 7462, 3, 868, 434, 0, 7462, 7463, 3, 864, 432, 0, 7463, 7464, 3, 862, 431, 0, 7464, 7465, 3, 876, 438, 0, 7465, 7473, 1, 0, 0, 0, 7466, 7467, 5, 363, 0, 0, 7467, 7468, 5, 2, 0, 0, 7468, 7469, 3, 852, 426, 0, 7469, 7470, 5, 3, 0, 0, 7470, 7471, 3, 876, 438, 0, 7471, 7473, 1, 0, 0, 0, 7472, 7459, 1, 0, 0, 0, 7472, 7466, 1, 0, 0, 0, 7473, 849, 1, 0, 0, 0, 7474, 7475, 3, 854, 427, 0, 7475, 7476, 3, 864, 432, 0, 7476, 7477, 3, 876, 438, 0, 7477, 7485, 1, 0, 0, 0, 7478, 7479, 3, 854, 427, 0, 7479, 7480, 5, 2, 0, 0, 7480, 7481, 3, 852, 426, 0, 7481, 7482, 5, 3, 0, 0, 7482, 7483, 3, 876, 438, 0, 7483, 7485, 1, 0, 0, 0, 7484, 7474, 1, 0, 0, 0, 7484, 7478, 1, 0, 0, 0, 7485, 851, 1, 0, 0, 0, 7486, 7491, 3, 856, 428, 0, 7487, 7488, 5, 6, 0, 0, 7488, 7490, 3, 856, 428, 0, 7489, 7487, 1, 0, 0, 0, 7490, 7493, 1, 0, 0, 0, 7491, 7489, 1, 0, 0, 0, 7491, 7492, 1, 0, 0, 0, 7492, 853, 1, 0, 0, 0, 7493, 7491, 1, 0, 0, 0, 7494, 7495, 7, 32, 0, 0, 7495, 855, 1, 0, 0, 0, 7496, 7497, 3, 858, 429, 0, 7497, 7498, 3, 860, 430, 0, 7498, 857, 1, 0, 0, 0, 7499, 7502, 3, 1380, 690, 0, 7500, 7502, 3, 854, 427, 0, 7501, 7499, 1, 0, 0, 0, 7501, 7500, 1, 0, 0, 0, 7502, 859, 1, 0, 0, 0, 7503, 7507, 3, 66, 33, 0, 7504, 7507, 3, 292, 146, 0, 7505, 7507, 1, 0, 0, 0, 7506, 7503, 1, 0, 0, 0, 7506, 7504, 1, 0, 0, 0, 7506, 7505, 1, 0, 0, 0, 7507, 861, 1, 0, 0, 0, 7508, 7511, 3, 854, 427, 0, 7509, 7511, 1, 0, 0, 0, 7510, 7508, 1, 0, 0, 0, 7510, 7509, 1, 0, 0, 0, 7511, 863, 1, 0, 0, 0, 7512, 7515, 5, 128, 0, 0, 7513, 7515, 1, 0, 0, 0, 7514, 7512, 1, 0, 0, 0, 7514, 7513, 1, 0, 0, 0, 7515, 865, 1, 0, 0, 0, 7516, 7519, 5, 113, 0, 0, 7517, 7519, 1, 0, 0, 0, 7518, 7516, 1, 0, 0, 0, 7518, 7517, 1, 0, 0, 0, 7519, 867, 1, 0, 0, 0, 7520, 7523, 5, 112, 0, 0, 7521, 7523, 1, 0, 0, 0, 7522, 7520, 1, 0, 0, 0, 7522, 7521, 1, 0, 0, 0, 7523, 869, 1, 0, 0, 0, 7524, 7525, 5, 2, 0, 0, 7525, 7526, 3, 1340, 670, 0, 7526, 7527, 5, 3, 0, 0, 7527, 7530, 1, 0, 0, 0, 7528, 7530, 1, 0, 0, 0, 7529, 7524, 1, 0, 0, 0, 7529, 7528, 1, 0, 0, 0, 7530, 871, 1, 0, 0, 0, 7531, 7532, 3, 1338, 669, 0, 7532, 7533, 3, 870, 435, 0, 7533, 873, 1, 0, 0, 0, 7534, 7539, 3, 872, 436, 0, 7535, 7536, 5, 6, 0, 0, 7536, 7538, 3, 872, 436, 0, 7537, 7535, 1, 0, 0, 0, 7538, 7541, 1, 0, 0, 0, 7539, 7537, 1, 0, 0, 0, 7539, 7540, 1, 0, 0, 0, 7540, 875, 1, 0, 0, 0, 7541, 7539, 1, 0, 0, 0, 7542, 7545, 3, 874, 437, 0, 7543, 7545, 1, 0, 0, 0, 7544, 7542, 1, 0, 0, 0, 7544, 7543, 1, 0, 0, 0, 7545, 877, 1, 0, 0, 0, 7546, 7547, 5, 203, 0, 0, 7547, 7563, 3, 880, 440, 0, 7548, 7549, 5, 203, 0, 0, 7549, 7550, 3, 854, 427, 0, 7550, 7551, 3, 864, 432, 0, 7551, 7552, 3, 880, 440, 0, 7552, 7563, 1, 0, 0, 0, 7553, 7554, 5, 203, 0, 0, 7554, 7555, 5, 128, 0, 0, 7555, 7563, 3, 880, 440, 0, 7556, 7557, 5, 203, 0, 0, 7557, 7558, 5, 2, 0, 0, 7558, 7559, 3, 882, 441, 0, 7559, 7560, 5, 3, 0, 0, 7560, 7561, 3, 880, 440, 0, 7561, 7563, 1, 0, 0, 0, 7562, 7546, 1, 0, 0, 0, 7562, 7548, 1, 0, 0, 0, 7562, 7553, 1, 0, 0, 0, 7562, 7556, 1, 0, 0, 0, 7563, 879, 1, 0, 0, 0, 7564, 7574, 3, 960, 480, 0, 7565, 7574, 3, 902, 451, 0, 7566, 7574, 3, 942, 471, 0, 7567, 7574, 3, 928, 464, 0, 7568, 7574, 3, 952, 476, 0, 7569, 7574, 3, 264, 132, 0, 7570, 7574, 3, 270, 135, 0, 7571, 7574, 3, 276, 138, 0, 7572, 7574, 3, 896, 448, 0, 7573, 7564, 1, 0, 0, 0, 7573, 7565, 1, 0, 0, 0, 7573, 7566, 1, 0, 0, 0, 7573, 7567, 1, 0, 0, 0, 7573, 7568, 1, 0, 0, 0, 7573, 7569, 1, 0, 0, 0, 7573, 7570, 1, 0, 0, 0, 7573, 7571, 1, 0, 0, 0, 7573, 7572, 1, 0, 0, 0, 7574, 881, 1, 0, 0, 0, 7575, 7580, 3, 884, 442, 0, 7576, 7577, 5, 6, 0, 0, 7577, 7579, 3, 884, 442, 0, 7578, 7576, 1, 0, 0, 0, 7579, 7582, 1, 0, 0, 0, 7580, 7578, 1, 0, 0, 0, 7580, 7581, 1, 0, 0, 0, 7581, 883, 1, 0, 0, 0, 7582, 7580, 1, 0, 0, 0, 7583, 7584, 3, 886, 443, 0, 7584, 7585, 3, 888, 444, 0, 7585, 885, 1, 0, 0, 0, 7586, 7589, 3, 1380, 690, 0, 7587, 7589, 3, 854, 427, 0, 7588, 7586, 1, 0, 0, 0, 7588, 7587, 1, 0, 0, 0, 7589, 887, 1, 0, 0, 0, 7590, 7594, 3, 66, 33, 0, 7591, 7594, 3, 292, 146, 0, 7592, 7594, 1, 0, 0, 0, 7593, 7590, 1, 0, 0, 0, 7593, 7591, 1, 0, 0, 0, 7593, 7592, 1, 0, 0, 0, 7594, 889, 1, 0, 0, 0, 7595, 7596, 5, 283, 0, 0, 7596, 7597, 3, 1342, 671, 0, 7597, 7598, 3, 892, 446, 0, 7598, 7599, 5, 36, 0, 0, 7599, 7600, 3, 894, 447, 0, 7600, 891, 1, 0, 0, 0, 7601, 7602, 5, 2, 0, 0, 7602, 7603, 3, 1288, 644, 0, 7603, 7604, 5, 3, 0, 0, 7604, 7607, 1, 0, 0, 0, 7605, 7607, 1, 0, 0, 0, 7606, 7601, 1, 0, 0, 0, 7606, 7605, 1, 0, 0, 0, 7607, 893, 1, 0, 0, 0, 7608, 7613, 3, 960, 480, 0, 7609, 7613, 3, 902, 451, 0, 7610, 7613, 3, 942, 471, 0, 7611, 7613, 3, 928, 464, 0, 7612, 7608, 1, 0, 0, 0, 7612, 7609, 1, 0, 0, 0, 7612, 7610, 1, 0, 0, 0, 7612, 7611, 1, 0, 0, 0, 7613, 895, 1, 0, 0, 0, 7614, 7615, 5, 202, 0, 0, 7615, 7616, 3, 1342, 671, 0, 7616, 7617, 3, 898, 449, 0, 7617, 7642, 1, 0, 0, 0, 7618, 7619, 5, 46, 0, 0, 7619, 7620, 3, 174, 87, 0, 7620, 7621, 5, 92, 0, 0, 7621, 7622, 3, 266, 133, 0, 7622, 7623, 5, 36, 0, 0, 7623, 7624, 5, 202, 0, 0, 7624, 7625, 3, 1342, 671, 0, 7625, 7626, 3, 898, 449, 0, 7626, 7627, 3, 268, 134, 0, 7627, 7642, 1, 0, 0, 0, 7628, 7629, 5, 46, 0, 0, 7629, 7630, 3, 174, 87, 0, 7630, 7631, 5, 92, 0, 0, 7631, 7632, 5, 220, 0, 0, 7632, 7633, 5, 77, 0, 0, 7633, 7634, 5, 389, 0, 0, 7634, 7635, 3, 266, 133, 0, 7635, 7636, 5, 36, 0, 0, 7636, 7637, 5, 202, 0, 0, 7637, 7638, 3, 1342, 671, 0, 7638, 7639, 3, 898, 449, 0, 7639, 7640, 3, 268, 134, 0, 7640, 7642, 1, 0, 0, 0, 7641, 7614, 1, 0, 0, 0, 7641, 7618, 1, 0, 0, 0, 7641, 7628, 1, 0, 0, 0, 7642, 897, 1, 0, 0, 0, 7643, 7644, 5, 2, 0, 0, 7644, 7645, 3, 1282, 641, 0, 7645, 7646, 5, 3, 0, 0, 7646, 7649, 1, 0, 0, 0, 7647, 7649, 1, 0, 0, 0, 7648, 7643, 1, 0, 0, 0, 7648, 7647, 1, 0, 0, 0, 7649, 899, 1, 0, 0, 0, 7650, 7651, 5, 177, 0, 0, 7651, 7661, 3, 1342, 671, 0, 7652, 7653, 5, 177, 0, 0, 7653, 7654, 5, 283, 0, 0, 7654, 7661, 3, 1342, 671, 0, 7655, 7656, 5, 177, 0, 0, 7656, 7661, 5, 30, 0, 0, 7657, 7658, 5, 177, 0, 0, 7658, 7659, 5, 283, 0, 0, 7659, 7661, 5, 30, 0, 0, 7660, 7650, 1, 0, 0, 0, 7660, 7652, 1, 0, 0, 0, 7660, 7655, 1, 0, 0, 0, 7660, 7657, 1, 0, 0, 0, 7661, 901, 1, 0, 0, 0, 7662, 7663, 3, 982, 491, 0, 7663, 7664, 5, 232, 0, 0, 7664, 7665, 5, 71, 0, 0, 7665, 7666, 3, 904, 452, 0, 7666, 7667, 3, 906, 453, 0, 7667, 7668, 3, 914, 457, 0, 7668, 7669, 3, 918, 459, 0, 7669, 903, 1, 0, 0, 0, 7670, 7673, 3, 1338, 669, 0, 7671, 7672, 5, 36, 0, 0, 7672, 7674, 3, 1374, 687, 0, 7673, 7671, 1, 0, 0, 0, 7673, 7674, 1, 0, 0, 0, 7674, 905, 1, 0, 0, 0, 7675, 7695, 3, 960, 480, 0, 7676, 7677, 5, 463, 0, 0, 7677, 7678, 3, 908, 454, 0, 7678, 7679, 5, 450, 0, 0, 7679, 7680, 3, 960, 480, 0, 7680, 7695, 1, 0, 0, 0, 7681, 7682, 5, 2, 0, 0, 7682, 7683, 3, 910, 455, 0, 7683, 7688, 5, 3, 0, 0, 7684, 7685, 5, 463, 0, 0, 7685, 7686, 3, 908, 454, 0, 7686, 7687, 5, 450, 0, 0, 7687, 7689, 1, 0, 0, 0, 7688, 7684, 1, 0, 0, 0, 7688, 7689, 1, 0, 0, 0, 7689, 7690, 1, 0, 0, 0, 7690, 7691, 3, 960, 480, 0, 7691, 7695, 1, 0, 0, 0, 7692, 7693, 5, 53, 0, 0, 7693, 7695, 5, 415, 0, 0, 7694, 7675, 1, 0, 0, 0, 7694, 7676, 1, 0, 0, 0, 7694, 7681, 1, 0, 0, 0, 7694, 7692, 1, 0, 0, 0, 7695, 907, 1, 0, 0, 0, 7696, 7697, 7, 33, 0, 0, 7697, 909, 1, 0, 0, 0, 7698, 7703, 3, 912, 456, 0, 7699, 7700, 5, 6, 0, 0, 7700, 7702, 3, 912, 456, 0, 7701, 7699, 1, 0, 0, 0, 7702, 7705, 1, 0, 0, 0, 7703, 7701, 1, 0, 0, 0, 7703, 7704, 1, 0, 0, 0, 7704, 911, 1, 0, 0, 0, 7705, 7703, 1, 0, 0, 0, 7706, 7707, 3, 1374, 687, 0, 7707, 7708, 3, 1328, 664, 0, 7708, 913, 1, 0, 0, 0, 7709, 7710, 5, 80, 0, 0, 7710, 7711, 5, 464, 0, 0, 7711, 7712, 3, 916, 458, 0, 7712, 7719, 5, 57, 0, 0, 7713, 7714, 5, 362, 0, 0, 7714, 7715, 5, 326, 0, 0, 7715, 7716, 3, 944, 472, 0, 7716, 7717, 3, 1096, 548, 0, 7717, 7720, 1, 0, 0, 0, 7718, 7720, 5, 263, 0, 0, 7719, 7713, 1, 0, 0, 0, 7719, 7718, 1, 0, 0, 0, 7720, 7723, 1, 0, 0, 0, 7721, 7723, 1, 0, 0, 0, 7722, 7709, 1, 0, 0, 0, 7722, 7721, 1, 0, 0, 0, 7723, 915, 1, 0, 0, 0, 7724, 7725, 5, 2, 0, 0, 7725, 7726, 3, 598, 299, 0, 7726, 7727, 5, 3, 0, 0, 7727, 7728, 3, 1096, 548, 0, 7728, 7734, 1, 0, 0, 0, 7729, 7730, 5, 80, 0, 0, 7730, 7731, 5, 45, 0, 0, 7731, 7734, 3, 1342, 671, 0, 7732, 7734, 1, 0, 0, 0, 7733, 7724, 1, 0, 0, 0, 7733, 7729, 1, 0, 0, 0, 7733, 7732, 1, 0, 0, 0, 7734, 917, 1, 0, 0, 0, 7735, 7736, 5, 87, 0, 0, 7736, 7739, 3, 1332, 666, 0, 7737, 7739, 1, 0, 0, 0, 7738, 7735, 1, 0, 0, 0, 7738, 7737, 1, 0, 0, 0, 7739, 919, 1, 0, 0, 0, 7740, 7742, 5, 253, 0, 0, 7741, 7743, 5, 71, 0, 0, 7742, 7741, 1, 0, 0, 0, 7742, 7743, 1, 0, 0, 0, 7743, 7744, 1, 0, 0, 0, 7744, 7746, 3, 1338, 669, 0, 7745, 7747, 3, 1064, 532, 0, 7746, 7745, 1, 0, 0, 0, 7746, 7747, 1, 0, 0, 0, 7747, 7748, 1, 0, 0, 0, 7748, 7751, 5, 100, 0, 0, 7749, 7752, 3, 962, 481, 0, 7750, 7752, 3, 1338, 669, 0, 7751, 7749, 1, 0, 0, 0, 7751, 7750, 1, 0, 0, 0, 7752, 7754, 1, 0, 0, 0, 7753, 7755, 3, 1064, 532, 0, 7754, 7753, 1, 0, 0, 0, 7754, 7755, 1, 0, 0, 0, 7755, 7756, 1, 0, 0, 0, 7756, 7757, 5, 80, 0, 0, 7757, 7766, 3, 1164, 582, 0, 7758, 7760, 3, 922, 461, 0, 7759, 7761, 3, 924, 462, 0, 7760, 7759, 1, 0, 0, 0, 7760, 7761, 1, 0, 0, 0, 7761, 7767, 1, 0, 0, 0, 7762, 7764, 3, 924, 462, 0, 7763, 7765, 3, 922, 461, 0, 7764, 7763, 1, 0, 0, 0, 7764, 7765, 1, 0, 0, 0, 7765, 7767, 1, 0, 0, 0, 7766, 7758, 1, 0, 0, 0, 7766, 7762, 1, 0, 0, 0, 7767, 7769, 1, 0, 0, 0, 7768, 7770, 3, 926, 463, 0, 7769, 7768, 1, 0, 0, 0, 7769, 7770, 1, 0, 0, 0, 7770, 921, 1, 0, 0, 0, 7771, 7772, 5, 102, 0, 0, 7772, 7773, 5, 77, 0, 0, 7773, 7776, 5, 250, 0, 0, 7774, 7775, 5, 33, 0, 0, 7775, 7777, 3, 1164, 582, 0, 7776, 7774, 1, 0, 0, 0, 7776, 7777, 1, 0, 0, 0, 7777, 7779, 1, 0, 0, 0, 7778, 7780, 5, 93, 0, 0, 7779, 7778, 1, 0, 0, 0, 7779, 7780, 1, 0, 0, 0, 7780, 7781, 1, 0, 0, 0, 7781, 7786, 5, 232, 0, 0, 7782, 7783, 5, 2, 0, 0, 7783, 7784, 3, 910, 455, 0, 7784, 7785, 5, 3, 0, 0, 7785, 7787, 1, 0, 0, 0, 7786, 7782, 1, 0, 0, 0, 7786, 7787, 1, 0, 0, 0, 7787, 7788, 1, 0, 0, 0, 7788, 7789, 3, 1054, 527, 0, 7789, 923, 1, 0, 0, 0, 7790, 7791, 5, 102, 0, 0, 7791, 7794, 5, 250, 0, 0, 7792, 7793, 5, 33, 0, 0, 7793, 7795, 3, 1164, 582, 0, 7794, 7792, 1, 0, 0, 0, 7794, 7795, 1, 0, 0, 0, 7795, 7797, 1, 0, 0, 0, 7796, 7798, 5, 93, 0, 0, 7797, 7796, 1, 0, 0, 0, 7797, 7798, 1, 0, 0, 0, 7798, 7799, 1, 0, 0, 0, 7799, 7800, 5, 362, 0, 0, 7800, 7801, 5, 326, 0, 0, 7801, 7802, 3, 944, 472, 0, 7802, 925, 1, 0, 0, 0, 7803, 7804, 5, 102, 0, 0, 7804, 7806, 5, 250, 0, 0, 7805, 7807, 5, 93, 0, 0, 7806, 7805, 1, 0, 0, 0, 7806, 7807, 1, 0, 0, 0, 7807, 7808, 1, 0, 0, 0, 7808, 7809, 5, 182, 0, 0, 7809, 927, 1, 0, 0, 0, 7810, 7811, 3, 982, 491, 0, 7811, 7812, 5, 182, 0, 0, 7812, 7813, 5, 64, 0, 0, 7813, 7814, 3, 1080, 540, 0, 7814, 7815, 3, 930, 465, 0, 7815, 7816, 3, 1098, 549, 0, 7816, 7817, 3, 918, 459, 0, 7817, 929, 1, 0, 0, 0, 7818, 7819, 5, 100, 0, 0, 7819, 7822, 3, 1058, 529, 0, 7820, 7822, 1, 0, 0, 0, 7821, 7818, 1, 0, 0, 0, 7821, 7820, 1, 0, 0, 0, 7822, 931, 1, 0, 0, 0, 7823, 7824, 5, 247, 0, 0, 7824, 7825, 3, 990, 495, 0, 7825, 7826, 3, 1078, 539, 0, 7826, 7827, 3, 934, 467, 0, 7827, 7828, 3, 938, 469, 0, 7828, 933, 1, 0, 0, 0, 7829, 7830, 5, 68, 0, 0, 7830, 7831, 3, 936, 468, 0, 7831, 7832, 5, 256, 0, 0, 7832, 7835, 1, 0, 0, 0, 7833, 7835, 1, 0, 0, 0, 7834, 7829, 1, 0, 0, 0, 7834, 7833, 1, 0, 0, 0, 7835, 935, 1, 0, 0, 0, 7836, 7837, 5, 131, 0, 0, 7837, 7849, 7, 34, 0, 0, 7838, 7839, 5, 407, 0, 0, 7839, 7849, 7, 34, 0, 0, 7840, 7845, 5, 327, 0, 0, 7841, 7842, 5, 362, 0, 0, 7842, 7846, 5, 201, 0, 0, 7843, 7844, 5, 407, 0, 0, 7844, 7846, 5, 201, 0, 0, 7845, 7841, 1, 0, 0, 0, 7845, 7843, 1, 0, 0, 0, 7845, 7846, 1, 0, 0, 0, 7846, 7849, 1, 0, 0, 0, 7847, 7849, 5, 201, 0, 0, 7848, 7836, 1, 0, 0, 0, 7848, 7838, 1, 0, 0, 0, 7848, 7840, 1, 0, 0, 0, 7848, 7847, 1, 0, 0, 0, 7849, 937, 1, 0, 0, 0, 7850, 7853, 5, 265, 0, 0, 7851, 7853, 1, 0, 0, 0, 7852, 7850, 1, 0, 0, 0, 7852, 7851, 1, 0, 0, 0, 7853, 939, 1, 0, 0, 0, 7854, 7859, 5, 265, 0, 0, 7855, 7856, 5, 465, 0, 0, 7856, 7859, 5, 466, 0, 0, 7857, 7859, 1, 0, 0, 0, 7858, 7854, 1, 0, 0, 0, 7858, 7855, 1, 0, 0, 0, 7858, 7857, 1, 0, 0, 0, 7859, 941, 1, 0, 0, 0, 7860, 7861, 3, 982, 491, 0, 7861, 7862, 5, 362, 0, 0, 7862, 7863, 3, 1080, 540, 0, 7863, 7864, 5, 326, 0, 0, 7864, 7865, 3, 944, 472, 0, 7865, 7866, 3, 1056, 528, 0, 7866, 7867, 3, 1098, 549, 0, 7867, 7868, 3, 918, 459, 0, 7868, 943, 1, 0, 0, 0, 7869, 7874, 3, 946, 473, 0, 7870, 7871, 5, 6, 0, 0, 7871, 7873, 3, 946, 473, 0, 7872, 7870, 1, 0, 0, 0, 7873, 7876, 1, 0, 0, 0, 7874, 7872, 1, 0, 0, 0, 7874, 7875, 1, 0, 0, 0, 7875, 945, 1, 0, 0, 0, 7876, 7874, 1, 0, 0, 0, 7877, 7878, 3, 948, 474, 0, 7878, 7879, 5, 10, 0, 0, 7879, 7880, 3, 1164, 582, 0, 7880, 7888, 1, 0, 0, 0, 7881, 7882, 5, 2, 0, 0, 7882, 7883, 3, 950, 475, 0, 7883, 7884, 5, 3, 0, 0, 7884, 7885, 5, 10, 0, 0, 7885, 7886, 3, 1164, 582, 0, 7886, 7888, 1, 0, 0, 0, 7887, 7877, 1, 0, 0, 0, 7887, 7881, 1, 0, 0, 0, 7888, 947, 1, 0, 0, 0, 7889, 7890, 3, 1374, 687, 0, 7890, 7891, 3, 1328, 664, 0, 7891, 949, 1, 0, 0, 0, 7892, 7897, 3, 948, 474, 0, 7893, 7894, 5, 6, 0, 0, 7894, 7896, 3, 948, 474, 0, 7895, 7893, 1, 0, 0, 0, 7896, 7899, 1, 0, 0, 0, 7897, 7895, 1, 0, 0, 0, 7897, 7898, 1, 0, 0, 0, 7898, 951, 1, 0, 0, 0, 7899, 7897, 1, 0, 0, 0, 7900, 7901, 5, 178, 0, 0, 7901, 7902, 3, 954, 477, 0, 7902, 7903, 3, 956, 478, 0, 7903, 7904, 5, 172, 0, 0, 7904, 7905, 3, 958, 479, 0, 7905, 7906, 5, 62, 0, 0, 7906, 7907, 3, 960, 480, 0, 7907, 953, 1, 0, 0, 0, 7908, 7909, 3, 1342, 671, 0, 7909, 955, 1, 0, 0, 0, 7910, 7911, 5, 262, 0, 0, 7911, 7916, 5, 317, 0, 0, 7912, 7916, 5, 317, 0, 0, 7913, 7916, 5, 107, 0, 0, 7914, 7916, 5, 231, 0, 0, 7915, 7910, 1, 0, 0, 0, 7915, 7912, 1, 0, 0, 0, 7915, 7913, 1, 0, 0, 0, 7915, 7914, 1, 0, 0, 0, 7916, 7919, 1, 0, 0, 0, 7917, 7915, 1, 0, 0, 0, 7917, 7918, 1, 0, 0, 0, 7918, 957, 1, 0, 0, 0, 7919, 7917, 1, 0, 0, 0, 7920, 7926, 1, 0, 0, 0, 7921, 7922, 5, 105, 0, 0, 7922, 7926, 5, 217, 0, 0, 7923, 7924, 5, 372, 0, 0, 7924, 7926, 5, 217, 0, 0, 7925, 7920, 1, 0, 0, 0, 7925, 7921, 1, 0, 0, 0, 7925, 7923, 1, 0, 0, 0, 7926, 959, 1, 0, 0, 0, 7927, 7930, 3, 964, 482, 0, 7928, 7930, 3, 962, 481, 0, 7929, 7927, 1, 0, 0, 0, 7929, 7928, 1, 0, 0, 0, 7930, 961, 1, 0, 0, 0, 7931, 7932, 5, 2, 0, 0, 7932, 7933, 3, 964, 482, 0, 7933, 7934, 5, 3, 0, 0, 7934, 7940, 1, 0, 0, 0, 7935, 7936, 5, 2, 0, 0, 7936, 7937, 3, 962, 481, 0, 7937, 7938, 5, 3, 0, 0, 7938, 7940, 1, 0, 0, 0, 7939, 7931, 1, 0, 0, 0, 7939, 7935, 1, 0, 0, 0, 7940, 963, 1, 0, 0, 0, 7941, 7942, 3, 966, 483, 0, 7942, 7949, 3, 998, 499, 0, 7943, 7944, 3, 1042, 521, 0, 7944, 7945, 3, 1008, 504, 0, 7945, 7950, 1, 0, 0, 0, 7946, 7947, 3, 1006, 503, 0, 7947, 7948, 3, 1044, 522, 0, 7948, 7950, 1, 0, 0, 0, 7949, 7943, 1, 0, 0, 0, 7949, 7946, 1, 0, 0, 0, 7949, 7950, 1, 0, 0, 0, 7950, 7963, 1, 0, 0, 0, 7951, 7952, 3, 974, 487, 0, 7952, 7953, 3, 966, 483, 0, 7953, 7960, 3, 998, 499, 0, 7954, 7955, 3, 1042, 521, 0, 7955, 7956, 3, 1008, 504, 0, 7956, 7961, 1, 0, 0, 0, 7957, 7958, 3, 1006, 503, 0, 7958, 7959, 3, 1044, 522, 0, 7959, 7961, 1, 0, 0, 0, 7960, 7954, 1, 0, 0, 0, 7960, 7957, 1, 0, 0, 0, 7960, 7961, 1, 0, 0, 0, 7961, 7963, 1, 0, 0, 0, 7962, 7941, 1, 0, 0, 0, 7962, 7951, 1, 0, 0, 0, 7963, 965, 1, 0, 0, 0, 7964, 7967, 3, 968, 484, 0, 7965, 7967, 3, 962, 481, 0, 7966, 7964, 1, 0, 0, 0, 7966, 7965, 1, 0, 0, 0, 7967, 967, 1, 0, 0, 0, 7968, 7976, 5, 88, 0, 0, 7969, 7970, 3, 996, 498, 0, 7970, 7971, 3, 984, 492, 0, 7971, 7972, 3, 1330, 665, 0, 7972, 7977, 1, 0, 0, 0, 7973, 7974, 3, 994, 497, 0, 7974, 7975, 3, 1332, 666, 0, 7975, 7977, 1, 0, 0, 0, 7976, 7969, 1, 0, 0, 0, 7976, 7973, 1, 0, 0, 0, 7977, 7978, 1, 0, 0, 0, 7978, 7979, 3, 984, 492, 0, 7979, 7980, 3, 1056, 528, 0, 7980, 7981, 3, 1096, 548, 0, 7981, 7982, 3, 1026, 513, 0, 7982, 7983, 3, 1040, 520, 0, 7983, 7984, 3, 1242, 621, 0, 7984, 7995, 1, 0, 0, 0, 7985, 7995, 3, 1054, 527, 0, 7986, 7987, 5, 92, 0, 0, 7987, 7995, 3, 1076, 538, 0, 7988, 7989, 3, 962, 481, 0, 7989, 7992, 3, 972, 486, 0, 7990, 7993, 3, 968, 484, 0, 7991, 7993, 3, 962, 481, 0, 7992, 7990, 1, 0, 0, 0, 7992, 7991, 1, 0, 0, 0, 7993, 7995, 1, 0, 0, 0, 7994, 7968, 1, 0, 0, 0, 7994, 7985, 1, 0, 0, 0, 7994, 7986, 1, 0, 0, 0, 7994, 7988, 1, 0, 0, 0, 7995, 8003, 1, 0, 0, 0, 7996, 7999, 3, 972, 486, 0, 7997, 8000, 3, 968, 484, 0, 7998, 8000, 3, 962, 481, 0, 7999, 7997, 1, 0, 0, 0, 7999, 7998, 1, 0, 0, 0, 8000, 8002, 1, 0, 0, 0, 8001, 7996, 1, 0, 0, 0, 8002, 8005, 1, 0, 0, 0, 8003, 8001, 1, 0, 0, 0, 8003, 8004, 1, 0, 0, 0, 8004, 969, 1, 0, 0, 0, 8005, 8003, 1, 0, 0, 0, 8006, 8010, 5, 97, 0, 0, 8007, 8010, 5, 70, 0, 0, 8008, 8010, 5, 59, 0, 0, 8009, 8006, 1, 0, 0, 0, 8009, 8007, 1, 0, 0, 0, 8009, 8008, 1, 0, 0, 0, 8010, 971, 1, 0, 0, 0, 8011, 8012, 3, 970, 485, 0, 8012, 8013, 3, 992, 496, 0, 8013, 973, 1, 0, 0, 0, 8014, 8016, 5, 105, 0, 0, 8015, 8017, 5, 296, 0, 0, 8016, 8015, 1, 0, 0, 0, 8016, 8017, 1, 0, 0, 0, 8017, 8018, 1, 0, 0, 0, 8018, 8019, 3, 976, 488, 0, 8019, 975, 1, 0, 0, 0, 8020, 8025, 3, 978, 489, 0, 8021, 8022, 5, 6, 0, 0, 8022, 8024, 3, 978, 489, 0, 8023, 8021, 1, 0, 0, 0, 8024, 8027, 1, 0, 0, 0, 8025, 8023, 1, 0, 0, 0, 8025, 8026, 1, 0, 0, 0, 8026, 977, 1, 0, 0, 0, 8027, 8025, 1, 0, 0, 0, 8028, 8029, 3, 1342, 671, 0, 8029, 8030, 3, 870, 435, 0, 8030, 8031, 5, 36, 0, 0, 8031, 8032, 3, 980, 490, 0, 8032, 8033, 5, 2, 0, 0, 8033, 8034, 3, 894, 447, 0, 8034, 8035, 5, 3, 0, 0, 8035, 979, 1, 0, 0, 0, 8036, 8041, 5, 251, 0, 0, 8037, 8038, 5, 77, 0, 0, 8038, 8041, 5, 251, 0, 0, 8039, 8041, 1, 0, 0, 0, 8040, 8036, 1, 0, 0, 0, 8040, 8037, 1, 0, 0, 0, 8040, 8039, 1, 0, 0, 0, 8041, 981, 1, 0, 0, 0, 8042, 8045, 3, 974, 487, 0, 8043, 8045, 1, 0, 0, 0, 8044, 8042, 1, 0, 0, 0, 8044, 8043, 1, 0, 0, 0, 8045, 983, 1, 0, 0, 0, 8046, 8051, 5, 71, 0, 0, 8047, 8048, 3, 986, 493, 0, 8048, 8049, 3, 988, 494, 0, 8049, 8052, 1, 0, 0, 0, 8050, 8052, 3, 1568, 784, 0, 8051, 8047, 1, 0, 0, 0, 8051, 8050, 1, 0, 0, 0, 8052, 8055, 1, 0, 0, 0, 8053, 8055, 1, 0, 0, 0, 8054, 8046, 1, 0, 0, 0, 8054, 8053, 1, 0, 0, 0, 8055, 985, 1, 0, 0, 0, 8056, 8059, 1, 0, 0, 0, 8057, 8059, 5, 339, 0, 0, 8058, 8056, 1, 0, 0, 0, 8058, 8057, 1, 0, 0, 0, 8059, 987, 1, 0, 0, 0, 8060, 8062, 7, 35, 0, 0, 8061, 8060, 1, 0, 0, 0, 8061, 8062, 1, 0, 0, 0, 8062, 8063, 1, 0, 0, 0, 8063, 8064, 7, 11, 0, 0, 8064, 8065, 3, 990, 495, 0, 8065, 8066, 3, 1338, 669, 0, 8066, 8075, 1, 0, 0, 0, 8067, 8068, 5, 360, 0, 0, 8068, 8069, 3, 990, 495, 0, 8069, 8070, 3, 1338, 669, 0, 8070, 8075, 1, 0, 0, 0, 8071, 8072, 5, 92, 0, 0, 8072, 8075, 3, 1338, 669, 0, 8073, 8075, 3, 1338, 669, 0, 8074, 8061, 1, 0, 0, 0, 8074, 8067, 1, 0, 0, 0, 8074, 8071, 1, 0, 0, 0, 8074, 8073, 1, 0, 0, 0, 8075, 989, 1, 0, 0, 0, 8076, 8079, 5, 92, 0, 0, 8077, 8079, 1, 0, 0, 0, 8078, 8076, 1, 0, 0, 0, 8078, 8077, 1, 0, 0, 0, 8079, 991, 1, 0, 0, 0, 8080, 8084, 5, 30, 0, 0, 8081, 8084, 5, 56, 0, 0, 8082, 8084, 1, 0, 0, 0, 8083, 8080, 1, 0, 0, 0, 8083, 8081, 1, 0, 0, 0, 8083, 8082, 1, 0, 0, 0, 8084, 993, 1, 0, 0, 0, 8085, 8091, 5, 56, 0, 0, 8086, 8087, 5, 80, 0, 0, 8087, 8088, 5, 2, 0, 0, 8088, 8089, 3, 1282, 641, 0, 8089, 8090, 5, 3, 0, 0, 8090, 8092, 1, 0, 0, 0, 8091, 8086, 1, 0, 0, 0, 8091, 8092, 1, 0, 0, 0, 8092, 995, 1, 0, 0, 0, 8093, 8096, 5, 30, 0, 0, 8094, 8096, 1, 0, 0, 0, 8095, 8093, 1, 0, 0, 0, 8095, 8094, 1, 0, 0, 0, 8096, 997, 1, 0, 0, 0, 8097, 8100, 3, 1000, 500, 0, 8098, 8100, 1, 0, 0, 0, 8099, 8097, 1, 0, 0, 0, 8099, 8098, 1, 0, 0, 0, 8100, 999, 1, 0, 0, 0, 8101, 8102, 5, 83, 0, 0, 8102, 8103, 5, 147, 0, 0, 8103, 8104, 3, 1002, 501, 0, 8104, 1001, 1, 0, 0, 0, 8105, 8110, 3, 1004, 502, 0, 8106, 8107, 5, 6, 0, 0, 8107, 8109, 3, 1004, 502, 0, 8108, 8106, 1, 0, 0, 0, 8109, 8112, 1, 0, 0, 0, 8110, 8108, 1, 0, 0, 0, 8110, 8111, 1, 0, 0, 0, 8111, 1003, 1, 0, 0, 0, 8112, 8110, 1, 0, 0, 0, 8113, 8117, 3, 1164, 582, 0, 8114, 8115, 5, 100, 0, 0, 8115, 8118, 3, 1278, 639, 0, 8116, 8118, 3, 612, 306, 0, 8117, 8114, 1, 0, 0, 0, 8117, 8116, 1, 0, 0, 0, 8118, 8119, 1, 0, 0, 0, 8119, 8120, 3, 614, 307, 0, 8120, 1005, 1, 0, 0, 0, 8121, 8123, 3, 1010, 505, 0, 8122, 8124, 3, 1012, 506, 0, 8123, 8122, 1, 0, 0, 0, 8123, 8124, 1, 0, 0, 0, 8124, 8130, 1, 0, 0, 0, 8125, 8127, 3, 1012, 506, 0, 8126, 8128, 3, 1010, 505, 0, 8127, 8126, 1, 0, 0, 0, 8127, 8128, 1, 0, 0, 0, 8128, 8130, 1, 0, 0, 0, 8129, 8121, 1, 0, 0, 0, 8129, 8125, 1, 0, 0, 0, 8130, 1007, 1, 0, 0, 0, 8131, 8134, 3, 1006, 503, 0, 8132, 8134, 1, 0, 0, 0, 8133, 8131, 1, 0, 0, 0, 8133, 8132, 1, 0, 0, 0, 8134, 1009, 1, 0, 0, 0, 8135, 8136, 5, 74, 0, 0, 8136, 8139, 3, 1014, 507, 0, 8137, 8138, 5, 6, 0, 0, 8138, 8140, 3, 1016, 508, 0, 8139, 8137, 1, 0, 0, 0, 8139, 8140, 1, 0, 0, 0, 8140, 8159, 1, 0, 0, 0, 8141, 8142, 5, 61, 0, 0, 8142, 8156, 3, 1024, 512, 0, 8143, 8144, 3, 1018, 509, 0, 8144, 8148, 3, 1022, 511, 0, 8145, 8149, 5, 81, 0, 0, 8146, 8147, 5, 105, 0, 0, 8147, 8149, 5, 467, 0, 0, 8148, 8145, 1, 0, 0, 0, 8148, 8146, 1, 0, 0, 0, 8149, 8157, 1, 0, 0, 0, 8150, 8154, 3, 1022, 511, 0, 8151, 8155, 5, 81, 0, 0, 8152, 8153, 5, 105, 0, 0, 8153, 8155, 5, 467, 0, 0, 8154, 8151, 1, 0, 0, 0, 8154, 8152, 1, 0, 0, 0, 8155, 8157, 1, 0, 0, 0, 8156, 8143, 1, 0, 0, 0, 8156, 8150, 1, 0, 0, 0, 8157, 8159, 1, 0, 0, 0, 8158, 8135, 1, 0, 0, 0, 8158, 8141, 1, 0, 0, 0, 8159, 1011, 1, 0, 0, 0, 8160, 8165, 5, 79, 0, 0, 8161, 8166, 3, 1016, 508, 0, 8162, 8163, 3, 1018, 509, 0, 8163, 8164, 3, 1022, 511, 0, 8164, 8166, 1, 0, 0, 0, 8165, 8161, 1, 0, 0, 0, 8165, 8162, 1, 0, 0, 0, 8166, 1013, 1, 0, 0, 0, 8167, 8170, 3, 1164, 582, 0, 8168, 8170, 5, 30, 0, 0, 8169, 8167, 1, 0, 0, 0, 8169, 8168, 1, 0, 0, 0, 8170, 1015, 1, 0, 0, 0, 8171, 8172, 3, 1164, 582, 0, 8172, 1017, 1, 0, 0, 0, 8173, 8179, 3, 1208, 604, 0, 8174, 8175, 5, 12, 0, 0, 8175, 8179, 3, 1020, 510, 0, 8176, 8177, 5, 13, 0, 0, 8177, 8179, 3, 1020, 510, 0, 8178, 8173, 1, 0, 0, 0, 8178, 8174, 1, 0, 0, 0, 8178, 8176, 1, 0, 0, 0, 8179, 1019, 1, 0, 0, 0, 8180, 8183, 3, 1358, 679, 0, 8181, 8183, 3, 1356, 678, 0, 8182, 8180, 1, 0, 0, 0, 8182, 8181, 1, 0, 0, 0, 8183, 1021, 1, 0, 0, 0, 8184, 8185, 7, 36, 0, 0, 8185, 1023, 1, 0, 0, 0, 8186, 8187, 7, 37, 0, 0, 8187, 1025, 1, 0, 0, 0, 8188, 8189, 5, 66, 0, 0, 8189, 8190, 5, 147, 0, 0, 8190, 8193, 3, 1028, 514, 0, 8191, 8193, 1, 0, 0, 0, 8192, 8188, 1, 0, 0, 0, 8192, 8191, 1, 0, 0, 0, 8193, 1027, 1, 0, 0, 0, 8194, 8199, 3, 1030, 515, 0, 8195, 8196, 5, 6, 0, 0, 8196, 8198, 3, 1030, 515, 0, 8197, 8195, 1, 0, 0, 0, 8198, 8201, 1, 0, 0, 0, 8199, 8197, 1, 0, 0, 0, 8199, 8200, 1, 0, 0, 0, 8200, 1029, 1, 0, 0, 0, 8201, 8199, 1, 0, 0, 0, 8202, 8208, 3, 1164, 582, 0, 8203, 8208, 3, 1032, 516, 0, 8204, 8208, 3, 1036, 518, 0, 8205, 8208, 3, 1034, 517, 0, 8206, 8208, 3, 1038, 519, 0, 8207, 8202, 1, 0, 0, 0, 8207, 8203, 1, 0, 0, 0, 8207, 8204, 1, 0, 0, 0, 8207, 8205, 1, 0, 0, 0, 8207, 8206, 1, 0, 0, 0, 8208, 1031, 1, 0, 0, 0, 8209, 8210, 5, 2, 0, 0, 8210, 8211, 5, 3, 0, 0, 8211, 1033, 1, 0, 0, 0, 8212, 8213, 5, 468, 0, 0, 8213, 8214, 5, 2, 0, 0, 8214, 8215, 3, 1282, 641, 0, 8215, 8216, 5, 3, 0, 0, 8216, 1035, 1, 0, 0, 0, 8217, 8218, 5, 469, 0, 0, 8218, 8219, 5, 2, 0, 0, 8219, 8220, 3, 1282, 641, 0, 8220, 8221, 5, 3, 0, 0, 8221, 1037, 1, 0, 0, 0, 8222, 8223, 5, 470, 0, 0, 8223, 8224, 5, 471, 0, 0, 8224, 8225, 5, 2, 0, 0, 8225, 8226, 3, 1028, 514, 0, 8226, 8227, 5, 3, 0, 0, 8227, 1039, 1, 0, 0, 0, 8228, 8229, 5, 67, 0, 0, 8229, 8232, 3, 1164, 582, 0, 8230, 8232, 1, 0, 0, 0, 8231, 8228, 1, 0, 0, 0, 8231, 8230, 1, 0, 0, 0, 8232, 1041, 1, 0, 0, 0, 8233, 8238, 3, 1046, 523, 0, 8234, 8235, 5, 62, 0, 0, 8235, 8236, 5, 293, 0, 0, 8236, 8238, 5, 81, 0, 0, 8237, 8233, 1, 0, 0, 0, 8237, 8234, 1, 0, 0, 0, 8238, 1043, 1, 0, 0, 0, 8239, 8242, 3, 1042, 521, 0, 8240, 8242, 1, 0, 0, 0, 8241, 8239, 1, 0, 0, 0, 8241, 8240, 1, 0, 0, 0, 8242, 1045, 1, 0, 0, 0, 8243, 8245, 3, 1048, 524, 0, 8244, 8243, 1, 0, 0, 0, 8245, 8246, 1, 0, 0, 0, 8246, 8244, 1, 0, 0, 0, 8246, 8247, 1, 0, 0, 0, 8247, 1047, 1, 0, 0, 0, 8248, 8249, 3, 1050, 525, 0, 8249, 8250, 3, 1052, 526, 0, 8250, 8251, 3, 940, 470, 0, 8251, 1049, 1, 0, 0, 0, 8252, 8262, 5, 62, 0, 0, 8253, 8254, 5, 262, 0, 0, 8254, 8256, 5, 236, 0, 0, 8255, 8253, 1, 0, 0, 0, 8255, 8256, 1, 0, 0, 0, 8256, 8257, 1, 0, 0, 0, 8257, 8263, 5, 362, 0, 0, 8258, 8260, 5, 236, 0, 0, 8259, 8258, 1, 0, 0, 0, 8259, 8260, 1, 0, 0, 0, 8260, 8261, 1, 0, 0, 0, 8261, 8263, 5, 327, 0, 0, 8262, 8255, 1, 0, 0, 0, 8262, 8259, 1, 0, 0, 0, 8263, 1051, 1, 0, 0, 0, 8264, 8265, 5, 268, 0, 0, 8265, 8268, 3, 1336, 668, 0, 8266, 8268, 1, 0, 0, 0, 8267, 8264, 1, 0, 0, 0, 8267, 8266, 1, 0, 0, 0, 8268, 1053, 1, 0, 0, 0, 8269, 8270, 5, 415, 0, 0, 8270, 8271, 5, 2, 0, 0, 8271, 8272, 3, 1282, 641, 0, 8272, 8280, 5, 3, 0, 0, 8273, 8274, 5, 6, 0, 0, 8274, 8275, 5, 2, 0, 0, 8275, 8276, 3, 1282, 641, 0, 8276, 8277, 5, 3, 0, 0, 8277, 8279, 1, 0, 0, 0, 8278, 8273, 1, 0, 0, 0, 8279, 8282, 1, 0, 0, 0, 8280, 8278, 1, 0, 0, 0, 8280, 8281, 1, 0, 0, 0, 8281, 1055, 1, 0, 0, 0, 8282, 8280, 1, 0, 0, 0, 8283, 8284, 5, 64, 0, 0, 8284, 8287, 3, 1058, 529, 0, 8285, 8287, 1, 0, 0, 0, 8286, 8283, 1, 0, 0, 0, 8286, 8285, 1, 0, 0, 0, 8287, 1057, 1, 0, 0, 0, 8288, 8298, 3, 1060, 530, 0, 8289, 8294, 3, 1062, 531, 0, 8290, 8291, 5, 6, 0, 0, 8291, 8293, 3, 1062, 531, 0, 8292, 8290, 1, 0, 0, 0, 8293, 8296, 1, 0, 0, 0, 8294, 8292, 1, 0, 0, 0, 8294, 8295, 1, 0, 0, 0, 8295, 8298, 1, 0, 0, 0, 8296, 8294, 1, 0, 0, 0, 8297, 8288, 1, 0, 0, 0, 8297, 8289, 1, 0, 0, 0, 8298, 1059, 1, 0, 0, 0, 8299, 8302, 3, 1062, 531, 0, 8300, 8301, 5, 6, 0, 0, 8301, 8303, 3, 1062, 531, 0, 8302, 8300, 1, 0, 0, 0, 8303, 8304, 1, 0, 0, 0, 8304, 8302, 1, 0, 0, 0, 8304, 8305, 1, 0, 0, 0, 8305, 1061, 1, 0, 0, 0, 8306, 8307, 3, 1076, 538, 0, 8307, 8309, 3, 1066, 533, 0, 8308, 8310, 3, 1082, 541, 0, 8309, 8308, 1, 0, 0, 0, 8309, 8310, 1, 0, 0, 0, 8310, 8356, 1, 0, 0, 0, 8311, 8312, 3, 1086, 543, 0, 8312, 8313, 3, 1070, 535, 0, 8313, 8356, 1, 0, 0, 0, 8314, 8315, 3, 1106, 553, 0, 8315, 8316, 3, 1066, 533, 0, 8316, 8356, 1, 0, 0, 0, 8317, 8318, 3, 962, 481, 0, 8318, 8319, 3, 1066, 533, 0, 8319, 8356, 1, 0, 0, 0, 8320, 8330, 5, 72, 0, 0, 8321, 8322, 3, 1106, 553, 0, 8322, 8323, 3, 1066, 533, 0, 8323, 8331, 1, 0, 0, 0, 8324, 8325, 3, 1086, 543, 0, 8325, 8326, 3, 1070, 535, 0, 8326, 8331, 1, 0, 0, 0, 8327, 8328, 3, 962, 481, 0, 8328, 8329, 3, 1066, 533, 0, 8329, 8331, 1, 0, 0, 0, 8330, 8321, 1, 0, 0, 0, 8330, 8324, 1, 0, 0, 0, 8330, 8327, 1, 0, 0, 0, 8331, 8356, 1, 0, 0, 0, 8332, 8333, 5, 2, 0, 0, 8333, 8350, 3, 1062, 531, 0, 8334, 8335, 5, 110, 0, 0, 8335, 8336, 5, 118, 0, 0, 8336, 8351, 3, 1062, 531, 0, 8337, 8339, 5, 121, 0, 0, 8338, 8340, 3, 1072, 536, 0, 8339, 8338, 1, 0, 0, 0, 8339, 8340, 1, 0, 0, 0, 8340, 8341, 1, 0, 0, 0, 8341, 8342, 5, 118, 0, 0, 8342, 8351, 3, 1062, 531, 0, 8343, 8345, 3, 1072, 536, 0, 8344, 8343, 1, 0, 0, 0, 8344, 8345, 1, 0, 0, 0, 8345, 8346, 1, 0, 0, 0, 8346, 8347, 5, 118, 0, 0, 8347, 8348, 3, 1062, 531, 0, 8348, 8349, 3, 1074, 537, 0, 8349, 8351, 1, 0, 0, 0, 8350, 8334, 1, 0, 0, 0, 8350, 8337, 1, 0, 0, 0, 8350, 8344, 1, 0, 0, 0, 8350, 8351, 1, 0, 0, 0, 8351, 8352, 1, 0, 0, 0, 8352, 8353, 5, 3, 0, 0, 8353, 8354, 3, 1066, 533, 0, 8354, 8356, 1, 0, 0, 0, 8355, 8306, 1, 0, 0, 0, 8355, 8311, 1, 0, 0, 0, 8355, 8314, 1, 0, 0, 0, 8355, 8317, 1, 0, 0, 0, 8355, 8320, 1, 0, 0, 0, 8355, 8332, 1, 0, 0, 0, 8356, 8375, 1, 0, 0, 0, 8357, 8358, 5, 110, 0, 0, 8358, 8359, 5, 118, 0, 0, 8359, 8374, 3, 1062, 531, 0, 8360, 8362, 5, 121, 0, 0, 8361, 8363, 3, 1072, 536, 0, 8362, 8361, 1, 0, 0, 0, 8362, 8363, 1, 0, 0, 0, 8363, 8364, 1, 0, 0, 0, 8364, 8365, 5, 118, 0, 0, 8365, 8374, 3, 1062, 531, 0, 8366, 8368, 3, 1072, 536, 0, 8367, 8366, 1, 0, 0, 0, 8367, 8368, 1, 0, 0, 0, 8368, 8369, 1, 0, 0, 0, 8369, 8370, 5, 118, 0, 0, 8370, 8371, 3, 1062, 531, 0, 8371, 8372, 3, 1074, 537, 0, 8372, 8374, 1, 0, 0, 0, 8373, 8357, 1, 0, 0, 0, 8373, 8360, 1, 0, 0, 0, 8373, 8367, 1, 0, 0, 0, 8374, 8377, 1, 0, 0, 0, 8375, 8373, 1, 0, 0, 0, 8375, 8376, 1, 0, 0, 0, 8376, 1063, 1, 0, 0, 0, 8377, 8375, 1, 0, 0, 0, 8378, 8380, 5, 36, 0, 0, 8379, 8378, 1, 0, 0, 0, 8379, 8380, 1, 0, 0, 0, 8380, 8381, 1, 0, 0, 0, 8381, 8386, 3, 1374, 687, 0, 8382, 8383, 5, 2, 0, 0, 8383, 8384, 3, 1340, 670, 0, 8384, 8385, 5, 3, 0, 0, 8385, 8387, 1, 0, 0, 0, 8386, 8382, 1, 0, 0, 0, 8386, 8387, 1, 0, 0, 0, 8387, 1065, 1, 0, 0, 0, 8388, 8391, 3, 1068, 534, 0, 8389, 8391, 1, 0, 0, 0, 8390, 8388, 1, 0, 0, 0, 8390, 8389, 1, 0, 0, 0, 8391, 1067, 1, 0, 0, 0, 8392, 8394, 5, 36, 0, 0, 8393, 8392, 1, 0, 0, 0, 8393, 8394, 1, 0, 0, 0, 8394, 8395, 1, 0, 0, 0, 8395, 8400, 3, 1376, 688, 0, 8396, 8397, 5, 2, 0, 0, 8397, 8398, 3, 1340, 670, 0, 8398, 8399, 5, 3, 0, 0, 8399, 8401, 1, 0, 0, 0, 8400, 8396, 1, 0, 0, 0, 8400, 8401, 1, 0, 0, 0, 8401, 1069, 1, 0, 0, 0, 8402, 8416, 3, 1064, 532, 0, 8403, 8405, 5, 36, 0, 0, 8404, 8406, 3, 1374, 687, 0, 8405, 8404, 1, 0, 0, 0, 8405, 8406, 1, 0, 0, 0, 8406, 8409, 1, 0, 0, 0, 8407, 8409, 3, 1374, 687, 0, 8408, 8403, 1, 0, 0, 0, 8408, 8407, 1, 0, 0, 0, 8409, 8410, 1, 0, 0, 0, 8410, 8411, 5, 2, 0, 0, 8411, 8412, 3, 1102, 551, 0, 8412, 8413, 5, 3, 0, 0, 8413, 8416, 1, 0, 0, 0, 8414, 8416, 1, 0, 0, 0, 8415, 8402, 1, 0, 0, 0, 8415, 8408, 1, 0, 0, 0, 8415, 8414, 1, 0, 0, 0, 8416, 1071, 1, 0, 0, 0, 8417, 8419, 7, 38, 0, 0, 8418, 8420, 5, 123, 0, 0, 8419, 8418, 1, 0, 0, 0, 8419, 8420, 1, 0, 0, 0, 8420, 1073, 1, 0, 0, 0, 8421, 8422, 5, 100, 0, 0, 8422, 8423, 5, 2, 0, 0, 8423, 8424, 3, 1340, 670, 0, 8424, 8425, 5, 3, 0, 0, 8425, 8429, 1, 0, 0, 0, 8426, 8427, 5, 80, 0, 0, 8427, 8429, 3, 1164, 582, 0, 8428, 8421, 1, 0, 0, 0, 8428, 8426, 1, 0, 0, 0, 8429, 1075, 1, 0, 0, 0, 8430, 8432, 3, 1338, 669, 0, 8431, 8433, 5, 9, 0, 0, 8432, 8431, 1, 0, 0, 0, 8432, 8433, 1, 0, 0, 0, 8433, 8443, 1, 0, 0, 0, 8434, 8440, 5, 81, 0, 0, 8435, 8441, 3, 1338, 669, 0, 8436, 8437, 5, 2, 0, 0, 8437, 8438, 3, 1338, 669, 0, 8438, 8439, 5, 3, 0, 0, 8439, 8441, 1, 0, 0, 0, 8440, 8435, 1, 0, 0, 0, 8440, 8436, 1, 0, 0, 0, 8441, 8443, 1, 0, 0, 0, 8442, 8430, 1, 0, 0, 0, 8442, 8434, 1, 0, 0, 0, 8443, 1077, 1, 0, 0, 0, 8444, 8449, 3, 1076, 538, 0, 8445, 8446, 5, 6, 0, 0, 8446, 8448, 3, 1076, 538, 0, 8447, 8445, 1, 0, 0, 0, 8448, 8451, 1, 0, 0, 0, 8449, 8447, 1, 0, 0, 0, 8449, 8450, 1, 0, 0, 0, 8450, 1079, 1, 0, 0, 0, 8451, 8449, 1, 0, 0, 0, 8452, 8457, 3, 1076, 538, 0, 8453, 8455, 5, 36, 0, 0, 8454, 8453, 1, 0, 0, 0, 8454, 8455, 1, 0, 0, 0, 8455, 8456, 1, 0, 0, 0, 8456, 8458, 3, 1374, 687, 0, 8457, 8454, 1, 0, 0, 0, 8457, 8458, 1, 0, 0, 0, 8458, 1081, 1, 0, 0, 0, 8459, 8460, 5, 472, 0, 0, 8460, 8461, 3, 1348, 674, 0, 8461, 8462, 5, 2, 0, 0, 8462, 8463, 3, 1282, 641, 0, 8463, 8464, 5, 3, 0, 0, 8464, 8465, 3, 1084, 542, 0, 8465, 1083, 1, 0, 0, 0, 8466, 8467, 5, 303, 0, 0, 8467, 8468, 5, 2, 0, 0, 8468, 8469, 3, 1164, 582, 0, 8469, 8470, 5, 3, 0, 0, 8470, 8473, 1, 0, 0, 0, 8471, 8473, 1, 0, 0, 0, 8472, 8466, 1, 0, 0, 0, 8472, 8471, 1, 0, 0, 0, 8473, 1085, 1, 0, 0, 0, 8474, 8475, 3, 1216, 608, 0, 8475, 8476, 3, 1094, 547, 0, 8476, 8485, 1, 0, 0, 0, 8477, 8478, 5, 313, 0, 0, 8478, 8479, 5, 64, 0, 0, 8479, 8480, 5, 2, 0, 0, 8480, 8481, 3, 1090, 545, 0, 8481, 8482, 5, 3, 0, 0, 8482, 8483, 3, 1094, 547, 0, 8483, 8485, 1, 0, 0, 0, 8484, 8474, 1, 0, 0, 0, 8484, 8477, 1, 0, 0, 0, 8485, 1087, 1, 0, 0, 0, 8486, 8487, 3, 1216, 608, 0, 8487, 8488, 3, 1092, 546, 0, 8488, 1089, 1, 0, 0, 0, 8489, 8494, 3, 1088, 544, 0, 8490, 8491, 5, 6, 0, 0, 8491, 8493, 3, 1088, 544, 0, 8492, 8490, 1, 0, 0, 0, 8493, 8496, 1, 0, 0, 0, 8494, 8492, 1, 0, 0, 0, 8494, 8495, 1, 0, 0, 0, 8495, 1091, 1, 0, 0, 0, 8496, 8494, 1, 0, 0, 0, 8497, 8498, 5, 36, 0, 0, 8498, 8499, 5, 2, 0, 0, 8499, 8500, 3, 1102, 551, 0, 8500, 8501, 5, 3, 0, 0, 8501, 8504, 1, 0, 0, 0, 8502, 8504, 1, 0, 0, 0, 8503, 8497, 1, 0, 0, 0, 8503, 8502, 1, 0, 0, 0, 8504, 1093, 1, 0, 0, 0, 8505, 8506, 5, 105, 0, 0, 8506, 8509, 5, 473, 0, 0, 8507, 8509, 1, 0, 0, 0, 8508, 8505, 1, 0, 0, 0, 8508, 8507, 1, 0, 0, 0, 8509, 1095, 1, 0, 0, 0, 8510, 8511, 5, 103, 0, 0, 8511, 8514, 3, 1164, 582, 0, 8512, 8514, 1, 0, 0, 0, 8513, 8510, 1, 0, 0, 0, 8513, 8512, 1, 0, 0, 0, 8514, 1097, 1, 0, 0, 0, 8515, 8520, 5, 103, 0, 0, 8516, 8517, 5, 434, 0, 0, 8517, 8518, 5, 268, 0, 0, 8518, 8521, 3, 954, 477, 0, 8519, 8521, 3, 1164, 582, 0, 8520, 8516, 1, 0, 0, 0, 8520, 8519, 1, 0, 0, 0, 8521, 8524, 1, 0, 0, 0, 8522, 8524, 1, 0, 0, 0, 8523, 8515, 1, 0, 0, 0, 8523, 8522, 1, 0, 0, 0, 8524, 1099, 1, 0, 0, 0, 8525, 8528, 3, 1102, 551, 0, 8526, 8528, 1, 0, 0, 0, 8527, 8525, 1, 0, 0, 0, 8527, 8526, 1, 0, 0, 0, 8528, 1101, 1, 0, 0, 0, 8529, 8534, 3, 1104, 552, 0, 8530, 8531, 5, 6, 0, 0, 8531, 8533, 3, 1104, 552, 0, 8532, 8530, 1, 0, 0, 0, 8533, 8536, 1, 0, 0, 0, 8534, 8532, 1, 0, 0, 0, 8534, 8535, 1, 0, 0, 0, 8535, 1103, 1, 0, 0, 0, 8536, 8534, 1, 0, 0, 0, 8537, 8538, 3, 1374, 687, 0, 8538, 8539, 3, 1120, 560, 0, 8539, 8540, 3, 110, 55, 0, 8540, 1105, 1, 0, 0, 0, 8541, 8542, 5, 474, 0, 0, 8542, 8558, 5, 2, 0, 0, 8543, 8544, 3, 1208, 604, 0, 8544, 8545, 3, 1234, 617, 0, 8545, 8546, 5, 475, 0, 0, 8546, 8547, 3, 1108, 554, 0, 8547, 8559, 1, 0, 0, 0, 8548, 8549, 5, 476, 0, 0, 8549, 8550, 5, 2, 0, 0, 8550, 8551, 3, 1116, 558, 0, 8551, 8552, 5, 3, 0, 0, 8552, 8553, 5, 6, 0, 0, 8553, 8554, 3, 1208, 604, 0, 8554, 8555, 3, 1234, 617, 0, 8555, 8556, 5, 475, 0, 0, 8556, 8557, 3, 1108, 554, 0, 8557, 8559, 1, 0, 0, 0, 8558, 8543, 1, 0, 0, 0, 8558, 8548, 1, 0, 0, 0, 8559, 8560, 1, 0, 0, 0, 8560, 8561, 5, 3, 0, 0, 8561, 1107, 1, 0, 0, 0, 8562, 8567, 3, 1110, 555, 0, 8563, 8564, 5, 6, 0, 0, 8564, 8566, 3, 1110, 555, 0, 8565, 8563, 1, 0, 0, 0, 8566, 8569, 1, 0, 0, 0, 8567, 8565, 1, 0, 0, 0, 8567, 8568, 1, 0, 0, 0, 8568, 1109, 1, 0, 0, 0, 8569, 8567, 1, 0, 0, 0, 8570, 8577, 3, 1374, 687, 0, 8571, 8573, 3, 1120, 560, 0, 8572, 8574, 3, 1112, 556, 0, 8573, 8572, 1, 0, 0, 0, 8573, 8574, 1, 0, 0, 0, 8574, 8578, 1, 0, 0, 0, 8575, 8576, 5, 62, 0, 0, 8576, 8578, 5, 473, 0, 0, 8577, 8571, 1, 0, 0, 0, 8577, 8575, 1, 0, 0, 0, 8578, 1111, 1, 0, 0, 0, 8579, 8581, 3, 1114, 557, 0, 8580, 8579, 1, 0, 0, 0, 8581, 8582, 1, 0, 0, 0, 8582, 8580, 1, 0, 0, 0, 8582, 8583, 1, 0, 0, 0, 8583, 1113, 1, 0, 0, 0, 8584, 8585, 5, 53, 0, 0, 8585, 8593, 3, 1164, 582, 0, 8586, 8587, 3, 1384, 692, 0, 8587, 8588, 3, 1164, 582, 0, 8588, 8593, 1, 0, 0, 0, 8589, 8590, 5, 77, 0, 0, 8590, 8593, 5, 78, 0, 0, 8591, 8593, 5, 78, 0, 0, 8592, 8584, 1, 0, 0, 0, 8592, 8586, 1, 0, 0, 0, 8592, 8589, 1, 0, 0, 0, 8592, 8591, 1, 0, 0, 0, 8593, 1115, 1, 0, 0, 0, 8594, 8599, 3, 1118, 559, 0, 8595, 8596, 5, 6, 0, 0, 8596, 8598, 3, 1118, 559, 0, 8597, 8595, 1, 0, 0, 0, 8598, 8601, 1, 0, 0, 0, 8599, 8597, 1, 0, 0, 0, 8599, 8600, 1, 0, 0, 0, 8600, 1117, 1, 0, 0, 0, 8601, 8599, 1, 0, 0, 0, 8602, 8603, 3, 1206, 603, 0, 8603, 8604, 5, 36, 0, 0, 8604, 8605, 3, 1382, 691, 0, 8605, 8609, 1, 0, 0, 0, 8606, 8607, 5, 53, 0, 0, 8607, 8609, 3, 1206, 603, 0, 8608, 8602, 1, 0, 0, 0, 8608, 8606, 1, 0, 0, 0, 8609, 1119, 1, 0, 0, 0, 8610, 8612, 5, 408, 0, 0, 8611, 8610, 1, 0, 0, 0, 8611, 8612, 1, 0, 0, 0, 8612, 8613, 1, 0, 0, 0, 8613, 8622, 3, 1124, 562, 0, 8614, 8623, 3, 1122, 561, 0, 8615, 8620, 5, 35, 0, 0, 8616, 8617, 5, 4, 0, 0, 8617, 8618, 3, 1358, 679, 0, 8618, 8619, 5, 5, 0, 0, 8619, 8621, 1, 0, 0, 0, 8620, 8616, 1, 0, 0, 0, 8620, 8621, 1, 0, 0, 0, 8621, 8623, 1, 0, 0, 0, 8622, 8614, 1, 0, 0, 0, 8622, 8615, 1, 0, 0, 0, 8623, 8629, 1, 0, 0, 0, 8624, 8625, 3, 1338, 669, 0, 8625, 8626, 5, 27, 0, 0, 8626, 8627, 7, 39, 0, 0, 8627, 8629, 1, 0, 0, 0, 8628, 8611, 1, 0, 0, 0, 8628, 8624, 1, 0, 0, 0, 8629, 1121, 1, 0, 0, 0, 8630, 8632, 5, 4, 0, 0, 8631, 8633, 3, 1358, 679, 0, 8632, 8631, 1, 0, 0, 0, 8632, 8633, 1, 0, 0, 0, 8633, 8634, 1, 0, 0, 0, 8634, 8636, 5, 5, 0, 0, 8635, 8630, 1, 0, 0, 0, 8636, 8639, 1, 0, 0, 0, 8637, 8635, 1, 0, 0, 0, 8637, 8638, 1, 0, 0, 0, 8638, 1123, 1, 0, 0, 0, 8639, 8637, 1, 0, 0, 0, 8640, 8654, 3, 1128, 564, 0, 8641, 8654, 3, 1132, 566, 0, 8642, 8654, 3, 1136, 568, 0, 8643, 8654, 3, 1144, 572, 0, 8644, 8654, 3, 1152, 576, 0, 8645, 8651, 3, 1154, 577, 0, 8646, 8652, 3, 1158, 579, 0, 8647, 8648, 5, 2, 0, 0, 8648, 8649, 3, 1358, 679, 0, 8649, 8650, 5, 3, 0, 0, 8650, 8652, 1, 0, 0, 0, 8651, 8646, 1, 0, 0, 0, 8651, 8647, 1, 0, 0, 0, 8652, 8654, 1, 0, 0, 0, 8653, 8640, 1, 0, 0, 0, 8653, 8641, 1, 0, 0, 0, 8653, 8642, 1, 0, 0, 0, 8653, 8643, 1, 0, 0, 0, 8653, 8644, 1, 0, 0, 0, 8653, 8645, 1, 0, 0, 0, 8654, 1125, 1, 0, 0, 0, 8655, 8660, 3, 1132, 566, 0, 8656, 8660, 3, 1138, 569, 0, 8657, 8660, 3, 1146, 573, 0, 8658, 8660, 3, 1152, 576, 0, 8659, 8655, 1, 0, 0, 0, 8659, 8656, 1, 0, 0, 0, 8659, 8657, 1, 0, 0, 0, 8659, 8658, 1, 0, 0, 0, 8660, 1127, 1, 0, 0, 0, 8661, 8666, 3, 1396, 698, 0, 8662, 8666, 3, 1378, 689, 0, 8663, 8666, 5, 119, 0, 0, 8664, 8666, 5, 126, 0, 0, 8665, 8661, 1, 0, 0, 0, 8665, 8662, 1, 0, 0, 0, 8665, 8663, 1, 0, 0, 0, 8665, 8664, 1, 0, 0, 0, 8666, 8668, 1, 0, 0, 0, 8667, 8669, 3, 526, 263, 0, 8668, 8667, 1, 0, 0, 0, 8668, 8669, 1, 0, 0, 0, 8669, 8670, 1, 0, 0, 0, 8670, 8671, 3, 1130, 565, 0, 8671, 1129, 1, 0, 0, 0, 8672, 8673, 5, 2, 0, 0, 8673, 8674, 3, 1282, 641, 0, 8674, 8675, 5, 3, 0, 0, 8675, 8678, 1, 0, 0, 0, 8676, 8678, 1, 0, 0, 0, 8677, 8672, 1, 0, 0, 0, 8677, 8676, 1, 0, 0, 0, 8678, 1131, 1, 0, 0, 0, 8679, 8696, 5, 394, 0, 0, 8680, 8696, 5, 395, 0, 0, 8681, 8696, 5, 409, 0, 0, 8682, 8696, 5, 381, 0, 0, 8683, 8696, 5, 406, 0, 0, 8684, 8685, 5, 391, 0, 0, 8685, 8696, 3, 1134, 567, 0, 8686, 8687, 5, 190, 0, 0, 8687, 8696, 5, 405, 0, 0, 8688, 8689, 5, 388, 0, 0, 8689, 8696, 3, 1130, 565, 0, 8690, 8691, 5, 387, 0, 0, 8691, 8696, 3, 1130, 565, 0, 8692, 8693, 5, 402, 0, 0, 8693, 8696, 3, 1130, 565, 0, 8694, 8696, 5, 383, 0, 0, 8695, 8679, 1, 0, 0, 0, 8695, 8680, 1, 0, 0, 0, 8695, 8681, 1, 0, 0, 0, 8695, 8682, 1, 0, 0, 0, 8695, 8683, 1, 0, 0, 0, 8695, 8684, 1, 0, 0, 0, 8695, 8686, 1, 0, 0, 0, 8695, 8688, 1, 0, 0, 0, 8695, 8690, 1, 0, 0, 0, 8695, 8692, 1, 0, 0, 0, 8695, 8694, 1, 0, 0, 0, 8696, 1133, 1, 0, 0, 0, 8697, 8698, 5, 2, 0, 0, 8698, 8699, 3, 1358, 679, 0, 8699, 8700, 5, 3, 0, 0, 8700, 8703, 1, 0, 0, 0, 8701, 8703, 1, 0, 0, 0, 8702, 8697, 1, 0, 0, 0, 8702, 8701, 1, 0, 0, 0, 8703, 1135, 1, 0, 0, 0, 8704, 8707, 3, 1140, 570, 0, 8705, 8707, 3, 1142, 571, 0, 8706, 8704, 1, 0, 0, 0, 8706, 8705, 1, 0, 0, 0, 8707, 1137, 1, 0, 0, 0, 8708, 8711, 3, 1140, 570, 0, 8709, 8711, 3, 1142, 571, 0, 8710, 8708, 1, 0, 0, 0, 8710, 8709, 1, 0, 0, 0, 8711, 1139, 1, 0, 0, 0, 8712, 8713, 5, 382, 0, 0, 8713, 8714, 3, 1150, 575, 0, 8714, 8715, 5, 2, 0, 0, 8715, 8716, 3, 1282, 641, 0, 8716, 8717, 5, 3, 0, 0, 8717, 1141, 1, 0, 0, 0, 8718, 8719, 5, 382, 0, 0, 8719, 8720, 3, 1150, 575, 0, 8720, 1143, 1, 0, 0, 0, 8721, 8726, 3, 1148, 574, 0, 8722, 8723, 5, 2, 0, 0, 8723, 8724, 3, 1358, 679, 0, 8724, 8725, 5, 3, 0, 0, 8725, 8727, 1, 0, 0, 0, 8726, 8722, 1, 0, 0, 0, 8726, 8727, 1, 0, 0, 0, 8727, 1145, 1, 0, 0, 0, 8728, 8733, 3, 1148, 574, 0, 8729, 8730, 5, 2, 0, 0, 8730, 8731, 3, 1358, 679, 0, 8731, 8732, 5, 3, 0, 0, 8732, 8734, 1, 0, 0, 0, 8733, 8729, 1, 0, 0, 0, 8733, 8734, 1, 0, 0, 0, 8734, 1147, 1, 0, 0, 0, 8735, 8736, 7, 40, 0, 0, 8736, 8742, 3, 1150, 575, 0, 8737, 8742, 5, 416, 0, 0, 8738, 8739, 5, 398, 0, 0, 8739, 8740, 7, 41, 0, 0, 8740, 8742, 3, 1150, 575, 0, 8741, 8735, 1, 0, 0, 0, 8741, 8737, 1, 0, 0, 0, 8741, 8738, 1, 0, 0, 0, 8742, 1149, 1, 0, 0, 0, 8743, 8746, 5, 367, 0, 0, 8744, 8746, 1, 0, 0, 0, 8745, 8743, 1, 0, 0, 0, 8745, 8744, 1, 0, 0, 0, 8746, 1151, 1, 0, 0, 0, 8747, 8752, 7, 42, 0, 0, 8748, 8749, 5, 2, 0, 0, 8749, 8750, 3, 1358, 679, 0, 8750, 8751, 5, 3, 0, 0, 8751, 8753, 1, 0, 0, 0, 8752, 8748, 1, 0, 0, 0, 8752, 8753, 1, 0, 0, 0, 8753, 8754, 1, 0, 0, 0, 8754, 8755, 3, 1156, 578, 0, 8755, 1153, 1, 0, 0, 0, 8756, 8757, 5, 396, 0, 0, 8757, 1155, 1, 0, 0, 0, 8758, 8759, 5, 105, 0, 0, 8759, 8760, 5, 411, 0, 0, 8760, 8766, 5, 379, 0, 0, 8761, 8762, 5, 372, 0, 0, 8762, 8763, 5, 411, 0, 0, 8763, 8766, 5, 379, 0, 0, 8764, 8766, 1, 0, 0, 0, 8765, 8758, 1, 0, 0, 0, 8765, 8761, 1, 0, 0, 0, 8765, 8764, 1, 0, 0, 0, 8766, 1157, 1, 0, 0, 0, 8767, 8794, 5, 377, 0, 0, 8768, 8794, 5, 257, 0, 0, 8769, 8794, 5, 176, 0, 0, 8770, 8794, 5, 218, 0, 0, 8771, 8794, 5, 254, 0, 0, 8772, 8794, 3, 1160, 580, 0, 8773, 8774, 5, 377, 0, 0, 8774, 8775, 5, 94, 0, 0, 8775, 8794, 5, 257, 0, 0, 8776, 8777, 5, 176, 0, 0, 8777, 8781, 5, 94, 0, 0, 8778, 8782, 5, 218, 0, 0, 8779, 8782, 5, 254, 0, 0, 8780, 8782, 3, 1160, 580, 0, 8781, 8778, 1, 0, 0, 0, 8781, 8779, 1, 0, 0, 0, 8781, 8780, 1, 0, 0, 0, 8782, 8794, 1, 0, 0, 0, 8783, 8784, 5, 218, 0, 0, 8784, 8787, 5, 94, 0, 0, 8785, 8788, 5, 254, 0, 0, 8786, 8788, 3, 1160, 580, 0, 8787, 8785, 1, 0, 0, 0, 8787, 8786, 1, 0, 0, 0, 8788, 8794, 1, 0, 0, 0, 8789, 8790, 5, 254, 0, 0, 8790, 8791, 5, 94, 0, 0, 8791, 8794, 3, 1160, 580, 0, 8792, 8794, 1, 0, 0, 0, 8793, 8767, 1, 0, 0, 0, 8793, 8768, 1, 0, 0, 0, 8793, 8769, 1, 0, 0, 0, 8793, 8770, 1, 0, 0, 0, 8793, 8771, 1, 0, 0, 0, 8793, 8772, 1, 0, 0, 0, 8793, 8773, 1, 0, 0, 0, 8793, 8776, 1, 0, 0, 0, 8793, 8783, 1, 0, 0, 0, 8793, 8789, 1, 0, 0, 0, 8793, 8792, 1, 0, 0, 0, 8794, 1159, 1, 0, 0, 0, 8795, 8800, 5, 319, 0, 0, 8796, 8797, 5, 2, 0, 0, 8797, 8798, 3, 1358, 679, 0, 8798, 8799, 5, 3, 0, 0, 8799, 8801, 1, 0, 0, 0, 8800, 8796, 1, 0, 0, 0, 8800, 8801, 1, 0, 0, 0, 8801, 1161, 1, 0, 0, 0, 8802, 8803, 5, 197, 0, 0, 8803, 8806, 3, 1164, 582, 0, 8804, 8806, 1, 0, 0, 0, 8805, 8802, 1, 0, 0, 0, 8805, 8804, 1, 0, 0, 0, 8806, 1163, 1, 0, 0, 0, 8807, 8808, 3, 1166, 583, 0, 8808, 1165, 1, 0, 0, 0, 8809, 8811, 3, 1168, 584, 0, 8810, 8812, 3, 1276, 638, 0, 8811, 8810, 1, 0, 0, 0, 8811, 8812, 1, 0, 0, 0, 8812, 1167, 1, 0, 0, 0, 8813, 8818, 3, 1170, 585, 0, 8814, 8815, 7, 43, 0, 0, 8815, 8817, 3, 1170, 585, 0, 8816, 8814, 1, 0, 0, 0, 8817, 8820, 1, 0, 0, 0, 8818, 8816, 1, 0, 0, 0, 8818, 8819, 1, 0, 0, 0, 8819, 1169, 1, 0, 0, 0, 8820, 8818, 1, 0, 0, 0, 8821, 8826, 3, 1172, 586, 0, 8822, 8823, 5, 82, 0, 0, 8823, 8825, 3, 1172, 586, 0, 8824, 8822, 1, 0, 0, 0, 8825, 8828, 1, 0, 0, 0, 8826, 8824, 1, 0, 0, 0, 8826, 8827, 1, 0, 0, 0, 8827, 1171, 1, 0, 0, 0, 8828, 8826, 1, 0, 0, 0, 8829, 8834, 3, 1174, 587, 0, 8830, 8831, 5, 33, 0, 0, 8831, 8833, 3, 1174, 587, 0, 8832, 8830, 1, 0, 0, 0, 8833, 8836, 1, 0, 0, 0, 8834, 8832, 1, 0, 0, 0, 8834, 8835, 1, 0, 0, 0, 8835, 1173, 1, 0, 0, 0, 8836, 8834, 1, 0, 0, 0, 8837, 8849, 3, 1176, 588, 0, 8838, 8840, 5, 77, 0, 0, 8839, 8838, 1, 0, 0, 0, 8839, 8840, 1, 0, 0, 0, 8840, 8841, 1, 0, 0, 0, 8841, 8843, 5, 380, 0, 0, 8842, 8844, 5, 91, 0, 0, 8843, 8842, 1, 0, 0, 0, 8843, 8844, 1, 0, 0, 0, 8844, 8845, 1, 0, 0, 0, 8845, 8846, 3, 1176, 588, 0, 8846, 8847, 5, 33, 0, 0, 8847, 8848, 3, 1176, 588, 0, 8848, 8850, 1, 0, 0, 0, 8849, 8839, 1, 0, 0, 0, 8849, 8850, 1, 0, 0, 0, 8850, 1175, 1, 0, 0, 0, 8851, 8857, 3, 1178, 589, 0, 8852, 8854, 5, 77, 0, 0, 8853, 8852, 1, 0, 0, 0, 8853, 8854, 1, 0, 0, 0, 8854, 8855, 1, 0, 0, 0, 8855, 8856, 5, 68, 0, 0, 8856, 8858, 3, 1308, 654, 0, 8857, 8853, 1, 0, 0, 0, 8857, 8858, 1, 0, 0, 0, 8858, 1177, 1, 0, 0, 0, 8859, 8861, 5, 77, 0, 0, 8860, 8859, 1, 0, 0, 0, 8860, 8861, 1, 0, 0, 0, 8861, 8862, 1, 0, 0, 0, 8862, 8863, 3, 1180, 590, 0, 8863, 1179, 1, 0, 0, 0, 8864, 8866, 3, 1182, 591, 0, 8865, 8867, 7, 44, 0, 0, 8866, 8865, 1, 0, 0, 0, 8866, 8867, 1, 0, 0, 0, 8867, 1181, 1, 0, 0, 0, 8868, 8892, 3, 1184, 592, 0, 8869, 8871, 5, 116, 0, 0, 8870, 8872, 5, 77, 0, 0, 8871, 8870, 1, 0, 0, 0, 8871, 8872, 1, 0, 0, 0, 8872, 8890, 1, 0, 0, 0, 8873, 8891, 5, 78, 0, 0, 8874, 8891, 5, 96, 0, 0, 8875, 8891, 5, 60, 0, 0, 8876, 8891, 5, 358, 0, 0, 8877, 8878, 5, 56, 0, 0, 8878, 8879, 5, 64, 0, 0, 8879, 8891, 3, 1164, 582, 0, 8880, 8881, 5, 268, 0, 0, 8881, 8882, 5, 2, 0, 0, 8882, 8883, 3, 1288, 644, 0, 8883, 8884, 5, 3, 0, 0, 8884, 8891, 1, 0, 0, 0, 8885, 8891, 5, 188, 0, 0, 8886, 8888, 3, 1298, 649, 0, 8887, 8886, 1, 0, 0, 0, 8887, 8888, 1, 0, 0, 0, 8888, 8889, 1, 0, 0, 0, 8889, 8891, 5, 478, 0, 0, 8890, 8873, 1, 0, 0, 0, 8890, 8874, 1, 0, 0, 0, 8890, 8875, 1, 0, 0, 0, 8890, 8876, 1, 0, 0, 0, 8890, 8877, 1, 0, 0, 0, 8890, 8880, 1, 0, 0, 0, 8890, 8885, 1, 0, 0, 0, 8890, 8887, 1, 0, 0, 0, 8891, 8893, 1, 0, 0, 0, 8892, 8869, 1, 0, 0, 0, 8892, 8893, 1, 0, 0, 0, 8893, 1183, 1, 0, 0, 0, 8894, 8906, 3, 1186, 593, 0, 8895, 8896, 7, 45, 0, 0, 8896, 8907, 3, 1186, 593, 0, 8897, 8898, 3, 1280, 640, 0, 8898, 8904, 3, 1270, 635, 0, 8899, 8905, 3, 962, 481, 0, 8900, 8901, 5, 2, 0, 0, 8901, 8902, 3, 1164, 582, 0, 8902, 8903, 5, 3, 0, 0, 8903, 8905, 1, 0, 0, 0, 8904, 8899, 1, 0, 0, 0, 8904, 8900, 1, 0, 0, 0, 8905, 8907, 1, 0, 0, 0, 8906, 8895, 1, 0, 0, 0, 8906, 8897, 1, 0, 0, 0, 8906, 8907, 1, 0, 0, 0, 8907, 1185, 1, 0, 0, 0, 8908, 8921, 3, 1188, 594, 0, 8909, 8911, 5, 77, 0, 0, 8910, 8909, 1, 0, 0, 0, 8910, 8911, 1, 0, 0, 0, 8911, 8916, 1, 0, 0, 0, 8912, 8917, 5, 120, 0, 0, 8913, 8917, 5, 114, 0, 0, 8914, 8915, 5, 127, 0, 0, 8915, 8917, 5, 94, 0, 0, 8916, 8912, 1, 0, 0, 0, 8916, 8913, 1, 0, 0, 0, 8916, 8914, 1, 0, 0, 0, 8917, 8918, 1, 0, 0, 0, 8918, 8919, 3, 1188, 594, 0, 8919, 8920, 3, 1162, 581, 0, 8920, 8922, 1, 0, 0, 0, 8921, 8910, 1, 0, 0, 0, 8921, 8922, 1, 0, 0, 0, 8922, 1187, 1, 0, 0, 0, 8923, 8929, 3, 1190, 595, 0, 8924, 8925, 3, 1276, 638, 0, 8925, 8926, 3, 1190, 595, 0, 8926, 8928, 1, 0, 0, 0, 8927, 8924, 1, 0, 0, 0, 8928, 8931, 1, 0, 0, 0, 8929, 8927, 1, 0, 0, 0, 8929, 8930, 1, 0, 0, 0, 8930, 1189, 1, 0, 0, 0, 8931, 8929, 1, 0, 0, 0, 8932, 8934, 3, 1276, 638, 0, 8933, 8932, 1, 0, 0, 0, 8933, 8934, 1, 0, 0, 0, 8934, 8935, 1, 0, 0, 0, 8935, 8936, 3, 1192, 596, 0, 8936, 1191, 1, 0, 0, 0, 8937, 8942, 3, 1194, 597, 0, 8938, 8939, 7, 46, 0, 0, 8939, 8941, 3, 1194, 597, 0, 8940, 8938, 1, 0, 0, 0, 8941, 8944, 1, 0, 0, 0, 8942, 8940, 1, 0, 0, 0, 8942, 8943, 1, 0, 0, 0, 8943, 1193, 1, 0, 0, 0, 8944, 8942, 1, 0, 0, 0, 8945, 8950, 3, 1196, 598, 0, 8946, 8947, 7, 47, 0, 0, 8947, 8949, 3, 1196, 598, 0, 8948, 8946, 1, 0, 0, 0, 8949, 8952, 1, 0, 0, 0, 8950, 8948, 1, 0, 0, 0, 8950, 8951, 1, 0, 0, 0, 8951, 1195, 1, 0, 0, 0, 8952, 8950, 1, 0, 0, 0, 8953, 8956, 3, 1198, 599, 0, 8954, 8955, 5, 15, 0, 0, 8955, 8957, 3, 1164, 582, 0, 8956, 8954, 1, 0, 0, 0, 8956, 8957, 1, 0, 0, 0, 8957, 1197, 1, 0, 0, 0, 8958, 8960, 7, 46, 0, 0, 8959, 8958, 1, 0, 0, 0, 8959, 8960, 1, 0, 0, 0, 8960, 8961, 1, 0, 0, 0, 8961, 8962, 3, 1200, 600, 0, 8962, 1199, 1, 0, 0, 0, 8963, 8968, 3, 1202, 601, 0, 8964, 8965, 5, 142, 0, 0, 8965, 8966, 5, 411, 0, 0, 8966, 8967, 5, 379, 0, 0, 8967, 8969, 3, 1164, 582, 0, 8968, 8964, 1, 0, 0, 0, 8968, 8969, 1, 0, 0, 0, 8969, 1201, 1, 0, 0, 0, 8970, 8973, 3, 1204, 602, 0, 8971, 8972, 5, 43, 0, 0, 8972, 8974, 3, 524, 262, 0, 8973, 8971, 1, 0, 0, 0, 8973, 8974, 1, 0, 0, 0, 8974, 1203, 1, 0, 0, 0, 8975, 8980, 3, 1208, 604, 0, 8976, 8977, 5, 26, 0, 0, 8977, 8979, 3, 1120, 560, 0, 8978, 8976, 1, 0, 0, 0, 8979, 8982, 1, 0, 0, 0, 8980, 8978, 1, 0, 0, 0, 8980, 8981, 1, 0, 0, 0, 8981, 1205, 1, 0, 0, 0, 8982, 8980, 1, 0, 0, 0, 8983, 8984, 6, 603, -1, 0, 8984, 8991, 3, 1208, 604, 0, 8985, 8986, 7, 46, 0, 0, 8986, 8991, 3, 1206, 603, 9, 8987, 8988, 3, 1276, 638, 0, 8988, 8989, 3, 1206, 603, 3, 8989, 8991, 1, 0, 0, 0, 8990, 8983, 1, 0, 0, 0, 8990, 8985, 1, 0, 0, 0, 8990, 8987, 1, 0, 0, 0, 8991, 9031, 1, 0, 0, 0, 8992, 8993, 10, 8, 0, 0, 8993, 8994, 5, 15, 0, 0, 8994, 9030, 3, 1206, 603, 9, 8995, 8996, 10, 7, 0, 0, 8996, 8997, 7, 47, 0, 0, 8997, 9030, 3, 1206, 603, 8, 8998, 8999, 10, 6, 0, 0, 8999, 9000, 7, 46, 0, 0, 9000, 9030, 3, 1206, 603, 7, 9001, 9002, 10, 5, 0, 0, 9002, 9003, 3, 1276, 638, 0, 9003, 9004, 3, 1206, 603, 6, 9004, 9030, 1, 0, 0, 0, 9005, 9006, 10, 4, 0, 0, 9006, 9007, 7, 45, 0, 0, 9007, 9030, 3, 1206, 603, 5, 9008, 9009, 10, 10, 0, 0, 9009, 9010, 5, 26, 0, 0, 9010, 9030, 3, 1120, 560, 0, 9011, 9012, 10, 2, 0, 0, 9012, 9030, 3, 1276, 638, 0, 9013, 9014, 10, 1, 0, 0, 9014, 9016, 5, 116, 0, 0, 9015, 9017, 5, 77, 0, 0, 9016, 9015, 1, 0, 0, 0, 9016, 9017, 1, 0, 0, 0, 9017, 9027, 1, 0, 0, 0, 9018, 9019, 5, 56, 0, 0, 9019, 9020, 5, 64, 0, 0, 9020, 9028, 3, 1206, 603, 0, 9021, 9022, 5, 268, 0, 0, 9022, 9023, 5, 2, 0, 0, 9023, 9024, 3, 1288, 644, 0, 9024, 9025, 5, 3, 0, 0, 9025, 9028, 1, 0, 0, 0, 9026, 9028, 5, 188, 0, 0, 9027, 9018, 1, 0, 0, 0, 9027, 9021, 1, 0, 0, 0, 9027, 9026, 1, 0, 0, 0, 9028, 9030, 1, 0, 0, 0, 9029, 8992, 1, 0, 0, 0, 9029, 8995, 1, 0, 0, 0, 9029, 8998, 1, 0, 0, 0, 9029, 9001, 1, 0, 0, 0, 9029, 9005, 1, 0, 0, 0, 9029, 9008, 1, 0, 0, 0, 9029, 9011, 1, 0, 0, 0, 9029, 9013, 1, 0, 0, 0, 9030, 9033, 1, 0, 0, 0, 9031, 9029, 1, 0, 0, 0, 9031, 9032, 1, 0, 0, 0, 9032, 1207, 1, 0, 0, 0, 9033, 9031, 1, 0, 0, 0, 9034, 9035, 5, 389, 0, 0, 9035, 9071, 3, 962, 481, 0, 9036, 9039, 5, 35, 0, 0, 9037, 9040, 3, 962, 481, 0, 9038, 9040, 3, 1290, 645, 0, 9039, 9037, 1, 0, 0, 0, 9039, 9038, 1, 0, 0, 0, 9040, 9071, 1, 0, 0, 0, 9041, 9042, 5, 28, 0, 0, 9042, 9071, 3, 1328, 664, 0, 9043, 9044, 5, 470, 0, 0, 9044, 9045, 5, 2, 0, 0, 9045, 9046, 3, 1282, 641, 0, 9046, 9047, 5, 3, 0, 0, 9047, 9071, 1, 0, 0, 0, 9048, 9049, 5, 98, 0, 0, 9049, 9071, 3, 962, 481, 0, 9050, 9071, 3, 1320, 660, 0, 9051, 9071, 3, 1350, 675, 0, 9052, 9071, 3, 1210, 605, 0, 9053, 9054, 5, 2, 0, 0, 9054, 9055, 3, 1164, 582, 0, 9055, 9056, 5, 3, 0, 0, 9056, 9057, 3, 1328, 664, 0, 9057, 9071, 1, 0, 0, 0, 9058, 9071, 3, 1310, 655, 0, 9059, 9071, 3, 1214, 607, 0, 9060, 9062, 3, 962, 481, 0, 9061, 9063, 3, 1326, 663, 0, 9062, 9061, 1, 0, 0, 0, 9062, 9063, 1, 0, 0, 0, 9063, 9071, 1, 0, 0, 0, 9064, 9071, 3, 1266, 633, 0, 9065, 9071, 3, 1268, 634, 0, 9066, 9067, 3, 1264, 632, 0, 9067, 9068, 5, 125, 0, 0, 9068, 9069, 3, 1264, 632, 0, 9069, 9071, 1, 0, 0, 0, 9070, 9034, 1, 0, 0, 0, 9070, 9036, 1, 0, 0, 0, 9070, 9041, 1, 0, 0, 0, 9070, 9043, 1, 0, 0, 0, 9070, 9048, 1, 0, 0, 0, 9070, 9050, 1, 0, 0, 0, 9070, 9051, 1, 0, 0, 0, 9070, 9052, 1, 0, 0, 0, 9070, 9053, 1, 0, 0, 0, 9070, 9058, 1, 0, 0, 0, 9070, 9059, 1, 0, 0, 0, 9070, 9060, 1, 0, 0, 0, 9070, 9064, 1, 0, 0, 0, 9070, 9065, 1, 0, 0, 0, 9070, 9066, 1, 0, 0, 0, 9071, 1209, 1, 0, 0, 0, 9072, 9073, 5, 661, 0, 0, 9073, 1211, 1, 0, 0, 0, 9074, 9075, 3, 1348, 674, 0, 9075, 9094, 5, 2, 0, 0, 9076, 9080, 3, 1284, 642, 0, 9077, 9078, 5, 6, 0, 0, 9078, 9079, 5, 101, 0, 0, 9079, 9081, 3, 1286, 643, 0, 9080, 9077, 1, 0, 0, 0, 9080, 9081, 1, 0, 0, 0, 9081, 9082, 1, 0, 0, 0, 9082, 9083, 3, 998, 499, 0, 9083, 9095, 1, 0, 0, 0, 9084, 9085, 5, 101, 0, 0, 9085, 9086, 3, 1286, 643, 0, 9086, 9087, 3, 998, 499, 0, 9087, 9095, 1, 0, 0, 0, 9088, 9089, 7, 48, 0, 0, 9089, 9090, 3, 1284, 642, 0, 9090, 9091, 3, 998, 499, 0, 9091, 9095, 1, 0, 0, 0, 9092, 9095, 5, 9, 0, 0, 9093, 9095, 1, 0, 0, 0, 9094, 9076, 1, 0, 0, 0, 9094, 9084, 1, 0, 0, 0, 9094, 9088, 1, 0, 0, 0, 9094, 9092, 1, 0, 0, 0, 9094, 9093, 1, 0, 0, 0, 9095, 9096, 1, 0, 0, 0, 9096, 9097, 5, 3, 0, 0, 9097, 1213, 1, 0, 0, 0, 9098, 9099, 3, 1212, 606, 0, 9099, 9100, 3, 1238, 619, 0, 9100, 9101, 3, 1240, 620, 0, 9101, 9102, 3, 1248, 624, 0, 9102, 9105, 1, 0, 0, 0, 9103, 9105, 3, 1218, 609, 0, 9104, 9098, 1, 0, 0, 0, 9104, 9103, 1, 0, 0, 0, 9105, 1215, 1, 0, 0, 0, 9106, 9109, 3, 1212, 606, 0, 9107, 9109, 3, 1218, 609, 0, 9108, 9106, 1, 0, 0, 0, 9108, 9107, 1, 0, 0, 0, 9109, 1217, 1, 0, 0, 0, 9110, 9111, 5, 108, 0, 0, 9111, 9112, 5, 62, 0, 0, 9112, 9113, 5, 2, 0, 0, 9113, 9114, 3, 1164, 582, 0, 9114, 9115, 5, 3, 0, 0, 9115, 9288, 1, 0, 0, 0, 9116, 9288, 5, 48, 0, 0, 9117, 9122, 5, 50, 0, 0, 9118, 9119, 5, 2, 0, 0, 9119, 9120, 3, 1358, 679, 0, 9120, 9121, 5, 3, 0, 0, 9121, 9123, 1, 0, 0, 0, 9122, 9118, 1, 0, 0, 0, 9122, 9123, 1, 0, 0, 0, 9123, 9288, 1, 0, 0, 0, 9124, 9129, 5, 51, 0, 0, 9125, 9126, 5, 2, 0, 0, 9126, 9127, 3, 1358, 679, 0, 9127, 9128, 5, 3, 0, 0, 9128, 9130, 1, 0, 0, 0, 9129, 9125, 1, 0, 0, 0, 9129, 9130, 1, 0, 0, 0, 9130, 9288, 1, 0, 0, 0, 9131, 9136, 5, 75, 0, 0, 9132, 9133, 5, 2, 0, 0, 9133, 9134, 3, 1358, 679, 0, 9134, 9135, 5, 3, 0, 0, 9135, 9137, 1, 0, 0, 0, 9136, 9132, 1, 0, 0, 0, 9136, 9137, 1, 0, 0, 0, 9137, 9288, 1, 0, 0, 0, 9138, 9143, 5, 76, 0, 0, 9139, 9140, 5, 2, 0, 0, 9140, 9141, 3, 1358, 679, 0, 9141, 9142, 5, 3, 0, 0, 9142, 9144, 1, 0, 0, 0, 9143, 9139, 1, 0, 0, 0, 9143, 9144, 1, 0, 0, 0, 9144, 9288, 1, 0, 0, 0, 9145, 9288, 5, 49, 0, 0, 9146, 9288, 5, 52, 0, 0, 9147, 9288, 5, 89, 0, 0, 9148, 9288, 5, 99, 0, 0, 9149, 9288, 5, 47, 0, 0, 9150, 9288, 5, 111, 0, 0, 9151, 9152, 5, 41, 0, 0, 9152, 9153, 5, 2, 0, 0, 9153, 9154, 3, 1164, 582, 0, 9154, 9155, 5, 36, 0, 0, 9155, 9156, 3, 1120, 560, 0, 9156, 9157, 5, 3, 0, 0, 9157, 9288, 1, 0, 0, 0, 9158, 9159, 5, 390, 0, 0, 9159, 9160, 5, 2, 0, 0, 9160, 9161, 3, 1294, 647, 0, 9161, 9162, 5, 3, 0, 0, 9162, 9288, 1, 0, 0, 0, 9163, 9164, 5, 489, 0, 0, 9164, 9165, 5, 2, 0, 0, 9165, 9168, 3, 1164, 582, 0, 9166, 9167, 5, 6, 0, 0, 9167, 9169, 3, 1298, 649, 0, 9168, 9166, 1, 0, 0, 0, 9168, 9169, 1, 0, 0, 0, 9169, 9170, 1, 0, 0, 0, 9170, 9171, 5, 3, 0, 0, 9171, 9288, 1, 0, 0, 0, 9172, 9173, 5, 403, 0, 0, 9173, 9174, 5, 2, 0, 0, 9174, 9175, 3, 1300, 650, 0, 9175, 9176, 5, 3, 0, 0, 9176, 9288, 1, 0, 0, 0, 9177, 9178, 5, 404, 0, 0, 9178, 9179, 5, 2, 0, 0, 9179, 9180, 3, 1302, 651, 0, 9180, 9181, 5, 3, 0, 0, 9181, 9288, 1, 0, 0, 0, 9182, 9183, 5, 410, 0, 0, 9183, 9184, 5, 2, 0, 0, 9184, 9185, 3, 1304, 652, 0, 9185, 9186, 5, 3, 0, 0, 9186, 9288, 1, 0, 0, 0, 9187, 9188, 5, 413, 0, 0, 9188, 9189, 5, 2, 0, 0, 9189, 9190, 3, 1164, 582, 0, 9190, 9191, 5, 36, 0, 0, 9191, 9192, 3, 1120, 560, 0, 9192, 9193, 5, 3, 0, 0, 9193, 9288, 1, 0, 0, 0, 9194, 9195, 5, 414, 0, 0, 9195, 9197, 5, 2, 0, 0, 9196, 9198, 7, 49, 0, 0, 9197, 9196, 1, 0, 0, 0, 9197, 9198, 1, 0, 0, 0, 9198, 9199, 1, 0, 0, 0, 9199, 9200, 3, 1306, 653, 0, 9200, 9201, 5, 3, 0, 0, 9201, 9288, 1, 0, 0, 0, 9202, 9203, 5, 401, 0, 0, 9203, 9204, 5, 2, 0, 0, 9204, 9205, 3, 1164, 582, 0, 9205, 9206, 5, 6, 0, 0, 9206, 9207, 3, 1164, 582, 0, 9207, 9208, 5, 3, 0, 0, 9208, 9288, 1, 0, 0, 0, 9209, 9210, 5, 386, 0, 0, 9210, 9211, 5, 2, 0, 0, 9211, 9212, 3, 1282, 641, 0, 9212, 9213, 5, 3, 0, 0, 9213, 9288, 1, 0, 0, 0, 9214, 9215, 5, 392, 0, 0, 9215, 9216, 5, 2, 0, 0, 9216, 9217, 3, 1282, 641, 0, 9217, 9218, 5, 3, 0, 0, 9218, 9288, 1, 0, 0, 0, 9219, 9220, 5, 397, 0, 0, 9220, 9221, 5, 2, 0, 0, 9221, 9222, 3, 1282, 641, 0, 9222, 9223, 5, 3, 0, 0, 9223, 9288, 1, 0, 0, 0, 9224, 9225, 5, 425, 0, 0, 9225, 9226, 5, 2, 0, 0, 9226, 9227, 3, 1282, 641, 0, 9227, 9228, 5, 3, 0, 0, 9228, 9288, 1, 0, 0, 0, 9229, 9230, 5, 426, 0, 0, 9230, 9231, 5, 2, 0, 0, 9231, 9232, 5, 259, 0, 0, 9232, 9238, 3, 1382, 691, 0, 9233, 9236, 5, 6, 0, 0, 9234, 9237, 3, 1224, 612, 0, 9235, 9237, 3, 1282, 641, 0, 9236, 9234, 1, 0, 0, 0, 9236, 9235, 1, 0, 0, 0, 9237, 9239, 1, 0, 0, 0, 9238, 9233, 1, 0, 0, 0, 9238, 9239, 1, 0, 0, 0, 9239, 9240, 1, 0, 0, 0, 9240, 9241, 5, 3, 0, 0, 9241, 9288, 1, 0, 0, 0, 9242, 9243, 5, 427, 0, 0, 9243, 9244, 5, 2, 0, 0, 9244, 9245, 3, 1208, 604, 0, 9245, 9246, 3, 1234, 617, 0, 9246, 9247, 5, 3, 0, 0, 9247, 9288, 1, 0, 0, 0, 9248, 9249, 5, 428, 0, 0, 9249, 9250, 5, 2, 0, 0, 9250, 9251, 3, 1226, 613, 0, 9251, 9252, 5, 3, 0, 0, 9252, 9288, 1, 0, 0, 0, 9253, 9254, 5, 429, 0, 0, 9254, 9255, 5, 2, 0, 0, 9255, 9256, 3, 1230, 615, 0, 9256, 9257, 3, 1164, 582, 0, 9257, 9258, 3, 1232, 616, 0, 9258, 9259, 5, 3, 0, 0, 9259, 9288, 1, 0, 0, 0, 9260, 9261, 5, 430, 0, 0, 9261, 9262, 5, 2, 0, 0, 9262, 9263, 5, 259, 0, 0, 9263, 9266, 3, 1382, 691, 0, 9264, 9265, 5, 6, 0, 0, 9265, 9267, 3, 1164, 582, 0, 9266, 9264, 1, 0, 0, 0, 9266, 9267, 1, 0, 0, 0, 9267, 9268, 1, 0, 0, 0, 9268, 9269, 5, 3, 0, 0, 9269, 9288, 1, 0, 0, 0, 9270, 9271, 5, 431, 0, 0, 9271, 9272, 5, 2, 0, 0, 9272, 9273, 5, 376, 0, 0, 9273, 9274, 3, 1164, 582, 0, 9274, 9275, 5, 6, 0, 0, 9275, 9276, 3, 1220, 610, 0, 9276, 9277, 3, 1222, 611, 0, 9277, 9278, 5, 3, 0, 0, 9278, 9288, 1, 0, 0, 0, 9279, 9280, 5, 432, 0, 0, 9280, 9281, 5, 2, 0, 0, 9281, 9282, 3, 1230, 615, 0, 9282, 9283, 3, 1164, 582, 0, 9283, 9284, 5, 36, 0, 0, 9284, 9285, 3, 1124, 562, 0, 9285, 9286, 5, 3, 0, 0, 9286, 9288, 1, 0, 0, 0, 9287, 9110, 1, 0, 0, 0, 9287, 9116, 1, 0, 0, 0, 9287, 9117, 1, 0, 0, 0, 9287, 9124, 1, 0, 0, 0, 9287, 9131, 1, 0, 0, 0, 9287, 9138, 1, 0, 0, 0, 9287, 9145, 1, 0, 0, 0, 9287, 9146, 1, 0, 0, 0, 9287, 9147, 1, 0, 0, 0, 9287, 9148, 1, 0, 0, 0, 9287, 9149, 1, 0, 0, 0, 9287, 9150, 1, 0, 0, 0, 9287, 9151, 1, 0, 0, 0, 9287, 9158, 1, 0, 0, 0, 9287, 9163, 1, 0, 0, 0, 9287, 9172, 1, 0, 0, 0, 9287, 9177, 1, 0, 0, 0, 9287, 9182, 1, 0, 0, 0, 9287, 9187, 1, 0, 0, 0, 9287, 9194, 1, 0, 0, 0, 9287, 9202, 1, 0, 0, 0, 9287, 9209, 1, 0, 0, 0, 9287, 9214, 1, 0, 0, 0, 9287, 9219, 1, 0, 0, 0, 9287, 9224, 1, 0, 0, 0, 9287, 9229, 1, 0, 0, 0, 9287, 9242, 1, 0, 0, 0, 9287, 9248, 1, 0, 0, 0, 9287, 9253, 1, 0, 0, 0, 9287, 9260, 1, 0, 0, 0, 9287, 9270, 1, 0, 0, 0, 9287, 9279, 1, 0, 0, 0, 9288, 1219, 1, 0, 0, 0, 9289, 9290, 5, 368, 0, 0, 9290, 9295, 3, 1164, 582, 0, 9291, 9292, 5, 368, 0, 0, 9292, 9293, 5, 262, 0, 0, 9293, 9295, 5, 450, 0, 0, 9294, 9289, 1, 0, 0, 0, 9294, 9291, 1, 0, 0, 0, 9295, 1221, 1, 0, 0, 0, 9296, 9297, 5, 6, 0, 0, 9297, 9298, 5, 332, 0, 0, 9298, 9308, 5, 378, 0, 0, 9299, 9300, 5, 6, 0, 0, 9300, 9301, 5, 332, 0, 0, 9301, 9308, 5, 262, 0, 0, 9302, 9303, 5, 6, 0, 0, 9303, 9304, 5, 332, 0, 0, 9304, 9305, 5, 262, 0, 0, 9305, 9308, 5, 450, 0, 0, 9306, 9308, 1, 0, 0, 0, 9307, 9296, 1, 0, 0, 0, 9307, 9299, 1, 0, 0, 0, 9307, 9302, 1, 0, 0, 0, 9307, 9306, 1, 0, 0, 0, 9308, 1223, 1, 0, 0, 0, 9309, 9310, 5, 417, 0, 0, 9310, 9311, 5, 2, 0, 0, 9311, 9312, 3, 1226, 613, 0, 9312, 9313, 5, 3, 0, 0, 9313, 1225, 1, 0, 0, 0, 9314, 9319, 3, 1228, 614, 0, 9315, 9316, 5, 6, 0, 0, 9316, 9318, 3, 1228, 614, 0, 9317, 9315, 1, 0, 0, 0, 9318, 9321, 1, 0, 0, 0, 9319, 9317, 1, 0, 0, 0, 9319, 9320, 1, 0, 0, 0, 9320, 1227, 1, 0, 0, 0, 9321, 9319, 1, 0, 0, 0, 9322, 9325, 3, 1164, 582, 0, 9323, 9324, 5, 36, 0, 0, 9324, 9326, 3, 1382, 691, 0, 9325, 9323, 1, 0, 0, 0, 9325, 9326, 1, 0, 0, 0, 9326, 1229, 1, 0, 0, 0, 9327, 9328, 7, 50, 0, 0, 9328, 1231, 1, 0, 0, 0, 9329, 9330, 5, 285, 0, 0, 9330, 9335, 5, 371, 0, 0, 9331, 9332, 5, 340, 0, 0, 9332, 9335, 5, 371, 0, 0, 9333, 9335, 1, 0, 0, 0, 9334, 9329, 1, 0, 0, 0, 9334, 9331, 1, 0, 0, 0, 9334, 9333, 1, 0, 0, 0, 9335, 1233, 1, 0, 0, 0, 9336, 9337, 5, 279, 0, 0, 9337, 9352, 3, 1208, 604, 0, 9338, 9339, 5, 279, 0, 0, 9339, 9340, 3, 1208, 604, 0, 9340, 9341, 3, 1236, 618, 0, 9341, 9352, 1, 0, 0, 0, 9342, 9343, 5, 279, 0, 0, 9343, 9344, 3, 1236, 618, 0, 9344, 9345, 3, 1208, 604, 0, 9345, 9352, 1, 0, 0, 0, 9346, 9347, 5, 279, 0, 0, 9347, 9348, 3, 1236, 618, 0, 9348, 9349, 3, 1208, 604, 0, 9349, 9350, 3, 1236, 618, 0, 9350, 9352, 1, 0, 0, 0, 9351, 9336, 1, 0, 0, 0, 9351, 9338, 1, 0, 0, 0, 9351, 9342, 1, 0, 0, 0, 9351, 9346, 1, 0, 0, 0, 9352, 1235, 1, 0, 0, 0, 9353, 9354, 5, 147, 0, 0, 9354, 9355, 7, 51, 0, 0, 9355, 1237, 1, 0, 0, 0, 9356, 9357, 5, 479, 0, 0, 9357, 9358, 5, 66, 0, 0, 9358, 9359, 5, 2, 0, 0, 9359, 9360, 3, 1000, 500, 0, 9360, 9361, 5, 3, 0, 0, 9361, 9364, 1, 0, 0, 0, 9362, 9364, 1, 0, 0, 0, 9363, 9356, 1, 0, 0, 0, 9363, 9362, 1, 0, 0, 0, 9364, 1239, 1, 0, 0, 0, 9365, 9366, 5, 480, 0, 0, 9366, 9367, 5, 2, 0, 0, 9367, 9368, 5, 103, 0, 0, 9368, 9369, 3, 1164, 582, 0, 9369, 9370, 5, 3, 0, 0, 9370, 9373, 1, 0, 0, 0, 9371, 9373, 1, 0, 0, 0, 9372, 9365, 1, 0, 0, 0, 9372, 9371, 1, 0, 0, 0, 9373, 1241, 1, 0, 0, 0, 9374, 9375, 5, 104, 0, 0, 9375, 9378, 3, 1244, 622, 0, 9376, 9378, 1, 0, 0, 0, 9377, 9374, 1, 0, 0, 0, 9377, 9376, 1, 0, 0, 0, 9378, 1243, 1, 0, 0, 0, 9379, 9384, 3, 1246, 623, 0, 9380, 9381, 5, 6, 0, 0, 9381, 9383, 3, 1246, 623, 0, 9382, 9380, 1, 0, 0, 0, 9383, 9386, 1, 0, 0, 0, 9384, 9382, 1, 0, 0, 0, 9384, 9385, 1, 0, 0, 0, 9385, 1245, 1, 0, 0, 0, 9386, 9384, 1, 0, 0, 0, 9387, 9388, 3, 1374, 687, 0, 9388, 9389, 5, 36, 0, 0, 9389, 9390, 3, 1250, 625, 0, 9390, 1247, 1, 0, 0, 0, 9391, 9394, 5, 124, 0, 0, 9392, 9395, 3, 1250, 625, 0, 9393, 9395, 3, 1374, 687, 0, 9394, 9392, 1, 0, 0, 0, 9394, 9393, 1, 0, 0, 0, 9395, 9398, 1, 0, 0, 0, 9396, 9398, 1, 0, 0, 0, 9397, 9391, 1, 0, 0, 0, 9397, 9396, 1, 0, 0, 0, 9398, 1249, 1, 0, 0, 0, 9399, 9400, 5, 2, 0, 0, 9400, 9401, 3, 1252, 626, 0, 9401, 9402, 3, 1254, 627, 0, 9402, 9403, 3, 998, 499, 0, 9403, 9404, 3, 1256, 628, 0, 9404, 9405, 5, 3, 0, 0, 9405, 1251, 1, 0, 0, 0, 9406, 9409, 3, 1374, 687, 0, 9407, 9409, 1, 0, 0, 0, 9408, 9406, 1, 0, 0, 0, 9408, 9407, 1, 0, 0, 0, 9409, 1253, 1, 0, 0, 0, 9410, 9411, 5, 278, 0, 0, 9411, 9412, 5, 147, 0, 0, 9412, 9415, 3, 1282, 641, 0, 9413, 9415, 1, 0, 0, 0, 9414, 9410, 1, 0, 0, 0, 9414, 9413, 1, 0, 0, 0, 9415, 1255, 1, 0, 0, 0, 9416, 9417, 5, 292, 0, 0, 9417, 9418, 3, 1258, 629, 0, 9418, 9419, 3, 1262, 631, 0, 9419, 9430, 1, 0, 0, 0, 9420, 9421, 5, 313, 0, 0, 9421, 9422, 3, 1258, 629, 0, 9422, 9423, 3, 1262, 631, 0, 9423, 9430, 1, 0, 0, 0, 9424, 9425, 5, 481, 0, 0, 9425, 9426, 3, 1258, 629, 0, 9426, 9427, 3, 1262, 631, 0, 9427, 9430, 1, 0, 0, 0, 9428, 9430, 1, 0, 0, 0, 9429, 9416, 1, 0, 0, 0, 9429, 9420, 1, 0, 0, 0, 9429, 9424, 1, 0, 0, 0, 9429, 9428, 1, 0, 0, 0, 9430, 1257, 1, 0, 0, 0, 9431, 9438, 3, 1260, 630, 0, 9432, 9433, 5, 380, 0, 0, 9433, 9434, 3, 1260, 630, 0, 9434, 9435, 5, 33, 0, 0, 9435, 9436, 3, 1260, 630, 0, 9436, 9438, 1, 0, 0, 0, 9437, 9431, 1, 0, 0, 0, 9437, 9432, 1, 0, 0, 0, 9438, 1259, 1, 0, 0, 0, 9439, 9440, 5, 355, 0, 0, 9440, 9447, 7, 52, 0, 0, 9441, 9442, 5, 434, 0, 0, 9442, 9447, 5, 407, 0, 0, 9443, 9444, 3, 1164, 582, 0, 9444, 9445, 7, 52, 0, 0, 9445, 9447, 1, 0, 0, 0, 9446, 9439, 1, 0, 0, 0, 9446, 9441, 1, 0, 0, 0, 9446, 9443, 1, 0, 0, 0, 9447, 1261, 1, 0, 0, 0, 9448, 9455, 5, 199, 0, 0, 9449, 9450, 5, 434, 0, 0, 9450, 9456, 5, 407, 0, 0, 9451, 9456, 5, 66, 0, 0, 9452, 9456, 5, 467, 0, 0, 9453, 9454, 5, 262, 0, 0, 9454, 9456, 5, 482, 0, 0, 9455, 9449, 1, 0, 0, 0, 9455, 9451, 1, 0, 0, 0, 9455, 9452, 1, 0, 0, 0, 9455, 9453, 1, 0, 0, 0, 9456, 9459, 1, 0, 0, 0, 9457, 9459, 1, 0, 0, 0, 9458, 9448, 1, 0, 0, 0, 9458, 9457, 1, 0, 0, 0, 9459, 1263, 1, 0, 0, 0, 9460, 9461, 5, 407, 0, 0, 9461, 9463, 5, 2, 0, 0, 9462, 9464, 3, 1282, 641, 0, 9463, 9462, 1, 0, 0, 0, 9463, 9464, 1, 0, 0, 0, 9464, 9465, 1, 0, 0, 0, 9465, 9473, 5, 3, 0, 0, 9466, 9467, 5, 2, 0, 0, 9467, 9468, 3, 1282, 641, 0, 9468, 9469, 5, 6, 0, 0, 9469, 9470, 3, 1164, 582, 0, 9470, 9471, 5, 3, 0, 0, 9471, 9473, 1, 0, 0, 0, 9472, 9460, 1, 0, 0, 0, 9472, 9466, 1, 0, 0, 0, 9473, 1265, 1, 0, 0, 0, 9474, 9475, 5, 407, 0, 0, 9475, 9477, 5, 2, 0, 0, 9476, 9478, 3, 1282, 641, 0, 9477, 9476, 1, 0, 0, 0, 9477, 9478, 1, 0, 0, 0, 9478, 9479, 1, 0, 0, 0, 9479, 9480, 5, 3, 0, 0, 9480, 1267, 1, 0, 0, 0, 9481, 9482, 5, 2, 0, 0, 9482, 9483, 3, 1282, 641, 0, 9483, 9484, 5, 6, 0, 0, 9484, 9485, 3, 1164, 582, 0, 9485, 9486, 5, 3, 0, 0, 9486, 1269, 1, 0, 0, 0, 9487, 9488, 7, 53, 0, 0, 9488, 1271, 1, 0, 0, 0, 9489, 9492, 5, 29, 0, 0, 9490, 9492, 3, 1274, 637, 0, 9491, 9489, 1, 0, 0, 0, 9491, 9490, 1, 0, 0, 0, 9492, 1273, 1, 0, 0, 0, 9493, 9494, 7, 54, 0, 0, 9494, 1275, 1, 0, 0, 0, 9495, 9502, 5, 29, 0, 0, 9496, 9497, 5, 271, 0, 0, 9497, 9498, 5, 2, 0, 0, 9498, 9499, 3, 684, 342, 0, 9499, 9500, 5, 3, 0, 0, 9500, 9502, 1, 0, 0, 0, 9501, 9495, 1, 0, 0, 0, 9501, 9496, 1, 0, 0, 0, 9502, 1277, 1, 0, 0, 0, 9503, 9510, 3, 1272, 636, 0, 9504, 9505, 5, 271, 0, 0, 9505, 9506, 5, 2, 0, 0, 9506, 9507, 3, 684, 342, 0, 9507, 9508, 5, 3, 0, 0, 9508, 9510, 1, 0, 0, 0, 9509, 9503, 1, 0, 0, 0, 9509, 9504, 1, 0, 0, 0, 9510, 1279, 1, 0, 0, 0, 9511, 9524, 3, 1272, 636, 0, 9512, 9513, 5, 271, 0, 0, 9513, 9514, 5, 2, 0, 0, 9514, 9515, 3, 684, 342, 0, 9515, 9516, 5, 3, 0, 0, 9516, 9524, 1, 0, 0, 0, 9517, 9524, 5, 120, 0, 0, 9518, 9519, 5, 77, 0, 0, 9519, 9524, 5, 120, 0, 0, 9520, 9524, 5, 114, 0, 0, 9521, 9522, 5, 77, 0, 0, 9522, 9524, 5, 114, 0, 0, 9523, 9511, 1, 0, 0, 0, 9523, 9512, 1, 0, 0, 0, 9523, 9517, 1, 0, 0, 0, 9523, 9518, 1, 0, 0, 0, 9523, 9520, 1, 0, 0, 0, 9523, 9521, 1, 0, 0, 0, 9524, 1281, 1, 0, 0, 0, 9525, 9530, 3, 1164, 582, 0, 9526, 9527, 5, 6, 0, 0, 9527, 9529, 3, 1164, 582, 0, 9528, 9526, 1, 0, 0, 0, 9529, 9532, 1, 0, 0, 0, 9530, 9528, 1, 0, 0, 0, 9530, 9531, 1, 0, 0, 0, 9531, 1283, 1, 0, 0, 0, 9532, 9530, 1, 0, 0, 0, 9533, 9538, 3, 1286, 643, 0, 9534, 9535, 5, 6, 0, 0, 9535, 9537, 3, 1286, 643, 0, 9536, 9534, 1, 0, 0, 0, 9537, 9540, 1, 0, 0, 0, 9538, 9536, 1, 0, 0, 0, 9538, 9539, 1, 0, 0, 0, 9539, 1285, 1, 0, 0, 0, 9540, 9538, 1, 0, 0, 0, 9541, 9547, 3, 1164, 582, 0, 9542, 9543, 3, 636, 318, 0, 9543, 9544, 7, 55, 0, 0, 9544, 9545, 3, 1164, 582, 0, 9545, 9547, 1, 0, 0, 0, 9546, 9541, 1, 0, 0, 0, 9546, 9542, 1, 0, 0, 0, 9547, 1287, 1, 0, 0, 0, 9548, 9553, 3, 1120, 560, 0, 9549, 9550, 5, 6, 0, 0, 9550, 9552, 3, 1120, 560, 0, 9551, 9549, 1, 0, 0, 0, 9552, 9555, 1, 0, 0, 0, 9553, 9551, 1, 0, 0, 0, 9553, 9554, 1, 0, 0, 0, 9554, 1289, 1, 0, 0, 0, 9555, 9553, 1, 0, 0, 0, 9556, 9559, 5, 4, 0, 0, 9557, 9560, 3, 1282, 641, 0, 9558, 9560, 3, 1292, 646, 0, 9559, 9557, 1, 0, 0, 0, 9559, 9558, 1, 0, 0, 0, 9559, 9560, 1, 0, 0, 0, 9560, 9561, 1, 0, 0, 0, 9561, 9562, 5, 5, 0, 0, 9562, 1291, 1, 0, 0, 0, 9563, 9568, 3, 1290, 645, 0, 9564, 9565, 5, 6, 0, 0, 9565, 9567, 3, 1290, 645, 0, 9566, 9564, 1, 0, 0, 0, 9567, 9570, 1, 0, 0, 0, 9568, 9566, 1, 0, 0, 0, 9568, 9569, 1, 0, 0, 0, 9569, 1293, 1, 0, 0, 0, 9570, 9568, 1, 0, 0, 0, 9571, 9572, 3, 1296, 648, 0, 9572, 9573, 5, 64, 0, 0, 9573, 9574, 3, 1164, 582, 0, 9574, 9577, 1, 0, 0, 0, 9575, 9577, 1, 0, 0, 0, 9576, 9571, 1, 0, 0, 0, 9576, 9575, 1, 0, 0, 0, 9577, 1295, 1, 0, 0, 0, 9578, 9587, 3, 1384, 692, 0, 9579, 9587, 5, 377, 0, 0, 9580, 9587, 5, 257, 0, 0, 9581, 9587, 5, 176, 0, 0, 9582, 9587, 5, 218, 0, 0, 9583, 9587, 5, 254, 0, 0, 9584, 9587, 5, 319, 0, 0, 9585, 9587, 3, 1360, 680, 0, 9586, 9578, 1, 0, 0, 0, 9586, 9579, 1, 0, 0, 0, 9586, 9580, 1, 0, 0, 0, 9586, 9581, 1, 0, 0, 0, 9586, 9582, 1, 0, 0, 0, 9586, 9583, 1, 0, 0, 0, 9586, 9584, 1, 0, 0, 0, 9586, 9585, 1, 0, 0, 0, 9587, 1297, 1, 0, 0, 0, 9588, 9589, 7, 56, 0, 0, 9589, 1299, 1, 0, 0, 0, 9590, 9591, 3, 1164, 582, 0, 9591, 9592, 5, 84, 0, 0, 9592, 9593, 3, 1164, 582, 0, 9593, 9594, 5, 64, 0, 0, 9594, 9597, 3, 1164, 582, 0, 9595, 9596, 5, 62, 0, 0, 9596, 9598, 3, 1164, 582, 0, 9597, 9595, 1, 0, 0, 0, 9597, 9598, 1, 0, 0, 0, 9598, 1301, 1, 0, 0, 0, 9599, 9600, 3, 1206, 603, 0, 9600, 9601, 5, 68, 0, 0, 9601, 9602, 3, 1206, 603, 0, 9602, 9605, 1, 0, 0, 0, 9603, 9605, 1, 0, 0, 0, 9604, 9599, 1, 0, 0, 0, 9604, 9603, 1, 0, 0, 0, 9605, 1303, 1, 0, 0, 0, 9606, 9607, 3, 1164, 582, 0, 9607, 9608, 5, 64, 0, 0, 9608, 9609, 3, 1164, 582, 0, 9609, 9610, 5, 62, 0, 0, 9610, 9611, 3, 1164, 582, 0, 9611, 9635, 1, 0, 0, 0, 9612, 9613, 3, 1164, 582, 0, 9613, 9614, 5, 62, 0, 0, 9614, 9615, 3, 1164, 582, 0, 9615, 9616, 5, 64, 0, 0, 9616, 9617, 3, 1164, 582, 0, 9617, 9635, 1, 0, 0, 0, 9618, 9619, 3, 1164, 582, 0, 9619, 9620, 5, 64, 0, 0, 9620, 9621, 3, 1164, 582, 0, 9621, 9635, 1, 0, 0, 0, 9622, 9623, 3, 1164, 582, 0, 9623, 9624, 5, 62, 0, 0, 9624, 9625, 3, 1164, 582, 0, 9625, 9635, 1, 0, 0, 0, 9626, 9627, 3, 1164, 582, 0, 9627, 9628, 5, 127, 0, 0, 9628, 9629, 3, 1164, 582, 0, 9629, 9630, 5, 197, 0, 0, 9630, 9631, 3, 1164, 582, 0, 9631, 9635, 1, 0, 0, 0, 9632, 9635, 3, 1282, 641, 0, 9633, 9635, 1, 0, 0, 0, 9634, 9606, 1, 0, 0, 0, 9634, 9612, 1, 0, 0, 0, 9634, 9618, 1, 0, 0, 0, 9634, 9622, 1, 0, 0, 0, 9634, 9626, 1, 0, 0, 0, 9634, 9632, 1, 0, 0, 0, 9634, 9633, 1, 0, 0, 0, 9635, 1305, 1, 0, 0, 0, 9636, 9637, 3, 1164, 582, 0, 9637, 9638, 5, 64, 0, 0, 9638, 9639, 3, 1282, 641, 0, 9639, 9644, 1, 0, 0, 0, 9640, 9641, 5, 64, 0, 0, 9641, 9644, 3, 1282, 641, 0, 9642, 9644, 3, 1282, 641, 0, 9643, 9636, 1, 0, 0, 0, 9643, 9640, 1, 0, 0, 0, 9643, 9642, 1, 0, 0, 0, 9644, 1307, 1, 0, 0, 0, 9645, 9651, 3, 962, 481, 0, 9646, 9647, 5, 2, 0, 0, 9647, 9648, 3, 1282, 641, 0, 9648, 9649, 5, 3, 0, 0, 9649, 9651, 1, 0, 0, 0, 9650, 9645, 1, 0, 0, 0, 9650, 9646, 1, 0, 0, 0, 9651, 1309, 1, 0, 0, 0, 9652, 9653, 5, 40, 0, 0, 9653, 9654, 3, 1318, 659, 0, 9654, 9655, 3, 1312, 656, 0, 9655, 9656, 3, 1316, 658, 0, 9656, 9657, 5, 454, 0, 0, 9657, 1311, 1, 0, 0, 0, 9658, 9660, 3, 1314, 657, 0, 9659, 9658, 1, 0, 0, 0, 9660, 9661, 1, 0, 0, 0, 9661, 9659, 1, 0, 0, 0, 9661, 9662, 1, 0, 0, 0, 9662, 1313, 1, 0, 0, 0, 9663, 9664, 5, 102, 0, 0, 9664, 9665, 3, 1164, 582, 0, 9665, 9666, 5, 93, 0, 0, 9666, 9667, 3, 1164, 582, 0, 9667, 1315, 1, 0, 0, 0, 9668, 9669, 5, 58, 0, 0, 9669, 9672, 3, 1164, 582, 0, 9670, 9672, 1, 0, 0, 0, 9671, 9668, 1, 0, 0, 0, 9671, 9670, 1, 0, 0, 0, 9672, 1317, 1, 0, 0, 0, 9673, 9676, 3, 1164, 582, 0, 9674, 9676, 1, 0, 0, 0, 9675, 9673, 1, 0, 0, 0, 9675, 9674, 1, 0, 0, 0, 9676, 1319, 1, 0, 0, 0, 9677, 9679, 3, 1374, 687, 0, 9678, 9680, 3, 1326, 663, 0, 9679, 9678, 1, 0, 0, 0, 9679, 9680, 1, 0, 0, 0, 9680, 1321, 1, 0, 0, 0, 9681, 9684, 5, 11, 0, 0, 9682, 9685, 3, 1344, 672, 0, 9683, 9685, 5, 9, 0, 0, 9684, 9682, 1, 0, 0, 0, 9684, 9683, 1, 0, 0, 0, 9685, 9697, 1, 0, 0, 0, 9686, 9692, 5, 4, 0, 0, 9687, 9693, 3, 1164, 582, 0, 9688, 9689, 3, 1324, 662, 0, 9689, 9690, 5, 8, 0, 0, 9690, 9691, 3, 1324, 662, 0, 9691, 9693, 1, 0, 0, 0, 9692, 9687, 1, 0, 0, 0, 9692, 9688, 1, 0, 0, 0, 9693, 9694, 1, 0, 0, 0, 9694, 9695, 5, 5, 0, 0, 9695, 9697, 1, 0, 0, 0, 9696, 9681, 1, 0, 0, 0, 9696, 9686, 1, 0, 0, 0, 9697, 1323, 1, 0, 0, 0, 9698, 9701, 3, 1164, 582, 0, 9699, 9701, 1, 0, 0, 0, 9700, 9698, 1, 0, 0, 0, 9700, 9699, 1, 0, 0, 0, 9701, 1325, 1, 0, 0, 0, 9702, 9704, 3, 1322, 661, 0, 9703, 9702, 1, 0, 0, 0, 9704, 9705, 1, 0, 0, 0, 9705, 9703, 1, 0, 0, 0, 9705, 9706, 1, 0, 0, 0, 9706, 1327, 1, 0, 0, 0, 9707, 9709, 3, 1322, 661, 0, 9708, 9707, 1, 0, 0, 0, 9709, 9712, 1, 0, 0, 0, 9710, 9708, 1, 0, 0, 0, 9710, 9711, 1, 0, 0, 0, 9711, 1329, 1, 0, 0, 0, 9712, 9710, 1, 0, 0, 0, 9713, 9716, 3, 1332, 666, 0, 9714, 9716, 1, 0, 0, 0, 9715, 9713, 1, 0, 0, 0, 9715, 9714, 1, 0, 0, 0, 9716, 1331, 1, 0, 0, 0, 9717, 9722, 3, 1334, 667, 0, 9718, 9719, 5, 6, 0, 0, 9719, 9721, 3, 1334, 667, 0, 9720, 9718, 1, 0, 0, 0, 9721, 9724, 1, 0, 0, 0, 9722, 9720, 1, 0, 0, 0, 9722, 9723, 1, 0, 0, 0, 9723, 1333, 1, 0, 0, 0, 9724, 9722, 1, 0, 0, 0, 9725, 9730, 3, 1164, 582, 0, 9726, 9727, 5, 36, 0, 0, 9727, 9731, 3, 1382, 691, 0, 9728, 9731, 3, 1384, 692, 0, 9729, 9731, 1, 0, 0, 0, 9730, 9726, 1, 0, 0, 0, 9730, 9728, 1, 0, 0, 0, 9730, 9729, 1, 0, 0, 0, 9731, 9734, 1, 0, 0, 0, 9732, 9734, 5, 9, 0, 0, 9733, 9725, 1, 0, 0, 0, 9733, 9732, 1, 0, 0, 0, 9734, 1335, 1, 0, 0, 0, 9735, 9740, 3, 1338, 669, 0, 9736, 9737, 5, 6, 0, 0, 9737, 9739, 3, 1338, 669, 0, 9738, 9736, 1, 0, 0, 0, 9739, 9742, 1, 0, 0, 0, 9740, 9738, 1, 0, 0, 0, 9740, 9741, 1, 0, 0, 0, 9741, 1337, 1, 0, 0, 0, 9742, 9740, 1, 0, 0, 0, 9743, 9745, 3, 1374, 687, 0, 9744, 9746, 3, 1326, 663, 0, 9745, 9744, 1, 0, 0, 0, 9745, 9746, 1, 0, 0, 0, 9746, 1339, 1, 0, 0, 0, 9747, 9752, 3, 1342, 671, 0, 9748, 9749, 5, 6, 0, 0, 9749, 9751, 3, 1342, 671, 0, 9750, 9748, 1, 0, 0, 0, 9751, 9754, 1, 0, 0, 0, 9752, 9750, 1, 0, 0, 0, 9752, 9753, 1, 0, 0, 0, 9753, 1341, 1, 0, 0, 0, 9754, 9752, 1, 0, 0, 0, 9755, 9756, 3, 1374, 687, 0, 9756, 1343, 1, 0, 0, 0, 9757, 9758, 3, 1382, 691, 0, 9758, 1345, 1, 0, 0, 0, 9759, 9760, 3, 1360, 680, 0, 9760, 1347, 1, 0, 0, 0, 9761, 9769, 3, 1396, 698, 0, 9762, 9769, 3, 1378, 689, 0, 9763, 9764, 3, 1374, 687, 0, 9764, 9765, 3, 1326, 663, 0, 9765, 9769, 1, 0, 0, 0, 9766, 9769, 5, 119, 0, 0, 9767, 9769, 5, 126, 0, 0, 9768, 9761, 1, 0, 0, 0, 9768, 9762, 1, 0, 0, 0, 9768, 9763, 1, 0, 0, 0, 9768, 9766, 1, 0, 0, 0, 9768, 9767, 1, 0, 0, 0, 9769, 1349, 1, 0, 0, 0, 9770, 9803, 3, 1358, 679, 0, 9771, 9803, 3, 1356, 678, 0, 9772, 9803, 3, 1360, 680, 0, 9773, 9803, 3, 1354, 677, 0, 9774, 9803, 3, 1352, 676, 0, 9775, 9783, 3, 1348, 674, 0, 9776, 9784, 3, 1360, 680, 0, 9777, 9778, 5, 2, 0, 0, 9778, 9779, 3, 1284, 642, 0, 9779, 9780, 3, 998, 499, 0, 9780, 9781, 5, 3, 0, 0, 9781, 9782, 3, 1360, 680, 0, 9782, 9784, 1, 0, 0, 0, 9783, 9776, 1, 0, 0, 0, 9783, 9777, 1, 0, 0, 0, 9784, 9803, 1, 0, 0, 0, 9785, 9786, 3, 1126, 563, 0, 9786, 9787, 3, 1360, 680, 0, 9787, 9803, 1, 0, 0, 0, 9788, 9797, 3, 1154, 577, 0, 9789, 9790, 3, 1360, 680, 0, 9790, 9791, 3, 1158, 579, 0, 9791, 9798, 1, 0, 0, 0, 9792, 9793, 5, 2, 0, 0, 9793, 9794, 3, 1358, 679, 0, 9794, 9795, 5, 3, 0, 0, 9795, 9796, 3, 1360, 680, 0, 9796, 9798, 1, 0, 0, 0, 9797, 9789, 1, 0, 0, 0, 9797, 9792, 1, 0, 0, 0, 9798, 9803, 1, 0, 0, 0, 9799, 9803, 5, 96, 0, 0, 9800, 9803, 5, 60, 0, 0, 9801, 9803, 5, 78, 0, 0, 9802, 9770, 1, 0, 0, 0, 9802, 9771, 1, 0, 0, 0, 9802, 9772, 1, 0, 0, 0, 9802, 9773, 1, 0, 0, 0, 9802, 9774, 1, 0, 0, 0, 9802, 9775, 1, 0, 0, 0, 9802, 9785, 1, 0, 0, 0, 9802, 9788, 1, 0, 0, 0, 9802, 9799, 1, 0, 0, 0, 9802, 9800, 1, 0, 0, 0, 9802, 9801, 1, 0, 0, 0, 9803, 1351, 1, 0, 0, 0, 9804, 9805, 5, 654, 0, 0, 9805, 1353, 1, 0, 0, 0, 9806, 9807, 5, 650, 0, 0, 9807, 1355, 1, 0, 0, 0, 9808, 9809, 5, 660, 0, 0, 9809, 1357, 1, 0, 0, 0, 9810, 9811, 5, 658, 0, 0, 9811, 1359, 1, 0, 0, 0, 9812, 9813, 3, 1362, 681, 0, 9813, 9814, 3, 1364, 682, 0, 9814, 1361, 1, 0, 0, 0, 9815, 9827, 5, 645, 0, 0, 9816, 9827, 5, 647, 0, 0, 9817, 9821, 5, 649, 0, 0, 9818, 9820, 5, 677, 0, 0, 9819, 9818, 1, 0, 0, 0, 9820, 9823, 1, 0, 0, 0, 9821, 9819, 1, 0, 0, 0, 9821, 9822, 1, 0, 0, 0, 9822, 9824, 1, 0, 0, 0, 9823, 9821, 1, 0, 0, 0, 9824, 9827, 5, 678, 0, 0, 9825, 9827, 5, 671, 0, 0, 9826, 9815, 1, 0, 0, 0, 9826, 9816, 1, 0, 0, 0, 9826, 9817, 1, 0, 0, 0, 9826, 9825, 1, 0, 0, 0, 9827, 1363, 1, 0, 0, 0, 9828, 9829, 5, 487, 0, 0, 9829, 9832, 3, 1362, 681, 0, 9830, 9832, 1, 0, 0, 0, 9831, 9828, 1, 0, 0, 0, 9831, 9830, 1, 0, 0, 0, 9832, 1365, 1, 0, 0, 0, 9833, 9839, 3, 1358, 679, 0, 9834, 9835, 5, 12, 0, 0, 9835, 9839, 3, 1358, 679, 0, 9836, 9837, 5, 13, 0, 0, 9837, 9839, 3, 1358, 679, 0, 9838, 9833, 1, 0, 0, 0, 9838, 9834, 1, 0, 0, 0, 9838, 9836, 1, 0, 0, 0, 9839, 1367, 1, 0, 0, 0, 9840, 9841, 3, 1370, 685, 0, 9841, 1369, 1, 0, 0, 0, 9842, 9846, 3, 1380, 690, 0, 9843, 9846, 5, 52, 0, 0, 9844, 9846, 5, 89, 0, 0, 9845, 9842, 1, 0, 0, 0, 9845, 9843, 1, 0, 0, 0, 9845, 9844, 1, 0, 0, 0, 9846, 1371, 1, 0, 0, 0, 9847, 9852, 3, 1370, 685, 0, 9848, 9849, 5, 6, 0, 0, 9849, 9851, 3, 1370, 685, 0, 9850, 9848, 1, 0, 0, 0, 9851, 9854, 1, 0, 0, 0, 9852, 9850, 1, 0, 0, 0, 9852, 9853, 1, 0, 0, 0, 9853, 1373, 1, 0, 0, 0, 9854, 9852, 1, 0, 0, 0, 9855, 9862, 3, 1384, 692, 0, 9856, 9862, 3, 1388, 694, 0, 9857, 9862, 3, 1390, 695, 0, 9858, 9862, 3, 1610, 805, 0, 9859, 9862, 5, 119, 0, 0, 9860, 9862, 5, 126, 0, 0, 9861, 9855, 1, 0, 0, 0, 9861, 9856, 1, 0, 0, 0, 9861, 9857, 1, 0, 0, 0, 9861, 9858, 1, 0, 0, 0, 9861, 9859, 1, 0, 0, 0, 9861, 9860, 1, 0, 0, 0, 9862, 1375, 1, 0, 0, 0, 9863, 9868, 3, 1384, 692, 0, 9864, 9868, 3, 1388, 694, 0, 9865, 9868, 3, 1390, 695, 0, 9866, 9868, 3, 1610, 805, 0, 9867, 9863, 1, 0, 0, 0, 9867, 9864, 1, 0, 0, 0, 9867, 9865, 1, 0, 0, 0, 9867, 9866, 1, 0, 0, 0, 9868, 1377, 1, 0, 0, 0, 9869, 9874, 3, 1384, 692, 0, 9870, 9874, 3, 1388, 694, 0, 9871, 9874, 3, 1610, 805, 0, 9872, 9874, 3, 1392, 696, 0, 9873, 9869, 1, 0, 0, 0, 9873, 9870, 1, 0, 0, 0, 9873, 9871, 1, 0, 0, 0, 9873, 9872, 1, 0, 0, 0, 9874, 1379, 1, 0, 0, 0, 9875, 9880, 3, 1384, 692, 0, 9876, 9880, 3, 1388, 694, 0, 9877, 9880, 3, 1390, 695, 0, 9878, 9880, 3, 1392, 696, 0, 9879, 9875, 1, 0, 0, 0, 9879, 9876, 1, 0, 0, 0, 9879, 9877, 1, 0, 0, 0, 9879, 9878, 1, 0, 0, 0, 9880, 1381, 1, 0, 0, 0, 9881, 9888, 3, 1384, 692, 0, 9882, 9888, 3, 1610, 805, 0, 9883, 9888, 3, 1388, 694, 0, 9884, 9888, 3, 1390, 695, 0, 9885, 9888, 3, 1392, 696, 0, 9886, 9888, 3, 1394, 697, 0, 9887, 9881, 1, 0, 0, 0, 9887, 9882, 1, 0, 0, 0, 9887, 9883, 1, 0, 0, 0, 9887, 9884, 1, 0, 0, 0, 9887, 9885, 1, 0, 0, 0, 9887, 9886, 1, 0, 0, 0, 9888, 1383, 1, 0, 0, 0, 9889, 9890, 5, 636, 0, 0, 9890, 9897, 3, 1364, 682, 0, 9891, 9897, 5, 637, 0, 0, 9892, 9897, 5, 641, 0, 0, 9893, 9897, 3, 1210, 605, 0, 9894, 9897, 3, 1386, 693, 0, 9895, 9897, 3, 1610, 805, 0, 9896, 9889, 1, 0, 0, 0, 9896, 9891, 1, 0, 0, 0, 9896, 9892, 1, 0, 0, 0, 9896, 9893, 1, 0, 0, 0, 9896, 9894, 1, 0, 0, 0, 9896, 9895, 1, 0, 0, 0, 9897, 1385, 1, 0, 0, 0, 9898, 9899, 5, 662, 0, 0, 9899, 1387, 1, 0, 0, 0, 9900, 9901, 7, 57, 0, 0, 9901, 1389, 1, 0, 0, 0, 9902, 9955, 5, 380, 0, 0, 9903, 9955, 5, 381, 0, 0, 9904, 9955, 3, 1136, 568, 0, 9905, 9955, 5, 383, 0, 0, 9906, 9955, 5, 384, 0, 0, 9907, 9955, 3, 1144, 572, 0, 9908, 9955, 5, 386, 0, 0, 9909, 9955, 5, 387, 0, 0, 9910, 9955, 5, 388, 0, 0, 9911, 9955, 5, 389, 0, 0, 9912, 9955, 5, 390, 0, 0, 9913, 9955, 5, 391, 0, 0, 9914, 9955, 5, 392, 0, 0, 9915, 9955, 5, 470, 0, 0, 9916, 9955, 5, 393, 0, 0, 9917, 9955, 5, 394, 0, 0, 9918, 9955, 5, 395, 0, 0, 9919, 9955, 5, 396, 0, 0, 9920, 9955, 5, 397, 0, 0, 9921, 9955, 5, 398, 0, 0, 9922, 9955, 5, 399, 0, 0, 9923, 9955, 5, 400, 0, 0, 9924, 9955, 5, 489, 0, 0, 9925, 9955, 5, 401, 0, 0, 9926, 9955, 3, 1132, 566, 0, 9927, 9955, 5, 453, 0, 0, 9928, 9955, 5, 403, 0, 0, 9929, 9955, 5, 404, 0, 0, 9930, 9955, 5, 405, 0, 0, 9931, 9955, 5, 406, 0, 0, 9932, 9955, 5, 407, 0, 0, 9933, 9955, 5, 408, 0, 0, 9934, 9955, 5, 409, 0, 0, 9935, 9955, 5, 410, 0, 0, 9936, 9955, 5, 411, 0, 0, 9937, 9955, 5, 412, 0, 0, 9938, 9955, 5, 413, 0, 0, 9939, 9955, 5, 414, 0, 0, 9940, 9955, 5, 415, 0, 0, 9941, 9955, 5, 416, 0, 0, 9942, 9955, 5, 417, 0, 0, 9943, 9955, 5, 425, 0, 0, 9944, 9955, 5, 426, 0, 0, 9945, 9955, 5, 427, 0, 0, 9946, 9955, 5, 428, 0, 0, 9947, 9955, 5, 476, 0, 0, 9948, 9955, 5, 429, 0, 0, 9949, 9955, 5, 430, 0, 0, 9950, 9955, 5, 431, 0, 0, 9951, 9955, 5, 432, 0, 0, 9952, 9955, 5, 474, 0, 0, 9953, 9955, 3, 1396, 698, 0, 9954, 9902, 1, 0, 0, 0, 9954, 9903, 1, 0, 0, 0, 9954, 9904, 1, 0, 0, 0, 9954, 9905, 1, 0, 0, 0, 9954, 9906, 1, 0, 0, 0, 9954, 9907, 1, 0, 0, 0, 9954, 9908, 1, 0, 0, 0, 9954, 9909, 1, 0, 0, 0, 9954, 9910, 1, 0, 0, 0, 9954, 9911, 1, 0, 0, 0, 9954, 9912, 1, 0, 0, 0, 9954, 9913, 1, 0, 0, 0, 9954, 9914, 1, 0, 0, 0, 9954, 9915, 1, 0, 0, 0, 9954, 9916, 1, 0, 0, 0, 9954, 9917, 1, 0, 0, 0, 9954, 9918, 1, 0, 0, 0, 9954, 9919, 1, 0, 0, 0, 9954, 9920, 1, 0, 0, 0, 9954, 9921, 1, 0, 0, 0, 9954, 9922, 1, 0, 0, 0, 9954, 9923, 1, 0, 0, 0, 9954, 9924, 1, 0, 0, 0, 9954, 9925, 1, 0, 0, 0, 9954, 9926, 1, 0, 0, 0, 9954, 9927, 1, 0, 0, 0, 9954, 9928, 1, 0, 0, 0, 9954, 9929, 1, 0, 0, 0, 9954, 9930, 1, 0, 0, 0, 9954, 9931, 1, 0, 0, 0, 9954, 9932, 1, 0, 0, 0, 9954, 9933, 1, 0, 0, 0, 9954, 9934, 1, 0, 0, 0, 9954, 9935, 1, 0, 0, 0, 9954, 9936, 1, 0, 0, 0, 9954, 9937, 1, 0, 0, 0, 9954, 9938, 1, 0, 0, 0, 9954, 9939, 1, 0, 0, 0, 9954, 9940, 1, 0, 0, 0, 9954, 9941, 1, 0, 0, 0, 9954, 9942, 1, 0, 0, 0, 9954, 9943, 1, 0, 0, 0, 9954, 9944, 1, 0, 0, 0, 9954, 9945, 1, 0, 0, 0, 9954, 9946, 1, 0, 0, 0, 9954, 9947, 1, 0, 0, 0, 9954, 9948, 1, 0, 0, 0, 9954, 9949, 1, 0, 0, 0, 9954, 9950, 1, 0, 0, 0, 9954, 9951, 1, 0, 0, 0, 9954, 9952, 1, 0, 0, 0, 9954, 9953, 1, 0, 0, 0, 9955, 1391, 1, 0, 0, 0, 9956, 9957, 7, 58, 0, 0, 9957, 1393, 1, 0, 0, 0, 9958, 9959, 7, 59, 0, 0, 9959, 1395, 1, 0, 0, 0, 9960, 9961, 7, 60, 0, 0, 9961, 1397, 1, 0, 0, 0, 9962, 9963, 3, 1400, 700, 0, 9963, 9964, 3, 1410, 705, 0, 9964, 9965, 3, 1408, 704, 0, 9965, 1399, 1, 0, 0, 0, 9966, 9968, 3, 1402, 701, 0, 9967, 9966, 1, 0, 0, 0, 9968, 9971, 1, 0, 0, 0, 9969, 9967, 1, 0, 0, 0, 9969, 9970, 1, 0, 0, 0, 9970, 1401, 1, 0, 0, 0, 9971, 9969, 1, 0, 0, 0, 9972, 9973, 3, 1404, 702, 0, 9973, 9974, 5, 272, 0, 0, 9974, 9975, 5, 490, 0, 0, 9975, 9993, 1, 0, 0, 0, 9976, 9977, 3, 1404, 702, 0, 9977, 9978, 5, 491, 0, 0, 9978, 9979, 3, 1406, 703, 0, 9979, 9993, 1, 0, 0, 0, 9980, 9981, 3, 1404, 702, 0, 9981, 9982, 5, 492, 0, 0, 9982, 9983, 5, 493, 0, 0, 9983, 9993, 1, 0, 0, 0, 9984, 9985, 3, 1404, 702, 0, 9985, 9986, 5, 492, 0, 0, 9986, 9987, 5, 494, 0, 0, 9987, 9993, 1, 0, 0, 0, 9988, 9989, 3, 1404, 702, 0, 9989, 9990, 5, 492, 0, 0, 9990, 9991, 5, 495, 0, 0, 9991, 9993, 1, 0, 0, 0, 9992, 9972, 1, 0, 0, 0, 9992, 9976, 1, 0, 0, 0, 9992, 9980, 1, 0, 0, 0, 9992, 9984, 1, 0, 0, 0, 9992, 9988, 1, 0, 0, 0, 9993, 1403, 1, 0, 0, 0, 9994, 9995, 5, 29, 0, 0, 9995, 1405, 1, 0, 0, 0, 9996, 10001, 3, 1360, 680, 0, 9997, 10001, 3, 1394, 697, 0, 9998, 10001, 3, 1610, 805, 0, 9999, 10001, 3, 1388, 694, 0, 10000, 9996, 1, 0, 0, 0, 10000, 9997, 1, 0, 0, 0, 10000, 9998, 1, 0, 0, 0, 10000, 9999, 1, 0, 0, 0, 10001, 1407, 1, 0, 0, 0, 10002, 10005, 1, 0, 0, 0, 10003, 10005, 5, 7, 0, 0, 10004, 10002, 1, 0, 0, 0, 10004, 10003, 1, 0, 0, 0, 10005, 1409, 1, 0, 0, 0, 10006, 10007, 3, 1412, 706, 0, 10007, 10008, 5, 146, 0, 0, 10008, 10009, 3, 1454, 727, 0, 10009, 10010, 3, 1590, 795, 0, 10010, 10011, 5, 454, 0, 0, 10011, 10012, 3, 1604, 802, 0, 10012, 1411, 1, 0, 0, 0, 10013, 10018, 3, 1600, 800, 0, 10014, 10016, 3, 1414, 707, 0, 10015, 10017, 3, 1416, 708, 0, 10016, 10015, 1, 0, 0, 0, 10016, 10017, 1, 0, 0, 0, 10017, 10019, 1, 0, 0, 0, 10018, 10014, 1, 0, 0, 0, 10018, 10019, 1, 0, 0, 0, 10019, 1413, 1, 0, 0, 0, 10020, 10021, 5, 178, 0, 0, 10021, 1415, 1, 0, 0, 0, 10022, 10024, 3, 1420, 710, 0, 10023, 10022, 1, 0, 0, 0, 10024, 10025, 1, 0, 0, 0, 10025, 10023, 1, 0, 0, 0, 10025, 10026, 1, 0, 0, 0, 10026, 1417, 1, 0, 0, 0, 10027, 10028, 5, 18, 0, 0, 10028, 10029, 3, 1608, 804, 0, 10029, 10030, 5, 19, 0, 0, 10030, 1419, 1, 0, 0, 0, 10031, 10035, 3, 1422, 711, 0, 10032, 10035, 5, 178, 0, 0, 10033, 10035, 3, 1418, 709, 0, 10034, 10031, 1, 0, 0, 0, 10034, 10032, 1, 0, 0, 0, 10034, 10033, 1, 0, 0, 0, 10035, 1421, 1, 0, 0, 0, 10036, 10052, 3, 1438, 719, 0, 10037, 10038, 5, 496, 0, 0, 10038, 10039, 5, 62, 0, 0, 10039, 10053, 3, 1436, 718, 0, 10040, 10041, 3, 1440, 720, 0, 10041, 10042, 3, 1442, 721, 0, 10042, 10043, 3, 1444, 722, 0, 10043, 10044, 3, 1446, 723, 0, 10044, 10045, 3, 1448, 724, 0, 10045, 10053, 1, 0, 0, 0, 10046, 10047, 3, 1424, 712, 0, 10047, 10048, 5, 172, 0, 0, 10048, 10049, 3, 1428, 714, 0, 10049, 10050, 3, 1434, 717, 0, 10050, 10051, 3, 1426, 713, 0, 10051, 10053, 1, 0, 0, 0, 10052, 10037, 1, 0, 0, 0, 10052, 10040, 1, 0, 0, 0, 10052, 10046, 1, 0, 0, 0, 10053, 10054, 1, 0, 0, 0, 10054, 10055, 5, 7, 0, 0, 10055, 1423, 1, 0, 0, 0, 10056, 10061, 1, 0, 0, 0, 10057, 10058, 5, 262, 0, 0, 10058, 10061, 5, 317, 0, 0, 10059, 10061, 5, 317, 0, 0, 10060, 10056, 1, 0, 0, 0, 10060, 10057, 1, 0, 0, 0, 10060, 10059, 1, 0, 0, 0, 10061, 1425, 1, 0, 0, 0, 10062, 10063, 3, 960, 480, 0, 10063, 1427, 1, 0, 0, 0, 10064, 10070, 1, 0, 0, 0, 10065, 10066, 5, 2, 0, 0, 10066, 10067, 3, 1430, 715, 0, 10067, 10068, 5, 3, 0, 0, 10068, 10070, 1, 0, 0, 0, 10069, 10064, 1, 0, 0, 0, 10069, 10065, 1, 0, 0, 0, 10070, 1429, 1, 0, 0, 0, 10071, 10076, 3, 1432, 716, 0, 10072, 10073, 5, 6, 0, 0, 10073, 10075, 3, 1432, 716, 0, 10074, 10072, 1, 0, 0, 0, 10075, 10078, 1, 0, 0, 0, 10076, 10074, 1, 0, 0, 0, 10076, 10077, 1, 0, 0, 0, 10077, 1431, 1, 0, 0, 0, 10078, 10076, 1, 0, 0, 0, 10079, 10080, 3, 1438, 719, 0, 10080, 10081, 3, 1442, 721, 0, 10081, 1433, 1, 0, 0, 0, 10082, 10083, 7, 61, 0, 0, 10083, 1435, 1, 0, 0, 0, 10084, 10087, 5, 28, 0, 0, 10085, 10087, 3, 1374, 687, 0, 10086, 10084, 1, 0, 0, 0, 10086, 10085, 1, 0, 0, 0, 10087, 1437, 1, 0, 0, 0, 10088, 10089, 3, 1608, 804, 0, 10089, 1439, 1, 0, 0, 0, 10090, 10093, 1, 0, 0, 0, 10091, 10093, 5, 497, 0, 0, 10092, 10090, 1, 0, 0, 0, 10092, 10091, 1, 0, 0, 0, 10093, 1441, 1, 0, 0, 0, 10094, 10095, 3, 1120, 560, 0, 10095, 1443, 1, 0, 0, 0, 10096, 10100, 1, 0, 0, 0, 10097, 10098, 5, 43, 0, 0, 10098, 10100, 3, 524, 262, 0, 10099, 10096, 1, 0, 0, 0, 10099, 10097, 1, 0, 0, 0, 10100, 1445, 1, 0, 0, 0, 10101, 10105, 1, 0, 0, 0, 10102, 10103, 5, 77, 0, 0, 10103, 10105, 5, 78, 0, 0, 10104, 10101, 1, 0, 0, 0, 10104, 10102, 1, 0, 0, 0, 10105, 1447, 1, 0, 0, 0, 10106, 10111, 1, 0, 0, 0, 10107, 10108, 3, 1450, 725, 0, 10108, 10109, 3, 1612, 806, 0, 10109, 10111, 1, 0, 0, 0, 10110, 10106, 1, 0, 0, 0, 10110, 10107, 1, 0, 0, 0, 10111, 1449, 1, 0, 0, 0, 10112, 10115, 3, 1452, 726, 0, 10113, 10115, 5, 53, 0, 0, 10114, 10112, 1, 0, 0, 0, 10114, 10113, 1, 0, 0, 0, 10115, 1451, 1, 0, 0, 0, 10116, 10117, 7, 62, 0, 0, 10117, 1453, 1, 0, 0, 0, 10118, 10120, 3, 1456, 728, 0, 10119, 10118, 1, 0, 0, 0, 10120, 10123, 1, 0, 0, 0, 10121, 10119, 1, 0, 0, 0, 10121, 10122, 1, 0, 0, 0, 10122, 1455, 1, 0, 0, 0, 10123, 10121, 1, 0, 0, 0, 10124, 10125, 3, 1410, 705, 0, 10125, 10126, 5, 7, 0, 0, 10126, 10152, 1, 0, 0, 0, 10127, 10152, 3, 1522, 761, 0, 10128, 10152, 3, 1526, 763, 0, 10129, 10152, 3, 1464, 732, 0, 10130, 10152, 3, 1480, 740, 0, 10131, 10152, 3, 1486, 743, 0, 10132, 10152, 3, 1496, 748, 0, 10133, 10152, 3, 1498, 749, 0, 10134, 10152, 3, 1500, 750, 0, 10135, 10152, 3, 1514, 757, 0, 10136, 10152, 3, 1518, 759, 0, 10137, 10152, 3, 1538, 769, 0, 10138, 10152, 3, 1544, 772, 0, 10139, 10152, 3, 1546, 773, 0, 10140, 10152, 3, 1458, 729, 0, 10141, 10152, 3, 1460, 730, 0, 10142, 10152, 3, 1466, 733, 0, 10143, 10152, 3, 1554, 777, 0, 10144, 10152, 3, 1566, 783, 0, 10145, 10152, 3, 1574, 787, 0, 10146, 10152, 3, 1576, 788, 0, 10147, 10152, 3, 1578, 789, 0, 10148, 10152, 3, 1580, 790, 0, 10149, 10152, 3, 1582, 791, 0, 10150, 10152, 3, 1586, 793, 0, 10151, 10124, 1, 0, 0, 0, 10151, 10127, 1, 0, 0, 0, 10151, 10128, 1, 0, 0, 0, 10151, 10129, 1, 0, 0, 0, 10151, 10130, 1, 0, 0, 0, 10151, 10131, 1, 0, 0, 0, 10151, 10132, 1, 0, 0, 0, 10151, 10133, 1, 0, 0, 0, 10151, 10134, 1, 0, 0, 0, 10151, 10135, 1, 0, 0, 0, 10151, 10136, 1, 0, 0, 0, 10151, 10137, 1, 0, 0, 0, 10151, 10138, 1, 0, 0, 0, 10151, 10139, 1, 0, 0, 0, 10151, 10140, 1, 0, 0, 0, 10151, 10141, 1, 0, 0, 0, 10151, 10142, 1, 0, 0, 0, 10151, 10143, 1, 0, 0, 0, 10151, 10144, 1, 0, 0, 0, 10151, 10145, 1, 0, 0, 0, 10151, 10146, 1, 0, 0, 0, 10151, 10147, 1, 0, 0, 0, 10151, 10148, 1, 0, 0, 0, 10151, 10149, 1, 0, 0, 0, 10151, 10150, 1, 0, 0, 0, 10152, 1457, 1, 0, 0, 0, 10153, 10154, 5, 498, 0, 0, 10154, 10155, 3, 1616, 808, 0, 10155, 10156, 5, 7, 0, 0, 10156, 1459, 1, 0, 0, 0, 10157, 10158, 5, 433, 0, 0, 10158, 10159, 3, 1608, 804, 0, 10159, 10160, 5, 2, 0, 0, 10160, 10161, 3, 1462, 731, 0, 10161, 10162, 5, 3, 0, 0, 10162, 10163, 5, 7, 0, 0, 10163, 10172, 1, 0, 0, 0, 10164, 10165, 5, 57, 0, 0, 10165, 10166, 3, 1608, 804, 0, 10166, 10167, 5, 2, 0, 0, 10167, 10168, 3, 1462, 731, 0, 10168, 10169, 5, 3, 0, 0, 10169, 10170, 5, 7, 0, 0, 10170, 10172, 1, 0, 0, 0, 10171, 10157, 1, 0, 0, 0, 10171, 10164, 1, 0, 0, 0, 10172, 1461, 1, 0, 0, 0, 10173, 10176, 1, 0, 0, 0, 10174, 10176, 3, 1282, 641, 0, 10175, 10173, 1, 0, 0, 0, 10175, 10174, 1, 0, 0, 0, 10176, 1463, 1, 0, 0, 0, 10177, 10178, 3, 1478, 739, 0, 10178, 10179, 3, 1452, 726, 0, 10179, 10180, 3, 1612, 806, 0, 10180, 10181, 5, 7, 0, 0, 10181, 1465, 1, 0, 0, 0, 10182, 10183, 5, 499, 0, 0, 10183, 10184, 3, 1468, 734, 0, 10184, 10185, 5, 500, 0, 0, 10185, 10186, 3, 1470, 735, 0, 10186, 10187, 5, 7, 0, 0, 10187, 1467, 1, 0, 0, 0, 10188, 10192, 1, 0, 0, 0, 10189, 10192, 5, 434, 0, 0, 10190, 10192, 5, 501, 0, 0, 10191, 10188, 1, 0, 0, 0, 10191, 10189, 1, 0, 0, 0, 10191, 10190, 1, 0, 0, 0, 10192, 1469, 1, 0, 0, 0, 10193, 10198, 3, 1472, 736, 0, 10194, 10195, 5, 6, 0, 0, 10195, 10197, 3, 1472, 736, 0, 10196, 10194, 1, 0, 0, 0, 10197, 10200, 1, 0, 0, 0, 10198, 10196, 1, 0, 0, 0, 10198, 10199, 1, 0, 0, 0, 10199, 1471, 1, 0, 0, 0, 10200, 10198, 1, 0, 0, 0, 10201, 10202, 3, 1476, 738, 0, 10202, 10203, 3, 1452, 726, 0, 10203, 10204, 3, 1474, 737, 0, 10204, 1473, 1, 0, 0, 0, 10205, 10206, 3, 1374, 687, 0, 10206, 1475, 1, 0, 0, 0, 10207, 10208, 3, 1478, 739, 0, 10208, 1477, 1, 0, 0, 0, 10209, 10212, 3, 524, 262, 0, 10210, 10212, 5, 28, 0, 0, 10211, 10209, 1, 0, 0, 0, 10211, 10210, 1, 0, 0, 0, 10212, 10219, 1, 0, 0, 0, 10213, 10214, 5, 4, 0, 0, 10214, 10215, 3, 1618, 809, 0, 10215, 10216, 5, 5, 0, 0, 10216, 10218, 1, 0, 0, 0, 10217, 10213, 1, 0, 0, 0, 10218, 10221, 1, 0, 0, 0, 10219, 10217, 1, 0, 0, 0, 10219, 10220, 1, 0, 0, 0, 10220, 1479, 1, 0, 0, 0, 10221, 10219, 1, 0, 0, 0, 10222, 10223, 5, 220, 0, 0, 10223, 10224, 3, 1614, 807, 0, 10224, 10225, 5, 93, 0, 0, 10225, 10226, 3, 1454, 727, 0, 10226, 10227, 3, 1482, 741, 0, 10227, 10228, 3, 1484, 742, 0, 10228, 10229, 5, 454, 0, 0, 10229, 10230, 5, 220, 0, 0, 10230, 10231, 5, 7, 0, 0, 10231, 1481, 1, 0, 0, 0, 10232, 10233, 5, 502, 0, 0, 10233, 10234, 3, 1164, 582, 0, 10234, 10235, 5, 93, 0, 0, 10235, 10236, 3, 1454, 727, 0, 10236, 10238, 1, 0, 0, 0, 10237, 10232, 1, 0, 0, 0, 10238, 10241, 1, 0, 0, 0, 10239, 10237, 1, 0, 0, 0, 10239, 10240, 1, 0, 0, 0, 10240, 1483, 1, 0, 0, 0, 10241, 10239, 1, 0, 0, 0, 10242, 10246, 1, 0, 0, 0, 10243, 10244, 5, 58, 0, 0, 10244, 10246, 3, 1454, 727, 0, 10245, 10242, 1, 0, 0, 0, 10245, 10243, 1, 0, 0, 0, 10246, 1485, 1, 0, 0, 0, 10247, 10248, 5, 40, 0, 0, 10248, 10249, 3, 1488, 744, 0, 10249, 10250, 3, 1490, 745, 0, 10250, 10251, 3, 1494, 747, 0, 10251, 10252, 5, 454, 0, 0, 10252, 10253, 5, 40, 0, 0, 10253, 10254, 5, 7, 0, 0, 10254, 1487, 1, 0, 0, 0, 10255, 10258, 1, 0, 0, 0, 10256, 10258, 3, 1612, 806, 0, 10257, 10255, 1, 0, 0, 0, 10257, 10256, 1, 0, 0, 0, 10258, 1489, 1, 0, 0, 0, 10259, 10261, 3, 1492, 746, 0, 10260, 10259, 1, 0, 0, 0, 10261, 10262, 1, 0, 0, 0, 10262, 10260, 1, 0, 0, 0, 10262, 10263, 1, 0, 0, 0, 10263, 1491, 1, 0, 0, 0, 10264, 10265, 5, 102, 0, 0, 10265, 10266, 3, 1282, 641, 0, 10266, 10267, 5, 93, 0, 0, 10267, 10268, 3, 1454, 727, 0, 10268, 1493, 1, 0, 0, 0, 10269, 10273, 1, 0, 0, 0, 10270, 10271, 5, 58, 0, 0, 10271, 10273, 3, 1454, 727, 0, 10272, 10269, 1, 0, 0, 0, 10272, 10270, 1, 0, 0, 0, 10273, 1495, 1, 0, 0, 0, 10274, 10275, 3, 1602, 801, 0, 10275, 10276, 3, 1542, 771, 0, 10276, 1497, 1, 0, 0, 0, 10277, 10278, 3, 1602, 801, 0, 10278, 10279, 5, 503, 0, 0, 10279, 10280, 3, 1620, 810, 0, 10280, 10281, 3, 1542, 771, 0, 10281, 1499, 1, 0, 0, 0, 10282, 10283, 3, 1602, 801, 0, 10283, 10284, 5, 62, 0, 0, 10284, 10285, 3, 1502, 751, 0, 10285, 10286, 3, 1542, 771, 0, 10286, 1501, 1, 0, 0, 0, 10287, 10288, 3, 1512, 756, 0, 10288, 10304, 5, 68, 0, 0, 10289, 10290, 3, 954, 477, 0, 10290, 10291, 3, 1506, 753, 0, 10291, 10305, 1, 0, 0, 0, 10292, 10305, 3, 960, 480, 0, 10293, 10305, 3, 878, 439, 0, 10294, 10295, 5, 202, 0, 0, 10295, 10296, 3, 1164, 582, 0, 10296, 10297, 3, 1504, 752, 0, 10297, 10305, 1, 0, 0, 0, 10298, 10299, 3, 1508, 754, 0, 10299, 10300, 3, 1164, 582, 0, 10300, 10301, 5, 24, 0, 0, 10301, 10302, 3, 1164, 582, 0, 10302, 10303, 3, 1510, 755, 0, 10303, 10305, 1, 0, 0, 0, 10304, 10289, 1, 0, 0, 0, 10304, 10292, 1, 0, 0, 0, 10304, 10293, 1, 0, 0, 0, 10304, 10294, 1, 0, 0, 0, 10304, 10298, 1, 0, 0, 0, 10305, 1503, 1, 0, 0, 0, 10306, 10310, 1, 0, 0, 0, 10307, 10308, 5, 100, 0, 0, 10308, 10310, 3, 1282, 641, 0, 10309, 10306, 1, 0, 0, 0, 10309, 10307, 1, 0, 0, 0, 10310, 1505, 1, 0, 0, 0, 10311, 10324, 1, 0, 0, 0, 10312, 10313, 5, 2, 0, 0, 10313, 10318, 3, 1164, 582, 0, 10314, 10315, 5, 6, 0, 0, 10315, 10317, 3, 1164, 582, 0, 10316, 10314, 1, 0, 0, 0, 10317, 10320, 1, 0, 0, 0, 10318, 10316, 1, 0, 0, 0, 10318, 10319, 1, 0, 0, 0, 10319, 10321, 1, 0, 0, 0, 10320, 10318, 1, 0, 0, 0, 10321, 10322, 5, 3, 0, 0, 10322, 10324, 1, 0, 0, 0, 10323, 10311, 1, 0, 0, 0, 10323, 10312, 1, 0, 0, 0, 10324, 1507, 1, 0, 0, 0, 10325, 10328, 1, 0, 0, 0, 10326, 10328, 5, 504, 0, 0, 10327, 10325, 1, 0, 0, 0, 10327, 10326, 1, 0, 0, 0, 10328, 1509, 1, 0, 0, 0, 10329, 10333, 1, 0, 0, 0, 10330, 10331, 5, 147, 0, 0, 10331, 10333, 3, 1164, 582, 0, 10332, 10329, 1, 0, 0, 0, 10332, 10330, 1, 0, 0, 0, 10333, 1511, 1, 0, 0, 0, 10334, 10335, 3, 522, 261, 0, 10335, 1513, 1, 0, 0, 0, 10336, 10337, 3, 1602, 801, 0, 10337, 10338, 5, 505, 0, 0, 10338, 10339, 3, 1512, 756, 0, 10339, 10340, 3, 1516, 758, 0, 10340, 10341, 5, 68, 0, 0, 10341, 10342, 5, 35, 0, 0, 10342, 10343, 3, 1164, 582, 0, 10343, 10344, 3, 1542, 771, 0, 10344, 1515, 1, 0, 0, 0, 10345, 10349, 1, 0, 0, 0, 10346, 10347, 5, 506, 0, 0, 10347, 10349, 3, 1358, 679, 0, 10348, 10345, 1, 0, 0, 0, 10348, 10346, 1, 0, 0, 0, 10349, 1517, 1, 0, 0, 0, 10350, 10351, 3, 1520, 760, 0, 10351, 10352, 3, 1604, 802, 0, 10352, 10353, 3, 1606, 803, 0, 10353, 10354, 5, 7, 0, 0, 10354, 1519, 1, 0, 0, 0, 10355, 10356, 7, 63, 0, 0, 10356, 1521, 1, 0, 0, 0, 10357, 10369, 5, 508, 0, 0, 10358, 10359, 5, 261, 0, 0, 10359, 10370, 3, 1612, 806, 0, 10360, 10366, 5, 509, 0, 0, 10361, 10362, 5, 202, 0, 0, 10362, 10363, 3, 1164, 582, 0, 10363, 10364, 3, 1504, 752, 0, 10364, 10367, 1, 0, 0, 0, 10365, 10367, 3, 960, 480, 0, 10366, 10361, 1, 0, 0, 0, 10366, 10365, 1, 0, 0, 0, 10367, 10370, 1, 0, 0, 0, 10368, 10370, 3, 1524, 762, 0, 10369, 10358, 1, 0, 0, 0, 10369, 10360, 1, 0, 0, 0, 10369, 10368, 1, 0, 0, 0, 10370, 10371, 1, 0, 0, 0, 10371, 10372, 5, 7, 0, 0, 10372, 1523, 1, 0, 0, 0, 10373, 10376, 1, 0, 0, 0, 10374, 10376, 3, 1612, 806, 0, 10375, 10373, 1, 0, 0, 0, 10375, 10374, 1, 0, 0, 0, 10376, 1525, 1, 0, 0, 0, 10377, 10378, 5, 510, 0, 0, 10378, 10379, 3, 1528, 764, 0, 10379, 10380, 3, 1360, 680, 0, 10380, 10381, 3, 1530, 765, 0, 10381, 10382, 3, 1532, 766, 0, 10382, 10383, 5, 7, 0, 0, 10383, 10404, 1, 0, 0, 0, 10384, 10385, 5, 510, 0, 0, 10385, 10386, 3, 1528, 764, 0, 10386, 10387, 3, 1384, 692, 0, 10387, 10388, 3, 1532, 766, 0, 10388, 10389, 5, 7, 0, 0, 10389, 10404, 1, 0, 0, 0, 10390, 10391, 5, 510, 0, 0, 10391, 10392, 3, 1528, 764, 0, 10392, 10393, 5, 511, 0, 0, 10393, 10394, 3, 1360, 680, 0, 10394, 10395, 3, 1532, 766, 0, 10395, 10396, 5, 7, 0, 0, 10396, 10404, 1, 0, 0, 0, 10397, 10398, 5, 510, 0, 0, 10398, 10399, 3, 1528, 764, 0, 10399, 10400, 3, 1532, 766, 0, 10400, 10401, 5, 7, 0, 0, 10401, 10404, 1, 0, 0, 0, 10402, 10404, 5, 510, 0, 0, 10403, 10377, 1, 0, 0, 0, 10403, 10384, 1, 0, 0, 0, 10403, 10390, 1, 0, 0, 0, 10403, 10397, 1, 0, 0, 0, 10403, 10402, 1, 0, 0, 0, 10404, 1527, 1, 0, 0, 0, 10405, 10414, 1, 0, 0, 0, 10406, 10414, 1, 0, 0, 0, 10407, 10414, 5, 512, 0, 0, 10408, 10414, 5, 513, 0, 0, 10409, 10414, 5, 514, 0, 0, 10410, 10414, 5, 515, 0, 0, 10411, 10414, 5, 516, 0, 0, 10412, 10414, 5, 517, 0, 0, 10413, 10405, 1, 0, 0, 0, 10413, 10406, 1, 0, 0, 0, 10413, 10407, 1, 0, 0, 0, 10413, 10408, 1, 0, 0, 0, 10413, 10409, 1, 0, 0, 0, 10413, 10410, 1, 0, 0, 0, 10413, 10411, 1, 0, 0, 0, 10413, 10412, 1, 0, 0, 0, 10414, 1529, 1, 0, 0, 0, 10415, 10423, 1, 0, 0, 0, 10416, 10417, 5, 6, 0, 0, 10417, 10419, 3, 1164, 582, 0, 10418, 10416, 1, 0, 0, 0, 10419, 10420, 1, 0, 0, 0, 10420, 10418, 1, 0, 0, 0, 10420, 10421, 1, 0, 0, 0, 10421, 10423, 1, 0, 0, 0, 10422, 10415, 1, 0, 0, 0, 10422, 10418, 1, 0, 0, 0, 10423, 1531, 1, 0, 0, 0, 10424, 10428, 1, 0, 0, 0, 10425, 10426, 5, 100, 0, 0, 10426, 10428, 3, 1536, 768, 0, 10427, 10424, 1, 0, 0, 0, 10427, 10425, 1, 0, 0, 0, 10428, 1533, 1, 0, 0, 0, 10429, 10430, 3, 1384, 692, 0, 10430, 10431, 5, 10, 0, 0, 10431, 10432, 3, 1164, 582, 0, 10432, 1535, 1, 0, 0, 0, 10433, 10438, 3, 1534, 767, 0, 10434, 10435, 5, 6, 0, 0, 10435, 10437, 3, 1534, 767, 0, 10436, 10434, 1, 0, 0, 0, 10437, 10440, 1, 0, 0, 0, 10438, 10436, 1, 0, 0, 0, 10438, 10439, 1, 0, 0, 0, 10439, 1537, 1, 0, 0, 0, 10440, 10438, 1, 0, 0, 0, 10441, 10442, 5, 518, 0, 0, 10442, 10443, 3, 1612, 806, 0, 10443, 10444, 3, 1540, 770, 0, 10444, 10445, 5, 7, 0, 0, 10445, 1539, 1, 0, 0, 0, 10446, 10450, 1, 0, 0, 0, 10447, 10448, 5, 6, 0, 0, 10448, 10450, 3, 1612, 806, 0, 10449, 10446, 1, 0, 0, 0, 10449, 10447, 1, 0, 0, 0, 10450, 1541, 1, 0, 0, 0, 10451, 10452, 5, 519, 0, 0, 10452, 10453, 3, 1454, 727, 0, 10453, 10454, 5, 454, 0, 0, 10454, 10455, 5, 519, 0, 0, 10455, 10456, 3, 1604, 802, 0, 10456, 10457, 5, 7, 0, 0, 10457, 1543, 1, 0, 0, 0, 10458, 10459, 3, 1622, 811, 0, 10459, 10460, 5, 7, 0, 0, 10460, 1545, 1, 0, 0, 0, 10461, 10462, 5, 202, 0, 0, 10462, 10470, 3, 1164, 582, 0, 10463, 10464, 3, 1552, 776, 0, 10464, 10465, 3, 1548, 774, 0, 10465, 10471, 1, 0, 0, 0, 10466, 10467, 3, 1548, 774, 0, 10467, 10468, 3, 1552, 776, 0, 10468, 10471, 1, 0, 0, 0, 10469, 10471, 1, 0, 0, 0, 10470, 10463, 1, 0, 0, 0, 10470, 10466, 1, 0, 0, 0, 10470, 10469, 1, 0, 0, 0, 10471, 10472, 1, 0, 0, 0, 10472, 10473, 5, 7, 0, 0, 10473, 1547, 1, 0, 0, 0, 10474, 10478, 1, 0, 0, 0, 10475, 10476, 5, 100, 0, 0, 10476, 10478, 3, 1550, 775, 0, 10477, 10474, 1, 0, 0, 0, 10477, 10475, 1, 0, 0, 0, 10478, 1549, 1, 0, 0, 0, 10479, 10484, 3, 1164, 582, 0, 10480, 10481, 5, 6, 0, 0, 10481, 10483, 3, 1164, 582, 0, 10482, 10480, 1, 0, 0, 0, 10483, 10486, 1, 0, 0, 0, 10484, 10482, 1, 0, 0, 0, 10484, 10485, 1, 0, 0, 0, 10485, 1551, 1, 0, 0, 0, 10486, 10484, 1, 0, 0, 0, 10487, 10494, 1, 0, 0, 0, 10488, 10490, 5, 71, 0, 0, 10489, 10491, 5, 339, 0, 0, 10490, 10489, 1, 0, 0, 0, 10490, 10491, 1, 0, 0, 0, 10491, 10492, 1, 0, 0, 0, 10492, 10494, 3, 1568, 784, 0, 10493, 10487, 1, 0, 0, 0, 10493, 10488, 1, 0, 0, 0, 10494, 1553, 1, 0, 0, 0, 10495, 10513, 5, 520, 0, 0, 10496, 10497, 3, 1588, 794, 0, 10497, 10498, 3, 1562, 781, 0, 10498, 10504, 5, 62, 0, 0, 10499, 10505, 3, 960, 480, 0, 10500, 10501, 5, 202, 0, 0, 10501, 10502, 3, 1612, 806, 0, 10502, 10503, 3, 1560, 780, 0, 10503, 10505, 1, 0, 0, 0, 10504, 10499, 1, 0, 0, 0, 10504, 10500, 1, 0, 0, 0, 10505, 10514, 1, 0, 0, 0, 10506, 10511, 3, 1374, 687, 0, 10507, 10508, 5, 2, 0, 0, 10508, 10509, 3, 1558, 779, 0, 10509, 10510, 5, 3, 0, 0, 10510, 10512, 1, 0, 0, 0, 10511, 10507, 1, 0, 0, 0, 10511, 10512, 1, 0, 0, 0, 10512, 10514, 1, 0, 0, 0, 10513, 10496, 1, 0, 0, 0, 10513, 10506, 1, 0, 0, 0, 10514, 10515, 1, 0, 0, 0, 10515, 10516, 5, 7, 0, 0, 10516, 1555, 1, 0, 0, 0, 10517, 10518, 3, 1374, 687, 0, 10518, 10519, 5, 20, 0, 0, 10519, 10520, 3, 1164, 582, 0, 10520, 10523, 1, 0, 0, 0, 10521, 10523, 3, 1164, 582, 0, 10522, 10517, 1, 0, 0, 0, 10522, 10521, 1, 0, 0, 0, 10523, 1557, 1, 0, 0, 0, 10524, 10529, 3, 1556, 778, 0, 10525, 10526, 5, 6, 0, 0, 10526, 10528, 3, 1556, 778, 0, 10527, 10525, 1, 0, 0, 0, 10528, 10531, 1, 0, 0, 0, 10529, 10527, 1, 0, 0, 0, 10529, 10530, 1, 0, 0, 0, 10530, 1559, 1, 0, 0, 0, 10531, 10529, 1, 0, 0, 0, 10532, 10536, 1, 0, 0, 0, 10533, 10534, 5, 100, 0, 0, 10534, 10536, 3, 1282, 641, 0, 10535, 10532, 1, 0, 0, 0, 10535, 10533, 1, 0, 0, 0, 10536, 1561, 1, 0, 0, 0, 10537, 10542, 1, 0, 0, 0, 10538, 10539, 3, 1564, 782, 0, 10539, 10540, 5, 317, 0, 0, 10540, 10542, 1, 0, 0, 0, 10541, 10537, 1, 0, 0, 0, 10541, 10538, 1, 0, 0, 0, 10542, 1563, 1, 0, 0, 0, 10543, 10546, 1, 0, 0, 0, 10544, 10546, 5, 262, 0, 0, 10545, 10543, 1, 0, 0, 0, 10545, 10544, 1, 0, 0, 0, 10546, 1565, 1, 0, 0, 0, 10547, 10548, 5, 61, 0, 0, 10548, 10549, 3, 1572, 786, 0, 10549, 10550, 3, 1570, 785, 0, 10550, 10551, 3, 1588, 794, 0, 10551, 10552, 5, 71, 0, 0, 10552, 10553, 3, 1568, 784, 0, 10553, 10554, 5, 7, 0, 0, 10554, 1567, 1, 0, 0, 0, 10555, 10556, 3, 1282, 641, 0, 10556, 1569, 1, 0, 0, 0, 10557, 10561, 1, 0, 0, 0, 10558, 10561, 5, 64, 0, 0, 10559, 10561, 5, 68, 0, 0, 10560, 10557, 1, 0, 0, 0, 10560, 10558, 1, 0, 0, 0, 10560, 10559, 1, 0, 0, 0, 10561, 1571, 1, 0, 0, 0, 10562, 10580, 1, 0, 0, 0, 10563, 10580, 1, 0, 0, 0, 10564, 10580, 5, 261, 0, 0, 10565, 10580, 5, 286, 0, 0, 10566, 10580, 5, 207, 0, 0, 10567, 10580, 5, 240, 0, 0, 10568, 10569, 5, 130, 0, 0, 10569, 10580, 3, 1164, 582, 0, 10570, 10571, 5, 300, 0, 0, 10571, 10580, 3, 1164, 582, 0, 10572, 10580, 3, 1164, 582, 0, 10573, 10580, 5, 30, 0, 0, 10574, 10577, 7, 64, 0, 0, 10575, 10578, 3, 1164, 582, 0, 10576, 10578, 5, 30, 0, 0, 10577, 10575, 1, 0, 0, 0, 10577, 10576, 1, 0, 0, 0, 10577, 10578, 1, 0, 0, 0, 10578, 10580, 1, 0, 0, 0, 10579, 10562, 1, 0, 0, 0, 10579, 10563, 1, 0, 0, 0, 10579, 10564, 1, 0, 0, 0, 10579, 10565, 1, 0, 0, 0, 10579, 10566, 1, 0, 0, 0, 10579, 10567, 1, 0, 0, 0, 10579, 10568, 1, 0, 0, 0, 10579, 10570, 1, 0, 0, 0, 10579, 10572, 1, 0, 0, 0, 10579, 10573, 1, 0, 0, 0, 10579, 10574, 1, 0, 0, 0, 10580, 1573, 1, 0, 0, 0, 10581, 10582, 5, 258, 0, 0, 10582, 10583, 3, 1572, 786, 0, 10583, 10584, 3, 1588, 794, 0, 10584, 10585, 5, 7, 0, 0, 10585, 1575, 1, 0, 0, 0, 10586, 10587, 5, 157, 0, 0, 10587, 10588, 3, 1588, 794, 0, 10588, 10589, 5, 7, 0, 0, 10589, 1577, 1, 0, 0, 0, 10590, 10591, 5, 78, 0, 0, 10591, 10592, 5, 7, 0, 0, 10592, 1579, 1, 0, 0, 0, 10593, 10594, 5, 161, 0, 0, 10594, 10595, 3, 1584, 792, 0, 10595, 10596, 5, 7, 0, 0, 10596, 1581, 1, 0, 0, 0, 10597, 10598, 5, 312, 0, 0, 10598, 10599, 3, 1584, 792, 0, 10599, 10600, 5, 7, 0, 0, 10600, 1583, 1, 0, 0, 0, 10601, 10603, 5, 33, 0, 0, 10602, 10604, 5, 262, 0, 0, 10603, 10602, 1, 0, 0, 0, 10603, 10604, 1, 0, 0, 0, 10604, 10605, 1, 0, 0, 0, 10605, 10608, 5, 153, 0, 0, 10606, 10608, 1, 0, 0, 0, 10607, 10601, 1, 0, 0, 0, 10607, 10606, 1, 0, 0, 0, 10608, 1585, 1, 0, 0, 0, 10609, 10610, 5, 326, 0, 0, 10610, 10611, 3, 524, 262, 0, 10611, 10612, 5, 94, 0, 0, 10612, 10613, 5, 53, 0, 0, 10613, 10614, 5, 7, 0, 0, 10614, 10622, 1, 0, 0, 0, 10615, 10618, 5, 306, 0, 0, 10616, 10619, 3, 524, 262, 0, 10617, 10619, 5, 30, 0, 0, 10618, 10616, 1, 0, 0, 0, 10618, 10617, 1, 0, 0, 0, 10619, 10620, 1, 0, 0, 0, 10620, 10622, 5, 7, 0, 0, 10621, 10609, 1, 0, 0, 0, 10621, 10615, 1, 0, 0, 0, 10622, 1587, 1, 0, 0, 0, 10623, 10626, 3, 1374, 687, 0, 10624, 10626, 5, 28, 0, 0, 10625, 10623, 1, 0, 0, 0, 10625, 10624, 1, 0, 0, 0, 10626, 1589, 1, 0, 0, 0, 10627, 10631, 1, 0, 0, 0, 10628, 10629, 5, 517, 0, 0, 10629, 10631, 3, 1592, 796, 0, 10630, 10627, 1, 0, 0, 0, 10630, 10628, 1, 0, 0, 0, 10631, 1591, 1, 0, 0, 0, 10632, 10634, 3, 1594, 797, 0, 10633, 10632, 1, 0, 0, 0, 10634, 10635, 1, 0, 0, 0, 10635, 10633, 1, 0, 0, 0, 10635, 10636, 1, 0, 0, 0, 10636, 1593, 1, 0, 0, 0, 10637, 10638, 5, 102, 0, 0, 10638, 10639, 3, 1596, 798, 0, 10639, 10640, 5, 93, 0, 0, 10640, 10641, 3, 1454, 727, 0, 10641, 1595, 1, 0, 0, 0, 10642, 10647, 3, 1598, 799, 0, 10643, 10644, 5, 82, 0, 0, 10644, 10646, 3, 1598, 799, 0, 10645, 10643, 1, 0, 0, 0, 10646, 10649, 1, 0, 0, 0, 10647, 10645, 1, 0, 0, 0, 10647, 10648, 1, 0, 0, 0, 10648, 1597, 1, 0, 0, 0, 10649, 10647, 1, 0, 0, 0, 10650, 10654, 3, 1608, 804, 0, 10651, 10652, 5, 511, 0, 0, 10652, 10654, 3, 1360, 680, 0, 10653, 10650, 1, 0, 0, 0, 10653, 10651, 1, 0, 0, 0, 10654, 1599, 1, 0, 0, 0, 10655, 10658, 1, 0, 0, 0, 10656, 10658, 3, 1418, 709, 0, 10657, 10655, 1, 0, 0, 0, 10657, 10656, 1, 0, 0, 0, 10658, 1601, 1, 0, 0, 0, 10659, 10662, 1, 0, 0, 0, 10660, 10662, 3, 1418, 709, 0, 10661, 10659, 1, 0, 0, 0, 10661, 10660, 1, 0, 0, 0, 10662, 1603, 1, 0, 0, 0, 10663, 10666, 1, 0, 0, 0, 10664, 10666, 3, 1608, 804, 0, 10665, 10663, 1, 0, 0, 0, 10665, 10664, 1, 0, 0, 0, 10666, 1605, 1, 0, 0, 0, 10667, 10668, 5, 102, 0, 0, 10668, 10671, 3, 1616, 808, 0, 10669, 10671, 1, 0, 0, 0, 10670, 10667, 1, 0, 0, 0, 10670, 10669, 1, 0, 0, 0, 10671, 1607, 1, 0, 0, 0, 10672, 10675, 3, 1374, 687, 0, 10673, 10675, 3, 1610, 805, 0, 10674, 10672, 1, 0, 0, 0, 10674, 10673, 1, 0, 0, 0, 10675, 1609, 1, 0, 0, 0, 10676, 10677, 7, 65, 0, 0, 10677, 1611, 1, 0, 0, 0, 10678, 10679, 3, 1330, 665, 0, 10679, 10680, 3, 984, 492, 0, 10680, 10681, 3, 1056, 528, 0, 10681, 10682, 3, 1096, 548, 0, 10682, 10683, 3, 1026, 513, 0, 10683, 10684, 3, 1040, 520, 0, 10684, 10685, 3, 1242, 621, 0, 10685, 1613, 1, 0, 0, 0, 10686, 10687, 3, 1612, 806, 0, 10687, 1615, 1, 0, 0, 0, 10688, 10689, 3, 1612, 806, 0, 10689, 1617, 1, 0, 0, 0, 10690, 10691, 3, 1164, 582, 0, 10691, 1619, 1, 0, 0, 0, 10692, 10693, 3, 1164, 582, 0, 10693, 1621, 1, 0, 0, 0, 10694, 10695, 3, 8, 4, 0, 10695, 10696, 3, 1624, 812, 0, 10696, 1623, 1, 0, 0, 0, 10697, 10698, 5, 71, 0, 0, 10698, 10699, 3, 986, 493, 0, 10699, 10700, 3, 1568, 784, 0, 10700, 10703, 1, 0, 0, 0, 10701, 10703, 1, 0, 0, 0, 10702, 10697, 1, 0, 0, 0, 10702, 10701, 1, 0, 0, 0, 10703, 1625, 1, 0, 0, 0, 747, 1635, 1639, 1767, 1771, 1784, 1789, 1795, 1801, 1816, 1828, 1846, 1851, 1861, 1885, 1892, 1898, 1903, 1912, 1916, 1928, 1959, 1966, 1974, 1979, 1986, 1992, 2009, 2014, 2018, 2031, 2035, 2040, 2045, 2057, 2066, 2079, 2084, 2095, 2106, 2111, 2122, 2133, 2142, 2152, 2167, 2179, 2184, 2191, 2202, 2460, 2467, 2472, 2477, 2482, 2490, 2499, 2506, 2516, 2518, 2523, 2529, 2535, 2537, 2565, 2575, 2588, 2600, 2614, 2619, 2643, 2649, 2654, 2661, 2666, 2704, 2708, 2715, 2719, 2726, 2740, 2747, 2758, 2791, 2801, 2805, 2812, 2819, 2827, 2833, 2837, 2847, 2854, 2865, 2897, 2905, 2910, 2917, 2927, 2937, 2957, 2972, 2997, 3002, 3009, 3016, 3027, 3032, 3039, 3050, 3058, 3069, 3085, 3093, 3097, 3111, 3128, 3133, 3140, 3149, 3152, 3157, 3164, 3175, 3188, 3201, 3219, 3222, 3231, 3246, 3261, 3270, 3277, 3284, 3289, 3319, 3321, 3325, 3333, 3340, 3354, 3358, 3362, 3367, 3373, 3377, 3381, 3394, 3400, 3409, 3418, 3428, 3439, 3549, 3567, 3572, 3576, 3593, 3601, 3608, 3621, 3631, 3665, 3670, 3675, 3679, 3687, 3689, 3747, 3764, 3772, 3795, 3799, 3819, 3856, 3865, 3870, 3875, 3880, 3885, 3938, 3944, 3951, 3961, 3966, 3971, 3989, 3993, 4003, 4009, 4015, 4022, 4027, 4032, 4046, 4074, 4081, 4095, 4110, 4227, 4238, 4244, 4252, 4263, 4272, 4279, 4319, 4325, 4346, 4374, 4378, 4383, 4392, 4396, 4423, 4430, 4445, 4465, 4485, 4578, 4603, 4610, 4626, 4635, 4640, 4646, 4653, 4667, 4816, 4820, 4913, 4918, 4922, 4928, 4996, 5002, 5031, 5048, 5055, 5067, 5127, 5134, 5140, 5146, 5172, 5178, 5184, 5195, 5207, 5236, 5275, 5279, 5283, 5287, 5292, 5299, 5313, 5326, 5334, 5341, 5347, 5351, 5356, 5363, 5377, 5379, 5386, 5390, 5399, 5407, 5416, 5418, 5422, 5431, 5436, 5442, 5447, 5451, 5456, 5462, 5468, 5474, 5480, 5485, 5500, 5509, 5520, 5526, 5565, 5575, 5582, 5593, 5599, 5609, 5621, 5625, 5663, 5677, 5691, 5715, 5722, 5732, 5744, 5749, 5785, 5792, 5807, 5854, 5891, 5902, 5919, 6389, 6393, 6398, 6457, 6461, 6680, 6695, 6706, 6713, 6906, 6916, 6924, 6953, 6969, 7011, 7025, 7047, 7054, 7062, 7066, 7073, 7082, 7091, 7143, 7148, 7160, 7164, 7169, 7174, 7178, 7182, 7187, 7203, 7211, 7216, 7229, 7234, 7241, 7251, 7255, 7266, 7277, 7285, 7292, 7331, 7339, 7343, 7424, 7452, 7457, 7472, 7484, 7491, 7501, 7506, 7510, 7514, 7518, 7522, 7529, 7539, 7544, 7562, 7573, 7580, 7588, 7593, 7606, 7612, 7641, 7648, 7660, 7673, 7688, 7694, 7703, 7719, 7722, 7733, 7738, 7742, 7746, 7751, 7754, 7760, 7764, 7766, 7769, 7776, 7779, 7786, 7794, 7797, 7806, 7821, 7834, 7845, 7848, 7852, 7858, 7874, 7887, 7897, 7915, 7917, 7925, 7929, 7939, 7949, 7960, 7962, 7966, 7976, 7992, 7994, 7999, 8003, 8009, 8016, 8025, 8040, 8044, 8051, 8054, 8058, 8061, 8074, 8078, 8083, 8091, 8095, 8099, 8110, 8117, 8123, 8127, 8129, 8133, 8139, 8148, 8154, 8156, 8158, 8165, 8169, 8178, 8182, 8192, 8199, 8207, 8231, 8237, 8241, 8246, 8255, 8259, 8262, 8267, 8280, 8286, 8294, 8297, 8304, 8309, 8330, 8339, 8344, 8350, 8355, 8362, 8367, 8373, 8375, 8379, 8386, 8390, 8393, 8400, 8405, 8408, 8415, 8419, 8428, 8432, 8440, 8442, 8449, 8454, 8457, 8472, 8484, 8494, 8503, 8508, 8513, 8520, 8523, 8527, 8534, 8558, 8567, 8573, 8577, 8582, 8592, 8599, 8608, 8611, 8620, 8622, 8628, 8632, 8637, 8651, 8653, 8659, 8665, 8668, 8677, 8695, 8702, 8706, 8710, 8726, 8733, 8741, 8745, 8752, 8765, 8781, 8787, 8793, 8800, 8805, 8811, 8818, 8826, 8834, 8839, 8843, 8849, 8853, 8857, 8860, 8866, 8871, 8887, 8890, 8892, 8904, 8906, 8910, 8916, 8921, 8929, 8933, 8942, 8950, 8956, 8959, 8968, 8973, 8980, 8990, 9016, 9027, 9029, 9031, 9039, 9062, 9070, 9080, 9094, 9104, 9108, 9122, 9129, 9136, 9143, 9168, 9197, 9236, 9238, 9266, 9287, 9294, 9307, 9319, 9325, 9334, 9351, 9363, 9372, 9377, 9384, 9394, 9397, 9408, 9414, 9429, 9437, 9446, 9455, 9458, 9463, 9472, 9477, 9491, 9501, 9509, 9523, 9530, 9538, 9546, 9553, 9559, 9568, 9576, 9586, 9597, 9604, 9634, 9643, 9650, 9661, 9671, 9675, 9679, 9684, 9692, 9696, 9700, 9705, 9710, 9715, 9722, 9730, 9733, 9740, 9745, 9752, 9768, 9783, 9797, 9802, 9821, 9826, 9831, 9838, 9845, 9852, 9861, 9867, 9873, 9879, 9887, 9896, 9954, 9969, 9992, 10000, 10004, 10016, 10018, 10025, 10034, 10052, 10060, 10069, 10076, 10086, 10092, 10099, 10104, 10110, 10114, 10121, 10151, 10171, 10175, 10191, 10198, 10211, 10219, 10239, 10245, 10257, 10262, 10272, 10304, 10309, 10318, 10323, 10327, 10332, 10348, 10366, 10369, 10375, 10403, 10413, 10420, 10422, 10427, 10438, 10449, 10470, 10477, 10484, 10490, 10493, 10504, 10511, 10513, 10522, 10529, 10535, 10541, 10545, 10560, 10577, 10579, 10603, 10607, 10618, 10621, 10625, 10630, 10635, 10647, 10653, 10657, 10661, 10665, 10670, 10674, 10702] \ No newline at end of file +[4, 1, 679, 10705, 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, 2, 607, 7, 607, 2, 608, 7, 608, 2, 609, 7, 609, 2, 610, 7, 610, 2, 611, 7, 611, 2, 612, 7, 612, 2, 613, 7, 613, 2, 614, 7, 614, 2, 615, 7, 615, 2, 616, 7, 616, 2, 617, 7, 617, 2, 618, 7, 618, 2, 619, 7, 619, 2, 620, 7, 620, 2, 621, 7, 621, 2, 622, 7, 622, 2, 623, 7, 623, 2, 624, 7, 624, 2, 625, 7, 625, 2, 626, 7, 626, 2, 627, 7, 627, 2, 628, 7, 628, 2, 629, 7, 629, 2, 630, 7, 630, 2, 631, 7, 631, 2, 632, 7, 632, 2, 633, 7, 633, 2, 634, 7, 634, 2, 635, 7, 635, 2, 636, 7, 636, 2, 637, 7, 637, 2, 638, 7, 638, 2, 639, 7, 639, 2, 640, 7, 640, 2, 641, 7, 641, 2, 642, 7, 642, 2, 643, 7, 643, 2, 644, 7, 644, 2, 645, 7, 645, 2, 646, 7, 646, 2, 647, 7, 647, 2, 648, 7, 648, 2, 649, 7, 649, 2, 650, 7, 650, 2, 651, 7, 651, 2, 652, 7, 652, 2, 653, 7, 653, 2, 654, 7, 654, 2, 655, 7, 655, 2, 656, 7, 656, 2, 657, 7, 657, 2, 658, 7, 658, 2, 659, 7, 659, 2, 660, 7, 660, 2, 661, 7, 661, 2, 662, 7, 662, 2, 663, 7, 663, 2, 664, 7, 664, 2, 665, 7, 665, 2, 666, 7, 666, 2, 667, 7, 667, 2, 668, 7, 668, 2, 669, 7, 669, 2, 670, 7, 670, 2, 671, 7, 671, 2, 672, 7, 672, 2, 673, 7, 673, 2, 674, 7, 674, 2, 675, 7, 675, 2, 676, 7, 676, 2, 677, 7, 677, 2, 678, 7, 678, 2, 679, 7, 679, 2, 680, 7, 680, 2, 681, 7, 681, 2, 682, 7, 682, 2, 683, 7, 683, 2, 684, 7, 684, 2, 685, 7, 685, 2, 686, 7, 686, 2, 687, 7, 687, 2, 688, 7, 688, 2, 689, 7, 689, 2, 690, 7, 690, 2, 691, 7, 691, 2, 692, 7, 692, 2, 693, 7, 693, 2, 694, 7, 694, 2, 695, 7, 695, 2, 696, 7, 696, 2, 697, 7, 697, 2, 698, 7, 698, 2, 699, 7, 699, 2, 700, 7, 700, 2, 701, 7, 701, 2, 702, 7, 702, 2, 703, 7, 703, 2, 704, 7, 704, 2, 705, 7, 705, 2, 706, 7, 706, 2, 707, 7, 707, 2, 708, 7, 708, 2, 709, 7, 709, 2, 710, 7, 710, 2, 711, 7, 711, 2, 712, 7, 712, 2, 713, 7, 713, 2, 714, 7, 714, 2, 715, 7, 715, 2, 716, 7, 716, 2, 717, 7, 717, 2, 718, 7, 718, 2, 719, 7, 719, 2, 720, 7, 720, 2, 721, 7, 721, 2, 722, 7, 722, 2, 723, 7, 723, 2, 724, 7, 724, 2, 725, 7, 725, 2, 726, 7, 726, 2, 727, 7, 727, 2, 728, 7, 728, 2, 729, 7, 729, 2, 730, 7, 730, 2, 731, 7, 731, 2, 732, 7, 732, 2, 733, 7, 733, 2, 734, 7, 734, 2, 735, 7, 735, 2, 736, 7, 736, 2, 737, 7, 737, 2, 738, 7, 738, 2, 739, 7, 739, 2, 740, 7, 740, 2, 741, 7, 741, 2, 742, 7, 742, 2, 743, 7, 743, 2, 744, 7, 744, 2, 745, 7, 745, 2, 746, 7, 746, 2, 747, 7, 747, 2, 748, 7, 748, 2, 749, 7, 749, 2, 750, 7, 750, 2, 751, 7, 751, 2, 752, 7, 752, 2, 753, 7, 753, 2, 754, 7, 754, 2, 755, 7, 755, 2, 756, 7, 756, 2, 757, 7, 757, 2, 758, 7, 758, 2, 759, 7, 759, 2, 760, 7, 760, 2, 761, 7, 761, 2, 762, 7, 762, 2, 763, 7, 763, 2, 764, 7, 764, 2, 765, 7, 765, 2, 766, 7, 766, 2, 767, 7, 767, 2, 768, 7, 768, 2, 769, 7, 769, 2, 770, 7, 770, 2, 771, 7, 771, 2, 772, 7, 772, 2, 773, 7, 773, 2, 774, 7, 774, 2, 775, 7, 775, 2, 776, 7, 776, 2, 777, 7, 777, 2, 778, 7, 778, 2, 779, 7, 779, 2, 780, 7, 780, 2, 781, 7, 781, 2, 782, 7, 782, 2, 783, 7, 783, 2, 784, 7, 784, 2, 785, 7, 785, 2, 786, 7, 786, 2, 787, 7, 787, 2, 788, 7, 788, 2, 789, 7, 789, 2, 790, 7, 790, 2, 791, 7, 791, 2, 792, 7, 792, 2, 793, 7, 793, 2, 794, 7, 794, 2, 795, 7, 795, 2, 796, 7, 796, 2, 797, 7, 797, 2, 798, 7, 798, 2, 799, 7, 799, 2, 800, 7, 800, 2, 801, 7, 801, 2, 802, 7, 802, 2, 803, 7, 803, 2, 804, 7, 804, 2, 805, 7, 805, 2, 806, 7, 806, 2, 807, 7, 807, 2, 808, 7, 808, 2, 809, 7, 809, 2, 810, 7, 810, 2, 811, 7, 811, 2, 812, 7, 812, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 1636, 8, 3, 5, 3, 1638, 8, 3, 10, 3, 12, 3, 1641, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 1768, 8, 4, 1, 5, 1, 5, 3, 5, 1772, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 3, 8, 1785, 8, 8, 1, 9, 5, 9, 1788, 8, 9, 10, 9, 12, 9, 1791, 9, 9, 1, 10, 5, 10, 1794, 8, 10, 10, 10, 12, 10, 1797, 9, 10, 1, 11, 1, 11, 1, 11, 3, 11, 1802, 8, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 1817, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 1829, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 1847, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 1852, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 1862, 8, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 1886, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 1893, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 1899, 8, 22, 1, 23, 5, 23, 1902, 8, 23, 10, 23, 12, 23, 1905, 9, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 1913, 8, 24, 1, 25, 1, 25, 3, 25, 1917, 8, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 1929, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 1960, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 1965, 8, 29, 10, 29, 12, 29, 1968, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 1973, 8, 30, 10, 30, 12, 30, 1976, 9, 30, 1, 31, 1, 31, 3, 31, 1980, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 1987, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 1993, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 2010, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 2015, 8, 35, 1, 36, 1, 36, 3, 36, 2019, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 2032, 8, 38, 1, 39, 1, 39, 3, 39, 2036, 8, 39, 1, 40, 1, 40, 1, 40, 3, 40, 2041, 8, 40, 1, 41, 1, 41, 1, 41, 3, 41, 2046, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 2058, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 2067, 8, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2080, 8, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2085, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2096, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2107, 8, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2112, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2123, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2134, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2143, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2153, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2168, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2180, 8, 48, 1, 48, 1, 48, 1, 48, 3, 48, 2185, 8, 48, 1, 49, 1, 49, 1, 49, 5, 49, 2190, 8, 49, 10, 49, 12, 49, 2193, 9, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 2203, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 2461, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 2468, 8, 53, 1, 54, 1, 54, 1, 54, 3, 54, 2473, 8, 54, 1, 55, 1, 55, 1, 55, 3, 55, 2478, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 2483, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 2491, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 3, 59, 2500, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 2505, 8, 60, 10, 60, 12, 60, 2508, 9, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 2517, 8, 61, 3, 61, 2519, 8, 61, 1, 62, 4, 62, 2522, 8, 62, 11, 62, 12, 62, 2523, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 2530, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 2536, 8, 63, 3, 63, 2538, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 2566, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 5, 66, 2574, 8, 66, 10, 66, 12, 66, 2577, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 5, 68, 2587, 8, 68, 10, 68, 12, 68, 2590, 9, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 2601, 8, 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, 3, 69, 2615, 8, 69, 1, 70, 1, 70, 1, 70, 3, 70, 2620, 8, 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, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 2644, 8, 71, 1, 72, 1, 72, 1, 73, 1, 73, 3, 73, 2650, 8, 73, 1, 74, 1, 74, 1, 74, 3, 74, 2655, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 2662, 8, 75, 1, 76, 5, 76, 2665, 8, 76, 10, 76, 12, 76, 2668, 9, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 2705, 8, 77, 1, 78, 1, 78, 3, 78, 2709, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 2716, 8, 79, 1, 80, 1, 80, 3, 80, 2720, 8, 80, 1, 81, 1, 81, 1, 81, 5, 81, 2725, 8, 81, 10, 81, 12, 81, 2728, 9, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 2741, 8, 83, 1, 84, 1, 84, 1, 84, 5, 84, 2746, 8, 84, 10, 84, 12, 84, 2749, 9, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 2759, 8, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 2792, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 2802, 8, 87, 1, 88, 1, 88, 3, 88, 2806, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 3, 89, 2813, 8, 89, 1, 90, 1, 90, 1, 90, 5, 90, 2818, 8, 90, 10, 90, 12, 90, 2821, 9, 90, 1, 91, 1, 91, 1, 91, 5, 91, 2826, 8, 91, 10, 91, 12, 91, 2829, 9, 91, 1, 92, 1, 92, 1, 92, 3, 92, 2834, 8, 92, 1, 93, 1, 93, 3, 93, 2838, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 2848, 8, 95, 1, 95, 1, 95, 1, 96, 5, 96, 2853, 8, 96, 10, 96, 12, 96, 2856, 9, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 2866, 8, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 3, 98, 2898, 8, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 3, 98, 2906, 8, 98, 1, 99, 1, 99, 1, 99, 3, 99, 2911, 8, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 3, 100, 2918, 8, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 5, 102, 2926, 8, 102, 10, 102, 12, 102, 2929, 9, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 2938, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 2958, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 2973, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 2998, 8, 105, 1, 106, 1, 106, 1, 106, 3, 106, 3003, 8, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 3010, 8, 107, 1, 108, 1, 108, 1, 108, 5, 108, 3015, 8, 108, 10, 108, 12, 108, 3018, 9, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 3, 110, 3028, 8, 110, 1, 111, 1, 111, 1, 111, 3, 111, 3033, 8, 111, 1, 112, 1, 112, 1, 112, 5, 112, 3038, 8, 112, 10, 112, 12, 112, 3041, 9, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 3, 113, 3051, 8, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 3, 114, 3059, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 3070, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 3, 118, 3086, 8, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 3, 119, 3094, 8, 119, 1, 120, 1, 120, 3, 120, 3098, 8, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 5, 122, 3110, 8, 122, 10, 122, 12, 122, 3113, 9, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 3129, 8, 123, 1, 124, 1, 124, 1, 124, 3, 124, 3134, 8, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 3, 125, 3141, 8, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 3, 126, 3150, 8, 126, 1, 126, 3, 126, 3153, 8, 126, 1, 127, 1, 127, 1, 127, 3, 127, 3158, 8, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 3, 128, 3165, 8, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 3, 130, 3176, 8, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 3189, 8, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 3, 132, 3202, 8, 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, 134, 1, 134, 1, 134, 1, 134, 3, 134, 3220, 8, 134, 1, 134, 3, 134, 3223, 8, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 3, 135, 3232, 8, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 3, 137, 3247, 8, 137, 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, 3, 139, 3262, 8, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 3, 140, 3271, 8, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 3, 141, 3278, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 3285, 8, 142, 1, 143, 4, 143, 3288, 8, 143, 11, 143, 12, 143, 3289, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 3, 144, 3320, 8, 144, 3, 144, 3322, 8, 144, 1, 145, 1, 145, 3, 145, 3326, 8, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 3, 146, 3334, 8, 146, 1, 147, 1, 147, 1, 147, 5, 147, 3339, 8, 147, 10, 147, 12, 147, 3342, 9, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 3, 148, 3355, 8, 148, 1, 149, 1, 149, 3, 149, 3359, 8, 149, 1, 150, 1, 150, 3, 150, 3363, 8, 150, 1, 151, 1, 151, 1, 151, 3, 151, 3368, 8, 151, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 3374, 8, 152, 1, 153, 1, 153, 3, 153, 3378, 8, 153, 1, 154, 1, 154, 3, 154, 3382, 8, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 3, 156, 3395, 8, 156, 1, 157, 1, 157, 1, 157, 1, 157, 3, 157, 3401, 8, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 3, 158, 3410, 8, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 5, 159, 3417, 8, 159, 10, 159, 12, 159, 3420, 9, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 3, 160, 3429, 8, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 5, 162, 3438, 8, 162, 10, 162, 12, 162, 3441, 9, 162, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 3, 164, 3550, 8, 164, 1, 165, 1, 165, 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, 166, 3, 166, 3568, 8, 166, 1, 167, 4, 167, 3571, 8, 167, 11, 167, 12, 167, 3572, 1, 168, 1, 168, 3, 168, 3577, 8, 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, 169, 1, 169, 3, 169, 3594, 8, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 3, 170, 3602, 8, 170, 1, 171, 1, 171, 1, 171, 5, 171, 3607, 8, 171, 10, 171, 12, 171, 3610, 9, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 5, 173, 3620, 8, 173, 10, 173, 12, 173, 3623, 9, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 3, 174, 3632, 8, 174, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 3, 178, 3666, 8, 178, 1, 179, 1, 179, 1, 179, 3, 179, 3671, 8, 179, 1, 180, 1, 180, 1, 180, 3, 180, 3676, 8, 180, 1, 181, 1, 181, 3, 181, 3680, 8, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 3, 182, 3688, 8, 182, 3, 182, 3690, 8, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 3, 183, 3748, 8, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 3, 185, 3765, 8, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 3, 186, 3773, 8, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 3, 187, 3796, 8, 187, 1, 188, 1, 188, 3, 188, 3800, 8, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 3, 189, 3820, 8, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 3, 193, 3857, 8, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 3, 194, 3866, 8, 194, 1, 195, 1, 195, 1, 195, 3, 195, 3871, 8, 195, 1, 196, 1, 196, 1, 196, 3, 196, 3876, 8, 196, 1, 197, 1, 197, 1, 197, 3, 197, 3881, 8, 197, 1, 198, 1, 198, 1, 198, 3, 198, 3886, 8, 198, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 3, 202, 3939, 8, 202, 1, 203, 1, 203, 1, 203, 1, 203, 3, 203, 3945, 8, 203, 1, 204, 1, 204, 1, 204, 5, 204, 3950, 8, 204, 10, 204, 12, 204, 3953, 9, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 3, 205, 3962, 8, 205, 1, 206, 1, 206, 1, 206, 3, 206, 3967, 8, 206, 1, 207, 4, 207, 3970, 8, 207, 11, 207, 12, 207, 3971, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 3, 212, 3990, 8, 212, 1, 213, 1, 213, 3, 213, 3994, 8, 213, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 3, 215, 4004, 8, 215, 1, 216, 1, 216, 1, 217, 1, 217, 3, 217, 4010, 8, 217, 1, 217, 1, 217, 5, 217, 4014, 8, 217, 10, 217, 12, 217, 4017, 9, 217, 1, 218, 1, 218, 1, 218, 1, 218, 3, 218, 4023, 8, 218, 1, 219, 1, 219, 1, 219, 3, 219, 4028, 8, 219, 1, 220, 5, 220, 4031, 8, 220, 10, 220, 12, 220, 4034, 9, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 3, 221, 4047, 8, 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, 3, 222, 4075, 8, 222, 1, 223, 1, 223, 1, 223, 5, 223, 4080, 8, 223, 10, 223, 12, 223, 4083, 9, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 5, 225, 4094, 8, 225, 10, 225, 12, 225, 4097, 9, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 3, 227, 4111, 8, 227, 1, 228, 1, 228, 1, 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, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 3, 229, 4228, 8, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 5, 231, 4237, 8, 231, 10, 231, 12, 231, 4240, 9, 231, 1, 232, 1, 232, 1, 232, 3, 232, 4245, 8, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 3, 233, 4253, 8, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 5, 235, 4262, 8, 235, 10, 235, 12, 235, 4265, 9, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 3, 237, 4273, 8, 237, 1, 238, 1, 238, 1, 238, 5, 238, 4278, 8, 238, 10, 238, 12, 238, 4281, 9, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 3, 239, 4320, 8, 239, 1, 240, 1, 240, 1, 240, 1, 240, 3, 240, 4326, 8, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 5, 242, 4345, 8, 242, 10, 242, 12, 242, 4348, 9, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 3, 243, 4375, 8, 243, 1, 244, 1, 244, 3, 244, 4379, 8, 244, 1, 245, 1, 245, 1, 245, 3, 245, 4384, 8, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 3, 246, 4393, 8, 246, 1, 247, 1, 247, 3, 247, 4397, 8, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 3, 249, 4424, 8, 249, 1, 250, 1, 250, 1, 250, 5, 250, 4429, 8, 250, 10, 250, 12, 250, 4432, 9, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 3, 251, 4446, 8, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 3, 252, 4466, 8, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 3, 253, 4486, 8, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 3, 256, 4579, 8, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 3, 257, 4604, 8, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 3, 258, 4611, 8, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 1, 259, 3, 259, 4627, 8, 259, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 5, 261, 4634, 8, 261, 10, 261, 12, 261, 4637, 9, 261, 1, 262, 1, 262, 3, 262, 4641, 8, 262, 1, 263, 1, 263, 4, 263, 4645, 8, 263, 11, 263, 12, 263, 4646, 1, 264, 1, 264, 1, 264, 5, 264, 4652, 8, 264, 10, 264, 12, 264, 4655, 9, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 3, 266, 4668, 8, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 3, 267, 4817, 8, 267, 1, 268, 1, 268, 3, 268, 4821, 8, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 3, 269, 4914, 8, 269, 1, 270, 1, 270, 1, 270, 3, 270, 4919, 8, 270, 1, 271, 1, 271, 3, 271, 4923, 8, 271, 1, 272, 1, 272, 1, 272, 1, 272, 3, 272, 4929, 8, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 3, 273, 4997, 8, 273, 1, 274, 1, 274, 1, 275, 1, 275, 3, 275, 5003, 8, 275, 1, 276, 1, 276, 1, 276, 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, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 3, 277, 5032, 8, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 3, 278, 5049, 8, 278, 1, 279, 1, 279, 1, 279, 5, 279, 5054, 8, 279, 10, 279, 12, 279, 5057, 9, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 3, 280, 5068, 8, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 3, 281, 5128, 8, 281, 1, 282, 1, 282, 1, 282, 5, 282, 5133, 8, 282, 10, 282, 12, 282, 5136, 9, 282, 1, 283, 1, 283, 1, 283, 3, 283, 5141, 8, 283, 1, 284, 1, 284, 1, 284, 1, 284, 3, 284, 5147, 8, 284, 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, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 3, 286, 5173, 8, 286, 1, 287, 1, 287, 1, 287, 1, 287, 3, 287, 5179, 8, 287, 1, 288, 1, 288, 1, 288, 1, 288, 3, 288, 5185, 8, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 5, 290, 5194, 8, 290, 10, 290, 12, 290, 5197, 9, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 3, 291, 5208, 8, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 3, 292, 5237, 8, 292, 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, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 3, 294, 5276, 8, 294, 1, 295, 1, 295, 3, 295, 5280, 8, 295, 1, 296, 1, 296, 3, 296, 5284, 8, 296, 1, 297, 1, 297, 3, 297, 5288, 8, 297, 1, 298, 1, 298, 1, 298, 3, 298, 5293, 8, 298, 1, 299, 1, 299, 1, 299, 5, 299, 5298, 8, 299, 10, 299, 12, 299, 5301, 9, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 3, 300, 5314, 8, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 3, 301, 5327, 8, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 3, 302, 5335, 8, 302, 1, 303, 1, 303, 1, 303, 5, 303, 5340, 8, 303, 10, 303, 12, 303, 5343, 9, 303, 1, 304, 1, 304, 1, 304, 3, 304, 5348, 8, 304, 1, 305, 1, 305, 3, 305, 5352, 8, 305, 1, 306, 1, 306, 1, 306, 3, 306, 5357, 8, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 3, 307, 5364, 8, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 3, 308, 5378, 8, 308, 3, 308, 5380, 8, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 3, 309, 5387, 8, 309, 1, 310, 1, 310, 3, 310, 5391, 8, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 5, 311, 5398, 8, 311, 10, 311, 12, 311, 5401, 9, 311, 1, 312, 1, 312, 1, 312, 5, 312, 5406, 8, 312, 10, 312, 12, 312, 5409, 9, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 3, 313, 5417, 8, 313, 3, 313, 5419, 8, 313, 1, 314, 1, 314, 3, 314, 5423, 8, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 5, 315, 5430, 8, 315, 10, 315, 12, 315, 5433, 9, 315, 1, 316, 1, 316, 3, 316, 5437, 8, 316, 1, 316, 1, 316, 1, 316, 1, 316, 3, 316, 5443, 8, 316, 1, 316, 1, 316, 1, 316, 3, 316, 5448, 8, 316, 1, 317, 1, 317, 3, 317, 5452, 8, 317, 1, 317, 1, 317, 1, 317, 3, 317, 5457, 8, 317, 1, 318, 1, 318, 1, 318, 1, 318, 3, 318, 5463, 8, 318, 1, 319, 1, 319, 1, 320, 1, 320, 3, 320, 5469, 8, 320, 1, 320, 1, 320, 1, 320, 1, 320, 3, 320, 5475, 8, 320, 1, 320, 1, 320, 1, 320, 1, 320, 3, 320, 5481, 8, 320, 1, 321, 1, 321, 1, 321, 3, 321, 5486, 8, 321, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 3, 323, 5501, 8, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 5, 324, 5508, 8, 324, 10, 324, 12, 324, 5511, 9, 324, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 5, 326, 5519, 8, 326, 10, 326, 12, 326, 5522, 9, 326, 1, 327, 4, 327, 5525, 8, 327, 11, 327, 12, 327, 5526, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 3, 328, 5566, 8, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 3, 329, 5576, 8, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 330, 3, 330, 5583, 8, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 5, 331, 5592, 8, 331, 10, 331, 12, 331, 5595, 9, 331, 1, 332, 1, 332, 1, 332, 3, 332, 5600, 8, 332, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 5, 334, 5608, 8, 334, 10, 334, 12, 334, 5611, 9, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 4, 336, 5620, 8, 336, 11, 336, 12, 336, 5621, 1, 337, 1, 337, 3, 337, 5626, 8, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 3, 338, 5664, 8, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 3, 339, 5678, 8, 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, 3, 340, 5692, 8, 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, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 3, 341, 5716, 8, 341, 1, 342, 1, 342, 1, 342, 5, 342, 5721, 8, 342, 10, 342, 12, 342, 5724, 9, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 5, 343, 5731, 8, 343, 10, 343, 12, 343, 5734, 9, 343, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 346, 4, 346, 5743, 8, 346, 11, 346, 12, 346, 5744, 1, 347, 1, 347, 1, 347, 3, 347, 5750, 8, 347, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 3, 348, 5786, 8, 348, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 3, 349, 5793, 8, 349, 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, 3, 351, 5808, 8, 351, 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, 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, 3, 353, 5855, 8, 353, 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, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 3, 355, 5892, 8, 355, 1, 356, 1, 356, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 5, 358, 5901, 8, 358, 10, 358, 12, 358, 5904, 9, 358, 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, 3, 360, 5920, 8, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 3, 361, 6390, 8, 361, 1, 362, 1, 362, 3, 362, 6394, 8, 362, 1, 363, 1, 363, 1, 363, 3, 363, 6399, 8, 363, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 3, 364, 6458, 8, 364, 1, 365, 1, 365, 3, 365, 6462, 8, 365, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 3, 366, 6681, 8, 366, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 368, 1, 368, 1, 368, 5, 368, 6694, 8, 368, 10, 368, 12, 368, 6697, 9, 368, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 3, 369, 6707, 8, 369, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 3, 370, 6714, 8, 370, 1, 371, 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, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 3, 372, 6907, 8, 372, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 374, 1, 374, 3, 374, 6917, 8, 374, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 3, 375, 6925, 8, 375, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 3, 376, 6954, 8, 376, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 378, 1, 378, 1, 378, 5, 378, 6968, 8, 378, 10, 378, 12, 378, 6971, 9, 378, 1, 379, 1, 379, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 3, 380, 7012, 8, 380, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 3, 381, 7026, 8, 381, 1, 382, 1, 382, 1, 382, 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, 3, 383, 7048, 8, 383, 1, 384, 1, 384, 1, 384, 5, 384, 7053, 8, 384, 10, 384, 12, 384, 7056, 9, 384, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 3, 385, 7063, 8, 385, 1, 386, 1, 386, 3, 386, 7067, 8, 386, 1, 387, 1, 387, 1, 388, 1, 388, 1, 388, 3, 388, 7074, 8, 388, 1, 389, 1, 389, 1, 389, 1, 389, 1, 390, 1, 390, 1, 390, 3, 390, 7083, 8, 390, 1, 391, 1, 391, 1, 391, 1, 392, 1, 392, 1, 392, 1, 392, 3, 392, 7092, 8, 392, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 3, 393, 7144, 8, 393, 1, 394, 1, 394, 1, 394, 3, 394, 7149, 8, 394, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 3, 395, 7161, 8, 395, 1, 396, 1, 396, 3, 396, 7165, 8, 396, 1, 396, 5, 396, 7168, 8, 396, 10, 396, 12, 396, 7171, 9, 396, 1, 397, 1, 397, 3, 397, 7175, 8, 397, 1, 398, 1, 398, 3, 398, 7179, 8, 398, 1, 398, 1, 398, 3, 398, 7183, 8, 398, 1, 399, 1, 399, 1, 399, 3, 399, 7188, 8, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 3, 399, 7204, 8, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 400, 1, 400, 3, 400, 7212, 8, 400, 1, 400, 1, 400, 1, 400, 3, 400, 7217, 8, 400, 1, 401, 1, 401, 1, 401, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 403, 1, 403, 3, 403, 7230, 8, 403, 1, 404, 4, 404, 7233, 8, 404, 11, 404, 12, 404, 7234, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 3, 405, 7242, 8, 405, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 1, 406, 3, 406, 7252, 8, 406, 1, 407, 1, 407, 3, 407, 7256, 8, 407, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 3, 408, 7267, 8, 408, 1, 409, 1, 409, 1, 409, 1, 409, 1, 409, 1, 410, 1, 410, 1, 410, 1, 410, 3, 410, 7278, 8, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 3, 410, 7286, 8, 410, 1, 411, 1, 411, 1, 411, 5, 411, 7291, 8, 411, 10, 411, 12, 411, 7294, 9, 411, 1, 412, 1, 412, 1, 413, 1, 413, 1, 413, 1, 413, 1, 413, 1, 413, 1, 414, 1, 414, 1, 414, 1, 414, 1, 414, 1, 415, 1, 415, 1, 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, 3, 416, 7332, 8, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 3, 416, 7340, 8, 416, 1, 417, 1, 417, 3, 417, 7344, 8, 417, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 3, 419, 7425, 8, 419, 1, 420, 1, 420, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 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, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 3, 422, 7453, 8, 422, 1, 423, 1, 423, 1, 423, 3, 423, 7458, 8, 423, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 3, 424, 7473, 8, 424, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 3, 425, 7485, 8, 425, 1, 426, 1, 426, 1, 426, 5, 426, 7490, 8, 426, 10, 426, 12, 426, 7493, 9, 426, 1, 427, 1, 427, 1, 428, 1, 428, 1, 428, 1, 429, 1, 429, 3, 429, 7502, 8, 429, 1, 430, 1, 430, 1, 430, 3, 430, 7507, 8, 430, 1, 431, 1, 431, 3, 431, 7511, 8, 431, 1, 432, 1, 432, 3, 432, 7515, 8, 432, 1, 433, 1, 433, 3, 433, 7519, 8, 433, 1, 434, 1, 434, 3, 434, 7523, 8, 434, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 3, 435, 7530, 8, 435, 1, 436, 1, 436, 1, 436, 1, 437, 1, 437, 1, 437, 5, 437, 7538, 8, 437, 10, 437, 12, 437, 7541, 9, 437, 1, 438, 1, 438, 3, 438, 7545, 8, 438, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 1, 439, 3, 439, 7563, 8, 439, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 1, 440, 3, 440, 7574, 8, 440, 1, 441, 1, 441, 1, 441, 5, 441, 7579, 8, 441, 10, 441, 12, 441, 7582, 9, 441, 1, 442, 1, 442, 1, 442, 1, 443, 1, 443, 3, 443, 7589, 8, 443, 1, 444, 1, 444, 1, 444, 3, 444, 7594, 8, 444, 1, 445, 1, 445, 1, 445, 1, 445, 1, 445, 1, 445, 1, 446, 1, 446, 1, 446, 1, 446, 1, 446, 3, 446, 7607, 8, 446, 1, 447, 1, 447, 1, 447, 1, 447, 3, 447, 7613, 8, 447, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 1, 448, 3, 448, 7642, 8, 448, 1, 449, 1, 449, 1, 449, 1, 449, 1, 449, 3, 449, 7649, 8, 449, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 1, 450, 3, 450, 7661, 8, 450, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 451, 1, 452, 1, 452, 1, 452, 3, 452, 7674, 8, 452, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 1, 453, 3, 453, 7689, 8, 453, 1, 453, 1, 453, 1, 453, 1, 453, 3, 453, 7695, 8, 453, 1, 454, 1, 454, 1, 455, 1, 455, 1, 455, 5, 455, 7702, 8, 455, 10, 455, 12, 455, 7705, 9, 455, 1, 456, 1, 456, 1, 456, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 1, 457, 3, 457, 7720, 8, 457, 1, 457, 3, 457, 7723, 8, 457, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 1, 458, 3, 458, 7734, 8, 458, 1, 459, 1, 459, 1, 459, 3, 459, 7739, 8, 459, 1, 460, 1, 460, 3, 460, 7743, 8, 460, 1, 460, 1, 460, 3, 460, 7747, 8, 460, 1, 460, 1, 460, 1, 460, 3, 460, 7752, 8, 460, 1, 460, 3, 460, 7755, 8, 460, 1, 460, 1, 460, 1, 460, 1, 460, 3, 460, 7761, 8, 460, 1, 460, 1, 460, 3, 460, 7765, 8, 460, 3, 460, 7767, 8, 460, 1, 460, 3, 460, 7770, 8, 460, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 3, 461, 7777, 8, 461, 1, 461, 3, 461, 7780, 8, 461, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 3, 461, 7787, 8, 461, 1, 461, 1, 461, 1, 462, 1, 462, 1, 462, 1, 462, 3, 462, 7795, 8, 462, 1, 462, 3, 462, 7798, 8, 462, 1, 462, 1, 462, 1, 462, 1, 462, 1, 463, 1, 463, 1, 463, 3, 463, 7807, 8, 463, 1, 463, 1, 463, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 465, 1, 465, 1, 465, 3, 465, 7822, 8, 465, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 3, 467, 7835, 8, 467, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 3, 468, 7846, 8, 468, 1, 468, 3, 468, 7849, 8, 468, 1, 469, 1, 469, 3, 469, 7853, 8, 469, 1, 470, 1, 470, 1, 470, 1, 470, 3, 470, 7859, 8, 470, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 472, 1, 472, 1, 472, 5, 472, 7873, 8, 472, 10, 472, 12, 472, 7876, 9, 472, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 3, 473, 7888, 8, 473, 1, 474, 1, 474, 1, 474, 1, 475, 1, 475, 1, 475, 5, 475, 7896, 8, 475, 10, 475, 12, 475, 7899, 9, 475, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 477, 1, 477, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 5, 478, 7916, 8, 478, 10, 478, 12, 478, 7919, 9, 478, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 3, 479, 7926, 8, 479, 1, 480, 1, 480, 3, 480, 7930, 8, 480, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 3, 481, 7940, 8, 481, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 3, 482, 7950, 8, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 3, 482, 7961, 8, 482, 3, 482, 7963, 8, 482, 1, 483, 1, 483, 3, 483, 7967, 8, 483, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 3, 484, 7977, 8, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 3, 484, 7993, 8, 484, 3, 484, 7995, 8, 484, 1, 484, 1, 484, 1, 484, 3, 484, 8000, 8, 484, 5, 484, 8002, 8, 484, 10, 484, 12, 484, 8005, 9, 484, 1, 485, 1, 485, 1, 485, 3, 485, 8010, 8, 485, 1, 486, 1, 486, 1, 486, 1, 487, 1, 487, 3, 487, 8017, 8, 487, 1, 487, 1, 487, 1, 488, 1, 488, 1, 488, 5, 488, 8024, 8, 488, 10, 488, 12, 488, 8027, 9, 488, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 490, 1, 490, 1, 490, 1, 490, 3, 490, 8041, 8, 490, 1, 491, 1, 491, 3, 491, 8045, 8, 491, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 3, 492, 8052, 8, 492, 1, 492, 3, 492, 8055, 8, 492, 1, 493, 1, 493, 3, 493, 8059, 8, 493, 1, 494, 3, 494, 8062, 8, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 3, 494, 8075, 8, 494, 1, 495, 1, 495, 3, 495, 8079, 8, 495, 1, 496, 1, 496, 1, 496, 3, 496, 8084, 8, 496, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 3, 497, 8092, 8, 497, 1, 498, 1, 498, 3, 498, 8096, 8, 498, 1, 499, 1, 499, 3, 499, 8100, 8, 499, 1, 500, 1, 500, 1, 500, 1, 500, 1, 501, 1, 501, 1, 501, 5, 501, 8109, 8, 501, 10, 501, 12, 501, 8112, 9, 501, 1, 502, 1, 502, 1, 502, 1, 502, 3, 502, 8118, 8, 502, 1, 502, 1, 502, 1, 503, 1, 503, 3, 503, 8124, 8, 503, 1, 503, 1, 503, 3, 503, 8128, 8, 503, 3, 503, 8130, 8, 503, 1, 504, 1, 504, 3, 504, 8134, 8, 504, 1, 505, 1, 505, 1, 505, 1, 505, 3, 505, 8140, 8, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 3, 505, 8149, 8, 505, 1, 505, 1, 505, 1, 505, 1, 505, 3, 505, 8155, 8, 505, 3, 505, 8157, 8, 505, 3, 505, 8159, 8, 505, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 3, 506, 8166, 8, 506, 1, 507, 1, 507, 3, 507, 8170, 8, 507, 1, 508, 1, 508, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 3, 509, 8179, 8, 509, 1, 510, 1, 510, 3, 510, 8183, 8, 510, 1, 511, 1, 511, 1, 512, 1, 512, 1, 513, 1, 513, 1, 513, 1, 513, 3, 513, 8193, 8, 513, 1, 514, 1, 514, 1, 514, 5, 514, 8198, 8, 514, 10, 514, 12, 514, 8201, 9, 514, 1, 515, 1, 515, 1, 515, 1, 515, 1, 515, 3, 515, 8208, 8, 515, 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, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 520, 1, 520, 1, 520, 3, 520, 8232, 8, 520, 1, 521, 1, 521, 1, 521, 1, 521, 3, 521, 8238, 8, 521, 1, 522, 1, 522, 3, 522, 8242, 8, 522, 1, 523, 4, 523, 8245, 8, 523, 11, 523, 12, 523, 8246, 1, 524, 1, 524, 1, 524, 1, 524, 1, 525, 1, 525, 1, 525, 3, 525, 8256, 8, 525, 1, 525, 1, 525, 3, 525, 8260, 8, 525, 1, 525, 3, 525, 8263, 8, 525, 1, 526, 1, 526, 1, 526, 3, 526, 8268, 8, 526, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 5, 527, 8279, 8, 527, 10, 527, 12, 527, 8282, 9, 527, 1, 528, 1, 528, 1, 528, 3, 528, 8287, 8, 528, 1, 529, 1, 529, 1, 529, 1, 529, 5, 529, 8293, 8, 529, 10, 529, 12, 529, 8296, 9, 529, 3, 529, 8298, 8, 529, 1, 530, 1, 530, 1, 530, 4, 530, 8303, 8, 530, 11, 530, 12, 530, 8304, 1, 531, 1, 531, 1, 531, 3, 531, 8310, 8, 531, 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, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8331, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8340, 8, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8345, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8351, 8, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8356, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8363, 8, 531, 1, 531, 1, 531, 1, 531, 3, 531, 8368, 8, 531, 1, 531, 1, 531, 1, 531, 1, 531, 5, 531, 8374, 8, 531, 10, 531, 12, 531, 8377, 9, 531, 1, 532, 3, 532, 8380, 8, 532, 1, 532, 1, 532, 1, 532, 1, 532, 1, 532, 3, 532, 8387, 8, 532, 1, 533, 1, 533, 3, 533, 8391, 8, 533, 1, 534, 3, 534, 8394, 8, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 3, 534, 8401, 8, 534, 1, 535, 1, 535, 1, 535, 3, 535, 8406, 8, 535, 1, 535, 3, 535, 8409, 8, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 3, 535, 8416, 8, 535, 1, 536, 1, 536, 3, 536, 8420, 8, 536, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 3, 537, 8429, 8, 537, 1, 538, 1, 538, 3, 538, 8433, 8, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 3, 538, 8441, 8, 538, 3, 538, 8443, 8, 538, 1, 539, 1, 539, 1, 539, 5, 539, 8448, 8, 539, 10, 539, 12, 539, 8451, 9, 539, 1, 540, 1, 540, 3, 540, 8455, 8, 540, 1, 540, 3, 540, 8458, 8, 540, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 3, 542, 8473, 8, 542, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 3, 543, 8485, 8, 543, 1, 544, 1, 544, 1, 544, 1, 545, 1, 545, 1, 545, 5, 545, 8493, 8, 545, 10, 545, 12, 545, 8496, 9, 545, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 3, 546, 8504, 8, 546, 1, 547, 1, 547, 1, 547, 3, 547, 8509, 8, 547, 1, 548, 1, 548, 1, 548, 3, 548, 8514, 8, 548, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 3, 549, 8521, 8, 549, 1, 549, 3, 549, 8524, 8, 549, 1, 550, 1, 550, 3, 550, 8528, 8, 550, 1, 551, 1, 551, 1, 551, 5, 551, 8533, 8, 551, 10, 551, 12, 551, 8536, 9, 551, 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, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 3, 553, 8559, 8, 553, 1, 553, 1, 553, 1, 554, 1, 554, 1, 554, 5, 554, 8566, 8, 554, 10, 554, 12, 554, 8569, 9, 554, 1, 555, 1, 555, 1, 555, 3, 555, 8574, 8, 555, 1, 555, 1, 555, 3, 555, 8578, 8, 555, 1, 556, 4, 556, 8581, 8, 556, 11, 556, 12, 556, 8582, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 3, 557, 8593, 8, 557, 1, 558, 1, 558, 1, 558, 5, 558, 8598, 8, 558, 10, 558, 12, 558, 8601, 9, 558, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 3, 559, 8609, 8, 559, 1, 560, 3, 560, 8612, 8, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 3, 560, 8621, 8, 560, 3, 560, 8623, 8, 560, 1, 560, 1, 560, 1, 560, 1, 560, 3, 560, 8629, 8, 560, 1, 561, 1, 561, 3, 561, 8633, 8, 561, 1, 561, 5, 561, 8636, 8, 561, 10, 561, 12, 561, 8639, 9, 561, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 3, 562, 8652, 8, 562, 3, 562, 8654, 8, 562, 1, 563, 1, 563, 1, 563, 1, 563, 3, 563, 8660, 8, 563, 1, 564, 1, 564, 1, 564, 1, 564, 3, 564, 8666, 8, 564, 1, 564, 3, 564, 8669, 8, 564, 1, 564, 1, 564, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 3, 565, 8678, 8, 565, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 3, 566, 8696, 8, 566, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 3, 567, 8703, 8, 567, 1, 568, 1, 568, 3, 568, 8707, 8, 568, 1, 569, 1, 569, 3, 569, 8711, 8, 569, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 571, 1, 571, 1, 571, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 3, 572, 8727, 8, 572, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 3, 573, 8734, 8, 573, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 3, 574, 8742, 8, 574, 1, 575, 1, 575, 3, 575, 8746, 8, 575, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 3, 576, 8753, 8, 576, 1, 576, 1, 576, 1, 577, 1, 577, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 3, 578, 8766, 8, 578, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 3, 579, 8782, 8, 579, 1, 579, 1, 579, 1, 579, 1, 579, 3, 579, 8788, 8, 579, 1, 579, 1, 579, 1, 579, 1, 579, 3, 579, 8794, 8, 579, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 3, 580, 8801, 8, 580, 1, 581, 1, 581, 1, 581, 3, 581, 8806, 8, 581, 1, 582, 1, 582, 1, 583, 1, 583, 3, 583, 8812, 8, 583, 1, 584, 1, 584, 1, 584, 5, 584, 8817, 8, 584, 10, 584, 12, 584, 8820, 9, 584, 1, 585, 1, 585, 1, 585, 5, 585, 8825, 8, 585, 10, 585, 12, 585, 8828, 9, 585, 1, 586, 1, 586, 1, 586, 5, 586, 8833, 8, 586, 10, 586, 12, 586, 8836, 9, 586, 1, 587, 1, 587, 3, 587, 8840, 8, 587, 1, 587, 1, 587, 3, 587, 8844, 8, 587, 1, 587, 1, 587, 1, 587, 1, 587, 3, 587, 8850, 8, 587, 1, 588, 1, 588, 3, 588, 8854, 8, 588, 1, 588, 1, 588, 3, 588, 8858, 8, 588, 1, 589, 3, 589, 8861, 8, 589, 1, 589, 1, 589, 1, 590, 1, 590, 3, 590, 8867, 8, 590, 1, 591, 1, 591, 1, 591, 3, 591, 8872, 8, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 3, 591, 8888, 8, 591, 1, 591, 3, 591, 8891, 8, 591, 3, 591, 8893, 8, 591, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 3, 592, 8905, 8, 592, 3, 592, 8907, 8, 592, 1, 593, 1, 593, 3, 593, 8911, 8, 593, 1, 593, 1, 593, 1, 593, 1, 593, 3, 593, 8917, 8, 593, 1, 593, 1, 593, 1, 593, 3, 593, 8922, 8, 593, 1, 594, 1, 594, 1, 594, 1, 594, 5, 594, 8928, 8, 594, 10, 594, 12, 594, 8931, 9, 594, 1, 595, 3, 595, 8934, 8, 595, 1, 595, 1, 595, 1, 596, 1, 596, 1, 596, 5, 596, 8941, 8, 596, 10, 596, 12, 596, 8944, 9, 596, 1, 597, 1, 597, 1, 597, 5, 597, 8949, 8, 597, 10, 597, 12, 597, 8952, 9, 597, 1, 598, 1, 598, 1, 598, 3, 598, 8957, 8, 598, 1, 599, 3, 599, 8960, 8, 599, 1, 599, 1, 599, 1, 600, 1, 600, 1, 600, 1, 600, 1, 600, 3, 600, 8969, 8, 600, 1, 601, 1, 601, 1, 601, 3, 601, 8974, 8, 601, 1, 602, 1, 602, 1, 602, 5, 602, 8979, 8, 602, 10, 602, 12, 602, 8982, 9, 602, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 3, 603, 8991, 8, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 3, 603, 9017, 8, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 1, 603, 3, 603, 9028, 8, 603, 5, 603, 9030, 8, 603, 10, 603, 12, 603, 9033, 9, 603, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 3, 604, 9040, 8, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 3, 604, 9063, 8, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 3, 604, 9071, 8, 604, 1, 605, 1, 605, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 3, 606, 9081, 8, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 1, 606, 3, 606, 9095, 8, 606, 1, 606, 1, 606, 1, 607, 1, 607, 1, 607, 1, 607, 1, 607, 1, 607, 3, 607, 9105, 8, 607, 1, 608, 1, 608, 3, 608, 9109, 8, 608, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9123, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9130, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9137, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9144, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9169, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9198, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9237, 8, 609, 3, 609, 9239, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9267, 8, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 1, 609, 3, 609, 9288, 8, 609, 1, 610, 1, 610, 1, 610, 1, 610, 1, 610, 3, 610, 9295, 8, 610, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 1, 611, 3, 611, 9308, 8, 611, 1, 612, 1, 612, 1, 612, 1, 612, 1, 612, 1, 613, 1, 613, 1, 613, 5, 613, 9318, 8, 613, 10, 613, 12, 613, 9321, 9, 613, 1, 614, 1, 614, 1, 614, 3, 614, 9326, 8, 614, 1, 615, 1, 615, 1, 616, 1, 616, 1, 616, 1, 616, 1, 616, 3, 616, 9335, 8, 616, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 1, 617, 3, 617, 9352, 8, 617, 1, 618, 1, 618, 1, 618, 1, 619, 1, 619, 1, 619, 1, 619, 1, 619, 1, 619, 1, 619, 3, 619, 9364, 8, 619, 1, 620, 1, 620, 1, 620, 1, 620, 1, 620, 1, 620, 1, 620, 3, 620, 9373, 8, 620, 1, 621, 1, 621, 1, 621, 3, 621, 9378, 8, 621, 1, 622, 1, 622, 1, 622, 5, 622, 9383, 8, 622, 10, 622, 12, 622, 9386, 9, 622, 1, 623, 1, 623, 1, 623, 1, 623, 1, 624, 1, 624, 1, 624, 3, 624, 9395, 8, 624, 1, 624, 3, 624, 9398, 8, 624, 1, 625, 1, 625, 1, 625, 1, 625, 1, 625, 1, 625, 1, 625, 1, 626, 1, 626, 3, 626, 9409, 8, 626, 1, 627, 1, 627, 1, 627, 1, 627, 3, 627, 9415, 8, 627, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 1, 628, 3, 628, 9430, 8, 628, 1, 629, 1, 629, 1, 629, 1, 629, 1, 629, 1, 629, 3, 629, 9438, 8, 629, 1, 630, 1, 630, 1, 630, 1, 630, 1, 630, 1, 630, 1, 630, 3, 630, 9447, 8, 630, 1, 631, 1, 631, 1, 631, 1, 631, 1, 631, 1, 631, 1, 631, 3, 631, 9456, 8, 631, 1, 631, 3, 631, 9459, 8, 631, 1, 632, 1, 632, 1, 632, 3, 632, 9464, 8, 632, 1, 632, 1, 632, 1, 632, 1, 632, 1, 632, 1, 632, 1, 632, 3, 632, 9473, 8, 632, 1, 633, 1, 633, 1, 633, 3, 633, 9478, 8, 633, 1, 633, 1, 633, 1, 634, 1, 634, 1, 634, 1, 634, 1, 634, 1, 634, 1, 635, 1, 635, 1, 636, 1, 636, 3, 636, 9492, 8, 636, 1, 637, 1, 637, 1, 638, 1, 638, 1, 638, 1, 638, 1, 638, 1, 638, 3, 638, 9502, 8, 638, 1, 639, 1, 639, 1, 639, 1, 639, 1, 639, 1, 639, 3, 639, 9510, 8, 639, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 1, 640, 3, 640, 9524, 8, 640, 1, 641, 1, 641, 1, 641, 5, 641, 9529, 8, 641, 10, 641, 12, 641, 9532, 9, 641, 1, 642, 1, 642, 1, 642, 5, 642, 9537, 8, 642, 10, 642, 12, 642, 9540, 9, 642, 1, 643, 1, 643, 1, 643, 1, 643, 1, 643, 3, 643, 9547, 8, 643, 1, 644, 1, 644, 1, 644, 5, 644, 9552, 8, 644, 10, 644, 12, 644, 9555, 9, 644, 1, 645, 1, 645, 1, 645, 3, 645, 9560, 8, 645, 1, 645, 1, 645, 1, 646, 1, 646, 1, 646, 5, 646, 9567, 8, 646, 10, 646, 12, 646, 9570, 9, 646, 1, 647, 1, 647, 1, 647, 1, 647, 1, 647, 3, 647, 9577, 8, 647, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 1, 648, 3, 648, 9587, 8, 648, 1, 649, 1, 649, 1, 650, 1, 650, 1, 650, 1, 650, 1, 650, 1, 650, 1, 650, 3, 650, 9598, 8, 650, 1, 651, 1, 651, 1, 651, 1, 651, 1, 651, 3, 651, 9605, 8, 651, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 1, 652, 3, 652, 9635, 8, 652, 1, 653, 1, 653, 1, 653, 1, 653, 1, 653, 1, 653, 1, 653, 3, 653, 9644, 8, 653, 1, 654, 1, 654, 1, 654, 1, 654, 1, 654, 3, 654, 9651, 8, 654, 1, 655, 1, 655, 1, 655, 1, 655, 1, 655, 1, 655, 1, 656, 4, 656, 9660, 8, 656, 11, 656, 12, 656, 9661, 1, 657, 1, 657, 1, 657, 1, 657, 1, 657, 1, 658, 1, 658, 1, 658, 3, 658, 9672, 8, 658, 1, 659, 1, 659, 3, 659, 9676, 8, 659, 1, 660, 1, 660, 3, 660, 9680, 8, 660, 1, 661, 1, 661, 1, 661, 3, 661, 9685, 8, 661, 1, 661, 1, 661, 1, 661, 1, 661, 1, 661, 1, 661, 3, 661, 9693, 8, 661, 1, 661, 1, 661, 3, 661, 9697, 8, 661, 1, 662, 1, 662, 3, 662, 9701, 8, 662, 1, 663, 4, 663, 9704, 8, 663, 11, 663, 12, 663, 9705, 1, 664, 5, 664, 9709, 8, 664, 10, 664, 12, 664, 9712, 9, 664, 1, 665, 1, 665, 3, 665, 9716, 8, 665, 1, 666, 1, 666, 1, 666, 5, 666, 9721, 8, 666, 10, 666, 12, 666, 9724, 9, 666, 1, 667, 1, 667, 1, 667, 1, 667, 1, 667, 3, 667, 9731, 8, 667, 1, 667, 3, 667, 9734, 8, 667, 1, 668, 1, 668, 1, 668, 5, 668, 9739, 8, 668, 10, 668, 12, 668, 9742, 9, 668, 1, 669, 1, 669, 3, 669, 9746, 8, 669, 1, 670, 1, 670, 1, 670, 5, 670, 9751, 8, 670, 10, 670, 12, 670, 9754, 9, 670, 1, 671, 1, 671, 1, 672, 1, 672, 1, 673, 1, 673, 1, 674, 1, 674, 1, 674, 1, 674, 1, 674, 1, 674, 1, 674, 3, 674, 9769, 8, 674, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 3, 675, 9784, 8, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 1, 675, 3, 675, 9798, 8, 675, 1, 675, 1, 675, 1, 675, 3, 675, 9803, 8, 675, 1, 676, 1, 676, 1, 677, 1, 677, 1, 678, 1, 678, 1, 679, 1, 679, 1, 680, 1, 680, 1, 680, 1, 681, 1, 681, 1, 681, 1, 681, 5, 681, 9820, 8, 681, 10, 681, 12, 681, 9823, 9, 681, 1, 681, 1, 681, 3, 681, 9827, 8, 681, 1, 682, 1, 682, 1, 682, 3, 682, 9832, 8, 682, 1, 683, 1, 683, 1, 683, 1, 683, 1, 683, 3, 683, 9839, 8, 683, 1, 684, 1, 684, 1, 685, 1, 685, 1, 685, 3, 685, 9846, 8, 685, 1, 686, 1, 686, 1, 686, 5, 686, 9851, 8, 686, 10, 686, 12, 686, 9854, 9, 686, 1, 687, 1, 687, 1, 687, 1, 687, 1, 687, 1, 687, 3, 687, 9862, 8, 687, 1, 688, 1, 688, 1, 688, 1, 688, 3, 688, 9868, 8, 688, 1, 689, 1, 689, 1, 689, 1, 689, 3, 689, 9874, 8, 689, 1, 690, 1, 690, 1, 690, 1, 690, 3, 690, 9880, 8, 690, 1, 691, 1, 691, 1, 691, 1, 691, 1, 691, 1, 691, 3, 691, 9888, 8, 691, 1, 692, 1, 692, 1, 692, 1, 692, 1, 692, 1, 692, 1, 692, 3, 692, 9897, 8, 692, 1, 693, 1, 693, 1, 694, 1, 694, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 1, 695, 3, 695, 9955, 8, 695, 1, 696, 1, 696, 1, 697, 1, 697, 1, 698, 1, 698, 1, 699, 1, 699, 1, 699, 1, 699, 1, 700, 5, 700, 9968, 8, 700, 10, 700, 12, 700, 9971, 9, 700, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 1, 701, 3, 701, 9993, 8, 701, 1, 702, 1, 702, 1, 703, 1, 703, 1, 703, 1, 703, 3, 703, 10001, 8, 703, 1, 704, 1, 704, 3, 704, 10005, 8, 704, 1, 705, 1, 705, 1, 705, 1, 705, 1, 705, 1, 705, 1, 705, 1, 706, 1, 706, 1, 706, 3, 706, 10017, 8, 706, 3, 706, 10019, 8, 706, 1, 707, 1, 707, 1, 708, 4, 708, 10024, 8, 708, 11, 708, 12, 708, 10025, 1, 709, 1, 709, 1, 709, 1, 709, 1, 710, 1, 710, 1, 710, 3, 710, 10035, 8, 710, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 1, 711, 3, 711, 10053, 8, 711, 1, 711, 1, 711, 1, 712, 1, 712, 1, 712, 1, 712, 3, 712, 10061, 8, 712, 1, 713, 1, 713, 1, 714, 1, 714, 1, 714, 1, 714, 1, 714, 3, 714, 10070, 8, 714, 1, 715, 1, 715, 1, 715, 5, 715, 10075, 8, 715, 10, 715, 12, 715, 10078, 9, 715, 1, 716, 1, 716, 1, 716, 1, 717, 1, 717, 1, 718, 1, 718, 3, 718, 10087, 8, 718, 1, 719, 1, 719, 1, 720, 1, 720, 3, 720, 10093, 8, 720, 1, 721, 1, 721, 1, 722, 1, 722, 1, 722, 3, 722, 10100, 8, 722, 1, 723, 1, 723, 1, 723, 3, 723, 10105, 8, 723, 1, 724, 1, 724, 1, 724, 1, 724, 3, 724, 10111, 8, 724, 1, 725, 1, 725, 3, 725, 10115, 8, 725, 1, 726, 1, 726, 1, 727, 5, 727, 10120, 8, 727, 10, 727, 12, 727, 10123, 9, 727, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 1, 728, 3, 728, 10152, 8, 728, 1, 729, 1, 729, 1, 729, 1, 729, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 1, 730, 3, 730, 10172, 8, 730, 1, 731, 1, 731, 3, 731, 10176, 8, 731, 1, 732, 1, 732, 1, 732, 1, 732, 1, 732, 1, 733, 1, 733, 1, 733, 1, 733, 1, 733, 1, 733, 1, 734, 1, 734, 1, 734, 3, 734, 10192, 8, 734, 1, 735, 1, 735, 1, 735, 5, 735, 10197, 8, 735, 10, 735, 12, 735, 10200, 9, 735, 1, 736, 1, 736, 1, 736, 1, 736, 1, 737, 1, 737, 1, 738, 1, 738, 1, 739, 1, 739, 3, 739, 10212, 8, 739, 1, 739, 1, 739, 1, 739, 1, 739, 5, 739, 10218, 8, 739, 10, 739, 12, 739, 10221, 9, 739, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 740, 1, 741, 1, 741, 1, 741, 1, 741, 1, 741, 5, 741, 10238, 8, 741, 10, 741, 12, 741, 10241, 9, 741, 1, 742, 1, 742, 1, 742, 3, 742, 10246, 8, 742, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 743, 1, 744, 1, 744, 3, 744, 10258, 8, 744, 1, 745, 4, 745, 10261, 8, 745, 11, 745, 12, 745, 10262, 1, 746, 1, 746, 1, 746, 1, 746, 1, 746, 1, 747, 1, 747, 1, 747, 3, 747, 10273, 8, 747, 1, 748, 1, 748, 1, 748, 1, 749, 1, 749, 1, 749, 1, 749, 1, 749, 1, 750, 1, 750, 1, 750, 1, 750, 1, 750, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 1, 751, 3, 751, 10305, 8, 751, 1, 752, 1, 752, 1, 752, 3, 752, 10310, 8, 752, 1, 753, 1, 753, 1, 753, 1, 753, 1, 753, 5, 753, 10317, 8, 753, 10, 753, 12, 753, 10320, 9, 753, 1, 753, 1, 753, 3, 753, 10324, 8, 753, 1, 754, 1, 754, 3, 754, 10328, 8, 754, 1, 755, 1, 755, 1, 755, 3, 755, 10333, 8, 755, 1, 756, 1, 756, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 757, 1, 758, 1, 758, 1, 758, 3, 758, 10349, 8, 758, 1, 759, 1, 759, 1, 759, 1, 759, 1, 759, 1, 760, 1, 760, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 1, 761, 3, 761, 10367, 8, 761, 1, 761, 3, 761, 10370, 8, 761, 1, 761, 1, 761, 1, 762, 1, 762, 3, 762, 10376, 8, 762, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 1, 763, 3, 763, 10404, 8, 763, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 1, 764, 3, 764, 10414, 8, 764, 1, 765, 1, 765, 1, 765, 4, 765, 10419, 8, 765, 11, 765, 12, 765, 10420, 3, 765, 10423, 8, 765, 1, 766, 1, 766, 1, 766, 3, 766, 10428, 8, 766, 1, 767, 1, 767, 1, 767, 1, 767, 1, 768, 1, 768, 1, 768, 5, 768, 10437, 8, 768, 10, 768, 12, 768, 10440, 9, 768, 1, 769, 1, 769, 1, 769, 1, 769, 1, 769, 1, 770, 1, 770, 1, 770, 3, 770, 10450, 8, 770, 1, 771, 1, 771, 1, 771, 1, 771, 1, 771, 1, 771, 1, 771, 1, 772, 1, 772, 1, 772, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 1, 773, 3, 773, 10471, 8, 773, 1, 773, 1, 773, 1, 774, 1, 774, 1, 774, 3, 774, 10478, 8, 774, 1, 775, 1, 775, 1, 775, 5, 775, 10483, 8, 775, 10, 775, 12, 775, 10486, 9, 775, 1, 776, 1, 776, 1, 776, 3, 776, 10491, 8, 776, 1, 776, 3, 776, 10494, 8, 776, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 3, 777, 10505, 8, 777, 1, 777, 1, 777, 1, 777, 1, 777, 1, 777, 3, 777, 10512, 8, 777, 3, 777, 10514, 8, 777, 1, 777, 1, 777, 1, 778, 1, 778, 1, 778, 1, 778, 1, 778, 3, 778, 10523, 8, 778, 1, 779, 1, 779, 1, 779, 5, 779, 10528, 8, 779, 10, 779, 12, 779, 10531, 9, 779, 1, 780, 1, 780, 1, 780, 3, 780, 10536, 8, 780, 1, 781, 1, 781, 1, 781, 1, 781, 3, 781, 10542, 8, 781, 1, 782, 1, 782, 3, 782, 10546, 8, 782, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 783, 1, 784, 1, 784, 1, 785, 1, 785, 1, 785, 3, 785, 10561, 8, 785, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 1, 786, 3, 786, 10578, 8, 786, 3, 786, 10580, 8, 786, 1, 787, 1, 787, 1, 787, 1, 787, 1, 787, 1, 788, 1, 788, 1, 788, 1, 788, 1, 789, 1, 789, 1, 789, 1, 790, 1, 790, 1, 790, 1, 790, 1, 791, 1, 791, 1, 791, 1, 791, 1, 792, 1, 792, 3, 792, 10604, 8, 792, 1, 792, 1, 792, 3, 792, 10608, 8, 792, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 1, 793, 3, 793, 10619, 8, 793, 1, 793, 3, 793, 10622, 8, 793, 1, 794, 1, 794, 3, 794, 10626, 8, 794, 1, 795, 1, 795, 1, 795, 3, 795, 10631, 8, 795, 1, 796, 4, 796, 10634, 8, 796, 11, 796, 12, 796, 10635, 1, 797, 1, 797, 1, 797, 1, 797, 1, 797, 1, 798, 1, 798, 1, 798, 5, 798, 10646, 8, 798, 10, 798, 12, 798, 10649, 9, 798, 1, 799, 1, 799, 1, 799, 3, 799, 10654, 8, 799, 1, 800, 1, 800, 3, 800, 10658, 8, 800, 1, 801, 1, 801, 3, 801, 10662, 8, 801, 1, 802, 1, 802, 3, 802, 10666, 8, 802, 1, 803, 1, 803, 1, 803, 3, 803, 10671, 8, 803, 1, 804, 1, 804, 3, 804, 10675, 8, 804, 1, 805, 1, 805, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 806, 1, 807, 1, 807, 1, 808, 1, 808, 1, 809, 1, 809, 1, 810, 1, 810, 1, 811, 1, 811, 1, 811, 1, 812, 1, 812, 1, 812, 1, 812, 1, 812, 3, 812, 10703, 8, 812, 1, 812, 0, 1, 1206, 813, 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, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, 532, 534, 536, 538, 540, 542, 544, 546, 548, 550, 552, 554, 556, 558, 560, 562, 564, 566, 568, 570, 572, 574, 576, 578, 580, 582, 584, 586, 588, 590, 592, 594, 596, 598, 600, 602, 604, 606, 608, 610, 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 662, 664, 666, 668, 670, 672, 674, 676, 678, 680, 682, 684, 686, 688, 690, 692, 694, 696, 698, 700, 702, 704, 706, 708, 710, 712, 714, 716, 718, 720, 722, 724, 726, 728, 730, 732, 734, 736, 738, 740, 742, 744, 746, 748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 782, 784, 786, 788, 790, 792, 794, 796, 798, 800, 802, 804, 806, 808, 810, 812, 814, 816, 818, 820, 822, 824, 826, 828, 830, 832, 834, 836, 838, 840, 842, 844, 846, 848, 850, 852, 854, 856, 858, 860, 862, 864, 866, 868, 870, 872, 874, 876, 878, 880, 882, 884, 886, 888, 890, 892, 894, 896, 898, 900, 902, 904, 906, 908, 910, 912, 914, 916, 918, 920, 922, 924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 944, 946, 948, 950, 952, 954, 956, 958, 960, 962, 964, 966, 968, 970, 972, 974, 976, 978, 980, 982, 984, 986, 988, 990, 992, 994, 996, 998, 1000, 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018, 1020, 1022, 1024, 1026, 1028, 1030, 1032, 1034, 1036, 1038, 1040, 1042, 1044, 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060, 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076, 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1092, 1094, 1096, 1098, 1100, 1102, 1104, 1106, 1108, 1110, 1112, 1114, 1116, 1118, 1120, 1122, 1124, 1126, 1128, 1130, 1132, 1134, 1136, 1138, 1140, 1142, 1144, 1146, 1148, 1150, 1152, 1154, 1156, 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174, 1176, 1178, 1180, 1182, 1184, 1186, 1188, 1190, 1192, 1194, 1196, 1198, 1200, 1202, 1204, 1206, 1208, 1210, 1212, 1214, 1216, 1218, 1220, 1222, 1224, 1226, 1228, 1230, 1232, 1234, 1236, 1238, 1240, 1242, 1244, 1246, 1248, 1250, 1252, 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268, 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288, 1290, 1292, 1294, 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1316, 1318, 1320, 1322, 1324, 1326, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388, 1390, 1392, 1394, 1396, 1398, 1400, 1402, 1404, 1406, 1408, 1410, 1412, 1414, 1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436, 1438, 1440, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532, 1534, 1536, 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568, 1570, 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, 1618, 1620, 1622, 1624, 0, 66, 2, 0, 195, 195, 357, 357, 2, 0, 66, 66, 311, 311, 2, 0, 99, 99, 311, 311, 3, 0, 66, 66, 99, 99, 311, 311, 2, 0, 133, 133, 191, 191, 2, 0, 245, 245, 325, 325, 2, 0, 10, 10, 94, 94, 2, 0, 162, 162, 356, 356, 2, 0, 180, 180, 221, 221, 5, 0, 30, 30, 281, 281, 322, 322, 345, 345, 347, 347, 2, 0, 64, 64, 94, 94, 2, 0, 345, 345, 347, 347, 2, 0, 200, 200, 224, 224, 9, 0, 30, 30, 160, 160, 165, 165, 179, 179, 219, 219, 227, 227, 335, 335, 338, 338, 438, 438, 3, 0, 113, 113, 277, 277, 329, 329, 2, 0, 53, 53, 78, 78, 3, 0, 173, 173, 252, 252, 255, 255, 5, 0, 30, 30, 88, 88, 182, 182, 232, 232, 362, 362, 2, 0, 92, 92, 226, 226, 1, 0, 448, 449, 2, 0, 92, 92, 407, 407, 2, 0, 334, 334, 407, 407, 2, 0, 211, 211, 289, 289, 3, 0, 314, 314, 350, 350, 445, 445, 2, 0, 64, 64, 68, 68, 5, 0, 212, 212, 322, 322, 343, 343, 354, 354, 455, 456, 2, 0, 10, 10, 53, 53, 3, 0, 211, 211, 289, 289, 442, 442, 3, 0, 175, 175, 316, 316, 342, 342, 4, 0, 88, 88, 182, 182, 232, 232, 362, 362, 2, 0, 151, 151, 245, 245, 2, 0, 306, 306, 326, 326, 1, 0, 31, 32, 2, 0, 99, 99, 342, 342, 2, 0, 201, 201, 327, 327, 2, 0, 213, 213, 245, 245, 2, 0, 313, 313, 407, 407, 2, 0, 207, 207, 261, 261, 4, 0, 113, 113, 115, 115, 119, 119, 126, 126, 2, 0, 353, 353, 477, 477, 2, 0, 384, 385, 399, 399, 1, 0, 384, 385, 1, 0, 411, 412, 1, 0, 18, 19, 2, 0, 117, 117, 122, 122, 5, 0, 10, 10, 16, 17, 21, 21, 23, 23, 25, 25, 1, 0, 12, 13, 3, 0, 9, 9, 14, 14, 27, 27, 2, 0, 30, 30, 56, 56, 3, 0, 39, 39, 73, 73, 95, 95, 2, 0, 166, 166, 188, 188, 2, 0, 297, 297, 450, 450, 2, 0, 208, 208, 282, 282, 3, 0, 30, 30, 34, 34, 90, 90, 6, 0, 9, 10, 12, 17, 21, 21, 23, 23, 25, 25, 27, 27, 2, 0, 20, 20, 22, 22, 1, 0, 483, 486, 11, 0, 124, 124, 129, 249, 251, 252, 254, 303, 305, 379, 433, 452, 455, 469, 471, 471, 473, 473, 475, 475, 478, 488, 5, 0, 106, 118, 120, 123, 125, 125, 127, 128, 472, 472, 4, 0, 30, 52, 54, 70, 72, 105, 454, 454, 5, 0, 304, 304, 418, 424, 504, 504, 513, 513, 521, 635, 2, 0, 62, 62, 116, 116, 2, 0, 10, 10, 20, 20, 2, 0, 167, 167, 507, 507, 2, 0, 144, 144, 210, 210, 36, 0, 33, 33, 35, 35, 43, 44, 53, 53, 57, 57, 61, 61, 92, 92, 116, 116, 123, 123, 130, 130, 144, 144, 153, 153, 157, 157, 161, 161, 167, 167, 172, 172, 207, 207, 210, 210, 232, 232, 240, 240, 258, 258, 261, 262, 272, 272, 286, 286, 300, 300, 306, 306, 312, 312, 316, 317, 326, 326, 353, 353, 433, 434, 477, 477, 490, 502, 506, 512, 514, 518, 520, 520, 11570, 0, 1626, 1, 0, 0, 0, 2, 1629, 1, 0, 0, 0, 4, 1631, 1, 0, 0, 0, 6, 1639, 1, 0, 0, 0, 8, 1767, 1, 0, 0, 0, 10, 1769, 1, 0, 0, 0, 12, 1773, 1, 0, 0, 0, 14, 1776, 1, 0, 0, 0, 16, 1784, 1, 0, 0, 0, 18, 1789, 1, 0, 0, 0, 20, 1795, 1, 0, 0, 0, 22, 1816, 1, 0, 0, 0, 24, 1828, 1, 0, 0, 0, 26, 1830, 1, 0, 0, 0, 28, 1836, 1, 0, 0, 0, 30, 1846, 1, 0, 0, 0, 32, 1848, 1, 0, 0, 0, 34, 1857, 1, 0, 0, 0, 36, 1865, 1, 0, 0, 0, 38, 1871, 1, 0, 0, 0, 40, 1878, 1, 0, 0, 0, 42, 1880, 1, 0, 0, 0, 44, 1898, 1, 0, 0, 0, 46, 1903, 1, 0, 0, 0, 48, 1912, 1, 0, 0, 0, 50, 1914, 1, 0, 0, 0, 52, 1928, 1, 0, 0, 0, 54, 1930, 1, 0, 0, 0, 56, 1959, 1, 0, 0, 0, 58, 1961, 1, 0, 0, 0, 60, 1969, 1, 0, 0, 0, 62, 1979, 1, 0, 0, 0, 64, 1986, 1, 0, 0, 0, 66, 1992, 1, 0, 0, 0, 68, 2009, 1, 0, 0, 0, 70, 2014, 1, 0, 0, 0, 72, 2018, 1, 0, 0, 0, 74, 2020, 1, 0, 0, 0, 76, 2031, 1, 0, 0, 0, 78, 2035, 1, 0, 0, 0, 80, 2040, 1, 0, 0, 0, 82, 2045, 1, 0, 0, 0, 84, 2047, 1, 0, 0, 0, 86, 2059, 1, 0, 0, 0, 88, 2066, 1, 0, 0, 0, 90, 2068, 1, 0, 0, 0, 92, 2070, 1, 0, 0, 0, 94, 2072, 1, 0, 0, 0, 96, 2184, 1, 0, 0, 0, 98, 2186, 1, 0, 0, 0, 100, 2202, 1, 0, 0, 0, 102, 2204, 1, 0, 0, 0, 104, 2460, 1, 0, 0, 0, 106, 2467, 1, 0, 0, 0, 108, 2472, 1, 0, 0, 0, 110, 2477, 1, 0, 0, 0, 112, 2482, 1, 0, 0, 0, 114, 2490, 1, 0, 0, 0, 116, 2492, 1, 0, 0, 0, 118, 2499, 1, 0, 0, 0, 120, 2501, 1, 0, 0, 0, 122, 2509, 1, 0, 0, 0, 124, 2521, 1, 0, 0, 0, 126, 2537, 1, 0, 0, 0, 128, 2565, 1, 0, 0, 0, 130, 2567, 1, 0, 0, 0, 132, 2570, 1, 0, 0, 0, 134, 2578, 1, 0, 0, 0, 136, 2583, 1, 0, 0, 0, 138, 2614, 1, 0, 0, 0, 140, 2616, 1, 0, 0, 0, 142, 2643, 1, 0, 0, 0, 144, 2645, 1, 0, 0, 0, 146, 2649, 1, 0, 0, 0, 148, 2654, 1, 0, 0, 0, 150, 2661, 1, 0, 0, 0, 152, 2666, 1, 0, 0, 0, 154, 2704, 1, 0, 0, 0, 156, 2708, 1, 0, 0, 0, 158, 2715, 1, 0, 0, 0, 160, 2719, 1, 0, 0, 0, 162, 2721, 1, 0, 0, 0, 164, 2729, 1, 0, 0, 0, 166, 2740, 1, 0, 0, 0, 168, 2742, 1, 0, 0, 0, 170, 2750, 1, 0, 0, 0, 172, 2752, 1, 0, 0, 0, 174, 2801, 1, 0, 0, 0, 176, 2805, 1, 0, 0, 0, 178, 2812, 1, 0, 0, 0, 180, 2814, 1, 0, 0, 0, 182, 2822, 1, 0, 0, 0, 184, 2833, 1, 0, 0, 0, 186, 2837, 1, 0, 0, 0, 188, 2839, 1, 0, 0, 0, 190, 2844, 1, 0, 0, 0, 192, 2854, 1, 0, 0, 0, 194, 2865, 1, 0, 0, 0, 196, 2905, 1, 0, 0, 0, 198, 2910, 1, 0, 0, 0, 200, 2917, 1, 0, 0, 0, 202, 2919, 1, 0, 0, 0, 204, 2927, 1, 0, 0, 0, 206, 2930, 1, 0, 0, 0, 208, 2937, 1, 0, 0, 0, 210, 2997, 1, 0, 0, 0, 212, 3002, 1, 0, 0, 0, 214, 3009, 1, 0, 0, 0, 216, 3011, 1, 0, 0, 0, 218, 3019, 1, 0, 0, 0, 220, 3027, 1, 0, 0, 0, 222, 3032, 1, 0, 0, 0, 224, 3034, 1, 0, 0, 0, 226, 3042, 1, 0, 0, 0, 228, 3058, 1, 0, 0, 0, 230, 3069, 1, 0, 0, 0, 232, 3071, 1, 0, 0, 0, 234, 3075, 1, 0, 0, 0, 236, 3085, 1, 0, 0, 0, 238, 3093, 1, 0, 0, 0, 240, 3097, 1, 0, 0, 0, 242, 3099, 1, 0, 0, 0, 244, 3106, 1, 0, 0, 0, 246, 3128, 1, 0, 0, 0, 248, 3133, 1, 0, 0, 0, 250, 3140, 1, 0, 0, 0, 252, 3152, 1, 0, 0, 0, 254, 3157, 1, 0, 0, 0, 256, 3164, 1, 0, 0, 0, 258, 3166, 1, 0, 0, 0, 260, 3170, 1, 0, 0, 0, 262, 3184, 1, 0, 0, 0, 264, 3195, 1, 0, 0, 0, 266, 3208, 1, 0, 0, 0, 268, 3222, 1, 0, 0, 0, 270, 3224, 1, 0, 0, 0, 272, 3238, 1, 0, 0, 0, 274, 3246, 1, 0, 0, 0, 276, 3248, 1, 0, 0, 0, 278, 3255, 1, 0, 0, 0, 280, 3266, 1, 0, 0, 0, 282, 3277, 1, 0, 0, 0, 284, 3284, 1, 0, 0, 0, 286, 3287, 1, 0, 0, 0, 288, 3321, 1, 0, 0, 0, 290, 3325, 1, 0, 0, 0, 292, 3333, 1, 0, 0, 0, 294, 3335, 1, 0, 0, 0, 296, 3343, 1, 0, 0, 0, 298, 3358, 1, 0, 0, 0, 300, 3360, 1, 0, 0, 0, 302, 3367, 1, 0, 0, 0, 304, 3373, 1, 0, 0, 0, 306, 3377, 1, 0, 0, 0, 308, 3381, 1, 0, 0, 0, 310, 3383, 1, 0, 0, 0, 312, 3394, 1, 0, 0, 0, 314, 3396, 1, 0, 0, 0, 316, 3404, 1, 0, 0, 0, 318, 3418, 1, 0, 0, 0, 320, 3428, 1, 0, 0, 0, 322, 3430, 1, 0, 0, 0, 324, 3439, 1, 0, 0, 0, 326, 3442, 1, 0, 0, 0, 328, 3549, 1, 0, 0, 0, 330, 3551, 1, 0, 0, 0, 332, 3567, 1, 0, 0, 0, 334, 3570, 1, 0, 0, 0, 336, 3576, 1, 0, 0, 0, 338, 3593, 1, 0, 0, 0, 340, 3601, 1, 0, 0, 0, 342, 3603, 1, 0, 0, 0, 344, 3611, 1, 0, 0, 0, 346, 3616, 1, 0, 0, 0, 348, 3631, 1, 0, 0, 0, 350, 3633, 1, 0, 0, 0, 352, 3636, 1, 0, 0, 0, 354, 3638, 1, 0, 0, 0, 356, 3665, 1, 0, 0, 0, 358, 3670, 1, 0, 0, 0, 360, 3672, 1, 0, 0, 0, 362, 3679, 1, 0, 0, 0, 364, 3681, 1, 0, 0, 0, 366, 3747, 1, 0, 0, 0, 368, 3749, 1, 0, 0, 0, 370, 3764, 1, 0, 0, 0, 372, 3772, 1, 0, 0, 0, 374, 3795, 1, 0, 0, 0, 376, 3799, 1, 0, 0, 0, 378, 3819, 1, 0, 0, 0, 380, 3821, 1, 0, 0, 0, 382, 3830, 1, 0, 0, 0, 384, 3841, 1, 0, 0, 0, 386, 3856, 1, 0, 0, 0, 388, 3865, 1, 0, 0, 0, 390, 3870, 1, 0, 0, 0, 392, 3875, 1, 0, 0, 0, 394, 3880, 1, 0, 0, 0, 396, 3885, 1, 0, 0, 0, 398, 3887, 1, 0, 0, 0, 400, 3889, 1, 0, 0, 0, 402, 3898, 1, 0, 0, 0, 404, 3938, 1, 0, 0, 0, 406, 3944, 1, 0, 0, 0, 408, 3946, 1, 0, 0, 0, 410, 3961, 1, 0, 0, 0, 412, 3966, 1, 0, 0, 0, 414, 3969, 1, 0, 0, 0, 416, 3973, 1, 0, 0, 0, 418, 3978, 1, 0, 0, 0, 420, 3980, 1, 0, 0, 0, 422, 3982, 1, 0, 0, 0, 424, 3989, 1, 0, 0, 0, 426, 3993, 1, 0, 0, 0, 428, 3995, 1, 0, 0, 0, 430, 4003, 1, 0, 0, 0, 432, 4005, 1, 0, 0, 0, 434, 4009, 1, 0, 0, 0, 436, 4022, 1, 0, 0, 0, 438, 4027, 1, 0, 0, 0, 440, 4032, 1, 0, 0, 0, 442, 4046, 1, 0, 0, 0, 444, 4074, 1, 0, 0, 0, 446, 4076, 1, 0, 0, 0, 448, 4084, 1, 0, 0, 0, 450, 4090, 1, 0, 0, 0, 452, 4098, 1, 0, 0, 0, 454, 4110, 1, 0, 0, 0, 456, 4112, 1, 0, 0, 0, 458, 4227, 1, 0, 0, 0, 460, 4229, 1, 0, 0, 0, 462, 4233, 1, 0, 0, 0, 464, 4241, 1, 0, 0, 0, 466, 4252, 1, 0, 0, 0, 468, 4254, 1, 0, 0, 0, 470, 4258, 1, 0, 0, 0, 472, 4266, 1, 0, 0, 0, 474, 4272, 1, 0, 0, 0, 476, 4274, 1, 0, 0, 0, 478, 4319, 1, 0, 0, 0, 480, 4325, 1, 0, 0, 0, 482, 4327, 1, 0, 0, 0, 484, 4341, 1, 0, 0, 0, 486, 4374, 1, 0, 0, 0, 488, 4378, 1, 0, 0, 0, 490, 4383, 1, 0, 0, 0, 492, 4392, 1, 0, 0, 0, 494, 4396, 1, 0, 0, 0, 496, 4398, 1, 0, 0, 0, 498, 4423, 1, 0, 0, 0, 500, 4425, 1, 0, 0, 0, 502, 4445, 1, 0, 0, 0, 504, 4465, 1, 0, 0, 0, 506, 4485, 1, 0, 0, 0, 508, 4487, 1, 0, 0, 0, 510, 4493, 1, 0, 0, 0, 512, 4578, 1, 0, 0, 0, 514, 4603, 1, 0, 0, 0, 516, 4610, 1, 0, 0, 0, 518, 4626, 1, 0, 0, 0, 520, 4628, 1, 0, 0, 0, 522, 4630, 1, 0, 0, 0, 524, 4638, 1, 0, 0, 0, 526, 4644, 1, 0, 0, 0, 528, 4648, 1, 0, 0, 0, 530, 4656, 1, 0, 0, 0, 532, 4667, 1, 0, 0, 0, 534, 4816, 1, 0, 0, 0, 536, 4820, 1, 0, 0, 0, 538, 4913, 1, 0, 0, 0, 540, 4918, 1, 0, 0, 0, 542, 4922, 1, 0, 0, 0, 544, 4928, 1, 0, 0, 0, 546, 4996, 1, 0, 0, 0, 548, 4998, 1, 0, 0, 0, 550, 5002, 1, 0, 0, 0, 552, 5004, 1, 0, 0, 0, 554, 5031, 1, 0, 0, 0, 556, 5048, 1, 0, 0, 0, 558, 5050, 1, 0, 0, 0, 560, 5067, 1, 0, 0, 0, 562, 5127, 1, 0, 0, 0, 564, 5129, 1, 0, 0, 0, 566, 5140, 1, 0, 0, 0, 568, 5146, 1, 0, 0, 0, 570, 5148, 1, 0, 0, 0, 572, 5172, 1, 0, 0, 0, 574, 5178, 1, 0, 0, 0, 576, 5184, 1, 0, 0, 0, 578, 5186, 1, 0, 0, 0, 580, 5195, 1, 0, 0, 0, 582, 5207, 1, 0, 0, 0, 584, 5236, 1, 0, 0, 0, 586, 5238, 1, 0, 0, 0, 588, 5275, 1, 0, 0, 0, 590, 5279, 1, 0, 0, 0, 592, 5283, 1, 0, 0, 0, 594, 5287, 1, 0, 0, 0, 596, 5292, 1, 0, 0, 0, 598, 5294, 1, 0, 0, 0, 600, 5313, 1, 0, 0, 0, 602, 5326, 1, 0, 0, 0, 604, 5334, 1, 0, 0, 0, 606, 5336, 1, 0, 0, 0, 608, 5347, 1, 0, 0, 0, 610, 5351, 1, 0, 0, 0, 612, 5356, 1, 0, 0, 0, 614, 5363, 1, 0, 0, 0, 616, 5365, 1, 0, 0, 0, 618, 5386, 1, 0, 0, 0, 620, 5388, 1, 0, 0, 0, 622, 5394, 1, 0, 0, 0, 624, 5402, 1, 0, 0, 0, 626, 5418, 1, 0, 0, 0, 628, 5420, 1, 0, 0, 0, 630, 5426, 1, 0, 0, 0, 632, 5447, 1, 0, 0, 0, 634, 5456, 1, 0, 0, 0, 636, 5462, 1, 0, 0, 0, 638, 5464, 1, 0, 0, 0, 640, 5480, 1, 0, 0, 0, 642, 5482, 1, 0, 0, 0, 644, 5487, 1, 0, 0, 0, 646, 5489, 1, 0, 0, 0, 648, 5504, 1, 0, 0, 0, 650, 5512, 1, 0, 0, 0, 652, 5515, 1, 0, 0, 0, 654, 5524, 1, 0, 0, 0, 656, 5565, 1, 0, 0, 0, 658, 5575, 1, 0, 0, 0, 660, 5582, 1, 0, 0, 0, 662, 5584, 1, 0, 0, 0, 664, 5599, 1, 0, 0, 0, 666, 5601, 1, 0, 0, 0, 668, 5604, 1, 0, 0, 0, 670, 5612, 1, 0, 0, 0, 672, 5619, 1, 0, 0, 0, 674, 5625, 1, 0, 0, 0, 676, 5663, 1, 0, 0, 0, 678, 5677, 1, 0, 0, 0, 680, 5691, 1, 0, 0, 0, 682, 5715, 1, 0, 0, 0, 684, 5722, 1, 0, 0, 0, 686, 5727, 1, 0, 0, 0, 688, 5735, 1, 0, 0, 0, 690, 5738, 1, 0, 0, 0, 692, 5742, 1, 0, 0, 0, 694, 5749, 1, 0, 0, 0, 696, 5785, 1, 0, 0, 0, 698, 5792, 1, 0, 0, 0, 700, 5794, 1, 0, 0, 0, 702, 5807, 1, 0, 0, 0, 704, 5809, 1, 0, 0, 0, 706, 5854, 1, 0, 0, 0, 708, 5856, 1, 0, 0, 0, 710, 5891, 1, 0, 0, 0, 712, 5893, 1, 0, 0, 0, 714, 5895, 1, 0, 0, 0, 716, 5897, 1, 0, 0, 0, 718, 5905, 1, 0, 0, 0, 720, 5919, 1, 0, 0, 0, 722, 6389, 1, 0, 0, 0, 724, 6393, 1, 0, 0, 0, 726, 6398, 1, 0, 0, 0, 728, 6457, 1, 0, 0, 0, 730, 6461, 1, 0, 0, 0, 732, 6680, 1, 0, 0, 0, 734, 6682, 1, 0, 0, 0, 736, 6690, 1, 0, 0, 0, 738, 6706, 1, 0, 0, 0, 740, 6713, 1, 0, 0, 0, 742, 6715, 1, 0, 0, 0, 744, 6906, 1, 0, 0, 0, 746, 6908, 1, 0, 0, 0, 748, 6916, 1, 0, 0, 0, 750, 6924, 1, 0, 0, 0, 752, 6953, 1, 0, 0, 0, 754, 6955, 1, 0, 0, 0, 756, 6964, 1, 0, 0, 0, 758, 6972, 1, 0, 0, 0, 760, 7011, 1, 0, 0, 0, 762, 7025, 1, 0, 0, 0, 764, 7027, 1, 0, 0, 0, 766, 7047, 1, 0, 0, 0, 768, 7049, 1, 0, 0, 0, 770, 7062, 1, 0, 0, 0, 772, 7066, 1, 0, 0, 0, 774, 7068, 1, 0, 0, 0, 776, 7073, 1, 0, 0, 0, 778, 7075, 1, 0, 0, 0, 780, 7082, 1, 0, 0, 0, 782, 7084, 1, 0, 0, 0, 784, 7091, 1, 0, 0, 0, 786, 7143, 1, 0, 0, 0, 788, 7148, 1, 0, 0, 0, 790, 7160, 1, 0, 0, 0, 792, 7162, 1, 0, 0, 0, 794, 7174, 1, 0, 0, 0, 796, 7182, 1, 0, 0, 0, 798, 7184, 1, 0, 0, 0, 800, 7216, 1, 0, 0, 0, 802, 7218, 1, 0, 0, 0, 804, 7221, 1, 0, 0, 0, 806, 7229, 1, 0, 0, 0, 808, 7232, 1, 0, 0, 0, 810, 7236, 1, 0, 0, 0, 812, 7251, 1, 0, 0, 0, 814, 7255, 1, 0, 0, 0, 816, 7257, 1, 0, 0, 0, 818, 7268, 1, 0, 0, 0, 820, 7273, 1, 0, 0, 0, 822, 7287, 1, 0, 0, 0, 824, 7295, 1, 0, 0, 0, 826, 7297, 1, 0, 0, 0, 828, 7303, 1, 0, 0, 0, 830, 7308, 1, 0, 0, 0, 832, 7315, 1, 0, 0, 0, 834, 7343, 1, 0, 0, 0, 836, 7345, 1, 0, 0, 0, 838, 7424, 1, 0, 0, 0, 840, 7426, 1, 0, 0, 0, 842, 7428, 1, 0, 0, 0, 844, 7452, 1, 0, 0, 0, 846, 7457, 1, 0, 0, 0, 848, 7472, 1, 0, 0, 0, 850, 7484, 1, 0, 0, 0, 852, 7486, 1, 0, 0, 0, 854, 7494, 1, 0, 0, 0, 856, 7496, 1, 0, 0, 0, 858, 7501, 1, 0, 0, 0, 860, 7506, 1, 0, 0, 0, 862, 7510, 1, 0, 0, 0, 864, 7514, 1, 0, 0, 0, 866, 7518, 1, 0, 0, 0, 868, 7522, 1, 0, 0, 0, 870, 7529, 1, 0, 0, 0, 872, 7531, 1, 0, 0, 0, 874, 7534, 1, 0, 0, 0, 876, 7544, 1, 0, 0, 0, 878, 7562, 1, 0, 0, 0, 880, 7573, 1, 0, 0, 0, 882, 7575, 1, 0, 0, 0, 884, 7583, 1, 0, 0, 0, 886, 7588, 1, 0, 0, 0, 888, 7593, 1, 0, 0, 0, 890, 7595, 1, 0, 0, 0, 892, 7606, 1, 0, 0, 0, 894, 7612, 1, 0, 0, 0, 896, 7641, 1, 0, 0, 0, 898, 7648, 1, 0, 0, 0, 900, 7660, 1, 0, 0, 0, 902, 7662, 1, 0, 0, 0, 904, 7670, 1, 0, 0, 0, 906, 7694, 1, 0, 0, 0, 908, 7696, 1, 0, 0, 0, 910, 7698, 1, 0, 0, 0, 912, 7706, 1, 0, 0, 0, 914, 7722, 1, 0, 0, 0, 916, 7733, 1, 0, 0, 0, 918, 7738, 1, 0, 0, 0, 920, 7740, 1, 0, 0, 0, 922, 7771, 1, 0, 0, 0, 924, 7790, 1, 0, 0, 0, 926, 7803, 1, 0, 0, 0, 928, 7810, 1, 0, 0, 0, 930, 7821, 1, 0, 0, 0, 932, 7823, 1, 0, 0, 0, 934, 7834, 1, 0, 0, 0, 936, 7848, 1, 0, 0, 0, 938, 7852, 1, 0, 0, 0, 940, 7858, 1, 0, 0, 0, 942, 7860, 1, 0, 0, 0, 944, 7869, 1, 0, 0, 0, 946, 7887, 1, 0, 0, 0, 948, 7889, 1, 0, 0, 0, 950, 7892, 1, 0, 0, 0, 952, 7900, 1, 0, 0, 0, 954, 7908, 1, 0, 0, 0, 956, 7917, 1, 0, 0, 0, 958, 7925, 1, 0, 0, 0, 960, 7929, 1, 0, 0, 0, 962, 7939, 1, 0, 0, 0, 964, 7962, 1, 0, 0, 0, 966, 7966, 1, 0, 0, 0, 968, 7994, 1, 0, 0, 0, 970, 8009, 1, 0, 0, 0, 972, 8011, 1, 0, 0, 0, 974, 8014, 1, 0, 0, 0, 976, 8020, 1, 0, 0, 0, 978, 8028, 1, 0, 0, 0, 980, 8040, 1, 0, 0, 0, 982, 8044, 1, 0, 0, 0, 984, 8054, 1, 0, 0, 0, 986, 8058, 1, 0, 0, 0, 988, 8074, 1, 0, 0, 0, 990, 8078, 1, 0, 0, 0, 992, 8083, 1, 0, 0, 0, 994, 8085, 1, 0, 0, 0, 996, 8095, 1, 0, 0, 0, 998, 8099, 1, 0, 0, 0, 1000, 8101, 1, 0, 0, 0, 1002, 8105, 1, 0, 0, 0, 1004, 8113, 1, 0, 0, 0, 1006, 8129, 1, 0, 0, 0, 1008, 8133, 1, 0, 0, 0, 1010, 8158, 1, 0, 0, 0, 1012, 8160, 1, 0, 0, 0, 1014, 8169, 1, 0, 0, 0, 1016, 8171, 1, 0, 0, 0, 1018, 8178, 1, 0, 0, 0, 1020, 8182, 1, 0, 0, 0, 1022, 8184, 1, 0, 0, 0, 1024, 8186, 1, 0, 0, 0, 1026, 8192, 1, 0, 0, 0, 1028, 8194, 1, 0, 0, 0, 1030, 8207, 1, 0, 0, 0, 1032, 8209, 1, 0, 0, 0, 1034, 8212, 1, 0, 0, 0, 1036, 8217, 1, 0, 0, 0, 1038, 8222, 1, 0, 0, 0, 1040, 8231, 1, 0, 0, 0, 1042, 8237, 1, 0, 0, 0, 1044, 8241, 1, 0, 0, 0, 1046, 8244, 1, 0, 0, 0, 1048, 8248, 1, 0, 0, 0, 1050, 8252, 1, 0, 0, 0, 1052, 8267, 1, 0, 0, 0, 1054, 8269, 1, 0, 0, 0, 1056, 8286, 1, 0, 0, 0, 1058, 8297, 1, 0, 0, 0, 1060, 8299, 1, 0, 0, 0, 1062, 8355, 1, 0, 0, 0, 1064, 8379, 1, 0, 0, 0, 1066, 8390, 1, 0, 0, 0, 1068, 8393, 1, 0, 0, 0, 1070, 8415, 1, 0, 0, 0, 1072, 8417, 1, 0, 0, 0, 1074, 8428, 1, 0, 0, 0, 1076, 8442, 1, 0, 0, 0, 1078, 8444, 1, 0, 0, 0, 1080, 8452, 1, 0, 0, 0, 1082, 8459, 1, 0, 0, 0, 1084, 8472, 1, 0, 0, 0, 1086, 8484, 1, 0, 0, 0, 1088, 8486, 1, 0, 0, 0, 1090, 8489, 1, 0, 0, 0, 1092, 8503, 1, 0, 0, 0, 1094, 8508, 1, 0, 0, 0, 1096, 8513, 1, 0, 0, 0, 1098, 8523, 1, 0, 0, 0, 1100, 8527, 1, 0, 0, 0, 1102, 8529, 1, 0, 0, 0, 1104, 8537, 1, 0, 0, 0, 1106, 8541, 1, 0, 0, 0, 1108, 8562, 1, 0, 0, 0, 1110, 8570, 1, 0, 0, 0, 1112, 8580, 1, 0, 0, 0, 1114, 8592, 1, 0, 0, 0, 1116, 8594, 1, 0, 0, 0, 1118, 8608, 1, 0, 0, 0, 1120, 8628, 1, 0, 0, 0, 1122, 8637, 1, 0, 0, 0, 1124, 8653, 1, 0, 0, 0, 1126, 8659, 1, 0, 0, 0, 1128, 8665, 1, 0, 0, 0, 1130, 8677, 1, 0, 0, 0, 1132, 8695, 1, 0, 0, 0, 1134, 8702, 1, 0, 0, 0, 1136, 8706, 1, 0, 0, 0, 1138, 8710, 1, 0, 0, 0, 1140, 8712, 1, 0, 0, 0, 1142, 8718, 1, 0, 0, 0, 1144, 8721, 1, 0, 0, 0, 1146, 8728, 1, 0, 0, 0, 1148, 8741, 1, 0, 0, 0, 1150, 8745, 1, 0, 0, 0, 1152, 8747, 1, 0, 0, 0, 1154, 8756, 1, 0, 0, 0, 1156, 8765, 1, 0, 0, 0, 1158, 8793, 1, 0, 0, 0, 1160, 8795, 1, 0, 0, 0, 1162, 8805, 1, 0, 0, 0, 1164, 8807, 1, 0, 0, 0, 1166, 8809, 1, 0, 0, 0, 1168, 8813, 1, 0, 0, 0, 1170, 8821, 1, 0, 0, 0, 1172, 8829, 1, 0, 0, 0, 1174, 8837, 1, 0, 0, 0, 1176, 8851, 1, 0, 0, 0, 1178, 8860, 1, 0, 0, 0, 1180, 8864, 1, 0, 0, 0, 1182, 8868, 1, 0, 0, 0, 1184, 8894, 1, 0, 0, 0, 1186, 8908, 1, 0, 0, 0, 1188, 8923, 1, 0, 0, 0, 1190, 8933, 1, 0, 0, 0, 1192, 8937, 1, 0, 0, 0, 1194, 8945, 1, 0, 0, 0, 1196, 8953, 1, 0, 0, 0, 1198, 8959, 1, 0, 0, 0, 1200, 8963, 1, 0, 0, 0, 1202, 8970, 1, 0, 0, 0, 1204, 8975, 1, 0, 0, 0, 1206, 8990, 1, 0, 0, 0, 1208, 9070, 1, 0, 0, 0, 1210, 9072, 1, 0, 0, 0, 1212, 9074, 1, 0, 0, 0, 1214, 9104, 1, 0, 0, 0, 1216, 9108, 1, 0, 0, 0, 1218, 9287, 1, 0, 0, 0, 1220, 9294, 1, 0, 0, 0, 1222, 9307, 1, 0, 0, 0, 1224, 9309, 1, 0, 0, 0, 1226, 9314, 1, 0, 0, 0, 1228, 9322, 1, 0, 0, 0, 1230, 9327, 1, 0, 0, 0, 1232, 9334, 1, 0, 0, 0, 1234, 9351, 1, 0, 0, 0, 1236, 9353, 1, 0, 0, 0, 1238, 9363, 1, 0, 0, 0, 1240, 9372, 1, 0, 0, 0, 1242, 9377, 1, 0, 0, 0, 1244, 9379, 1, 0, 0, 0, 1246, 9387, 1, 0, 0, 0, 1248, 9397, 1, 0, 0, 0, 1250, 9399, 1, 0, 0, 0, 1252, 9408, 1, 0, 0, 0, 1254, 9414, 1, 0, 0, 0, 1256, 9429, 1, 0, 0, 0, 1258, 9437, 1, 0, 0, 0, 1260, 9446, 1, 0, 0, 0, 1262, 9458, 1, 0, 0, 0, 1264, 9472, 1, 0, 0, 0, 1266, 9474, 1, 0, 0, 0, 1268, 9481, 1, 0, 0, 0, 1270, 9487, 1, 0, 0, 0, 1272, 9491, 1, 0, 0, 0, 1274, 9493, 1, 0, 0, 0, 1276, 9501, 1, 0, 0, 0, 1278, 9509, 1, 0, 0, 0, 1280, 9523, 1, 0, 0, 0, 1282, 9525, 1, 0, 0, 0, 1284, 9533, 1, 0, 0, 0, 1286, 9546, 1, 0, 0, 0, 1288, 9548, 1, 0, 0, 0, 1290, 9556, 1, 0, 0, 0, 1292, 9563, 1, 0, 0, 0, 1294, 9576, 1, 0, 0, 0, 1296, 9586, 1, 0, 0, 0, 1298, 9588, 1, 0, 0, 0, 1300, 9590, 1, 0, 0, 0, 1302, 9604, 1, 0, 0, 0, 1304, 9634, 1, 0, 0, 0, 1306, 9643, 1, 0, 0, 0, 1308, 9650, 1, 0, 0, 0, 1310, 9652, 1, 0, 0, 0, 1312, 9659, 1, 0, 0, 0, 1314, 9663, 1, 0, 0, 0, 1316, 9671, 1, 0, 0, 0, 1318, 9675, 1, 0, 0, 0, 1320, 9677, 1, 0, 0, 0, 1322, 9696, 1, 0, 0, 0, 1324, 9700, 1, 0, 0, 0, 1326, 9703, 1, 0, 0, 0, 1328, 9710, 1, 0, 0, 0, 1330, 9715, 1, 0, 0, 0, 1332, 9717, 1, 0, 0, 0, 1334, 9733, 1, 0, 0, 0, 1336, 9735, 1, 0, 0, 0, 1338, 9743, 1, 0, 0, 0, 1340, 9747, 1, 0, 0, 0, 1342, 9755, 1, 0, 0, 0, 1344, 9757, 1, 0, 0, 0, 1346, 9759, 1, 0, 0, 0, 1348, 9768, 1, 0, 0, 0, 1350, 9802, 1, 0, 0, 0, 1352, 9804, 1, 0, 0, 0, 1354, 9806, 1, 0, 0, 0, 1356, 9808, 1, 0, 0, 0, 1358, 9810, 1, 0, 0, 0, 1360, 9812, 1, 0, 0, 0, 1362, 9826, 1, 0, 0, 0, 1364, 9831, 1, 0, 0, 0, 1366, 9838, 1, 0, 0, 0, 1368, 9840, 1, 0, 0, 0, 1370, 9845, 1, 0, 0, 0, 1372, 9847, 1, 0, 0, 0, 1374, 9861, 1, 0, 0, 0, 1376, 9867, 1, 0, 0, 0, 1378, 9873, 1, 0, 0, 0, 1380, 9879, 1, 0, 0, 0, 1382, 9887, 1, 0, 0, 0, 1384, 9896, 1, 0, 0, 0, 1386, 9898, 1, 0, 0, 0, 1388, 9900, 1, 0, 0, 0, 1390, 9954, 1, 0, 0, 0, 1392, 9956, 1, 0, 0, 0, 1394, 9958, 1, 0, 0, 0, 1396, 9960, 1, 0, 0, 0, 1398, 9962, 1, 0, 0, 0, 1400, 9969, 1, 0, 0, 0, 1402, 9992, 1, 0, 0, 0, 1404, 9994, 1, 0, 0, 0, 1406, 10000, 1, 0, 0, 0, 1408, 10004, 1, 0, 0, 0, 1410, 10006, 1, 0, 0, 0, 1412, 10013, 1, 0, 0, 0, 1414, 10020, 1, 0, 0, 0, 1416, 10023, 1, 0, 0, 0, 1418, 10027, 1, 0, 0, 0, 1420, 10034, 1, 0, 0, 0, 1422, 10036, 1, 0, 0, 0, 1424, 10060, 1, 0, 0, 0, 1426, 10062, 1, 0, 0, 0, 1428, 10069, 1, 0, 0, 0, 1430, 10071, 1, 0, 0, 0, 1432, 10079, 1, 0, 0, 0, 1434, 10082, 1, 0, 0, 0, 1436, 10086, 1, 0, 0, 0, 1438, 10088, 1, 0, 0, 0, 1440, 10092, 1, 0, 0, 0, 1442, 10094, 1, 0, 0, 0, 1444, 10099, 1, 0, 0, 0, 1446, 10104, 1, 0, 0, 0, 1448, 10110, 1, 0, 0, 0, 1450, 10114, 1, 0, 0, 0, 1452, 10116, 1, 0, 0, 0, 1454, 10121, 1, 0, 0, 0, 1456, 10151, 1, 0, 0, 0, 1458, 10153, 1, 0, 0, 0, 1460, 10171, 1, 0, 0, 0, 1462, 10175, 1, 0, 0, 0, 1464, 10177, 1, 0, 0, 0, 1466, 10182, 1, 0, 0, 0, 1468, 10191, 1, 0, 0, 0, 1470, 10193, 1, 0, 0, 0, 1472, 10201, 1, 0, 0, 0, 1474, 10205, 1, 0, 0, 0, 1476, 10207, 1, 0, 0, 0, 1478, 10211, 1, 0, 0, 0, 1480, 10222, 1, 0, 0, 0, 1482, 10239, 1, 0, 0, 0, 1484, 10245, 1, 0, 0, 0, 1486, 10247, 1, 0, 0, 0, 1488, 10257, 1, 0, 0, 0, 1490, 10260, 1, 0, 0, 0, 1492, 10264, 1, 0, 0, 0, 1494, 10272, 1, 0, 0, 0, 1496, 10274, 1, 0, 0, 0, 1498, 10277, 1, 0, 0, 0, 1500, 10282, 1, 0, 0, 0, 1502, 10287, 1, 0, 0, 0, 1504, 10309, 1, 0, 0, 0, 1506, 10323, 1, 0, 0, 0, 1508, 10327, 1, 0, 0, 0, 1510, 10332, 1, 0, 0, 0, 1512, 10334, 1, 0, 0, 0, 1514, 10336, 1, 0, 0, 0, 1516, 10348, 1, 0, 0, 0, 1518, 10350, 1, 0, 0, 0, 1520, 10355, 1, 0, 0, 0, 1522, 10357, 1, 0, 0, 0, 1524, 10375, 1, 0, 0, 0, 1526, 10403, 1, 0, 0, 0, 1528, 10413, 1, 0, 0, 0, 1530, 10422, 1, 0, 0, 0, 1532, 10427, 1, 0, 0, 0, 1534, 10429, 1, 0, 0, 0, 1536, 10433, 1, 0, 0, 0, 1538, 10441, 1, 0, 0, 0, 1540, 10449, 1, 0, 0, 0, 1542, 10451, 1, 0, 0, 0, 1544, 10458, 1, 0, 0, 0, 1546, 10461, 1, 0, 0, 0, 1548, 10477, 1, 0, 0, 0, 1550, 10479, 1, 0, 0, 0, 1552, 10493, 1, 0, 0, 0, 1554, 10495, 1, 0, 0, 0, 1556, 10522, 1, 0, 0, 0, 1558, 10524, 1, 0, 0, 0, 1560, 10535, 1, 0, 0, 0, 1562, 10541, 1, 0, 0, 0, 1564, 10545, 1, 0, 0, 0, 1566, 10547, 1, 0, 0, 0, 1568, 10555, 1, 0, 0, 0, 1570, 10560, 1, 0, 0, 0, 1572, 10579, 1, 0, 0, 0, 1574, 10581, 1, 0, 0, 0, 1576, 10586, 1, 0, 0, 0, 1578, 10590, 1, 0, 0, 0, 1580, 10593, 1, 0, 0, 0, 1582, 10597, 1, 0, 0, 0, 1584, 10607, 1, 0, 0, 0, 1586, 10621, 1, 0, 0, 0, 1588, 10625, 1, 0, 0, 0, 1590, 10630, 1, 0, 0, 0, 1592, 10633, 1, 0, 0, 0, 1594, 10637, 1, 0, 0, 0, 1596, 10642, 1, 0, 0, 0, 1598, 10653, 1, 0, 0, 0, 1600, 10657, 1, 0, 0, 0, 1602, 10661, 1, 0, 0, 0, 1604, 10665, 1, 0, 0, 0, 1606, 10670, 1, 0, 0, 0, 1608, 10674, 1, 0, 0, 0, 1610, 10676, 1, 0, 0, 0, 1612, 10678, 1, 0, 0, 0, 1614, 10686, 1, 0, 0, 0, 1616, 10688, 1, 0, 0, 0, 1618, 10690, 1, 0, 0, 0, 1620, 10692, 1, 0, 0, 0, 1622, 10694, 1, 0, 0, 0, 1624, 10702, 1, 0, 0, 0, 1626, 1627, 3, 4, 2, 0, 1627, 1628, 5, 0, 0, 1, 1628, 1, 1, 0, 0, 0, 1629, 1630, 3, 1398, 699, 0, 1630, 3, 1, 0, 0, 0, 1631, 1632, 3, 6, 3, 0, 1632, 5, 1, 0, 0, 0, 1633, 1635, 3, 8, 4, 0, 1634, 1636, 5, 7, 0, 0, 1635, 1634, 1, 0, 0, 0, 1635, 1636, 1, 0, 0, 0, 1636, 1638, 1, 0, 0, 0, 1637, 1633, 1, 0, 0, 0, 1638, 1641, 1, 0, 0, 0, 1639, 1637, 1, 0, 0, 0, 1639, 1640, 1, 0, 0, 0, 1640, 7, 1, 0, 0, 0, 1641, 1639, 1, 0, 0, 0, 1642, 1768, 3, 452, 226, 0, 1643, 1768, 3, 826, 413, 0, 1644, 1768, 3, 816, 408, 0, 1645, 1768, 3, 818, 409, 0, 1646, 1768, 3, 578, 289, 0, 1647, 1768, 3, 832, 416, 0, 1648, 1768, 3, 478, 239, 0, 1649, 1768, 3, 322, 161, 0, 1650, 1768, 3, 328, 164, 0, 1651, 1768, 3, 338, 169, 0, 1652, 1768, 3, 364, 182, 0, 1653, 1768, 3, 670, 335, 0, 1654, 1768, 3, 38, 19, 0, 1655, 1768, 3, 728, 364, 0, 1656, 1768, 3, 732, 366, 0, 1657, 1768, 3, 744, 372, 0, 1658, 1768, 3, 734, 367, 0, 1659, 1768, 3, 742, 371, 0, 1660, 1768, 3, 384, 192, 0, 1661, 1768, 3, 280, 140, 0, 1662, 1768, 3, 828, 414, 0, 1663, 1768, 3, 96, 48, 0, 1664, 1768, 3, 720, 360, 0, 1665, 1768, 3, 134, 67, 0, 1666, 1768, 3, 752, 376, 0, 1667, 1768, 3, 32, 16, 0, 1668, 1768, 3, 28, 14, 0, 1669, 1768, 3, 760, 380, 0, 1670, 1768, 3, 262, 131, 0, 1671, 1768, 3, 838, 419, 0, 1672, 1768, 3, 836, 418, 0, 1673, 1768, 3, 380, 190, 0, 1674, 1768, 3, 850, 425, 0, 1675, 1768, 3, 12, 6, 0, 1676, 1768, 3, 92, 46, 0, 1677, 1768, 3, 140, 70, 0, 1678, 1768, 3, 844, 422, 0, 1679, 1768, 3, 534, 267, 0, 1680, 1768, 3, 86, 43, 0, 1681, 1768, 3, 142, 71, 0, 1682, 1768, 3, 400, 200, 0, 1683, 1768, 3, 264, 132, 0, 1684, 1768, 3, 456, 228, 0, 1685, 1768, 3, 696, 348, 0, 1686, 1768, 3, 842, 421, 0, 1687, 1768, 3, 830, 415, 0, 1688, 1768, 3, 316, 158, 0, 1689, 1768, 3, 330, 165, 0, 1690, 1768, 3, 356, 178, 0, 1691, 1768, 3, 366, 183, 0, 1692, 1768, 3, 616, 308, 0, 1693, 1768, 3, 36, 18, 0, 1694, 1768, 3, 270, 135, 0, 1695, 1768, 3, 482, 241, 0, 1696, 1768, 3, 496, 248, 0, 1697, 1768, 3, 746, 373, 0, 1698, 1768, 3, 498, 249, 0, 1699, 1768, 3, 382, 191, 0, 1700, 1768, 3, 296, 148, 0, 1701, 1768, 3, 42, 21, 0, 1702, 1768, 3, 278, 139, 0, 1703, 1768, 3, 172, 86, 0, 1704, 1768, 3, 754, 377, 0, 1705, 1768, 3, 260, 130, 0, 1706, 1768, 3, 310, 155, 0, 1707, 1768, 3, 704, 352, 0, 1708, 1768, 3, 404, 202, 0, 1709, 1768, 3, 444, 222, 0, 1710, 1768, 3, 14, 7, 0, 1711, 1768, 3, 26, 13, 0, 1712, 1768, 3, 374, 187, 0, 1713, 1768, 3, 804, 402, 0, 1714, 1768, 3, 900, 450, 0, 1715, 1768, 3, 952, 476, 0, 1716, 1768, 3, 458, 229, 0, 1717, 1768, 3, 928, 464, 0, 1718, 1768, 3, 94, 47, 0, 1719, 1768, 3, 690, 345, 0, 1720, 1768, 3, 700, 350, 0, 1721, 1768, 3, 504, 252, 0, 1722, 1768, 3, 506, 253, 0, 1723, 1768, 3, 508, 254, 0, 1724, 1768, 3, 512, 256, 0, 1725, 1768, 3, 762, 381, 0, 1726, 1768, 3, 314, 157, 0, 1727, 1768, 3, 708, 354, 0, 1728, 1768, 3, 34, 17, 0, 1729, 1768, 3, 378, 189, 0, 1730, 1768, 3, 820, 410, 0, 1731, 1768, 3, 896, 448, 0, 1732, 1768, 3, 878, 439, 0, 1733, 1768, 3, 544, 272, 0, 1734, 1768, 3, 552, 276, 0, 1735, 1768, 3, 570, 285, 0, 1736, 1768, 3, 368, 184, 0, 1737, 1768, 3, 588, 294, 0, 1738, 1768, 3, 902, 451, 0, 1739, 1768, 3, 920, 460, 0, 1740, 1768, 3, 782, 391, 0, 1741, 1768, 3, 276, 138, 0, 1742, 1768, 3, 802, 401, 0, 1743, 1768, 3, 932, 466, 0, 1744, 1768, 3, 778, 389, 0, 1745, 1768, 3, 890, 445, 0, 1746, 1768, 3, 510, 255, 0, 1747, 1768, 3, 710, 355, 0, 1748, 1768, 3, 678, 339, 0, 1749, 1768, 3, 676, 338, 0, 1750, 1768, 3, 680, 340, 0, 1751, 1768, 3, 722, 361, 0, 1752, 1768, 3, 554, 277, 0, 1753, 1768, 3, 572, 286, 0, 1754, 1768, 3, 764, 382, 0, 1755, 1768, 3, 538, 269, 0, 1756, 1768, 3, 960, 480, 0, 1757, 1768, 3, 786, 393, 0, 1758, 1768, 3, 530, 265, 0, 1759, 1768, 3, 784, 392, 0, 1760, 1768, 3, 942, 471, 0, 1761, 1768, 3, 848, 424, 0, 1762, 1768, 3, 74, 37, 0, 1763, 1768, 3, 50, 25, 0, 1764, 1768, 3, 84, 42, 0, 1765, 1768, 3, 798, 399, 0, 1766, 1768, 3, 10, 5, 0, 1767, 1642, 1, 0, 0, 0, 1767, 1643, 1, 0, 0, 0, 1767, 1644, 1, 0, 0, 0, 1767, 1645, 1, 0, 0, 0, 1767, 1646, 1, 0, 0, 0, 1767, 1647, 1, 0, 0, 0, 1767, 1648, 1, 0, 0, 0, 1767, 1649, 1, 0, 0, 0, 1767, 1650, 1, 0, 0, 0, 1767, 1651, 1, 0, 0, 0, 1767, 1652, 1, 0, 0, 0, 1767, 1653, 1, 0, 0, 0, 1767, 1654, 1, 0, 0, 0, 1767, 1655, 1, 0, 0, 0, 1767, 1656, 1, 0, 0, 0, 1767, 1657, 1, 0, 0, 0, 1767, 1658, 1, 0, 0, 0, 1767, 1659, 1, 0, 0, 0, 1767, 1660, 1, 0, 0, 0, 1767, 1661, 1, 0, 0, 0, 1767, 1662, 1, 0, 0, 0, 1767, 1663, 1, 0, 0, 0, 1767, 1664, 1, 0, 0, 0, 1767, 1665, 1, 0, 0, 0, 1767, 1666, 1, 0, 0, 0, 1767, 1667, 1, 0, 0, 0, 1767, 1668, 1, 0, 0, 0, 1767, 1669, 1, 0, 0, 0, 1767, 1670, 1, 0, 0, 0, 1767, 1671, 1, 0, 0, 0, 1767, 1672, 1, 0, 0, 0, 1767, 1673, 1, 0, 0, 0, 1767, 1674, 1, 0, 0, 0, 1767, 1675, 1, 0, 0, 0, 1767, 1676, 1, 0, 0, 0, 1767, 1677, 1, 0, 0, 0, 1767, 1678, 1, 0, 0, 0, 1767, 1679, 1, 0, 0, 0, 1767, 1680, 1, 0, 0, 0, 1767, 1681, 1, 0, 0, 0, 1767, 1682, 1, 0, 0, 0, 1767, 1683, 1, 0, 0, 0, 1767, 1684, 1, 0, 0, 0, 1767, 1685, 1, 0, 0, 0, 1767, 1686, 1, 0, 0, 0, 1767, 1687, 1, 0, 0, 0, 1767, 1688, 1, 0, 0, 0, 1767, 1689, 1, 0, 0, 0, 1767, 1690, 1, 0, 0, 0, 1767, 1691, 1, 0, 0, 0, 1767, 1692, 1, 0, 0, 0, 1767, 1693, 1, 0, 0, 0, 1767, 1694, 1, 0, 0, 0, 1767, 1695, 1, 0, 0, 0, 1767, 1696, 1, 0, 0, 0, 1767, 1697, 1, 0, 0, 0, 1767, 1698, 1, 0, 0, 0, 1767, 1699, 1, 0, 0, 0, 1767, 1700, 1, 0, 0, 0, 1767, 1701, 1, 0, 0, 0, 1767, 1702, 1, 0, 0, 0, 1767, 1703, 1, 0, 0, 0, 1767, 1704, 1, 0, 0, 0, 1767, 1705, 1, 0, 0, 0, 1767, 1706, 1, 0, 0, 0, 1767, 1707, 1, 0, 0, 0, 1767, 1708, 1, 0, 0, 0, 1767, 1709, 1, 0, 0, 0, 1767, 1710, 1, 0, 0, 0, 1767, 1711, 1, 0, 0, 0, 1767, 1712, 1, 0, 0, 0, 1767, 1713, 1, 0, 0, 0, 1767, 1714, 1, 0, 0, 0, 1767, 1715, 1, 0, 0, 0, 1767, 1716, 1, 0, 0, 0, 1767, 1717, 1, 0, 0, 0, 1767, 1718, 1, 0, 0, 0, 1767, 1719, 1, 0, 0, 0, 1767, 1720, 1, 0, 0, 0, 1767, 1721, 1, 0, 0, 0, 1767, 1722, 1, 0, 0, 0, 1767, 1723, 1, 0, 0, 0, 1767, 1724, 1, 0, 0, 0, 1767, 1725, 1, 0, 0, 0, 1767, 1726, 1, 0, 0, 0, 1767, 1727, 1, 0, 0, 0, 1767, 1728, 1, 0, 0, 0, 1767, 1729, 1, 0, 0, 0, 1767, 1730, 1, 0, 0, 0, 1767, 1731, 1, 0, 0, 0, 1767, 1732, 1, 0, 0, 0, 1767, 1733, 1, 0, 0, 0, 1767, 1734, 1, 0, 0, 0, 1767, 1735, 1, 0, 0, 0, 1767, 1736, 1, 0, 0, 0, 1767, 1737, 1, 0, 0, 0, 1767, 1738, 1, 0, 0, 0, 1767, 1739, 1, 0, 0, 0, 1767, 1740, 1, 0, 0, 0, 1767, 1741, 1, 0, 0, 0, 1767, 1742, 1, 0, 0, 0, 1767, 1743, 1, 0, 0, 0, 1767, 1744, 1, 0, 0, 0, 1767, 1745, 1, 0, 0, 0, 1767, 1746, 1, 0, 0, 0, 1767, 1747, 1, 0, 0, 0, 1767, 1748, 1, 0, 0, 0, 1767, 1749, 1, 0, 0, 0, 1767, 1750, 1, 0, 0, 0, 1767, 1751, 1, 0, 0, 0, 1767, 1752, 1, 0, 0, 0, 1767, 1753, 1, 0, 0, 0, 1767, 1754, 1, 0, 0, 0, 1767, 1755, 1, 0, 0, 0, 1767, 1756, 1, 0, 0, 0, 1767, 1757, 1, 0, 0, 0, 1767, 1758, 1, 0, 0, 0, 1767, 1759, 1, 0, 0, 0, 1767, 1760, 1, 0, 0, 0, 1767, 1761, 1, 0, 0, 0, 1767, 1762, 1, 0, 0, 0, 1767, 1763, 1, 0, 0, 0, 1767, 1764, 1, 0, 0, 0, 1767, 1765, 1, 0, 0, 0, 1767, 1766, 1, 0, 0, 0, 1768, 9, 1, 0, 0, 0, 1769, 1771, 5, 668, 0, 0, 1770, 1772, 5, 669, 0, 0, 1771, 1770, 1, 0, 0, 0, 1771, 1772, 1, 0, 0, 0, 1772, 11, 1, 0, 0, 0, 1773, 1774, 5, 433, 0, 0, 1774, 1775, 3, 1212, 606, 0, 1775, 13, 1, 0, 0, 0, 1776, 1777, 5, 46, 0, 0, 1777, 1778, 5, 311, 0, 0, 1778, 1779, 3, 1368, 684, 0, 1779, 1780, 3, 16, 8, 0, 1780, 1781, 3, 18, 9, 0, 1781, 15, 1, 0, 0, 0, 1782, 1785, 5, 105, 0, 0, 1783, 1785, 1, 0, 0, 0, 1784, 1782, 1, 0, 0, 0, 1784, 1783, 1, 0, 0, 0, 1785, 17, 1, 0, 0, 0, 1786, 1788, 3, 24, 12, 0, 1787, 1786, 1, 0, 0, 0, 1788, 1791, 1, 0, 0, 0, 1789, 1787, 1, 0, 0, 0, 1789, 1790, 1, 0, 0, 0, 1790, 19, 1, 0, 0, 0, 1791, 1789, 1, 0, 0, 0, 1792, 1794, 3, 22, 11, 0, 1793, 1792, 1, 0, 0, 0, 1794, 1797, 1, 0, 0, 0, 1795, 1793, 1, 0, 0, 0, 1795, 1796, 1, 0, 0, 0, 1796, 21, 1, 0, 0, 0, 1797, 1795, 1, 0, 0, 0, 1798, 1801, 5, 280, 0, 0, 1799, 1802, 3, 1360, 680, 0, 1800, 1802, 5, 78, 0, 0, 1801, 1799, 1, 0, 0, 0, 1801, 1800, 1, 0, 0, 0, 1802, 1817, 1, 0, 0, 0, 1803, 1804, 7, 0, 0, 0, 1804, 1805, 5, 280, 0, 0, 1805, 1817, 3, 1360, 680, 0, 1806, 1817, 5, 228, 0, 0, 1807, 1808, 5, 164, 0, 0, 1808, 1809, 5, 74, 0, 0, 1809, 1817, 3, 1366, 683, 0, 1810, 1811, 5, 364, 0, 0, 1811, 1812, 5, 361, 0, 0, 1812, 1817, 3, 1360, 680, 0, 1813, 1814, 5, 99, 0, 0, 1814, 1817, 3, 1372, 686, 0, 1815, 1817, 3, 1384, 692, 0, 1816, 1798, 1, 0, 0, 0, 1816, 1803, 1, 0, 0, 0, 1816, 1806, 1, 0, 0, 0, 1816, 1807, 1, 0, 0, 0, 1816, 1810, 1, 0, 0, 0, 1816, 1813, 1, 0, 0, 0, 1816, 1815, 1, 0, 0, 0, 1817, 23, 1, 0, 0, 0, 1818, 1829, 3, 22, 11, 0, 1819, 1820, 5, 341, 0, 0, 1820, 1829, 3, 1358, 679, 0, 1821, 1822, 5, 134, 0, 0, 1822, 1829, 3, 1372, 686, 0, 1823, 1824, 5, 311, 0, 0, 1824, 1829, 3, 1372, 686, 0, 1825, 1826, 5, 68, 0, 0, 1826, 1827, 7, 1, 0, 0, 1827, 1829, 3, 1372, 686, 0, 1828, 1818, 1, 0, 0, 0, 1828, 1819, 1, 0, 0, 0, 1828, 1821, 1, 0, 0, 0, 1828, 1823, 1, 0, 0, 0, 1828, 1825, 1, 0, 0, 0, 1829, 25, 1, 0, 0, 0, 1830, 1831, 5, 46, 0, 0, 1831, 1832, 5, 99, 0, 0, 1832, 1833, 3, 1368, 684, 0, 1833, 1834, 3, 16, 8, 0, 1834, 1835, 3, 18, 9, 0, 1835, 27, 1, 0, 0, 0, 1836, 1837, 5, 138, 0, 0, 1837, 1838, 7, 2, 0, 0, 1838, 1839, 3, 1370, 685, 0, 1839, 1840, 3, 16, 8, 0, 1840, 1841, 3, 20, 10, 0, 1841, 29, 1, 0, 0, 0, 1842, 1847, 1, 0, 0, 0, 1843, 1844, 5, 68, 0, 0, 1844, 1845, 5, 175, 0, 0, 1845, 1847, 3, 1342, 671, 0, 1846, 1842, 1, 0, 0, 0, 1846, 1843, 1, 0, 0, 0, 1847, 31, 1, 0, 0, 0, 1848, 1849, 5, 138, 0, 0, 1849, 1851, 7, 2, 0, 0, 1850, 1852, 5, 30, 0, 0, 1851, 1850, 1, 0, 0, 0, 1851, 1852, 1, 0, 0, 0, 1852, 1853, 1, 0, 0, 0, 1853, 1854, 3, 1370, 685, 0, 1854, 1855, 3, 30, 15, 0, 1855, 1856, 3, 80, 40, 0, 1856, 33, 1, 0, 0, 0, 1857, 1858, 5, 191, 0, 0, 1858, 1861, 7, 3, 0, 0, 1859, 1860, 5, 220, 0, 0, 1860, 1862, 5, 389, 0, 0, 1861, 1859, 1, 0, 0, 0, 1861, 1862, 1, 0, 0, 0, 1862, 1863, 1, 0, 0, 0, 1863, 1864, 3, 1372, 686, 0, 1864, 35, 1, 0, 0, 0, 1865, 1866, 5, 46, 0, 0, 1866, 1867, 5, 66, 0, 0, 1867, 1868, 3, 1368, 684, 0, 1868, 1869, 3, 16, 8, 0, 1869, 1870, 3, 18, 9, 0, 1870, 37, 1, 0, 0, 0, 1871, 1872, 5, 138, 0, 0, 1872, 1873, 5, 66, 0, 0, 1873, 1874, 3, 1370, 685, 0, 1874, 1875, 3, 40, 20, 0, 1875, 1876, 5, 99, 0, 0, 1876, 1877, 3, 1372, 686, 0, 1877, 39, 1, 0, 0, 0, 1878, 1879, 7, 4, 0, 0, 1879, 41, 1, 0, 0, 0, 1880, 1881, 5, 46, 0, 0, 1881, 1885, 5, 316, 0, 0, 1882, 1883, 5, 220, 0, 0, 1883, 1884, 5, 77, 0, 0, 1884, 1886, 5, 389, 0, 0, 1885, 1882, 1, 0, 0, 0, 1885, 1886, 1, 0, 0, 0, 1886, 1892, 1, 0, 0, 0, 1887, 1888, 3, 44, 22, 0, 1888, 1889, 5, 106, 0, 0, 1889, 1890, 3, 1370, 685, 0, 1890, 1893, 1, 0, 0, 0, 1891, 1893, 3, 1374, 687, 0, 1892, 1887, 1, 0, 0, 0, 1892, 1891, 1, 0, 0, 0, 1893, 1894, 1, 0, 0, 0, 1894, 1895, 3, 46, 23, 0, 1895, 43, 1, 0, 0, 0, 1896, 1899, 3, 1374, 687, 0, 1897, 1899, 1, 0, 0, 0, 1898, 1896, 1, 0, 0, 0, 1898, 1897, 1, 0, 0, 0, 1899, 45, 1, 0, 0, 0, 1900, 1902, 3, 48, 24, 0, 1901, 1900, 1, 0, 0, 0, 1902, 1905, 1, 0, 0, 0, 1903, 1901, 1, 0, 0, 0, 1903, 1904, 1, 0, 0, 0, 1904, 47, 1, 0, 0, 0, 1905, 1903, 1, 0, 0, 0, 1906, 1913, 3, 172, 86, 0, 1907, 1913, 3, 588, 294, 0, 1908, 1913, 3, 278, 139, 0, 1909, 1913, 3, 404, 202, 0, 1910, 1913, 3, 552, 276, 0, 1911, 1913, 3, 798, 399, 0, 1912, 1906, 1, 0, 0, 0, 1912, 1907, 1, 0, 0, 0, 1912, 1908, 1, 0, 0, 0, 1912, 1909, 1, 0, 0, 0, 1912, 1910, 1, 0, 0, 0, 1912, 1911, 1, 0, 0, 0, 1913, 49, 1, 0, 0, 0, 1914, 1916, 5, 326, 0, 0, 1915, 1917, 7, 5, 0, 0, 1916, 1915, 1, 0, 0, 0, 1916, 1917, 1, 0, 0, 0, 1917, 1918, 1, 0, 0, 0, 1918, 1919, 3, 52, 26, 0, 1919, 51, 1, 0, 0, 0, 1920, 1921, 5, 349, 0, 0, 1921, 1929, 3, 792, 396, 0, 1922, 1923, 5, 325, 0, 0, 1923, 1924, 5, 154, 0, 0, 1924, 1925, 5, 36, 0, 0, 1925, 1926, 5, 349, 0, 0, 1926, 1929, 3, 792, 396, 0, 1927, 1929, 3, 56, 28, 0, 1928, 1920, 1, 0, 0, 0, 1928, 1922, 1, 0, 0, 0, 1928, 1927, 1, 0, 0, 0, 1929, 53, 1, 0, 0, 0, 1930, 1931, 3, 58, 29, 0, 1931, 1932, 7, 6, 0, 0, 1932, 1933, 3, 60, 30, 0, 1933, 55, 1, 0, 0, 0, 1934, 1960, 3, 54, 27, 0, 1935, 1936, 3, 58, 29, 0, 1936, 1937, 5, 64, 0, 0, 1937, 1938, 5, 434, 0, 0, 1938, 1960, 1, 0, 0, 0, 1939, 1940, 5, 411, 0, 0, 1940, 1941, 5, 379, 0, 0, 1941, 1960, 3, 68, 34, 0, 1942, 1943, 5, 152, 0, 0, 1943, 1960, 3, 1360, 680, 0, 1944, 1945, 5, 316, 0, 0, 1945, 1960, 3, 1360, 680, 0, 1946, 1947, 5, 260, 0, 0, 1947, 1960, 3, 70, 35, 0, 1948, 1949, 5, 311, 0, 0, 1949, 1960, 3, 72, 36, 0, 1950, 1951, 5, 325, 0, 0, 1951, 1952, 5, 106, 0, 0, 1952, 1960, 3, 72, 36, 0, 1953, 1954, 5, 376, 0, 0, 1954, 1955, 5, 272, 0, 0, 1955, 1960, 3, 1230, 615, 0, 1956, 1957, 5, 349, 0, 0, 1957, 1958, 5, 330, 0, 0, 1958, 1960, 3, 1360, 680, 0, 1959, 1934, 1, 0, 0, 0, 1959, 1935, 1, 0, 0, 0, 1959, 1939, 1, 0, 0, 0, 1959, 1942, 1, 0, 0, 0, 1959, 1944, 1, 0, 0, 0, 1959, 1946, 1, 0, 0, 0, 1959, 1948, 1, 0, 0, 0, 1959, 1950, 1, 0, 0, 0, 1959, 1953, 1, 0, 0, 0, 1959, 1956, 1, 0, 0, 0, 1960, 57, 1, 0, 0, 0, 1961, 1966, 3, 1374, 687, 0, 1962, 1963, 5, 11, 0, 0, 1963, 1965, 3, 1374, 687, 0, 1964, 1962, 1, 0, 0, 0, 1965, 1968, 1, 0, 0, 0, 1966, 1964, 1, 0, 0, 0, 1966, 1967, 1, 0, 0, 0, 1967, 59, 1, 0, 0, 0, 1968, 1966, 1, 0, 0, 0, 1969, 1974, 3, 62, 31, 0, 1970, 1971, 5, 6, 0, 0, 1971, 1973, 3, 62, 31, 0, 1972, 1970, 1, 0, 0, 0, 1973, 1976, 1, 0, 0, 0, 1974, 1972, 1, 0, 0, 0, 1974, 1975, 1, 0, 0, 0, 1975, 61, 1, 0, 0, 0, 1976, 1974, 1, 0, 0, 0, 1977, 1980, 3, 66, 33, 0, 1978, 1980, 3, 292, 146, 0, 1979, 1977, 1, 0, 0, 0, 1979, 1978, 1, 0, 0, 0, 1980, 63, 1, 0, 0, 0, 1981, 1982, 5, 293, 0, 0, 1982, 1987, 7, 7, 0, 0, 1983, 1984, 5, 303, 0, 0, 1984, 1987, 5, 293, 0, 0, 1985, 1987, 5, 323, 0, 0, 1986, 1981, 1, 0, 0, 0, 1986, 1983, 1, 0, 0, 0, 1986, 1985, 1, 0, 0, 0, 1987, 65, 1, 0, 0, 0, 1988, 1993, 5, 96, 0, 0, 1989, 1993, 5, 60, 0, 0, 1990, 1993, 5, 80, 0, 0, 1991, 1993, 3, 72, 36, 0, 1992, 1988, 1, 0, 0, 0, 1992, 1989, 1, 0, 0, 0, 1992, 1990, 1, 0, 0, 0, 1992, 1991, 1, 0, 0, 0, 1993, 67, 1, 0, 0, 0, 1994, 2010, 3, 1360, 680, 0, 1995, 2010, 3, 1384, 692, 0, 1996, 1997, 3, 1154, 577, 0, 1997, 1998, 3, 1360, 680, 0, 1998, 1999, 3, 1158, 579, 0, 1999, 2010, 1, 0, 0, 0, 2000, 2001, 3, 1154, 577, 0, 2001, 2002, 5, 2, 0, 0, 2002, 2003, 3, 1358, 679, 0, 2003, 2004, 5, 3, 0, 0, 2004, 2005, 3, 1360, 680, 0, 2005, 2010, 1, 0, 0, 0, 2006, 2010, 3, 292, 146, 0, 2007, 2010, 5, 53, 0, 0, 2008, 2010, 5, 245, 0, 0, 2009, 1994, 1, 0, 0, 0, 2009, 1995, 1, 0, 0, 0, 2009, 1996, 1, 0, 0, 0, 2009, 2000, 1, 0, 0, 0, 2009, 2006, 1, 0, 0, 0, 2009, 2007, 1, 0, 0, 0, 2009, 2008, 1, 0, 0, 0, 2010, 69, 1, 0, 0, 0, 2011, 2015, 3, 1360, 680, 0, 2012, 2015, 5, 53, 0, 0, 2013, 2015, 1, 0, 0, 0, 2014, 2011, 1, 0, 0, 0, 2014, 2012, 1, 0, 0, 0, 2014, 2013, 1, 0, 0, 0, 2015, 71, 1, 0, 0, 0, 2016, 2019, 3, 1380, 690, 0, 2017, 2019, 3, 1360, 680, 0, 2018, 2016, 1, 0, 0, 0, 2018, 2017, 1, 0, 0, 0, 2019, 73, 1, 0, 0, 0, 2020, 2021, 5, 306, 0, 0, 2021, 2022, 3, 76, 38, 0, 2022, 75, 1, 0, 0, 0, 2023, 2032, 3, 78, 39, 0, 2024, 2025, 5, 411, 0, 0, 2025, 2032, 5, 379, 0, 0, 2026, 2027, 5, 349, 0, 0, 2027, 2028, 5, 235, 0, 0, 2028, 2032, 5, 242, 0, 0, 2029, 2030, 5, 325, 0, 0, 2030, 2032, 5, 106, 0, 0, 2031, 2023, 1, 0, 0, 0, 2031, 2024, 1, 0, 0, 0, 2031, 2026, 1, 0, 0, 0, 2031, 2029, 1, 0, 0, 0, 2032, 77, 1, 0, 0, 0, 2033, 2036, 3, 58, 29, 0, 2034, 2036, 5, 30, 0, 0, 2035, 2033, 1, 0, 0, 0, 2035, 2034, 1, 0, 0, 0, 2036, 79, 1, 0, 0, 0, 2037, 2038, 5, 326, 0, 0, 2038, 2041, 3, 52, 26, 0, 2039, 2041, 3, 74, 37, 0, 2040, 2037, 1, 0, 0, 0, 2040, 2039, 1, 0, 0, 0, 2041, 81, 1, 0, 0, 0, 2042, 2043, 5, 326, 0, 0, 2043, 2046, 3, 56, 28, 0, 2044, 2046, 3, 74, 37, 0, 2045, 2042, 1, 0, 0, 0, 2045, 2044, 1, 0, 0, 0, 2046, 83, 1, 0, 0, 0, 2047, 2057, 5, 328, 0, 0, 2048, 2058, 3, 58, 29, 0, 2049, 2050, 5, 411, 0, 0, 2050, 2058, 5, 379, 0, 0, 2051, 2052, 5, 349, 0, 0, 2052, 2053, 5, 235, 0, 0, 2053, 2058, 5, 242, 0, 0, 2054, 2055, 5, 325, 0, 0, 2055, 2058, 5, 106, 0, 0, 2056, 2058, 5, 30, 0, 0, 2057, 2048, 1, 0, 0, 0, 2057, 2049, 1, 0, 0, 0, 2057, 2051, 1, 0, 0, 0, 2057, 2054, 1, 0, 0, 0, 2057, 2056, 1, 0, 0, 0, 2058, 85, 1, 0, 0, 0, 2059, 2060, 5, 326, 0, 0, 2060, 2061, 5, 165, 0, 0, 2061, 2062, 3, 88, 44, 0, 2062, 2063, 3, 90, 45, 0, 2063, 87, 1, 0, 0, 0, 2064, 2067, 5, 30, 0, 0, 2065, 2067, 3, 1336, 668, 0, 2066, 2064, 1, 0, 0, 0, 2066, 2065, 1, 0, 0, 0, 2067, 89, 1, 0, 0, 0, 2068, 2069, 7, 8, 0, 0, 2069, 91, 1, 0, 0, 0, 2070, 2071, 5, 155, 0, 0, 2071, 93, 1, 0, 0, 0, 2072, 2073, 5, 187, 0, 0, 2073, 2074, 7, 9, 0, 0, 2074, 95, 1, 0, 0, 0, 2075, 2076, 5, 138, 0, 0, 2076, 2079, 5, 92, 0, 0, 2077, 2078, 5, 220, 0, 0, 2078, 2080, 5, 389, 0, 0, 2079, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2081, 1, 0, 0, 0, 2081, 2084, 3, 1076, 538, 0, 2082, 2085, 3, 98, 49, 0, 2083, 2085, 3, 100, 50, 0, 2084, 2082, 1, 0, 0, 0, 2084, 2083, 1, 0, 0, 0, 2085, 2185, 1, 0, 0, 0, 2086, 2087, 5, 138, 0, 0, 2087, 2088, 5, 92, 0, 0, 2088, 2089, 5, 30, 0, 0, 2089, 2090, 5, 68, 0, 0, 2090, 2091, 5, 344, 0, 0, 2091, 2095, 3, 1342, 671, 0, 2092, 2093, 5, 274, 0, 0, 2093, 2094, 5, 147, 0, 0, 2094, 2096, 3, 1372, 686, 0, 2095, 2092, 1, 0, 0, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2097, 1, 0, 0, 0, 2097, 2098, 5, 326, 0, 0, 2098, 2099, 5, 344, 0, 0, 2099, 2100, 3, 1342, 671, 0, 2100, 2101, 3, 938, 469, 0, 2101, 2185, 1, 0, 0, 0, 2102, 2103, 5, 138, 0, 0, 2103, 2106, 5, 226, 0, 0, 2104, 2105, 5, 220, 0, 0, 2105, 2107, 5, 389, 0, 0, 2106, 2104, 1, 0, 0, 0, 2106, 2107, 1, 0, 0, 0, 2107, 2108, 1, 0, 0, 0, 2108, 2111, 3, 1338, 669, 0, 2109, 2112, 3, 98, 49, 0, 2110, 2112, 3, 102, 51, 0, 2111, 2109, 1, 0, 0, 0, 2111, 2110, 1, 0, 0, 0, 2112, 2185, 1, 0, 0, 0, 2113, 2114, 5, 138, 0, 0, 2114, 2115, 5, 226, 0, 0, 2115, 2116, 5, 30, 0, 0, 2116, 2117, 5, 68, 0, 0, 2117, 2118, 5, 344, 0, 0, 2118, 2122, 3, 1342, 671, 0, 2119, 2120, 5, 274, 0, 0, 2120, 2121, 5, 147, 0, 0, 2121, 2123, 3, 1372, 686, 0, 2122, 2119, 1, 0, 0, 0, 2122, 2123, 1, 0, 0, 0, 2123, 2124, 1, 0, 0, 0, 2124, 2125, 5, 326, 0, 0, 2125, 2126, 5, 344, 0, 0, 2126, 2127, 3, 1342, 671, 0, 2127, 2128, 3, 938, 469, 0, 2128, 2185, 1, 0, 0, 0, 2129, 2130, 5, 138, 0, 0, 2130, 2133, 5, 321, 0, 0, 2131, 2132, 5, 220, 0, 0, 2132, 2134, 5, 389, 0, 0, 2133, 2131, 1, 0, 0, 0, 2133, 2134, 1, 0, 0, 0, 2134, 2135, 1, 0, 0, 0, 2135, 2136, 3, 1338, 669, 0, 2136, 2137, 3, 98, 49, 0, 2137, 2185, 1, 0, 0, 0, 2138, 2139, 5, 138, 0, 0, 2139, 2142, 5, 369, 0, 0, 2140, 2141, 5, 220, 0, 0, 2141, 2143, 5, 389, 0, 0, 2142, 2140, 1, 0, 0, 0, 2142, 2143, 1, 0, 0, 0, 2143, 2144, 1, 0, 0, 0, 2144, 2145, 3, 1338, 669, 0, 2145, 2146, 3, 98, 49, 0, 2146, 2185, 1, 0, 0, 0, 2147, 2148, 5, 138, 0, 0, 2148, 2149, 5, 251, 0, 0, 2149, 2152, 5, 369, 0, 0, 2150, 2151, 5, 220, 0, 0, 2151, 2153, 5, 389, 0, 0, 2152, 2150, 1, 0, 0, 0, 2152, 2153, 1, 0, 0, 0, 2153, 2154, 1, 0, 0, 0, 2154, 2155, 3, 1338, 669, 0, 2155, 2156, 3, 98, 49, 0, 2156, 2185, 1, 0, 0, 0, 2157, 2158, 5, 138, 0, 0, 2158, 2159, 5, 251, 0, 0, 2159, 2160, 5, 369, 0, 0, 2160, 2161, 5, 30, 0, 0, 2161, 2162, 5, 68, 0, 0, 2162, 2163, 5, 344, 0, 0, 2163, 2167, 3, 1342, 671, 0, 2164, 2165, 5, 274, 0, 0, 2165, 2166, 5, 147, 0, 0, 2166, 2168, 3, 1372, 686, 0, 2167, 2164, 1, 0, 0, 0, 2167, 2168, 1, 0, 0, 0, 2168, 2169, 1, 0, 0, 0, 2169, 2170, 5, 326, 0, 0, 2170, 2171, 5, 344, 0, 0, 2171, 2172, 3, 1342, 671, 0, 2172, 2173, 3, 938, 469, 0, 2173, 2185, 1, 0, 0, 0, 2174, 2175, 5, 138, 0, 0, 2175, 2176, 5, 63, 0, 0, 2176, 2179, 5, 92, 0, 0, 2177, 2178, 5, 220, 0, 0, 2178, 2180, 5, 389, 0, 0, 2179, 2177, 1, 0, 0, 0, 2179, 2180, 1, 0, 0, 0, 2180, 2181, 1, 0, 0, 0, 2181, 2182, 3, 1076, 538, 0, 2182, 2183, 3, 98, 49, 0, 2183, 2185, 1, 0, 0, 0, 2184, 2075, 1, 0, 0, 0, 2184, 2086, 1, 0, 0, 0, 2184, 2102, 1, 0, 0, 0, 2184, 2113, 1, 0, 0, 0, 2184, 2129, 1, 0, 0, 0, 2184, 2138, 1, 0, 0, 0, 2184, 2147, 1, 0, 0, 0, 2184, 2157, 1, 0, 0, 0, 2184, 2174, 1, 0, 0, 0, 2185, 97, 1, 0, 0, 0, 2186, 2191, 3, 104, 52, 0, 2187, 2188, 5, 6, 0, 0, 2188, 2190, 3, 104, 52, 0, 2189, 2187, 1, 0, 0, 0, 2190, 2193, 1, 0, 0, 0, 2191, 2189, 1, 0, 0, 0, 2191, 2192, 1, 0, 0, 0, 2192, 99, 1, 0, 0, 0, 2193, 2191, 1, 0, 0, 0, 2194, 2195, 5, 435, 0, 0, 2195, 2196, 5, 278, 0, 0, 2196, 2197, 3, 1338, 669, 0, 2197, 2198, 3, 128, 64, 0, 2198, 2203, 1, 0, 0, 0, 2199, 2200, 5, 436, 0, 0, 2200, 2201, 5, 278, 0, 0, 2201, 2203, 3, 1338, 669, 0, 2202, 2194, 1, 0, 0, 0, 2202, 2199, 1, 0, 0, 0, 2203, 101, 1, 0, 0, 0, 2204, 2205, 5, 435, 0, 0, 2205, 2206, 5, 278, 0, 0, 2206, 2207, 3, 1338, 669, 0, 2207, 103, 1, 0, 0, 0, 2208, 2209, 5, 133, 0, 0, 2209, 2461, 3, 188, 94, 0, 2210, 2211, 5, 133, 0, 0, 2211, 2212, 5, 220, 0, 0, 2212, 2213, 5, 77, 0, 0, 2213, 2214, 5, 389, 0, 0, 2214, 2461, 3, 188, 94, 0, 2215, 2216, 5, 133, 0, 0, 2216, 2217, 5, 44, 0, 0, 2217, 2461, 3, 188, 94, 0, 2218, 2219, 5, 133, 0, 0, 2219, 2220, 5, 44, 0, 0, 2220, 2221, 5, 220, 0, 0, 2221, 2222, 5, 77, 0, 0, 2222, 2223, 5, 389, 0, 0, 2223, 2461, 3, 188, 94, 0, 2224, 2225, 5, 138, 0, 0, 2225, 2226, 3, 724, 362, 0, 2226, 2227, 3, 1374, 687, 0, 2227, 2228, 3, 106, 53, 0, 2228, 2461, 1, 0, 0, 0, 2229, 2230, 5, 138, 0, 0, 2230, 2231, 3, 724, 362, 0, 2231, 2232, 3, 1374, 687, 0, 2232, 2233, 5, 191, 0, 0, 2233, 2234, 5, 77, 0, 0, 2234, 2235, 5, 78, 0, 0, 2235, 2461, 1, 0, 0, 0, 2236, 2237, 5, 138, 0, 0, 2237, 2238, 3, 724, 362, 0, 2238, 2239, 3, 1374, 687, 0, 2239, 2240, 5, 326, 0, 0, 2240, 2241, 5, 77, 0, 0, 2241, 2242, 5, 78, 0, 0, 2242, 2461, 1, 0, 0, 0, 2243, 2244, 5, 138, 0, 0, 2244, 2245, 3, 724, 362, 0, 2245, 2246, 3, 1374, 687, 0, 2246, 2247, 5, 191, 0, 0, 2247, 2248, 5, 437, 0, 0, 2248, 2461, 1, 0, 0, 0, 2249, 2250, 5, 138, 0, 0, 2250, 2251, 3, 724, 362, 0, 2251, 2252, 3, 1374, 687, 0, 2252, 2253, 5, 191, 0, 0, 2253, 2254, 5, 437, 0, 0, 2254, 2255, 5, 220, 0, 0, 2255, 2256, 5, 389, 0, 0, 2256, 2461, 1, 0, 0, 0, 2257, 2258, 5, 138, 0, 0, 2258, 2259, 3, 724, 362, 0, 2259, 2260, 3, 1374, 687, 0, 2260, 2261, 5, 326, 0, 0, 2261, 2262, 5, 335, 0, 0, 2262, 2263, 3, 1366, 683, 0, 2263, 2461, 1, 0, 0, 0, 2264, 2265, 5, 138, 0, 0, 2265, 2266, 3, 724, 362, 0, 2266, 2267, 3, 1358, 679, 0, 2267, 2268, 5, 326, 0, 0, 2268, 2269, 5, 335, 0, 0, 2269, 2270, 3, 1366, 683, 0, 2270, 2461, 1, 0, 0, 0, 2271, 2272, 5, 138, 0, 0, 2272, 2273, 3, 724, 362, 0, 2273, 2274, 3, 1374, 687, 0, 2274, 2275, 5, 326, 0, 0, 2275, 2276, 3, 116, 58, 0, 2276, 2461, 1, 0, 0, 0, 2277, 2278, 5, 138, 0, 0, 2278, 2279, 3, 724, 362, 0, 2279, 2280, 3, 1374, 687, 0, 2280, 2281, 5, 306, 0, 0, 2281, 2282, 3, 116, 58, 0, 2282, 2461, 1, 0, 0, 0, 2283, 2284, 5, 138, 0, 0, 2284, 2285, 3, 724, 362, 0, 2285, 2286, 3, 1374, 687, 0, 2286, 2287, 5, 326, 0, 0, 2287, 2288, 5, 338, 0, 0, 2288, 2289, 3, 1374, 687, 0, 2289, 2461, 1, 0, 0, 0, 2290, 2291, 5, 138, 0, 0, 2291, 2292, 3, 724, 362, 0, 2292, 2293, 3, 1374, 687, 0, 2293, 2294, 5, 133, 0, 0, 2294, 2295, 5, 438, 0, 0, 2295, 2296, 3, 198, 99, 0, 2296, 2297, 5, 36, 0, 0, 2297, 2298, 5, 219, 0, 0, 2298, 2299, 3, 284, 142, 0, 2299, 2461, 1, 0, 0, 0, 2300, 2301, 5, 138, 0, 0, 2301, 2302, 3, 724, 362, 0, 2302, 2303, 3, 1374, 687, 0, 2303, 2304, 3, 124, 62, 0, 2304, 2461, 1, 0, 0, 0, 2305, 2306, 5, 138, 0, 0, 2306, 2307, 3, 724, 362, 0, 2307, 2308, 3, 1374, 687, 0, 2308, 2309, 5, 191, 0, 0, 2309, 2310, 5, 219, 0, 0, 2310, 2461, 1, 0, 0, 0, 2311, 2312, 5, 138, 0, 0, 2312, 2313, 3, 724, 362, 0, 2313, 2314, 3, 1374, 687, 0, 2314, 2315, 5, 191, 0, 0, 2315, 2316, 5, 219, 0, 0, 2316, 2317, 5, 220, 0, 0, 2317, 2318, 5, 389, 0, 0, 2318, 2461, 1, 0, 0, 0, 2319, 2320, 5, 191, 0, 0, 2320, 2321, 3, 724, 362, 0, 2321, 2322, 5, 220, 0, 0, 2322, 2323, 5, 389, 0, 0, 2323, 2324, 3, 1374, 687, 0, 2324, 2325, 3, 108, 54, 0, 2325, 2461, 1, 0, 0, 0, 2326, 2327, 5, 191, 0, 0, 2327, 2328, 3, 724, 362, 0, 2328, 2329, 3, 1374, 687, 0, 2329, 2330, 3, 108, 54, 0, 2330, 2461, 1, 0, 0, 0, 2331, 2332, 5, 138, 0, 0, 2332, 2333, 3, 724, 362, 0, 2333, 2334, 3, 1374, 687, 0, 2334, 2335, 3, 726, 363, 0, 2335, 2336, 5, 353, 0, 0, 2336, 2337, 3, 1120, 560, 0, 2337, 2338, 3, 110, 55, 0, 2338, 2339, 3, 112, 56, 0, 2339, 2461, 1, 0, 0, 0, 2340, 2341, 5, 138, 0, 0, 2341, 2342, 3, 724, 362, 0, 2342, 2343, 3, 1374, 687, 0, 2343, 2344, 3, 344, 172, 0, 2344, 2461, 1, 0, 0, 0, 2345, 2346, 5, 133, 0, 0, 2346, 2461, 3, 208, 104, 0, 2347, 2348, 5, 138, 0, 0, 2348, 2349, 5, 45, 0, 0, 2349, 2350, 3, 1342, 671, 0, 2350, 2351, 3, 440, 220, 0, 2351, 2461, 1, 0, 0, 0, 2352, 2353, 5, 365, 0, 0, 2353, 2354, 5, 45, 0, 0, 2354, 2461, 3, 1342, 671, 0, 2355, 2356, 5, 191, 0, 0, 2356, 2357, 5, 45, 0, 0, 2357, 2358, 5, 220, 0, 0, 2358, 2359, 5, 389, 0, 0, 2359, 2360, 3, 1342, 671, 0, 2360, 2361, 3, 108, 54, 0, 2361, 2461, 1, 0, 0, 0, 2362, 2363, 5, 191, 0, 0, 2363, 2364, 5, 45, 0, 0, 2364, 2365, 3, 1342, 671, 0, 2365, 2366, 3, 108, 54, 0, 2366, 2461, 1, 0, 0, 0, 2367, 2368, 5, 326, 0, 0, 2368, 2369, 5, 372, 0, 0, 2369, 2461, 5, 270, 0, 0, 2370, 2371, 5, 158, 0, 0, 2371, 2372, 5, 80, 0, 0, 2372, 2461, 3, 1342, 671, 0, 2373, 2374, 5, 326, 0, 0, 2374, 2375, 5, 372, 0, 0, 2375, 2461, 5, 158, 0, 0, 2376, 2377, 5, 326, 0, 0, 2377, 2461, 5, 439, 0, 0, 2378, 2379, 5, 326, 0, 0, 2379, 2461, 5, 360, 0, 0, 2380, 2381, 5, 193, 0, 0, 2381, 2382, 5, 350, 0, 0, 2382, 2461, 3, 1342, 671, 0, 2383, 2384, 5, 193, 0, 0, 2384, 2385, 5, 139, 0, 0, 2385, 2386, 5, 350, 0, 0, 2386, 2461, 3, 1342, 671, 0, 2387, 2388, 5, 193, 0, 0, 2388, 2389, 5, 305, 0, 0, 2389, 2390, 5, 350, 0, 0, 2390, 2461, 3, 1342, 671, 0, 2391, 2392, 5, 193, 0, 0, 2392, 2393, 5, 350, 0, 0, 2393, 2461, 5, 30, 0, 0, 2394, 2395, 5, 193, 0, 0, 2395, 2396, 5, 350, 0, 0, 2396, 2461, 5, 99, 0, 0, 2397, 2398, 5, 186, 0, 0, 2398, 2399, 5, 350, 0, 0, 2399, 2461, 3, 1342, 671, 0, 2400, 2401, 5, 186, 0, 0, 2401, 2402, 5, 350, 0, 0, 2402, 2461, 5, 30, 0, 0, 2403, 2404, 5, 186, 0, 0, 2404, 2405, 5, 350, 0, 0, 2405, 2461, 5, 99, 0, 0, 2406, 2407, 5, 193, 0, 0, 2407, 2408, 5, 314, 0, 0, 2408, 2461, 3, 1342, 671, 0, 2409, 2410, 5, 193, 0, 0, 2410, 2411, 5, 139, 0, 0, 2411, 2412, 5, 314, 0, 0, 2412, 2461, 3, 1342, 671, 0, 2413, 2414, 5, 193, 0, 0, 2414, 2415, 5, 305, 0, 0, 2415, 2416, 5, 314, 0, 0, 2416, 2461, 3, 1342, 671, 0, 2417, 2418, 5, 186, 0, 0, 2418, 2419, 5, 314, 0, 0, 2419, 2461, 3, 1342, 671, 0, 2420, 2421, 5, 228, 0, 0, 2421, 2461, 3, 1338, 669, 0, 2422, 2423, 5, 262, 0, 0, 2423, 2424, 5, 228, 0, 0, 2424, 2461, 3, 1338, 669, 0, 2425, 2426, 5, 268, 0, 0, 2426, 2461, 3, 524, 262, 0, 2427, 2428, 5, 77, 0, 0, 2428, 2461, 5, 268, 0, 0, 2429, 2430, 5, 275, 0, 0, 2430, 2431, 5, 94, 0, 0, 2431, 2461, 3, 1370, 685, 0, 2432, 2433, 5, 326, 0, 0, 2433, 2434, 5, 344, 0, 0, 2434, 2461, 3, 1342, 671, 0, 2435, 2436, 5, 326, 0, 0, 2436, 2461, 3, 116, 58, 0, 2437, 2438, 5, 306, 0, 0, 2438, 2461, 3, 116, 58, 0, 2439, 2440, 5, 305, 0, 0, 2440, 2441, 5, 219, 0, 0, 2441, 2461, 3, 114, 57, 0, 2442, 2443, 5, 193, 0, 0, 2443, 2444, 5, 407, 0, 0, 2444, 2445, 5, 242, 0, 0, 2445, 2461, 5, 320, 0, 0, 2446, 2447, 5, 186, 0, 0, 2447, 2448, 5, 407, 0, 0, 2448, 2449, 5, 242, 0, 0, 2449, 2461, 5, 320, 0, 0, 2450, 2451, 5, 209, 0, 0, 2451, 2452, 5, 407, 0, 0, 2452, 2453, 5, 242, 0, 0, 2453, 2461, 5, 320, 0, 0, 2454, 2455, 5, 262, 0, 0, 2455, 2456, 5, 209, 0, 0, 2456, 2457, 5, 407, 0, 0, 2457, 2458, 5, 242, 0, 0, 2458, 2461, 5, 320, 0, 0, 2459, 2461, 3, 344, 172, 0, 2460, 2208, 1, 0, 0, 0, 2460, 2210, 1, 0, 0, 0, 2460, 2215, 1, 0, 0, 0, 2460, 2218, 1, 0, 0, 0, 2460, 2224, 1, 0, 0, 0, 2460, 2229, 1, 0, 0, 0, 2460, 2236, 1, 0, 0, 0, 2460, 2243, 1, 0, 0, 0, 2460, 2249, 1, 0, 0, 0, 2460, 2257, 1, 0, 0, 0, 2460, 2264, 1, 0, 0, 0, 2460, 2271, 1, 0, 0, 0, 2460, 2277, 1, 0, 0, 0, 2460, 2283, 1, 0, 0, 0, 2460, 2290, 1, 0, 0, 0, 2460, 2300, 1, 0, 0, 0, 2460, 2305, 1, 0, 0, 0, 2460, 2311, 1, 0, 0, 0, 2460, 2319, 1, 0, 0, 0, 2460, 2326, 1, 0, 0, 0, 2460, 2331, 1, 0, 0, 0, 2460, 2340, 1, 0, 0, 0, 2460, 2345, 1, 0, 0, 0, 2460, 2347, 1, 0, 0, 0, 2460, 2352, 1, 0, 0, 0, 2460, 2355, 1, 0, 0, 0, 2460, 2362, 1, 0, 0, 0, 2460, 2367, 1, 0, 0, 0, 2460, 2370, 1, 0, 0, 0, 2460, 2373, 1, 0, 0, 0, 2460, 2376, 1, 0, 0, 0, 2460, 2378, 1, 0, 0, 0, 2460, 2380, 1, 0, 0, 0, 2460, 2383, 1, 0, 0, 0, 2460, 2387, 1, 0, 0, 0, 2460, 2391, 1, 0, 0, 0, 2460, 2394, 1, 0, 0, 0, 2460, 2397, 1, 0, 0, 0, 2460, 2400, 1, 0, 0, 0, 2460, 2403, 1, 0, 0, 0, 2460, 2406, 1, 0, 0, 0, 2460, 2409, 1, 0, 0, 0, 2460, 2413, 1, 0, 0, 0, 2460, 2417, 1, 0, 0, 0, 2460, 2420, 1, 0, 0, 0, 2460, 2422, 1, 0, 0, 0, 2460, 2425, 1, 0, 0, 0, 2460, 2427, 1, 0, 0, 0, 2460, 2429, 1, 0, 0, 0, 2460, 2432, 1, 0, 0, 0, 2460, 2435, 1, 0, 0, 0, 2460, 2437, 1, 0, 0, 0, 2460, 2439, 1, 0, 0, 0, 2460, 2442, 1, 0, 0, 0, 2460, 2446, 1, 0, 0, 0, 2460, 2450, 1, 0, 0, 0, 2460, 2454, 1, 0, 0, 0, 2460, 2459, 1, 0, 0, 0, 2461, 105, 1, 0, 0, 0, 2462, 2463, 5, 326, 0, 0, 2463, 2464, 5, 53, 0, 0, 2464, 2468, 3, 1164, 582, 0, 2465, 2466, 5, 191, 0, 0, 2466, 2468, 5, 53, 0, 0, 2467, 2462, 1, 0, 0, 0, 2467, 2465, 1, 0, 0, 0, 2468, 107, 1, 0, 0, 0, 2469, 2473, 5, 150, 0, 0, 2470, 2473, 5, 308, 0, 0, 2471, 2473, 1, 0, 0, 0, 2472, 2469, 1, 0, 0, 0, 2472, 2470, 1, 0, 0, 0, 2472, 2471, 1, 0, 0, 0, 2473, 109, 1, 0, 0, 0, 2474, 2475, 5, 43, 0, 0, 2475, 2478, 3, 524, 262, 0, 2476, 2478, 1, 0, 0, 0, 2477, 2474, 1, 0, 0, 0, 2477, 2476, 1, 0, 0, 0, 2478, 111, 1, 0, 0, 0, 2479, 2480, 5, 100, 0, 0, 2480, 2483, 3, 1164, 582, 0, 2481, 2483, 1, 0, 0, 0, 2482, 2479, 1, 0, 0, 0, 2482, 2481, 1, 0, 0, 0, 2483, 113, 1, 0, 0, 0, 2484, 2491, 5, 263, 0, 0, 2485, 2491, 5, 113, 0, 0, 2486, 2491, 5, 53, 0, 0, 2487, 2488, 5, 100, 0, 0, 2488, 2489, 5, 226, 0, 0, 2489, 2491, 3, 1342, 671, 0, 2490, 2484, 1, 0, 0, 0, 2490, 2485, 1, 0, 0, 0, 2490, 2486, 1, 0, 0, 0, 2490, 2487, 1, 0, 0, 0, 2491, 115, 1, 0, 0, 0, 2492, 2493, 5, 2, 0, 0, 2493, 2494, 3, 120, 60, 0, 2494, 2495, 5, 3, 0, 0, 2495, 117, 1, 0, 0, 0, 2496, 2497, 5, 105, 0, 0, 2497, 2500, 3, 116, 58, 0, 2498, 2500, 1, 0, 0, 0, 2499, 2496, 1, 0, 0, 0, 2499, 2498, 1, 0, 0, 0, 2500, 119, 1, 0, 0, 0, 2501, 2506, 3, 122, 61, 0, 2502, 2503, 5, 6, 0, 0, 2503, 2505, 3, 122, 61, 0, 2504, 2502, 1, 0, 0, 0, 2505, 2508, 1, 0, 0, 0, 2506, 2504, 1, 0, 0, 0, 2506, 2507, 1, 0, 0, 0, 2507, 121, 1, 0, 0, 0, 2508, 2506, 1, 0, 0, 0, 2509, 2518, 3, 1382, 691, 0, 2510, 2511, 5, 10, 0, 0, 2511, 2519, 3, 466, 233, 0, 2512, 2513, 5, 11, 0, 0, 2513, 2516, 3, 1382, 691, 0, 2514, 2515, 5, 10, 0, 0, 2515, 2517, 3, 466, 233, 0, 2516, 2514, 1, 0, 0, 0, 2516, 2517, 1, 0, 0, 0, 2517, 2519, 1, 0, 0, 0, 2518, 2510, 1, 0, 0, 0, 2518, 2512, 1, 0, 0, 0, 2518, 2519, 1, 0, 0, 0, 2519, 123, 1, 0, 0, 0, 2520, 2522, 3, 126, 63, 0, 2521, 2520, 1, 0, 0, 0, 2522, 2523, 1, 0, 0, 0, 2523, 2521, 1, 0, 0, 0, 2523, 2524, 1, 0, 0, 0, 2524, 125, 1, 0, 0, 0, 2525, 2529, 5, 307, 0, 0, 2526, 2527, 3, 16, 8, 0, 2527, 2528, 3, 292, 146, 0, 2528, 2530, 1, 0, 0, 0, 2529, 2526, 1, 0, 0, 0, 2529, 2530, 1, 0, 0, 0, 2530, 2538, 1, 0, 0, 0, 2531, 2535, 5, 326, 0, 0, 2532, 2536, 3, 288, 144, 0, 2533, 2534, 5, 438, 0, 0, 2534, 2536, 3, 198, 99, 0, 2535, 2532, 1, 0, 0, 0, 2535, 2533, 1, 0, 0, 0, 2536, 2538, 1, 0, 0, 0, 2537, 2525, 1, 0, 0, 0, 2537, 2531, 1, 0, 0, 0, 2538, 127, 1, 0, 0, 0, 2539, 2540, 5, 62, 0, 0, 2540, 2541, 5, 415, 0, 0, 2541, 2542, 5, 105, 0, 0, 2542, 2543, 5, 2, 0, 0, 2543, 2544, 3, 132, 66, 0, 2544, 2545, 5, 3, 0, 0, 2545, 2566, 1, 0, 0, 0, 2546, 2547, 5, 62, 0, 0, 2547, 2548, 5, 415, 0, 0, 2548, 2549, 5, 68, 0, 0, 2549, 2550, 5, 2, 0, 0, 2550, 2551, 3, 1282, 641, 0, 2551, 2552, 5, 3, 0, 0, 2552, 2566, 1, 0, 0, 0, 2553, 2554, 5, 62, 0, 0, 2554, 2555, 5, 415, 0, 0, 2555, 2556, 5, 64, 0, 0, 2556, 2557, 5, 2, 0, 0, 2557, 2558, 3, 1282, 641, 0, 2558, 2559, 5, 3, 0, 0, 2559, 2560, 5, 94, 0, 0, 2560, 2561, 5, 2, 0, 0, 2561, 2562, 3, 1282, 641, 0, 2562, 2563, 5, 3, 0, 0, 2563, 2566, 1, 0, 0, 0, 2564, 2566, 5, 53, 0, 0, 2565, 2539, 1, 0, 0, 0, 2565, 2546, 1, 0, 0, 0, 2565, 2553, 1, 0, 0, 0, 2565, 2564, 1, 0, 0, 0, 2566, 129, 1, 0, 0, 0, 2567, 2568, 3, 1380, 690, 0, 2568, 2569, 3, 1358, 679, 0, 2569, 131, 1, 0, 0, 0, 2570, 2575, 3, 130, 65, 0, 2571, 2572, 5, 6, 0, 0, 2572, 2574, 3, 130, 65, 0, 2573, 2571, 1, 0, 0, 0, 2574, 2577, 1, 0, 0, 0, 2575, 2573, 1, 0, 0, 0, 2575, 2576, 1, 0, 0, 0, 2576, 133, 1, 0, 0, 0, 2577, 2575, 1, 0, 0, 0, 2578, 2579, 5, 138, 0, 0, 2579, 2580, 5, 353, 0, 0, 2580, 2581, 3, 524, 262, 0, 2581, 2582, 3, 136, 68, 0, 2582, 135, 1, 0, 0, 0, 2583, 2588, 3, 138, 69, 0, 2584, 2585, 5, 6, 0, 0, 2585, 2587, 3, 138, 69, 0, 2586, 2584, 1, 0, 0, 0, 2587, 2590, 1, 0, 0, 0, 2588, 2586, 1, 0, 0, 0, 2588, 2589, 1, 0, 0, 0, 2589, 137, 1, 0, 0, 0, 2590, 2588, 1, 0, 0, 0, 2591, 2592, 5, 133, 0, 0, 2592, 2593, 5, 143, 0, 0, 2593, 2594, 3, 1104, 552, 0, 2594, 2595, 3, 108, 54, 0, 2595, 2615, 1, 0, 0, 0, 2596, 2597, 5, 191, 0, 0, 2597, 2600, 5, 143, 0, 0, 2598, 2599, 5, 220, 0, 0, 2599, 2601, 5, 389, 0, 0, 2600, 2598, 1, 0, 0, 0, 2600, 2601, 1, 0, 0, 0, 2601, 2602, 1, 0, 0, 0, 2602, 2603, 3, 1374, 687, 0, 2603, 2604, 3, 108, 54, 0, 2604, 2615, 1, 0, 0, 0, 2605, 2606, 5, 138, 0, 0, 2606, 2607, 5, 143, 0, 0, 2607, 2608, 3, 1374, 687, 0, 2608, 2609, 3, 726, 363, 0, 2609, 2610, 5, 353, 0, 0, 2610, 2611, 3, 1120, 560, 0, 2611, 2612, 3, 110, 55, 0, 2612, 2613, 3, 108, 54, 0, 2613, 2615, 1, 0, 0, 0, 2614, 2591, 1, 0, 0, 0, 2614, 2596, 1, 0, 0, 0, 2614, 2605, 1, 0, 0, 0, 2615, 139, 1, 0, 0, 0, 2616, 2619, 5, 157, 0, 0, 2617, 2620, 3, 954, 477, 0, 2618, 2620, 5, 30, 0, 0, 2619, 2617, 1, 0, 0, 0, 2619, 2618, 1, 0, 0, 0, 2620, 141, 1, 0, 0, 0, 2621, 2622, 5, 169, 0, 0, 2622, 2623, 3, 156, 78, 0, 2623, 2624, 3, 1338, 669, 0, 2624, 2625, 3, 214, 107, 0, 2625, 2626, 3, 144, 72, 0, 2626, 2627, 3, 146, 73, 0, 2627, 2628, 3, 148, 74, 0, 2628, 2629, 3, 158, 79, 0, 2629, 2630, 3, 16, 8, 0, 2630, 2631, 3, 150, 75, 0, 2631, 2632, 3, 1096, 548, 0, 2632, 2644, 1, 0, 0, 0, 2633, 2634, 5, 169, 0, 0, 2634, 2635, 5, 2, 0, 0, 2635, 2636, 3, 894, 447, 0, 2636, 2637, 5, 3, 0, 0, 2637, 2638, 5, 94, 0, 0, 2638, 2639, 3, 146, 73, 0, 2639, 2640, 3, 148, 74, 0, 2640, 2641, 3, 16, 8, 0, 2641, 2642, 3, 150, 75, 0, 2642, 2644, 1, 0, 0, 0, 2643, 2621, 1, 0, 0, 0, 2643, 2633, 1, 0, 0, 0, 2644, 143, 1, 0, 0, 0, 2645, 2646, 7, 10, 0, 0, 2646, 145, 1, 0, 0, 0, 2647, 2650, 5, 290, 0, 0, 2648, 2650, 1, 0, 0, 0, 2649, 2647, 1, 0, 0, 0, 2649, 2648, 1, 0, 0, 0, 2650, 147, 1, 0, 0, 0, 2651, 2655, 3, 1360, 680, 0, 2652, 2655, 5, 336, 0, 0, 2653, 2655, 5, 337, 0, 0, 2654, 2651, 1, 0, 0, 0, 2654, 2652, 1, 0, 0, 0, 2654, 2653, 1, 0, 0, 0, 2655, 149, 1, 0, 0, 0, 2656, 2662, 3, 152, 76, 0, 2657, 2658, 5, 2, 0, 0, 2658, 2659, 3, 162, 81, 0, 2659, 2660, 5, 3, 0, 0, 2660, 2662, 1, 0, 0, 0, 2661, 2656, 1, 0, 0, 0, 2661, 2657, 1, 0, 0, 0, 2662, 151, 1, 0, 0, 0, 2663, 2665, 3, 154, 77, 0, 2664, 2663, 1, 0, 0, 0, 2665, 2668, 1, 0, 0, 0, 2666, 2664, 1, 0, 0, 0, 2666, 2667, 1, 0, 0, 0, 2667, 153, 1, 0, 0, 0, 2668, 2666, 1, 0, 0, 0, 2669, 2705, 5, 107, 0, 0, 2670, 2705, 5, 112, 0, 0, 2671, 2672, 5, 183, 0, 0, 2672, 2673, 3, 834, 417, 0, 2673, 2674, 3, 1360, 680, 0, 2674, 2705, 1, 0, 0, 0, 2675, 2676, 5, 78, 0, 0, 2676, 2677, 3, 834, 417, 0, 2677, 2678, 3, 1360, 680, 0, 2678, 2705, 1, 0, 0, 0, 2679, 2705, 5, 171, 0, 0, 2680, 2705, 5, 216, 0, 0, 2681, 2682, 5, 291, 0, 0, 2682, 2683, 3, 834, 417, 0, 2683, 2684, 3, 1360, 680, 0, 2684, 2705, 1, 0, 0, 0, 2685, 2686, 5, 197, 0, 0, 2686, 2687, 3, 834, 417, 0, 2687, 2688, 3, 1360, 680, 0, 2688, 2705, 1, 0, 0, 0, 2689, 2690, 5, 209, 0, 0, 2690, 2691, 5, 291, 0, 0, 2691, 2705, 3, 216, 108, 0, 2692, 2693, 5, 209, 0, 0, 2693, 2694, 5, 291, 0, 0, 2694, 2705, 5, 9, 0, 0, 2695, 2696, 5, 209, 0, 0, 2696, 2697, 5, 77, 0, 0, 2697, 2698, 5, 78, 0, 0, 2698, 2705, 3, 216, 108, 0, 2699, 2700, 5, 209, 0, 0, 2700, 2701, 5, 78, 0, 0, 2701, 2705, 3, 216, 108, 0, 2702, 2703, 5, 194, 0, 0, 2703, 2705, 3, 1360, 680, 0, 2704, 2669, 1, 0, 0, 0, 2704, 2670, 1, 0, 0, 0, 2704, 2671, 1, 0, 0, 0, 2704, 2675, 1, 0, 0, 0, 2704, 2679, 1, 0, 0, 0, 2704, 2680, 1, 0, 0, 0, 2704, 2681, 1, 0, 0, 0, 2704, 2685, 1, 0, 0, 0, 2704, 2689, 1, 0, 0, 0, 2704, 2692, 1, 0, 0, 0, 2704, 2695, 1, 0, 0, 0, 2704, 2699, 1, 0, 0, 0, 2704, 2702, 1, 0, 0, 0, 2705, 155, 1, 0, 0, 0, 2706, 2709, 5, 107, 0, 0, 2707, 2709, 1, 0, 0, 0, 2708, 2706, 1, 0, 0, 0, 2708, 2707, 1, 0, 0, 0, 2709, 157, 1, 0, 0, 0, 2710, 2711, 3, 160, 80, 0, 2711, 2712, 5, 184, 0, 0, 2712, 2713, 3, 1360, 680, 0, 2713, 2716, 1, 0, 0, 0, 2714, 2716, 1, 0, 0, 0, 2715, 2710, 1, 0, 0, 0, 2715, 2714, 1, 0, 0, 0, 2716, 159, 1, 0, 0, 0, 2717, 2720, 5, 100, 0, 0, 2718, 2720, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2719, 2718, 1, 0, 0, 0, 2720, 161, 1, 0, 0, 0, 2721, 2726, 3, 164, 82, 0, 2722, 2723, 5, 6, 0, 0, 2723, 2725, 3, 164, 82, 0, 2724, 2722, 1, 0, 0, 0, 2725, 2728, 1, 0, 0, 0, 2726, 2724, 1, 0, 0, 0, 2726, 2727, 1, 0, 0, 0, 2727, 163, 1, 0, 0, 0, 2728, 2726, 1, 0, 0, 0, 2729, 2730, 3, 1382, 691, 0, 2730, 2731, 3, 166, 83, 0, 2731, 165, 1, 0, 0, 0, 2732, 2741, 3, 66, 33, 0, 2733, 2741, 3, 292, 146, 0, 2734, 2741, 5, 9, 0, 0, 2735, 2736, 5, 2, 0, 0, 2736, 2737, 3, 168, 84, 0, 2737, 2738, 5, 3, 0, 0, 2738, 2741, 1, 0, 0, 0, 2739, 2741, 1, 0, 0, 0, 2740, 2732, 1, 0, 0, 0, 2740, 2733, 1, 0, 0, 0, 2740, 2734, 1, 0, 0, 0, 2740, 2735, 1, 0, 0, 0, 2740, 2739, 1, 0, 0, 0, 2741, 167, 1, 0, 0, 0, 2742, 2747, 3, 170, 85, 0, 2743, 2744, 5, 6, 0, 0, 2744, 2746, 3, 170, 85, 0, 2745, 2743, 1, 0, 0, 0, 2746, 2749, 1, 0, 0, 0, 2747, 2745, 1, 0, 0, 0, 2747, 2748, 1, 0, 0, 0, 2748, 169, 1, 0, 0, 0, 2749, 2747, 1, 0, 0, 0, 2750, 2751, 3, 66, 33, 0, 2751, 171, 1, 0, 0, 0, 2752, 2753, 5, 46, 0, 0, 2753, 2754, 3, 174, 87, 0, 2754, 2758, 5, 92, 0, 0, 2755, 2756, 5, 220, 0, 0, 2756, 2757, 5, 77, 0, 0, 2757, 2759, 5, 389, 0, 0, 2758, 2755, 1, 0, 0, 0, 2758, 2759, 1, 0, 0, 0, 2759, 2760, 1, 0, 0, 0, 2760, 2791, 3, 1338, 669, 0, 2761, 2762, 5, 2, 0, 0, 2762, 2763, 3, 176, 88, 0, 2763, 2764, 5, 3, 0, 0, 2764, 2765, 3, 238, 119, 0, 2765, 2766, 3, 240, 120, 0, 2766, 2767, 3, 248, 124, 0, 2767, 2768, 3, 250, 125, 0, 2768, 2769, 3, 252, 126, 0, 2769, 2770, 3, 254, 127, 0, 2770, 2792, 1, 0, 0, 0, 2771, 2772, 5, 268, 0, 0, 2772, 2773, 3, 524, 262, 0, 2773, 2774, 3, 178, 89, 0, 2774, 2775, 3, 240, 120, 0, 2775, 2776, 3, 248, 124, 0, 2776, 2777, 3, 250, 125, 0, 2777, 2778, 3, 252, 126, 0, 2778, 2779, 3, 254, 127, 0, 2779, 2792, 1, 0, 0, 0, 2780, 2781, 5, 278, 0, 0, 2781, 2782, 5, 268, 0, 0, 2782, 2783, 3, 1338, 669, 0, 2783, 2784, 3, 178, 89, 0, 2784, 2785, 3, 128, 64, 0, 2785, 2786, 3, 240, 120, 0, 2786, 2787, 3, 248, 124, 0, 2787, 2788, 3, 250, 125, 0, 2788, 2789, 3, 252, 126, 0, 2789, 2790, 3, 254, 127, 0, 2790, 2792, 1, 0, 0, 0, 2791, 2761, 1, 0, 0, 0, 2791, 2771, 1, 0, 0, 0, 2791, 2780, 1, 0, 0, 0, 2792, 173, 1, 0, 0, 0, 2793, 2802, 5, 347, 0, 0, 2794, 2802, 5, 345, 0, 0, 2795, 2796, 5, 245, 0, 0, 2796, 2802, 7, 11, 0, 0, 2797, 2798, 5, 213, 0, 0, 2798, 2802, 7, 11, 0, 0, 2799, 2802, 5, 360, 0, 0, 2800, 2802, 1, 0, 0, 0, 2801, 2793, 1, 0, 0, 0, 2801, 2794, 1, 0, 0, 0, 2801, 2795, 1, 0, 0, 0, 2801, 2797, 1, 0, 0, 0, 2801, 2799, 1, 0, 0, 0, 2801, 2800, 1, 0, 0, 0, 2802, 175, 1, 0, 0, 0, 2803, 2806, 3, 180, 90, 0, 2804, 2806, 1, 0, 0, 0, 2805, 2803, 1, 0, 0, 0, 2805, 2804, 1, 0, 0, 0, 2806, 177, 1, 0, 0, 0, 2807, 2808, 5, 2, 0, 0, 2808, 2809, 3, 182, 91, 0, 2809, 2810, 5, 3, 0, 0, 2810, 2813, 1, 0, 0, 0, 2811, 2813, 1, 0, 0, 0, 2812, 2807, 1, 0, 0, 0, 2812, 2811, 1, 0, 0, 0, 2813, 179, 1, 0, 0, 0, 2814, 2819, 3, 184, 92, 0, 2815, 2816, 5, 6, 0, 0, 2816, 2818, 3, 184, 92, 0, 2817, 2815, 1, 0, 0, 0, 2818, 2821, 1, 0, 0, 0, 2819, 2817, 1, 0, 0, 0, 2819, 2820, 1, 0, 0, 0, 2820, 181, 1, 0, 0, 0, 2821, 2819, 1, 0, 0, 0, 2822, 2827, 3, 186, 93, 0, 2823, 2824, 5, 6, 0, 0, 2824, 2826, 3, 186, 93, 0, 2825, 2823, 1, 0, 0, 0, 2826, 2829, 1, 0, 0, 0, 2827, 2825, 1, 0, 0, 0, 2827, 2828, 1, 0, 0, 0, 2828, 183, 1, 0, 0, 0, 2829, 2827, 1, 0, 0, 0, 2830, 2834, 3, 208, 104, 0, 2831, 2834, 3, 202, 101, 0, 2832, 2834, 3, 188, 94, 0, 2833, 2830, 1, 0, 0, 0, 2833, 2831, 1, 0, 0, 0, 2833, 2832, 1, 0, 0, 0, 2834, 185, 1, 0, 0, 0, 2835, 2838, 3, 190, 95, 0, 2836, 2838, 3, 208, 104, 0, 2837, 2835, 1, 0, 0, 0, 2837, 2836, 1, 0, 0, 0, 2838, 187, 1, 0, 0, 0, 2839, 2840, 3, 1374, 687, 0, 2840, 2841, 3, 1120, 560, 0, 2841, 2842, 3, 340, 170, 0, 2842, 2843, 3, 192, 96, 0, 2843, 189, 1, 0, 0, 0, 2844, 2847, 3, 1374, 687, 0, 2845, 2846, 5, 105, 0, 0, 2846, 2848, 5, 273, 0, 0, 2847, 2845, 1, 0, 0, 0, 2847, 2848, 1, 0, 0, 0, 2848, 2849, 1, 0, 0, 0, 2849, 2850, 3, 192, 96, 0, 2850, 191, 1, 0, 0, 0, 2851, 2853, 3, 194, 97, 0, 2852, 2851, 1, 0, 0, 0, 2853, 2856, 1, 0, 0, 0, 2854, 2852, 1, 0, 0, 0, 2854, 2855, 1, 0, 0, 0, 2855, 193, 1, 0, 0, 0, 2856, 2854, 1, 0, 0, 0, 2857, 2858, 5, 45, 0, 0, 2858, 2859, 3, 1342, 671, 0, 2859, 2860, 3, 196, 98, 0, 2860, 2866, 1, 0, 0, 0, 2861, 2866, 3, 196, 98, 0, 2862, 2866, 3, 200, 100, 0, 2863, 2864, 5, 43, 0, 0, 2864, 2866, 3, 524, 262, 0, 2865, 2857, 1, 0, 0, 0, 2865, 2861, 1, 0, 0, 0, 2865, 2862, 1, 0, 0, 0, 2865, 2863, 1, 0, 0, 0, 2866, 195, 1, 0, 0, 0, 2867, 2868, 5, 77, 0, 0, 2868, 2906, 5, 78, 0, 0, 2869, 2906, 5, 78, 0, 0, 2870, 2871, 5, 98, 0, 0, 2871, 2872, 3, 664, 332, 0, 2872, 2873, 3, 256, 128, 0, 2873, 2906, 1, 0, 0, 0, 2874, 2875, 5, 85, 0, 0, 2875, 2876, 5, 236, 0, 0, 2876, 2877, 3, 664, 332, 0, 2877, 2878, 3, 256, 128, 0, 2878, 2906, 1, 0, 0, 0, 2879, 2880, 5, 42, 0, 0, 2880, 2881, 5, 2, 0, 0, 2881, 2882, 3, 1164, 582, 0, 2882, 2883, 5, 3, 0, 0, 2883, 2884, 3, 212, 106, 0, 2884, 2906, 1, 0, 0, 0, 2885, 2886, 5, 53, 0, 0, 2886, 2906, 3, 1206, 603, 0, 2887, 2888, 5, 438, 0, 0, 2888, 2889, 3, 198, 99, 0, 2889, 2897, 5, 36, 0, 0, 2890, 2891, 5, 219, 0, 0, 2891, 2898, 3, 284, 142, 0, 2892, 2893, 5, 2, 0, 0, 2893, 2894, 3, 1164, 582, 0, 2894, 2895, 5, 3, 0, 0, 2895, 2896, 5, 440, 0, 0, 2896, 2898, 1, 0, 0, 0, 2897, 2890, 1, 0, 0, 0, 2897, 2892, 1, 0, 0, 0, 2898, 2906, 1, 0, 0, 0, 2899, 2900, 5, 86, 0, 0, 2900, 2901, 3, 1338, 669, 0, 2901, 2902, 3, 214, 107, 0, 2902, 2903, 3, 222, 111, 0, 2903, 2904, 3, 230, 115, 0, 2904, 2906, 1, 0, 0, 0, 2905, 2867, 1, 0, 0, 0, 2905, 2869, 1, 0, 0, 0, 2905, 2870, 1, 0, 0, 0, 2905, 2874, 1, 0, 0, 0, 2905, 2879, 1, 0, 0, 0, 2905, 2885, 1, 0, 0, 0, 2905, 2887, 1, 0, 0, 0, 2905, 2899, 1, 0, 0, 0, 2906, 197, 1, 0, 0, 0, 2907, 2911, 5, 139, 0, 0, 2908, 2909, 5, 147, 0, 0, 2909, 2911, 5, 53, 0, 0, 2910, 2907, 1, 0, 0, 0, 2910, 2908, 1, 0, 0, 0, 2911, 199, 1, 0, 0, 0, 2912, 2918, 5, 54, 0, 0, 2913, 2914, 5, 77, 0, 0, 2914, 2918, 5, 54, 0, 0, 2915, 2916, 5, 69, 0, 0, 2916, 2918, 7, 8, 0, 0, 2917, 2912, 1, 0, 0, 0, 2917, 2913, 1, 0, 0, 0, 2917, 2915, 1, 0, 0, 0, 2918, 201, 1, 0, 0, 0, 2919, 2920, 5, 120, 0, 0, 2920, 2921, 3, 1338, 669, 0, 2921, 2922, 3, 204, 102, 0, 2922, 203, 1, 0, 0, 0, 2923, 2924, 7, 12, 0, 0, 2924, 2926, 3, 206, 103, 0, 2925, 2923, 1, 0, 0, 0, 2926, 2929, 1, 0, 0, 0, 2927, 2925, 1, 0, 0, 0, 2927, 2928, 1, 0, 0, 0, 2928, 205, 1, 0, 0, 0, 2929, 2927, 1, 0, 0, 0, 2930, 2931, 7, 13, 0, 0, 2931, 207, 1, 0, 0, 0, 2932, 2933, 5, 45, 0, 0, 2933, 2934, 3, 1342, 671, 0, 2934, 2935, 3, 210, 105, 0, 2935, 2938, 1, 0, 0, 0, 2936, 2938, 3, 210, 105, 0, 2937, 2932, 1, 0, 0, 0, 2937, 2936, 1, 0, 0, 0, 2938, 209, 1, 0, 0, 0, 2939, 2940, 5, 42, 0, 0, 2940, 2941, 5, 2, 0, 0, 2941, 2942, 3, 1164, 582, 0, 2942, 2943, 5, 3, 0, 0, 2943, 2944, 3, 440, 220, 0, 2944, 2998, 1, 0, 0, 0, 2945, 2957, 5, 98, 0, 0, 2946, 2947, 5, 2, 0, 0, 2947, 2948, 3, 216, 108, 0, 2948, 2949, 5, 3, 0, 0, 2949, 2950, 3, 220, 110, 0, 2950, 2951, 3, 664, 332, 0, 2951, 2952, 3, 256, 128, 0, 2952, 2953, 3, 440, 220, 0, 2953, 2958, 1, 0, 0, 0, 2954, 2955, 3, 258, 129, 0, 2955, 2956, 3, 440, 220, 0, 2956, 2958, 1, 0, 0, 0, 2957, 2946, 1, 0, 0, 0, 2957, 2954, 1, 0, 0, 0, 2958, 2998, 1, 0, 0, 0, 2959, 2960, 5, 85, 0, 0, 2960, 2972, 5, 236, 0, 0, 2961, 2962, 5, 2, 0, 0, 2962, 2963, 3, 216, 108, 0, 2963, 2964, 5, 3, 0, 0, 2964, 2965, 3, 220, 110, 0, 2965, 2966, 3, 664, 332, 0, 2966, 2967, 3, 256, 128, 0, 2967, 2968, 3, 440, 220, 0, 2968, 2973, 1, 0, 0, 0, 2969, 2970, 3, 258, 129, 0, 2970, 2971, 3, 440, 220, 0, 2971, 2973, 1, 0, 0, 0, 2972, 2961, 1, 0, 0, 0, 2972, 2969, 1, 0, 0, 0, 2973, 2998, 1, 0, 0, 0, 2974, 2975, 5, 199, 0, 0, 2975, 2976, 3, 596, 298, 0, 2976, 2977, 5, 2, 0, 0, 2977, 2978, 3, 224, 112, 0, 2978, 2979, 5, 3, 0, 0, 2979, 2980, 3, 220, 110, 0, 2980, 2981, 3, 664, 332, 0, 2981, 2982, 3, 256, 128, 0, 2982, 2983, 3, 228, 114, 0, 2983, 2984, 3, 440, 220, 0, 2984, 2998, 1, 0, 0, 0, 2985, 2986, 5, 63, 0, 0, 2986, 2987, 5, 236, 0, 0, 2987, 2988, 5, 2, 0, 0, 2988, 2989, 3, 216, 108, 0, 2989, 2990, 5, 3, 0, 0, 2990, 2991, 5, 86, 0, 0, 2991, 2992, 3, 1338, 669, 0, 2992, 2993, 3, 214, 107, 0, 2993, 2994, 3, 222, 111, 0, 2994, 2995, 3, 230, 115, 0, 2995, 2996, 3, 440, 220, 0, 2996, 2998, 1, 0, 0, 0, 2997, 2939, 1, 0, 0, 0, 2997, 2945, 1, 0, 0, 0, 2997, 2959, 1, 0, 0, 0, 2997, 2974, 1, 0, 0, 0, 2997, 2985, 1, 0, 0, 0, 2998, 211, 1, 0, 0, 0, 2999, 3000, 5, 262, 0, 0, 3000, 3003, 5, 228, 0, 0, 3001, 3003, 1, 0, 0, 0, 3002, 2999, 1, 0, 0, 0, 3002, 3001, 1, 0, 0, 0, 3003, 213, 1, 0, 0, 0, 3004, 3005, 5, 2, 0, 0, 3005, 3006, 3, 216, 108, 0, 3006, 3007, 5, 3, 0, 0, 3007, 3010, 1, 0, 0, 0, 3008, 3010, 1, 0, 0, 0, 3009, 3004, 1, 0, 0, 0, 3009, 3008, 1, 0, 0, 0, 3010, 215, 1, 0, 0, 0, 3011, 3016, 3, 218, 109, 0, 3012, 3013, 5, 6, 0, 0, 3013, 3015, 3, 218, 109, 0, 3014, 3012, 1, 0, 0, 0, 3015, 3018, 1, 0, 0, 0, 3016, 3014, 1, 0, 0, 0, 3016, 3017, 1, 0, 0, 0, 3017, 217, 1, 0, 0, 0, 3018, 3016, 1, 0, 0, 0, 3019, 3020, 3, 1374, 687, 0, 3020, 219, 1, 0, 0, 0, 3021, 3022, 5, 441, 0, 0, 3022, 3023, 5, 2, 0, 0, 3023, 3024, 3, 216, 108, 0, 3024, 3025, 5, 3, 0, 0, 3025, 3028, 1, 0, 0, 0, 3026, 3028, 1, 0, 0, 0, 3027, 3021, 1, 0, 0, 0, 3027, 3026, 1, 0, 0, 0, 3028, 221, 1, 0, 0, 0, 3029, 3030, 5, 249, 0, 0, 3030, 3033, 7, 14, 0, 0, 3031, 3033, 1, 0, 0, 0, 3032, 3029, 1, 0, 0, 0, 3032, 3031, 1, 0, 0, 0, 3033, 223, 1, 0, 0, 0, 3034, 3039, 3, 226, 113, 0, 3035, 3036, 5, 6, 0, 0, 3036, 3038, 3, 226, 113, 0, 3037, 3035, 1, 0, 0, 0, 3038, 3041, 1, 0, 0, 0, 3039, 3037, 1, 0, 0, 0, 3039, 3040, 1, 0, 0, 0, 3040, 225, 1, 0, 0, 0, 3041, 3039, 1, 0, 0, 0, 3042, 3043, 3, 602, 301, 0, 3043, 3050, 5, 105, 0, 0, 3044, 3051, 3, 684, 342, 0, 3045, 3046, 5, 271, 0, 0, 3046, 3047, 5, 2, 0, 0, 3047, 3048, 3, 684, 342, 0, 3048, 3049, 5, 3, 0, 0, 3049, 3051, 1, 0, 0, 0, 3050, 3044, 1, 0, 0, 0, 3050, 3045, 1, 0, 0, 0, 3051, 227, 1, 0, 0, 0, 3052, 3053, 5, 103, 0, 0, 3053, 3054, 5, 2, 0, 0, 3054, 3055, 3, 1164, 582, 0, 3055, 3056, 5, 3, 0, 0, 3056, 3059, 1, 0, 0, 0, 3057, 3059, 1, 0, 0, 0, 3058, 3052, 1, 0, 0, 0, 3058, 3057, 1, 0, 0, 0, 3059, 229, 1, 0, 0, 0, 3060, 3070, 3, 232, 116, 0, 3061, 3070, 3, 234, 117, 0, 3062, 3063, 3, 232, 116, 0, 3063, 3064, 3, 234, 117, 0, 3064, 3070, 1, 0, 0, 0, 3065, 3066, 3, 234, 117, 0, 3066, 3067, 3, 232, 116, 0, 3067, 3070, 1, 0, 0, 0, 3068, 3070, 1, 0, 0, 0, 3069, 3060, 1, 0, 0, 0, 3069, 3061, 1, 0, 0, 0, 3069, 3062, 1, 0, 0, 0, 3069, 3065, 1, 0, 0, 0, 3069, 3068, 1, 0, 0, 0, 3070, 231, 1, 0, 0, 0, 3071, 3072, 5, 80, 0, 0, 3072, 3073, 5, 362, 0, 0, 3073, 3074, 3, 236, 118, 0, 3074, 233, 1, 0, 0, 0, 3075, 3076, 5, 80, 0, 0, 3076, 3077, 5, 182, 0, 0, 3077, 3078, 3, 236, 118, 0, 3078, 235, 1, 0, 0, 0, 3079, 3080, 5, 262, 0, 0, 3080, 3086, 5, 132, 0, 0, 3081, 3086, 5, 308, 0, 0, 3082, 3086, 5, 150, 0, 0, 3083, 3084, 5, 326, 0, 0, 3084, 3086, 7, 15, 0, 0, 3085, 3079, 1, 0, 0, 0, 3085, 3081, 1, 0, 0, 0, 3085, 3082, 1, 0, 0, 0, 3085, 3083, 1, 0, 0, 0, 3086, 237, 1, 0, 0, 0, 3087, 3088, 5, 229, 0, 0, 3088, 3089, 5, 2, 0, 0, 3089, 3090, 3, 1336, 668, 0, 3090, 3091, 5, 3, 0, 0, 3091, 3094, 1, 0, 0, 0, 3092, 3094, 1, 0, 0, 0, 3093, 3087, 1, 0, 0, 0, 3093, 3092, 1, 0, 0, 0, 3094, 239, 1, 0, 0, 0, 3095, 3098, 3, 242, 121, 0, 3096, 3098, 1, 0, 0, 0, 3097, 3095, 1, 0, 0, 0, 3097, 3096, 1, 0, 0, 0, 3098, 241, 1, 0, 0, 0, 3099, 3100, 5, 278, 0, 0, 3100, 3101, 5, 147, 0, 0, 3101, 3102, 3, 1374, 687, 0, 3102, 3103, 5, 2, 0, 0, 3103, 3104, 3, 244, 122, 0, 3104, 3105, 5, 3, 0, 0, 3105, 243, 1, 0, 0, 0, 3106, 3111, 3, 246, 123, 0, 3107, 3108, 5, 6, 0, 0, 3108, 3110, 3, 246, 123, 0, 3109, 3107, 1, 0, 0, 0, 3110, 3113, 1, 0, 0, 0, 3111, 3109, 1, 0, 0, 0, 3111, 3112, 1, 0, 0, 0, 3112, 245, 1, 0, 0, 0, 3113, 3111, 1, 0, 0, 0, 3114, 3115, 3, 1374, 687, 0, 3115, 3116, 3, 608, 304, 0, 3116, 3117, 3, 610, 305, 0, 3117, 3129, 1, 0, 0, 0, 3118, 3119, 3, 1216, 608, 0, 3119, 3120, 3, 608, 304, 0, 3120, 3121, 3, 610, 305, 0, 3121, 3129, 1, 0, 0, 0, 3122, 3123, 5, 2, 0, 0, 3123, 3124, 3, 1164, 582, 0, 3124, 3125, 5, 3, 0, 0, 3125, 3126, 3, 608, 304, 0, 3126, 3127, 3, 610, 305, 0, 3127, 3129, 1, 0, 0, 0, 3128, 3114, 1, 0, 0, 0, 3128, 3118, 1, 0, 0, 0, 3128, 3122, 1, 0, 0, 0, 3129, 247, 1, 0, 0, 0, 3130, 3131, 5, 100, 0, 0, 3131, 3134, 3, 1342, 671, 0, 3132, 3134, 1, 0, 0, 0, 3133, 3130, 1, 0, 0, 0, 3133, 3132, 1, 0, 0, 0, 3134, 249, 1, 0, 0, 0, 3135, 3136, 5, 105, 0, 0, 3136, 3141, 3, 116, 58, 0, 3137, 3138, 5, 372, 0, 0, 3138, 3141, 5, 270, 0, 0, 3139, 3141, 1, 0, 0, 0, 3140, 3135, 1, 0, 0, 0, 3140, 3137, 1, 0, 0, 0, 3140, 3139, 1, 0, 0, 0, 3141, 251, 1, 0, 0, 0, 3142, 3143, 5, 80, 0, 0, 3143, 3149, 5, 161, 0, 0, 3144, 3150, 5, 191, 0, 0, 3145, 3146, 5, 182, 0, 0, 3146, 3150, 5, 313, 0, 0, 3147, 3148, 5, 285, 0, 0, 3148, 3150, 5, 313, 0, 0, 3149, 3144, 1, 0, 0, 0, 3149, 3145, 1, 0, 0, 0, 3149, 3147, 1, 0, 0, 0, 3150, 3153, 1, 0, 0, 0, 3151, 3153, 1, 0, 0, 0, 3152, 3142, 1, 0, 0, 0, 3152, 3151, 1, 0, 0, 0, 3153, 253, 1, 0, 0, 0, 3154, 3155, 5, 344, 0, 0, 3155, 3158, 3, 1342, 671, 0, 3156, 3158, 1, 0, 0, 0, 3157, 3154, 1, 0, 0, 0, 3157, 3156, 1, 0, 0, 0, 3158, 255, 1, 0, 0, 0, 3159, 3160, 5, 100, 0, 0, 3160, 3161, 5, 226, 0, 0, 3161, 3162, 5, 344, 0, 0, 3162, 3165, 3, 1342, 671, 0, 3163, 3165, 1, 0, 0, 0, 3164, 3159, 1, 0, 0, 0, 3164, 3163, 1, 0, 0, 0, 3165, 257, 1, 0, 0, 0, 3166, 3167, 5, 100, 0, 0, 3167, 3168, 5, 226, 0, 0, 3168, 3169, 3, 1342, 671, 0, 3169, 259, 1, 0, 0, 0, 3170, 3171, 5, 46, 0, 0, 3171, 3175, 5, 335, 0, 0, 3172, 3173, 5, 220, 0, 0, 3173, 3174, 5, 77, 0, 0, 3174, 3176, 5, 389, 0, 0, 3175, 3172, 1, 0, 0, 0, 3175, 3176, 1, 0, 0, 0, 3176, 3177, 1, 0, 0, 0, 3177, 3178, 3, 524, 262, 0, 3178, 3179, 3, 870, 435, 0, 3179, 3180, 5, 80, 0, 0, 3180, 3181, 3, 1282, 641, 0, 3181, 3182, 5, 64, 0, 0, 3182, 3183, 3, 1058, 529, 0, 3183, 261, 1, 0, 0, 0, 3184, 3185, 5, 138, 0, 0, 3185, 3188, 5, 335, 0, 0, 3186, 3187, 5, 220, 0, 0, 3187, 3189, 5, 389, 0, 0, 3188, 3186, 1, 0, 0, 0, 3188, 3189, 1, 0, 0, 0, 3189, 3190, 1, 0, 0, 0, 3190, 3191, 3, 524, 262, 0, 3191, 3192, 5, 326, 0, 0, 3192, 3193, 5, 335, 0, 0, 3193, 3194, 3, 1366, 683, 0, 3194, 263, 1, 0, 0, 0, 3195, 3196, 5, 46, 0, 0, 3196, 3197, 3, 174, 87, 0, 3197, 3201, 5, 92, 0, 0, 3198, 3199, 5, 220, 0, 0, 3199, 3200, 5, 77, 0, 0, 3200, 3202, 5, 389, 0, 0, 3201, 3198, 1, 0, 0, 0, 3201, 3202, 1, 0, 0, 0, 3202, 3203, 1, 0, 0, 0, 3203, 3204, 3, 266, 133, 0, 3204, 3205, 5, 36, 0, 0, 3205, 3206, 3, 960, 480, 0, 3206, 3207, 3, 268, 134, 0, 3207, 265, 1, 0, 0, 0, 3208, 3209, 3, 1338, 669, 0, 3209, 3210, 3, 214, 107, 0, 3210, 3211, 3, 248, 124, 0, 3211, 3212, 3, 250, 125, 0, 3212, 3213, 3, 252, 126, 0, 3213, 3214, 3, 254, 127, 0, 3214, 267, 1, 0, 0, 0, 3215, 3219, 5, 105, 0, 0, 3216, 3220, 5, 174, 0, 0, 3217, 3218, 5, 262, 0, 0, 3218, 3220, 5, 174, 0, 0, 3219, 3216, 1, 0, 0, 0, 3219, 3217, 1, 0, 0, 0, 3220, 3223, 1, 0, 0, 0, 3221, 3223, 1, 0, 0, 0, 3222, 3215, 1, 0, 0, 0, 3222, 3221, 1, 0, 0, 0, 3223, 269, 1, 0, 0, 0, 3224, 3225, 5, 46, 0, 0, 3225, 3226, 3, 274, 137, 0, 3226, 3227, 5, 251, 0, 0, 3227, 3231, 5, 369, 0, 0, 3228, 3229, 5, 220, 0, 0, 3229, 3230, 5, 77, 0, 0, 3230, 3232, 5, 389, 0, 0, 3231, 3228, 1, 0, 0, 0, 3231, 3232, 1, 0, 0, 0, 3232, 3233, 1, 0, 0, 0, 3233, 3234, 3, 272, 136, 0, 3234, 3235, 5, 36, 0, 0, 3235, 3236, 3, 960, 480, 0, 3236, 3237, 3, 268, 134, 0, 3237, 271, 1, 0, 0, 0, 3238, 3239, 3, 1338, 669, 0, 3239, 3240, 3, 214, 107, 0, 3240, 3241, 3, 248, 124, 0, 3241, 3242, 3, 118, 59, 0, 3242, 3243, 3, 254, 127, 0, 3243, 273, 1, 0, 0, 0, 3244, 3247, 5, 360, 0, 0, 3245, 3247, 1, 0, 0, 0, 3246, 3244, 1, 0, 0, 0, 3246, 3245, 1, 0, 0, 0, 3247, 275, 1, 0, 0, 0, 3248, 3249, 5, 298, 0, 0, 3249, 3250, 5, 251, 0, 0, 3250, 3251, 5, 369, 0, 0, 3251, 3252, 3, 592, 296, 0, 3252, 3253, 3, 1338, 669, 0, 3253, 3254, 3, 268, 134, 0, 3254, 277, 1, 0, 0, 0, 3255, 3256, 5, 46, 0, 0, 3256, 3257, 3, 174, 87, 0, 3257, 3261, 5, 321, 0, 0, 3258, 3259, 5, 220, 0, 0, 3259, 3260, 5, 77, 0, 0, 3260, 3262, 5, 389, 0, 0, 3261, 3258, 1, 0, 0, 0, 3261, 3262, 1, 0, 0, 0, 3262, 3263, 1, 0, 0, 0, 3263, 3264, 3, 1338, 669, 0, 3264, 3265, 3, 282, 141, 0, 3265, 279, 1, 0, 0, 0, 3266, 3267, 5, 138, 0, 0, 3267, 3270, 5, 321, 0, 0, 3268, 3269, 5, 220, 0, 0, 3269, 3271, 5, 389, 0, 0, 3270, 3268, 1, 0, 0, 0, 3270, 3271, 1, 0, 0, 0, 3271, 3272, 1, 0, 0, 0, 3272, 3273, 3, 1338, 669, 0, 3273, 3274, 3, 286, 143, 0, 3274, 281, 1, 0, 0, 0, 3275, 3278, 3, 286, 143, 0, 3276, 3278, 1, 0, 0, 0, 3277, 3275, 1, 0, 0, 0, 3277, 3276, 1, 0, 0, 0, 3278, 283, 1, 0, 0, 0, 3279, 3280, 5, 2, 0, 0, 3280, 3281, 3, 286, 143, 0, 3281, 3282, 5, 3, 0, 0, 3282, 3285, 1, 0, 0, 0, 3283, 3285, 1, 0, 0, 0, 3284, 3279, 1, 0, 0, 0, 3284, 3283, 1, 0, 0, 0, 3285, 285, 1, 0, 0, 0, 3286, 3288, 3, 288, 144, 0, 3287, 3286, 1, 0, 0, 0, 3288, 3289, 1, 0, 0, 0, 3289, 3287, 1, 0, 0, 0, 3289, 3290, 1, 0, 0, 0, 3290, 287, 1, 0, 0, 0, 3291, 3292, 5, 36, 0, 0, 3292, 3322, 3, 1124, 562, 0, 3293, 3294, 5, 148, 0, 0, 3294, 3322, 3, 292, 146, 0, 3295, 3322, 5, 173, 0, 0, 3296, 3297, 5, 225, 0, 0, 3297, 3298, 3, 290, 145, 0, 3298, 3299, 3, 292, 146, 0, 3299, 3322, 1, 0, 0, 0, 3300, 3301, 5, 252, 0, 0, 3301, 3322, 3, 292, 146, 0, 3302, 3303, 5, 255, 0, 0, 3303, 3322, 3, 292, 146, 0, 3304, 3305, 5, 262, 0, 0, 3305, 3322, 7, 16, 0, 0, 3306, 3307, 5, 274, 0, 0, 3307, 3308, 5, 147, 0, 0, 3308, 3322, 3, 524, 262, 0, 3309, 3310, 5, 321, 0, 0, 3310, 3311, 5, 259, 0, 0, 3311, 3322, 3, 524, 262, 0, 3312, 3313, 5, 333, 0, 0, 3313, 3314, 3, 16, 8, 0, 3314, 3315, 3, 292, 146, 0, 3315, 3322, 1, 0, 0, 0, 3316, 3317, 5, 307, 0, 0, 3317, 3319, 3, 16, 8, 0, 3318, 3320, 3, 292, 146, 0, 3319, 3318, 1, 0, 0, 0, 3319, 3320, 1, 0, 0, 0, 3320, 3322, 1, 0, 0, 0, 3321, 3291, 1, 0, 0, 0, 3321, 3293, 1, 0, 0, 0, 3321, 3295, 1, 0, 0, 0, 3321, 3296, 1, 0, 0, 0, 3321, 3300, 1, 0, 0, 0, 3321, 3302, 1, 0, 0, 0, 3321, 3304, 1, 0, 0, 0, 3321, 3306, 1, 0, 0, 0, 3321, 3309, 1, 0, 0, 0, 3321, 3312, 1, 0, 0, 0, 3321, 3316, 1, 0, 0, 0, 3322, 289, 1, 0, 0, 0, 3323, 3326, 5, 147, 0, 0, 3324, 3326, 1, 0, 0, 0, 3325, 3323, 1, 0, 0, 0, 3325, 3324, 1, 0, 0, 0, 3326, 291, 1, 0, 0, 0, 3327, 3334, 3, 1356, 678, 0, 3328, 3329, 5, 12, 0, 0, 3329, 3334, 3, 1356, 678, 0, 3330, 3331, 5, 13, 0, 0, 3331, 3334, 3, 1356, 678, 0, 3332, 3334, 3, 1366, 683, 0, 3333, 3327, 1, 0, 0, 0, 3333, 3328, 1, 0, 0, 0, 3333, 3330, 1, 0, 0, 0, 3333, 3332, 1, 0, 0, 0, 3334, 293, 1, 0, 0, 0, 3335, 3340, 3, 292, 146, 0, 3336, 3337, 5, 6, 0, 0, 3337, 3339, 3, 292, 146, 0, 3338, 3336, 1, 0, 0, 0, 3339, 3342, 1, 0, 0, 0, 3340, 3338, 1, 0, 0, 0, 3340, 3341, 1, 0, 0, 0, 3341, 295, 1, 0, 0, 0, 3342, 3340, 1, 0, 0, 0, 3343, 3344, 5, 46, 0, 0, 3344, 3345, 3, 618, 309, 0, 3345, 3346, 3, 298, 149, 0, 3346, 3347, 3, 308, 154, 0, 3347, 3348, 5, 238, 0, 0, 3348, 3354, 3, 1342, 671, 0, 3349, 3350, 5, 215, 0, 0, 3350, 3351, 3, 300, 150, 0, 3351, 3352, 3, 302, 151, 0, 3352, 3353, 3, 306, 153, 0, 3353, 3355, 1, 0, 0, 0, 3354, 3349, 1, 0, 0, 0, 3354, 3355, 1, 0, 0, 0, 3355, 297, 1, 0, 0, 0, 3356, 3359, 5, 352, 0, 0, 3357, 3359, 1, 0, 0, 0, 3358, 3356, 1, 0, 0, 0, 3358, 3357, 1, 0, 0, 0, 3359, 299, 1, 0, 0, 0, 3360, 3362, 3, 1342, 671, 0, 3361, 3363, 3, 526, 263, 0, 3362, 3361, 1, 0, 0, 0, 3362, 3363, 1, 0, 0, 0, 3363, 301, 1, 0, 0, 0, 3364, 3365, 5, 230, 0, 0, 3365, 3368, 3, 300, 150, 0, 3366, 3368, 1, 0, 0, 0, 3367, 3364, 1, 0, 0, 0, 3367, 3366, 1, 0, 0, 0, 3368, 303, 1, 0, 0, 0, 3369, 3370, 5, 366, 0, 0, 3370, 3374, 3, 300, 150, 0, 3371, 3372, 5, 262, 0, 0, 3372, 3374, 5, 366, 0, 0, 3373, 3369, 1, 0, 0, 0, 3373, 3371, 1, 0, 0, 0, 3374, 305, 1, 0, 0, 0, 3375, 3378, 3, 304, 152, 0, 3376, 3378, 1, 0, 0, 0, 3377, 3375, 1, 0, 0, 0, 3377, 3376, 1, 0, 0, 0, 3378, 307, 1, 0, 0, 0, 3379, 3382, 5, 288, 0, 0, 3380, 3382, 1, 0, 0, 0, 3381, 3379, 1, 0, 0, 0, 3381, 3380, 1, 0, 0, 0, 3382, 309, 1, 0, 0, 0, 3383, 3384, 5, 46, 0, 0, 3384, 3385, 5, 344, 0, 0, 3385, 3386, 3, 1342, 671, 0, 3386, 3387, 3, 312, 156, 0, 3387, 3388, 5, 246, 0, 0, 3388, 3389, 3, 1360, 680, 0, 3389, 3390, 3, 118, 59, 0, 3390, 311, 1, 0, 0, 0, 3391, 3392, 5, 275, 0, 0, 3392, 3395, 3, 1370, 685, 0, 3393, 3395, 1, 0, 0, 0, 3394, 3391, 1, 0, 0, 0, 3394, 3393, 1, 0, 0, 0, 3395, 313, 1, 0, 0, 0, 3396, 3397, 5, 191, 0, 0, 3397, 3400, 5, 344, 0, 0, 3398, 3399, 5, 220, 0, 0, 3399, 3401, 5, 389, 0, 0, 3400, 3398, 1, 0, 0, 0, 3400, 3401, 1, 0, 0, 0, 3401, 3402, 1, 0, 0, 0, 3402, 3403, 3, 1342, 671, 0, 3403, 315, 1, 0, 0, 0, 3404, 3405, 5, 46, 0, 0, 3405, 3409, 5, 204, 0, 0, 3406, 3407, 5, 220, 0, 0, 3407, 3408, 5, 77, 0, 0, 3408, 3410, 5, 389, 0, 0, 3409, 3406, 1, 0, 0, 0, 3409, 3410, 1, 0, 0, 0, 3410, 3411, 1, 0, 0, 0, 3411, 3412, 3, 1342, 671, 0, 3412, 3413, 3, 16, 8, 0, 3413, 3414, 3, 318, 159, 0, 3414, 317, 1, 0, 0, 0, 3415, 3417, 3, 320, 160, 0, 3416, 3415, 1, 0, 0, 0, 3417, 3420, 1, 0, 0, 0, 3418, 3416, 1, 0, 0, 0, 3418, 3419, 1, 0, 0, 0, 3419, 319, 1, 0, 0, 0, 3420, 3418, 1, 0, 0, 0, 3421, 3422, 5, 316, 0, 0, 3422, 3429, 3, 1342, 671, 0, 3423, 3424, 5, 368, 0, 0, 3424, 3429, 3, 72, 36, 0, 3425, 3426, 5, 64, 0, 0, 3426, 3429, 3, 72, 36, 0, 3427, 3429, 5, 150, 0, 0, 3428, 3421, 1, 0, 0, 0, 3428, 3423, 1, 0, 0, 0, 3428, 3425, 1, 0, 0, 0, 3428, 3427, 1, 0, 0, 0, 3429, 321, 1, 0, 0, 0, 3430, 3431, 5, 138, 0, 0, 3431, 3432, 5, 204, 0, 0, 3432, 3433, 3, 1342, 671, 0, 3433, 3434, 5, 362, 0, 0, 3434, 3435, 3, 324, 162, 0, 3435, 323, 1, 0, 0, 0, 3436, 3438, 3, 326, 163, 0, 3437, 3436, 1, 0, 0, 0, 3438, 3441, 1, 0, 0, 0, 3439, 3437, 1, 0, 0, 0, 3439, 3440, 1, 0, 0, 0, 3440, 325, 1, 0, 0, 0, 3441, 3439, 1, 0, 0, 0, 3442, 3443, 5, 94, 0, 0, 3443, 3444, 3, 72, 36, 0, 3444, 327, 1, 0, 0, 0, 3445, 3446, 5, 138, 0, 0, 3446, 3447, 5, 204, 0, 0, 3447, 3448, 3, 1342, 671, 0, 3448, 3449, 3, 40, 20, 0, 3449, 3450, 3, 516, 258, 0, 3450, 3451, 3, 1342, 671, 0, 3451, 3550, 1, 0, 0, 0, 3452, 3453, 5, 138, 0, 0, 3453, 3454, 5, 204, 0, 0, 3454, 3455, 3, 1342, 671, 0, 3455, 3456, 3, 40, 20, 0, 3456, 3457, 3, 514, 257, 0, 3457, 3458, 3, 524, 262, 0, 3458, 3550, 1, 0, 0, 0, 3459, 3460, 5, 138, 0, 0, 3460, 3461, 5, 204, 0, 0, 3461, 3462, 3, 1342, 671, 0, 3462, 3463, 3, 40, 20, 0, 3463, 3464, 5, 136, 0, 0, 3464, 3465, 3, 650, 325, 0, 3465, 3550, 1, 0, 0, 0, 3466, 3467, 5, 138, 0, 0, 3467, 3468, 5, 204, 0, 0, 3468, 3469, 3, 1342, 671, 0, 3469, 3470, 3, 40, 20, 0, 3470, 3471, 5, 41, 0, 0, 3471, 3472, 5, 2, 0, 0, 3472, 3473, 3, 1120, 560, 0, 3473, 3474, 5, 36, 0, 0, 3474, 3475, 3, 1120, 560, 0, 3475, 3476, 5, 3, 0, 0, 3476, 3550, 1, 0, 0, 0, 3477, 3478, 5, 138, 0, 0, 3478, 3479, 5, 204, 0, 0, 3479, 3480, 3, 1342, 671, 0, 3480, 3481, 3, 40, 20, 0, 3481, 3482, 5, 189, 0, 0, 3482, 3483, 3, 1120, 560, 0, 3483, 3550, 1, 0, 0, 0, 3484, 3485, 5, 138, 0, 0, 3485, 3486, 5, 204, 0, 0, 3486, 3487, 3, 1342, 671, 0, 3487, 3488, 3, 40, 20, 0, 3488, 3489, 5, 211, 0, 0, 3489, 3490, 3, 626, 313, 0, 3490, 3550, 1, 0, 0, 0, 3491, 3492, 5, 138, 0, 0, 3492, 3493, 5, 204, 0, 0, 3493, 3494, 3, 1342, 671, 0, 3494, 3495, 3, 40, 20, 0, 3495, 3496, 5, 271, 0, 0, 3496, 3497, 3, 688, 344, 0, 3497, 3550, 1, 0, 0, 0, 3498, 3499, 5, 138, 0, 0, 3499, 3500, 5, 204, 0, 0, 3500, 3501, 3, 1342, 671, 0, 3501, 3502, 3, 40, 20, 0, 3502, 3503, 5, 271, 0, 0, 3503, 3504, 5, 156, 0, 0, 3504, 3505, 3, 524, 262, 0, 3505, 3506, 5, 100, 0, 0, 3506, 3507, 3, 1342, 671, 0, 3507, 3550, 1, 0, 0, 0, 3508, 3509, 5, 138, 0, 0, 3509, 3510, 5, 204, 0, 0, 3510, 3511, 3, 1342, 671, 0, 3511, 3512, 3, 40, 20, 0, 3512, 3513, 5, 271, 0, 0, 3513, 3514, 5, 206, 0, 0, 3514, 3515, 3, 524, 262, 0, 3515, 3516, 5, 100, 0, 0, 3516, 3517, 3, 1342, 671, 0, 3517, 3550, 1, 0, 0, 0, 3518, 3519, 5, 138, 0, 0, 3519, 3520, 5, 204, 0, 0, 3520, 3521, 3, 1342, 671, 0, 3521, 3522, 3, 40, 20, 0, 3522, 3523, 5, 289, 0, 0, 3523, 3524, 3, 626, 313, 0, 3524, 3550, 1, 0, 0, 0, 3525, 3526, 5, 138, 0, 0, 3526, 3527, 5, 204, 0, 0, 3527, 3528, 3, 1342, 671, 0, 3528, 3529, 3, 40, 20, 0, 3529, 3530, 5, 442, 0, 0, 3530, 3531, 3, 626, 313, 0, 3531, 3550, 1, 0, 0, 0, 3532, 3533, 5, 138, 0, 0, 3533, 3534, 5, 204, 0, 0, 3534, 3535, 3, 1342, 671, 0, 3535, 3536, 3, 40, 20, 0, 3536, 3537, 5, 443, 0, 0, 3537, 3538, 5, 62, 0, 0, 3538, 3539, 3, 1120, 560, 0, 3539, 3540, 5, 238, 0, 0, 3540, 3541, 3, 1342, 671, 0, 3541, 3550, 1, 0, 0, 0, 3542, 3543, 5, 138, 0, 0, 3543, 3544, 5, 204, 0, 0, 3544, 3545, 3, 1342, 671, 0, 3545, 3546, 3, 40, 20, 0, 3546, 3547, 5, 353, 0, 0, 3547, 3548, 3, 1120, 560, 0, 3548, 3550, 1, 0, 0, 0, 3549, 3445, 1, 0, 0, 0, 3549, 3452, 1, 0, 0, 0, 3549, 3459, 1, 0, 0, 0, 3549, 3466, 1, 0, 0, 0, 3549, 3477, 1, 0, 0, 0, 3549, 3484, 1, 0, 0, 0, 3549, 3491, 1, 0, 0, 0, 3549, 3498, 1, 0, 0, 0, 3549, 3508, 1, 0, 0, 0, 3549, 3518, 1, 0, 0, 0, 3549, 3525, 1, 0, 0, 0, 3549, 3532, 1, 0, 0, 0, 3549, 3542, 1, 0, 0, 0, 3550, 329, 1, 0, 0, 0, 3551, 3552, 5, 46, 0, 0, 3552, 3553, 5, 63, 0, 0, 3553, 3554, 5, 174, 0, 0, 3554, 3555, 5, 374, 0, 0, 3555, 3556, 3, 1342, 671, 0, 3556, 3557, 3, 336, 168, 0, 3557, 3558, 3, 340, 170, 0, 3558, 331, 1, 0, 0, 0, 3559, 3560, 5, 215, 0, 0, 3560, 3568, 3, 300, 150, 0, 3561, 3562, 5, 262, 0, 0, 3562, 3568, 5, 215, 0, 0, 3563, 3564, 5, 366, 0, 0, 3564, 3568, 3, 300, 150, 0, 3565, 3566, 5, 262, 0, 0, 3566, 3568, 5, 366, 0, 0, 3567, 3559, 1, 0, 0, 0, 3567, 3561, 1, 0, 0, 0, 3567, 3563, 1, 0, 0, 0, 3567, 3565, 1, 0, 0, 0, 3568, 333, 1, 0, 0, 0, 3569, 3571, 3, 332, 166, 0, 3570, 3569, 1, 0, 0, 0, 3571, 3572, 1, 0, 0, 0, 3572, 3570, 1, 0, 0, 0, 3572, 3573, 1, 0, 0, 0, 3573, 335, 1, 0, 0, 0, 3574, 3577, 3, 334, 167, 0, 3575, 3577, 1, 0, 0, 0, 3576, 3574, 1, 0, 0, 0, 3576, 3575, 1, 0, 0, 0, 3577, 337, 1, 0, 0, 0, 3578, 3579, 5, 138, 0, 0, 3579, 3580, 5, 63, 0, 0, 3580, 3581, 5, 174, 0, 0, 3581, 3582, 5, 374, 0, 0, 3582, 3583, 3, 1342, 671, 0, 3583, 3584, 3, 336, 168, 0, 3584, 3585, 3, 344, 172, 0, 3585, 3594, 1, 0, 0, 0, 3586, 3587, 5, 138, 0, 0, 3587, 3588, 5, 63, 0, 0, 3588, 3589, 5, 174, 0, 0, 3589, 3590, 5, 374, 0, 0, 3590, 3591, 3, 1342, 671, 0, 3591, 3592, 3, 334, 167, 0, 3592, 3594, 1, 0, 0, 0, 3593, 3578, 1, 0, 0, 0, 3593, 3586, 1, 0, 0, 0, 3594, 339, 1, 0, 0, 0, 3595, 3596, 5, 273, 0, 0, 3596, 3597, 5, 2, 0, 0, 3597, 3598, 3, 342, 171, 0, 3598, 3599, 5, 3, 0, 0, 3599, 3602, 1, 0, 0, 0, 3600, 3602, 1, 0, 0, 0, 3601, 3595, 1, 0, 0, 0, 3601, 3600, 1, 0, 0, 0, 3602, 341, 1, 0, 0, 0, 3603, 3608, 3, 350, 175, 0, 3604, 3605, 5, 6, 0, 0, 3605, 3607, 3, 350, 175, 0, 3606, 3604, 1, 0, 0, 0, 3607, 3610, 1, 0, 0, 0, 3608, 3606, 1, 0, 0, 0, 3608, 3609, 1, 0, 0, 0, 3609, 343, 1, 0, 0, 0, 3610, 3608, 1, 0, 0, 0, 3611, 3612, 5, 273, 0, 0, 3612, 3613, 5, 2, 0, 0, 3613, 3614, 3, 346, 173, 0, 3614, 3615, 5, 3, 0, 0, 3615, 345, 1, 0, 0, 0, 3616, 3621, 3, 348, 174, 0, 3617, 3618, 5, 6, 0, 0, 3618, 3620, 3, 348, 174, 0, 3619, 3617, 1, 0, 0, 0, 3620, 3623, 1, 0, 0, 0, 3621, 3619, 1, 0, 0, 0, 3621, 3622, 1, 0, 0, 0, 3622, 347, 1, 0, 0, 0, 3623, 3621, 1, 0, 0, 0, 3624, 3632, 3, 350, 175, 0, 3625, 3626, 5, 326, 0, 0, 3626, 3632, 3, 350, 175, 0, 3627, 3628, 5, 133, 0, 0, 3628, 3632, 3, 350, 175, 0, 3629, 3630, 5, 191, 0, 0, 3630, 3632, 3, 352, 176, 0, 3631, 3624, 1, 0, 0, 0, 3631, 3625, 1, 0, 0, 0, 3631, 3627, 1, 0, 0, 0, 3631, 3629, 1, 0, 0, 0, 3632, 349, 1, 0, 0, 0, 3633, 3634, 3, 352, 176, 0, 3634, 3635, 3, 354, 177, 0, 3635, 351, 1, 0, 0, 0, 3636, 3637, 3, 1382, 691, 0, 3637, 353, 1, 0, 0, 0, 3638, 3639, 3, 1360, 680, 0, 3639, 355, 1, 0, 0, 0, 3640, 3641, 5, 46, 0, 0, 3641, 3642, 5, 324, 0, 0, 3642, 3643, 3, 1342, 671, 0, 3643, 3644, 3, 358, 179, 0, 3644, 3645, 3, 362, 181, 0, 3645, 3646, 5, 63, 0, 0, 3646, 3647, 5, 174, 0, 0, 3647, 3648, 5, 374, 0, 0, 3648, 3649, 3, 1342, 671, 0, 3649, 3650, 3, 340, 170, 0, 3650, 3666, 1, 0, 0, 0, 3651, 3652, 5, 46, 0, 0, 3652, 3653, 5, 324, 0, 0, 3653, 3654, 5, 220, 0, 0, 3654, 3655, 5, 77, 0, 0, 3655, 3656, 5, 389, 0, 0, 3656, 3657, 3, 1342, 671, 0, 3657, 3658, 3, 358, 179, 0, 3658, 3659, 3, 362, 181, 0, 3659, 3660, 5, 63, 0, 0, 3660, 3661, 5, 174, 0, 0, 3661, 3662, 5, 374, 0, 0, 3662, 3663, 3, 1342, 671, 0, 3663, 3664, 3, 340, 170, 0, 3664, 3666, 1, 0, 0, 0, 3665, 3640, 1, 0, 0, 0, 3665, 3651, 1, 0, 0, 0, 3666, 357, 1, 0, 0, 0, 3667, 3668, 5, 353, 0, 0, 3668, 3671, 3, 1360, 680, 0, 3669, 3671, 1, 0, 0, 0, 3670, 3667, 1, 0, 0, 0, 3670, 3669, 1, 0, 0, 0, 3671, 359, 1, 0, 0, 0, 3672, 3675, 5, 368, 0, 0, 3673, 3676, 3, 1360, 680, 0, 3674, 3676, 5, 78, 0, 0, 3675, 3673, 1, 0, 0, 0, 3675, 3674, 1, 0, 0, 0, 3676, 361, 1, 0, 0, 0, 3677, 3680, 3, 360, 180, 0, 3678, 3680, 1, 0, 0, 0, 3679, 3677, 1, 0, 0, 0, 3679, 3678, 1, 0, 0, 0, 3680, 363, 1, 0, 0, 0, 3681, 3682, 5, 138, 0, 0, 3682, 3683, 5, 324, 0, 0, 3683, 3689, 3, 1342, 671, 0, 3684, 3690, 3, 344, 172, 0, 3685, 3687, 3, 360, 180, 0, 3686, 3688, 3, 344, 172, 0, 3687, 3686, 1, 0, 0, 0, 3687, 3688, 1, 0, 0, 0, 3688, 3690, 1, 0, 0, 0, 3689, 3684, 1, 0, 0, 0, 3689, 3685, 1, 0, 0, 0, 3690, 365, 1, 0, 0, 0, 3691, 3692, 5, 46, 0, 0, 3692, 3693, 5, 63, 0, 0, 3693, 3694, 5, 92, 0, 0, 3694, 3695, 3, 1338, 669, 0, 3695, 3696, 5, 2, 0, 0, 3696, 3697, 3, 176, 88, 0, 3697, 3698, 5, 3, 0, 0, 3698, 3699, 3, 238, 119, 0, 3699, 3700, 5, 324, 0, 0, 3700, 3701, 3, 1342, 671, 0, 3701, 3702, 3, 340, 170, 0, 3702, 3748, 1, 0, 0, 0, 3703, 3704, 5, 46, 0, 0, 3704, 3705, 5, 63, 0, 0, 3705, 3706, 5, 92, 0, 0, 3706, 3707, 5, 220, 0, 0, 3707, 3708, 5, 77, 0, 0, 3708, 3709, 5, 389, 0, 0, 3709, 3710, 3, 1338, 669, 0, 3710, 3711, 5, 2, 0, 0, 3711, 3712, 3, 176, 88, 0, 3712, 3713, 5, 3, 0, 0, 3713, 3714, 3, 238, 119, 0, 3714, 3715, 5, 324, 0, 0, 3715, 3716, 3, 1342, 671, 0, 3716, 3717, 3, 340, 170, 0, 3717, 3748, 1, 0, 0, 0, 3718, 3719, 5, 46, 0, 0, 3719, 3720, 5, 63, 0, 0, 3720, 3721, 5, 92, 0, 0, 3721, 3722, 3, 1338, 669, 0, 3722, 3723, 5, 278, 0, 0, 3723, 3724, 5, 268, 0, 0, 3724, 3725, 3, 1338, 669, 0, 3725, 3726, 3, 178, 89, 0, 3726, 3727, 3, 128, 64, 0, 3727, 3728, 5, 324, 0, 0, 3728, 3729, 3, 1342, 671, 0, 3729, 3730, 3, 340, 170, 0, 3730, 3748, 1, 0, 0, 0, 3731, 3732, 5, 46, 0, 0, 3732, 3733, 5, 63, 0, 0, 3733, 3734, 5, 92, 0, 0, 3734, 3735, 5, 220, 0, 0, 3735, 3736, 5, 77, 0, 0, 3736, 3737, 5, 389, 0, 0, 3737, 3738, 3, 1338, 669, 0, 3738, 3739, 5, 278, 0, 0, 3739, 3740, 5, 268, 0, 0, 3740, 3741, 3, 1338, 669, 0, 3741, 3742, 3, 178, 89, 0, 3742, 3743, 3, 128, 64, 0, 3743, 3744, 5, 324, 0, 0, 3744, 3745, 3, 1342, 671, 0, 3745, 3746, 3, 340, 170, 0, 3746, 3748, 1, 0, 0, 0, 3747, 3691, 1, 0, 0, 0, 3747, 3703, 1, 0, 0, 0, 3747, 3718, 1, 0, 0, 0, 3747, 3731, 1, 0, 0, 0, 3748, 367, 1, 0, 0, 0, 3749, 3750, 5, 444, 0, 0, 3750, 3751, 5, 63, 0, 0, 3751, 3752, 5, 316, 0, 0, 3752, 3753, 3, 1342, 671, 0, 3753, 3754, 3, 372, 186, 0, 3754, 3755, 5, 64, 0, 0, 3755, 3756, 5, 324, 0, 0, 3756, 3757, 3, 1342, 671, 0, 3757, 3758, 5, 71, 0, 0, 3758, 3759, 3, 1342, 671, 0, 3759, 3760, 3, 340, 170, 0, 3760, 369, 1, 0, 0, 0, 3761, 3762, 5, 74, 0, 0, 3762, 3765, 5, 94, 0, 0, 3763, 3765, 5, 59, 0, 0, 3764, 3761, 1, 0, 0, 0, 3764, 3763, 1, 0, 0, 0, 3765, 371, 1, 0, 0, 0, 3766, 3767, 3, 370, 185, 0, 3767, 3768, 5, 2, 0, 0, 3768, 3769, 3, 1078, 539, 0, 3769, 3770, 5, 3, 0, 0, 3770, 3773, 1, 0, 0, 0, 3771, 3773, 1, 0, 0, 0, 3772, 3766, 1, 0, 0, 0, 3772, 3771, 1, 0, 0, 0, 3773, 373, 1, 0, 0, 0, 3774, 3775, 5, 46, 0, 0, 3775, 3776, 5, 99, 0, 0, 3776, 3777, 5, 248, 0, 0, 3777, 3778, 5, 62, 0, 0, 3778, 3779, 3, 376, 188, 0, 3779, 3780, 5, 324, 0, 0, 3780, 3781, 3, 1342, 671, 0, 3781, 3782, 3, 340, 170, 0, 3782, 3796, 1, 0, 0, 0, 3783, 3784, 5, 46, 0, 0, 3784, 3785, 5, 99, 0, 0, 3785, 3786, 5, 248, 0, 0, 3786, 3787, 5, 220, 0, 0, 3787, 3788, 5, 77, 0, 0, 3788, 3789, 5, 389, 0, 0, 3789, 3790, 5, 62, 0, 0, 3790, 3791, 3, 376, 188, 0, 3791, 3792, 5, 324, 0, 0, 3792, 3793, 3, 1342, 671, 0, 3793, 3794, 3, 340, 170, 0, 3794, 3796, 1, 0, 0, 0, 3795, 3774, 1, 0, 0, 0, 3795, 3783, 1, 0, 0, 0, 3796, 375, 1, 0, 0, 0, 3797, 3800, 3, 1370, 685, 0, 3798, 3800, 5, 99, 0, 0, 3799, 3797, 1, 0, 0, 0, 3799, 3798, 1, 0, 0, 0, 3800, 377, 1, 0, 0, 0, 3801, 3802, 5, 191, 0, 0, 3802, 3803, 5, 99, 0, 0, 3803, 3804, 5, 248, 0, 0, 3804, 3805, 5, 62, 0, 0, 3805, 3806, 3, 376, 188, 0, 3806, 3807, 5, 324, 0, 0, 3807, 3808, 3, 1342, 671, 0, 3808, 3820, 1, 0, 0, 0, 3809, 3810, 5, 191, 0, 0, 3810, 3811, 5, 99, 0, 0, 3811, 3812, 5, 248, 0, 0, 3812, 3813, 5, 220, 0, 0, 3813, 3814, 5, 389, 0, 0, 3814, 3815, 5, 62, 0, 0, 3815, 3816, 3, 376, 188, 0, 3816, 3817, 5, 324, 0, 0, 3817, 3818, 3, 1342, 671, 0, 3818, 3820, 1, 0, 0, 0, 3819, 3801, 1, 0, 0, 0, 3819, 3809, 1, 0, 0, 0, 3820, 379, 1, 0, 0, 0, 3821, 3822, 5, 138, 0, 0, 3822, 3823, 5, 99, 0, 0, 3823, 3824, 5, 248, 0, 0, 3824, 3825, 5, 62, 0, 0, 3825, 3826, 3, 376, 188, 0, 3826, 3827, 5, 324, 0, 0, 3827, 3828, 3, 1342, 671, 0, 3828, 3829, 3, 344, 172, 0, 3829, 381, 1, 0, 0, 0, 3830, 3831, 5, 46, 0, 0, 3831, 3832, 5, 445, 0, 0, 3832, 3833, 3, 1342, 671, 0, 3833, 3834, 5, 80, 0, 0, 3834, 3835, 3, 1338, 669, 0, 3835, 3836, 3, 394, 197, 0, 3836, 3837, 3, 396, 198, 0, 3837, 3838, 3, 390, 195, 0, 3838, 3839, 3, 386, 193, 0, 3839, 3840, 3, 388, 194, 0, 3840, 383, 1, 0, 0, 0, 3841, 3842, 5, 138, 0, 0, 3842, 3843, 5, 445, 0, 0, 3843, 3844, 3, 1342, 671, 0, 3844, 3845, 5, 80, 0, 0, 3845, 3846, 3, 1338, 669, 0, 3846, 3847, 3, 392, 196, 0, 3847, 3848, 3, 386, 193, 0, 3848, 3849, 3, 388, 194, 0, 3849, 385, 1, 0, 0, 0, 3850, 3851, 5, 100, 0, 0, 3851, 3852, 5, 2, 0, 0, 3852, 3853, 3, 1164, 582, 0, 3853, 3854, 5, 3, 0, 0, 3854, 3857, 1, 0, 0, 0, 3855, 3857, 1, 0, 0, 0, 3856, 3850, 1, 0, 0, 0, 3856, 3855, 1, 0, 0, 0, 3857, 387, 1, 0, 0, 0, 3858, 3859, 5, 105, 0, 0, 3859, 3860, 5, 42, 0, 0, 3860, 3861, 5, 2, 0, 0, 3861, 3862, 3, 1164, 582, 0, 3862, 3863, 5, 3, 0, 0, 3863, 3866, 1, 0, 0, 0, 3864, 3866, 1, 0, 0, 0, 3865, 3858, 1, 0, 0, 0, 3865, 3864, 1, 0, 0, 0, 3866, 389, 1, 0, 0, 0, 3867, 3868, 5, 94, 0, 0, 3868, 3871, 3, 1372, 686, 0, 3869, 3871, 1, 0, 0, 0, 3870, 3867, 1, 0, 0, 0, 3870, 3869, 1, 0, 0, 0, 3871, 391, 1, 0, 0, 0, 3872, 3873, 5, 94, 0, 0, 3873, 3876, 3, 1372, 686, 0, 3874, 3876, 1, 0, 0, 0, 3875, 3872, 1, 0, 0, 0, 3875, 3874, 1, 0, 0, 0, 3876, 393, 1, 0, 0, 0, 3877, 3878, 5, 36, 0, 0, 3878, 3881, 3, 1384, 692, 0, 3879, 3881, 1, 0, 0, 0, 3880, 3877, 1, 0, 0, 0, 3880, 3879, 1, 0, 0, 0, 3881, 395, 1, 0, 0, 0, 3882, 3883, 5, 62, 0, 0, 3883, 3886, 3, 398, 199, 0, 3884, 3886, 1, 0, 0, 0, 3885, 3882, 1, 0, 0, 0, 3885, 3884, 1, 0, 0, 0, 3886, 397, 1, 0, 0, 0, 3887, 3888, 7, 17, 0, 0, 3888, 399, 1, 0, 0, 0, 3889, 3890, 5, 46, 0, 0, 3890, 3891, 5, 131, 0, 0, 3891, 3892, 5, 446, 0, 0, 3892, 3893, 3, 1342, 671, 0, 3893, 3894, 5, 353, 0, 0, 3894, 3895, 3, 402, 201, 0, 3895, 3896, 5, 215, 0, 0, 3896, 3897, 3, 300, 150, 0, 3897, 401, 1, 0, 0, 0, 3898, 3899, 7, 18, 0, 0, 3899, 403, 1, 0, 0, 0, 3900, 3901, 5, 46, 0, 0, 3901, 3902, 5, 350, 0, 0, 3902, 3903, 3, 1342, 671, 0, 3903, 3904, 3, 406, 203, 0, 3904, 3905, 3, 408, 204, 0, 3905, 3906, 5, 80, 0, 0, 3906, 3907, 3, 1338, 669, 0, 3907, 3908, 3, 412, 206, 0, 3908, 3909, 3, 424, 212, 0, 3909, 3910, 3, 430, 215, 0, 3910, 3911, 5, 202, 0, 0, 3911, 3912, 3, 432, 216, 0, 3912, 3913, 3, 1348, 674, 0, 3913, 3914, 5, 2, 0, 0, 3914, 3915, 3, 434, 217, 0, 3915, 3916, 5, 3, 0, 0, 3916, 3939, 1, 0, 0, 0, 3917, 3918, 5, 46, 0, 0, 3918, 3919, 5, 45, 0, 0, 3919, 3920, 5, 350, 0, 0, 3920, 3921, 3, 1342, 671, 0, 3921, 3922, 5, 135, 0, 0, 3922, 3923, 3, 408, 204, 0, 3923, 3924, 5, 80, 0, 0, 3924, 3925, 3, 1338, 669, 0, 3925, 3926, 3, 438, 219, 0, 3926, 3927, 3, 440, 220, 0, 3927, 3928, 5, 62, 0, 0, 3928, 3929, 5, 192, 0, 0, 3929, 3930, 5, 407, 0, 0, 3930, 3931, 3, 430, 215, 0, 3931, 3932, 5, 202, 0, 0, 3932, 3933, 3, 432, 216, 0, 3933, 3934, 3, 1348, 674, 0, 3934, 3935, 5, 2, 0, 0, 3935, 3936, 3, 434, 217, 0, 3936, 3937, 5, 3, 0, 0, 3937, 3939, 1, 0, 0, 0, 3938, 3900, 1, 0, 0, 0, 3938, 3917, 1, 0, 0, 0, 3939, 405, 1, 0, 0, 0, 3940, 3945, 5, 145, 0, 0, 3941, 3945, 5, 135, 0, 0, 3942, 3943, 5, 233, 0, 0, 3943, 3945, 5, 268, 0, 0, 3944, 3940, 1, 0, 0, 0, 3944, 3941, 1, 0, 0, 0, 3944, 3942, 1, 0, 0, 0, 3945, 407, 1, 0, 0, 0, 3946, 3951, 3, 410, 205, 0, 3947, 3948, 5, 82, 0, 0, 3948, 3950, 3, 410, 205, 0, 3949, 3947, 1, 0, 0, 0, 3950, 3953, 1, 0, 0, 0, 3951, 3949, 1, 0, 0, 0, 3951, 3952, 1, 0, 0, 0, 3952, 409, 1, 0, 0, 0, 3953, 3951, 1, 0, 0, 0, 3954, 3962, 5, 232, 0, 0, 3955, 3962, 5, 182, 0, 0, 3956, 3962, 5, 362, 0, 0, 3957, 3958, 5, 362, 0, 0, 3958, 3959, 5, 268, 0, 0, 3959, 3962, 3, 216, 108, 0, 3960, 3962, 5, 351, 0, 0, 3961, 3954, 1, 0, 0, 0, 3961, 3955, 1, 0, 0, 0, 3961, 3956, 1, 0, 0, 0, 3961, 3957, 1, 0, 0, 0, 3961, 3960, 1, 0, 0, 0, 3962, 411, 1, 0, 0, 0, 3963, 3964, 5, 447, 0, 0, 3964, 3967, 3, 414, 207, 0, 3965, 3967, 1, 0, 0, 0, 3966, 3963, 1, 0, 0, 0, 3966, 3965, 1, 0, 0, 0, 3967, 413, 1, 0, 0, 0, 3968, 3970, 3, 416, 208, 0, 3969, 3968, 1, 0, 0, 0, 3970, 3971, 1, 0, 0, 0, 3971, 3969, 1, 0, 0, 0, 3971, 3972, 1, 0, 0, 0, 3972, 415, 1, 0, 0, 0, 3973, 3974, 3, 418, 209, 0, 3974, 3975, 3, 420, 210, 0, 3975, 3976, 3, 834, 417, 0, 3976, 3977, 3, 422, 211, 0, 3977, 417, 1, 0, 0, 0, 3978, 3979, 7, 19, 0, 0, 3979, 419, 1, 0, 0, 0, 3980, 3981, 7, 20, 0, 0, 3981, 421, 1, 0, 0, 0, 3982, 3983, 3, 1374, 687, 0, 3983, 423, 1, 0, 0, 0, 3984, 3985, 5, 62, 0, 0, 3985, 3986, 3, 426, 213, 0, 3986, 3987, 3, 428, 214, 0, 3987, 3990, 1, 0, 0, 0, 3988, 3990, 1, 0, 0, 0, 3989, 3984, 1, 0, 0, 0, 3989, 3988, 1, 0, 0, 0, 3990, 425, 1, 0, 0, 0, 3991, 3994, 5, 192, 0, 0, 3992, 3994, 1, 0, 0, 0, 3993, 3991, 1, 0, 0, 0, 3993, 3992, 1, 0, 0, 0, 3994, 427, 1, 0, 0, 0, 3995, 3996, 7, 21, 0, 0, 3996, 429, 1, 0, 0, 0, 3997, 3998, 5, 102, 0, 0, 3998, 3999, 5, 2, 0, 0, 3999, 4000, 3, 1164, 582, 0, 4000, 4001, 5, 3, 0, 0, 4001, 4004, 1, 0, 0, 0, 4002, 4004, 1, 0, 0, 0, 4003, 3997, 1, 0, 0, 0, 4003, 4002, 1, 0, 0, 0, 4004, 431, 1, 0, 0, 0, 4005, 4006, 7, 22, 0, 0, 4006, 433, 1, 0, 0, 0, 4007, 4010, 3, 436, 218, 0, 4008, 4010, 1, 0, 0, 0, 4009, 4007, 1, 0, 0, 0, 4009, 4008, 1, 0, 0, 0, 4010, 4015, 1, 0, 0, 0, 4011, 4012, 5, 6, 0, 0, 4012, 4014, 3, 436, 218, 0, 4013, 4011, 1, 0, 0, 0, 4014, 4017, 1, 0, 0, 0, 4015, 4013, 1, 0, 0, 0, 4015, 4016, 1, 0, 0, 0, 4016, 435, 1, 0, 0, 0, 4017, 4015, 1, 0, 0, 0, 4018, 4023, 3, 1358, 679, 0, 4019, 4023, 3, 1356, 678, 0, 4020, 4023, 3, 1360, 680, 0, 4021, 4023, 3, 1382, 691, 0, 4022, 4018, 1, 0, 0, 0, 4022, 4019, 1, 0, 0, 0, 4022, 4020, 1, 0, 0, 0, 4022, 4021, 1, 0, 0, 0, 4023, 437, 1, 0, 0, 0, 4024, 4025, 5, 64, 0, 0, 4025, 4028, 3, 1338, 669, 0, 4026, 4028, 1, 0, 0, 0, 4027, 4024, 1, 0, 0, 0, 4027, 4026, 1, 0, 0, 0, 4028, 439, 1, 0, 0, 0, 4029, 4031, 3, 442, 221, 0, 4030, 4029, 1, 0, 0, 0, 4031, 4034, 1, 0, 0, 0, 4032, 4030, 1, 0, 0, 0, 4032, 4033, 1, 0, 0, 0, 4033, 441, 1, 0, 0, 0, 4034, 4032, 1, 0, 0, 0, 4035, 4036, 5, 77, 0, 0, 4036, 4047, 5, 54, 0, 0, 4037, 4047, 5, 54, 0, 0, 4038, 4039, 5, 69, 0, 0, 4039, 4047, 5, 221, 0, 0, 4040, 4041, 5, 69, 0, 0, 4041, 4047, 5, 180, 0, 0, 4042, 4043, 5, 77, 0, 0, 4043, 4047, 5, 364, 0, 0, 4044, 4045, 5, 262, 0, 0, 4045, 4047, 5, 228, 0, 0, 4046, 4035, 1, 0, 0, 0, 4046, 4037, 1, 0, 0, 0, 4046, 4038, 1, 0, 0, 0, 4046, 4040, 1, 0, 0, 0, 4046, 4042, 1, 0, 0, 0, 4046, 4044, 1, 0, 0, 0, 4047, 443, 1, 0, 0, 0, 4048, 4049, 5, 46, 0, 0, 4049, 4050, 5, 198, 0, 0, 4050, 4051, 5, 350, 0, 0, 4051, 4052, 3, 1342, 671, 0, 4052, 4053, 5, 80, 0, 0, 4053, 4054, 3, 1382, 691, 0, 4054, 4055, 5, 202, 0, 0, 4055, 4056, 3, 432, 216, 0, 4056, 4057, 3, 1348, 674, 0, 4057, 4058, 5, 2, 0, 0, 4058, 4059, 5, 3, 0, 0, 4059, 4075, 1, 0, 0, 0, 4060, 4061, 5, 46, 0, 0, 4061, 4062, 5, 198, 0, 0, 4062, 4063, 5, 350, 0, 0, 4063, 4064, 3, 1342, 671, 0, 4064, 4065, 5, 80, 0, 0, 4065, 4066, 3, 1382, 691, 0, 4066, 4067, 5, 102, 0, 0, 4067, 4068, 3, 446, 223, 0, 4068, 4069, 5, 202, 0, 0, 4069, 4070, 3, 432, 216, 0, 4070, 4071, 3, 1348, 674, 0, 4071, 4072, 5, 2, 0, 0, 4072, 4073, 5, 3, 0, 0, 4073, 4075, 1, 0, 0, 0, 4074, 4048, 1, 0, 0, 0, 4074, 4060, 1, 0, 0, 0, 4075, 445, 1, 0, 0, 0, 4076, 4081, 3, 448, 224, 0, 4077, 4078, 5, 33, 0, 0, 4078, 4080, 3, 448, 224, 0, 4079, 4077, 1, 0, 0, 0, 4080, 4083, 1, 0, 0, 0, 4081, 4079, 1, 0, 0, 0, 4081, 4082, 1, 0, 0, 0, 4082, 447, 1, 0, 0, 0, 4083, 4081, 1, 0, 0, 0, 4084, 4085, 3, 1374, 687, 0, 4085, 4086, 5, 68, 0, 0, 4086, 4087, 5, 2, 0, 0, 4087, 4088, 3, 450, 225, 0, 4088, 4089, 5, 3, 0, 0, 4089, 449, 1, 0, 0, 0, 4090, 4095, 3, 1360, 680, 0, 4091, 4092, 5, 6, 0, 0, 4092, 4094, 3, 1360, 680, 0, 4093, 4091, 1, 0, 0, 0, 4094, 4097, 1, 0, 0, 0, 4095, 4093, 1, 0, 0, 0, 4095, 4096, 1, 0, 0, 0, 4096, 451, 1, 0, 0, 0, 4097, 4095, 1, 0, 0, 0, 4098, 4099, 5, 138, 0, 0, 4099, 4100, 5, 198, 0, 0, 4100, 4101, 5, 350, 0, 0, 4101, 4102, 3, 1342, 671, 0, 4102, 4103, 3, 454, 227, 0, 4103, 453, 1, 0, 0, 0, 4104, 4111, 5, 193, 0, 0, 4105, 4106, 5, 193, 0, 0, 4106, 4111, 5, 305, 0, 0, 4107, 4108, 5, 193, 0, 0, 4108, 4111, 5, 139, 0, 0, 4109, 4111, 5, 186, 0, 0, 4110, 4104, 1, 0, 0, 0, 4110, 4105, 1, 0, 0, 0, 4110, 4107, 1, 0, 0, 0, 4110, 4109, 1, 0, 0, 0, 4111, 455, 1, 0, 0, 0, 4112, 4113, 5, 46, 0, 0, 4113, 4114, 5, 140, 0, 0, 4114, 4115, 3, 524, 262, 0, 4115, 4116, 5, 42, 0, 0, 4116, 4117, 5, 2, 0, 0, 4117, 4118, 3, 1164, 582, 0, 4118, 4119, 5, 3, 0, 0, 4119, 4120, 3, 440, 220, 0, 4120, 457, 1, 0, 0, 0, 4121, 4122, 5, 46, 0, 0, 4122, 4123, 3, 618, 309, 0, 4123, 4124, 5, 136, 0, 0, 4124, 4125, 3, 1348, 674, 0, 4125, 4126, 3, 646, 323, 0, 4126, 4127, 3, 460, 230, 0, 4127, 4228, 1, 0, 0, 0, 4128, 4129, 5, 46, 0, 0, 4129, 4130, 3, 618, 309, 0, 4130, 4131, 5, 136, 0, 0, 4131, 4132, 3, 1348, 674, 0, 4132, 4133, 3, 468, 234, 0, 4133, 4228, 1, 0, 0, 0, 4134, 4135, 5, 46, 0, 0, 4135, 4136, 5, 271, 0, 0, 4136, 4137, 3, 684, 342, 0, 4137, 4138, 3, 460, 230, 0, 4138, 4228, 1, 0, 0, 0, 4139, 4140, 5, 46, 0, 0, 4140, 4141, 5, 353, 0, 0, 4141, 4142, 3, 524, 262, 0, 4142, 4143, 3, 460, 230, 0, 4143, 4228, 1, 0, 0, 0, 4144, 4145, 5, 46, 0, 0, 4145, 4146, 5, 353, 0, 0, 4146, 4228, 3, 524, 262, 0, 4147, 4148, 5, 46, 0, 0, 4148, 4149, 5, 353, 0, 0, 4149, 4150, 3, 524, 262, 0, 4150, 4151, 5, 36, 0, 0, 4151, 4152, 5, 2, 0, 0, 4152, 4153, 3, 1100, 550, 0, 4153, 4154, 5, 3, 0, 0, 4154, 4228, 1, 0, 0, 0, 4155, 4156, 5, 46, 0, 0, 4156, 4157, 5, 353, 0, 0, 4157, 4158, 3, 524, 262, 0, 4158, 4159, 5, 36, 0, 0, 4159, 4160, 5, 196, 0, 0, 4160, 4161, 5, 2, 0, 0, 4161, 4162, 3, 474, 237, 0, 4162, 4163, 5, 3, 0, 0, 4163, 4228, 1, 0, 0, 0, 4164, 4165, 5, 46, 0, 0, 4165, 4166, 5, 353, 0, 0, 4166, 4167, 3, 524, 262, 0, 4167, 4168, 5, 36, 0, 0, 4168, 4169, 5, 292, 0, 0, 4169, 4170, 3, 460, 230, 0, 4170, 4228, 1, 0, 0, 0, 4171, 4172, 5, 46, 0, 0, 4172, 4173, 5, 348, 0, 0, 4173, 4174, 5, 318, 0, 0, 4174, 4175, 5, 276, 0, 0, 4175, 4176, 3, 524, 262, 0, 4176, 4177, 3, 460, 230, 0, 4177, 4228, 1, 0, 0, 0, 4178, 4179, 5, 46, 0, 0, 4179, 4180, 5, 348, 0, 0, 4180, 4181, 5, 318, 0, 0, 4181, 4182, 5, 185, 0, 0, 4182, 4183, 3, 524, 262, 0, 4183, 4184, 3, 460, 230, 0, 4184, 4228, 1, 0, 0, 0, 4185, 4186, 5, 46, 0, 0, 4186, 4187, 5, 348, 0, 0, 4187, 4188, 5, 318, 0, 0, 4188, 4189, 5, 346, 0, 0, 4189, 4190, 3, 524, 262, 0, 4190, 4191, 3, 460, 230, 0, 4191, 4228, 1, 0, 0, 0, 4192, 4193, 5, 46, 0, 0, 4193, 4194, 5, 348, 0, 0, 4194, 4195, 5, 318, 0, 0, 4195, 4196, 5, 163, 0, 0, 4196, 4197, 3, 524, 262, 0, 4197, 4198, 3, 460, 230, 0, 4198, 4228, 1, 0, 0, 0, 4199, 4200, 5, 46, 0, 0, 4200, 4201, 5, 108, 0, 0, 4201, 4202, 3, 524, 262, 0, 4202, 4203, 3, 460, 230, 0, 4203, 4228, 1, 0, 0, 0, 4204, 4205, 5, 46, 0, 0, 4205, 4206, 5, 108, 0, 0, 4206, 4207, 5, 220, 0, 0, 4207, 4208, 5, 77, 0, 0, 4208, 4209, 5, 389, 0, 0, 4209, 4210, 3, 524, 262, 0, 4210, 4211, 3, 460, 230, 0, 4211, 4228, 1, 0, 0, 0, 4212, 4213, 5, 46, 0, 0, 4213, 4214, 5, 108, 0, 0, 4214, 4215, 3, 524, 262, 0, 4215, 4216, 5, 64, 0, 0, 4216, 4217, 3, 524, 262, 0, 4217, 4228, 1, 0, 0, 0, 4218, 4219, 5, 46, 0, 0, 4219, 4220, 5, 108, 0, 0, 4220, 4221, 5, 220, 0, 0, 4221, 4222, 5, 77, 0, 0, 4222, 4223, 5, 389, 0, 0, 4223, 4224, 3, 524, 262, 0, 4224, 4225, 5, 64, 0, 0, 4225, 4226, 3, 524, 262, 0, 4226, 4228, 1, 0, 0, 0, 4227, 4121, 1, 0, 0, 0, 4227, 4128, 1, 0, 0, 0, 4227, 4134, 1, 0, 0, 0, 4227, 4139, 1, 0, 0, 0, 4227, 4144, 1, 0, 0, 0, 4227, 4147, 1, 0, 0, 0, 4227, 4155, 1, 0, 0, 0, 4227, 4164, 1, 0, 0, 0, 4227, 4171, 1, 0, 0, 0, 4227, 4178, 1, 0, 0, 0, 4227, 4185, 1, 0, 0, 0, 4227, 4192, 1, 0, 0, 0, 4227, 4199, 1, 0, 0, 0, 4227, 4204, 1, 0, 0, 0, 4227, 4212, 1, 0, 0, 0, 4227, 4218, 1, 0, 0, 0, 4228, 459, 1, 0, 0, 0, 4229, 4230, 5, 2, 0, 0, 4230, 4231, 3, 462, 231, 0, 4231, 4232, 5, 3, 0, 0, 4232, 461, 1, 0, 0, 0, 4233, 4238, 3, 464, 232, 0, 4234, 4235, 5, 6, 0, 0, 4235, 4237, 3, 464, 232, 0, 4236, 4234, 1, 0, 0, 0, 4237, 4240, 1, 0, 0, 0, 4238, 4236, 1, 0, 0, 0, 4238, 4239, 1, 0, 0, 0, 4239, 463, 1, 0, 0, 0, 4240, 4238, 1, 0, 0, 0, 4241, 4244, 3, 1382, 691, 0, 4242, 4243, 5, 10, 0, 0, 4243, 4245, 3, 466, 233, 0, 4244, 4242, 1, 0, 0, 0, 4244, 4245, 1, 0, 0, 0, 4245, 465, 1, 0, 0, 0, 4246, 4253, 3, 640, 320, 0, 4247, 4253, 3, 1394, 697, 0, 4248, 4253, 3, 1278, 639, 0, 4249, 4253, 3, 292, 146, 0, 4250, 4253, 3, 1360, 680, 0, 4251, 4253, 5, 400, 0, 0, 4252, 4246, 1, 0, 0, 0, 4252, 4247, 1, 0, 0, 0, 4252, 4248, 1, 0, 0, 0, 4252, 4249, 1, 0, 0, 0, 4252, 4250, 1, 0, 0, 0, 4252, 4251, 1, 0, 0, 0, 4253, 467, 1, 0, 0, 0, 4254, 4255, 5, 2, 0, 0, 4255, 4256, 3, 470, 235, 0, 4256, 4257, 5, 3, 0, 0, 4257, 469, 1, 0, 0, 0, 4258, 4263, 3, 472, 236, 0, 4259, 4260, 5, 6, 0, 0, 4260, 4262, 3, 472, 236, 0, 4261, 4259, 1, 0, 0, 0, 4262, 4265, 1, 0, 0, 0, 4263, 4261, 1, 0, 0, 0, 4263, 4264, 1, 0, 0, 0, 4264, 471, 1, 0, 0, 0, 4265, 4263, 1, 0, 0, 0, 4266, 4267, 3, 1384, 692, 0, 4267, 4268, 5, 10, 0, 0, 4268, 4269, 3, 466, 233, 0, 4269, 473, 1, 0, 0, 0, 4270, 4273, 3, 476, 238, 0, 4271, 4273, 1, 0, 0, 0, 4272, 4270, 1, 0, 0, 0, 4272, 4271, 1, 0, 0, 0, 4273, 475, 1, 0, 0, 0, 4274, 4279, 3, 1360, 680, 0, 4275, 4276, 5, 6, 0, 0, 4276, 4278, 3, 1360, 680, 0, 4277, 4275, 1, 0, 0, 0, 4278, 4281, 1, 0, 0, 0, 4279, 4277, 1, 0, 0, 0, 4279, 4280, 1, 0, 0, 0, 4280, 477, 1, 0, 0, 0, 4281, 4279, 1, 0, 0, 0, 4282, 4283, 5, 138, 0, 0, 4283, 4284, 5, 353, 0, 0, 4284, 4285, 3, 524, 262, 0, 4285, 4286, 5, 133, 0, 0, 4286, 4287, 5, 450, 0, 0, 4287, 4288, 3, 480, 240, 0, 4288, 4289, 3, 1360, 680, 0, 4289, 4320, 1, 0, 0, 0, 4290, 4291, 5, 138, 0, 0, 4291, 4292, 5, 353, 0, 0, 4292, 4293, 3, 524, 262, 0, 4293, 4294, 5, 133, 0, 0, 4294, 4295, 5, 450, 0, 0, 4295, 4296, 3, 480, 240, 0, 4296, 4297, 3, 1360, 680, 0, 4297, 4298, 5, 145, 0, 0, 4298, 4299, 3, 1360, 680, 0, 4299, 4320, 1, 0, 0, 0, 4300, 4301, 5, 138, 0, 0, 4301, 4302, 5, 353, 0, 0, 4302, 4303, 3, 524, 262, 0, 4303, 4304, 5, 133, 0, 0, 4304, 4305, 5, 450, 0, 0, 4305, 4306, 3, 480, 240, 0, 4306, 4307, 3, 1360, 680, 0, 4307, 4308, 5, 135, 0, 0, 4308, 4309, 3, 1360, 680, 0, 4309, 4320, 1, 0, 0, 0, 4310, 4311, 5, 138, 0, 0, 4311, 4312, 5, 353, 0, 0, 4312, 4313, 3, 524, 262, 0, 4313, 4314, 5, 302, 0, 0, 4314, 4315, 5, 450, 0, 0, 4315, 4316, 3, 1360, 680, 0, 4316, 4317, 5, 94, 0, 0, 4317, 4318, 3, 1360, 680, 0, 4318, 4320, 1, 0, 0, 0, 4319, 4282, 1, 0, 0, 0, 4319, 4290, 1, 0, 0, 0, 4319, 4300, 1, 0, 0, 0, 4319, 4310, 1, 0, 0, 0, 4320, 479, 1, 0, 0, 0, 4321, 4322, 5, 220, 0, 0, 4322, 4323, 5, 77, 0, 0, 4323, 4326, 5, 389, 0, 0, 4324, 4326, 1, 0, 0, 0, 4325, 4321, 1, 0, 0, 0, 4325, 4324, 1, 0, 0, 0, 4326, 481, 1, 0, 0, 0, 4327, 4328, 5, 46, 0, 0, 4328, 4329, 5, 271, 0, 0, 4329, 4330, 5, 156, 0, 0, 4330, 4331, 3, 524, 262, 0, 4331, 4332, 3, 488, 244, 0, 4332, 4333, 5, 62, 0, 0, 4333, 4334, 5, 353, 0, 0, 4334, 4335, 3, 1120, 560, 0, 4335, 4336, 5, 100, 0, 0, 4336, 4337, 3, 1342, 671, 0, 4337, 4338, 3, 490, 245, 0, 4338, 4339, 5, 36, 0, 0, 4339, 4340, 3, 484, 242, 0, 4340, 483, 1, 0, 0, 0, 4341, 4346, 3, 486, 243, 0, 4342, 4343, 5, 6, 0, 0, 4343, 4345, 3, 486, 243, 0, 4344, 4342, 1, 0, 0, 0, 4345, 4348, 1, 0, 0, 0, 4346, 4344, 1, 0, 0, 0, 4346, 4347, 1, 0, 0, 0, 4347, 485, 1, 0, 0, 0, 4348, 4346, 1, 0, 0, 0, 4349, 4350, 5, 271, 0, 0, 4350, 4351, 3, 1358, 679, 0, 4351, 4352, 3, 684, 342, 0, 4352, 4353, 3, 492, 246, 0, 4353, 4354, 3, 494, 247, 0, 4354, 4375, 1, 0, 0, 0, 4355, 4356, 5, 271, 0, 0, 4356, 4357, 3, 1358, 679, 0, 4357, 4358, 3, 688, 344, 0, 4358, 4359, 3, 492, 246, 0, 4359, 4360, 3, 494, 247, 0, 4360, 4375, 1, 0, 0, 0, 4361, 4362, 5, 211, 0, 0, 4362, 4363, 3, 1358, 679, 0, 4363, 4364, 3, 626, 313, 0, 4364, 4375, 1, 0, 0, 0, 4365, 4366, 5, 211, 0, 0, 4366, 4367, 3, 1358, 679, 0, 4367, 4368, 5, 2, 0, 0, 4368, 4369, 3, 1288, 644, 0, 4369, 4370, 5, 3, 0, 0, 4370, 4371, 3, 626, 313, 0, 4371, 4375, 1, 0, 0, 0, 4372, 4373, 5, 338, 0, 0, 4373, 4375, 3, 1120, 560, 0, 4374, 4349, 1, 0, 0, 0, 4374, 4355, 1, 0, 0, 0, 4374, 4361, 1, 0, 0, 0, 4374, 4365, 1, 0, 0, 0, 4374, 4372, 1, 0, 0, 0, 4375, 487, 1, 0, 0, 0, 4376, 4379, 5, 53, 0, 0, 4377, 4379, 1, 0, 0, 0, 4378, 4376, 1, 0, 0, 0, 4378, 4377, 1, 0, 0, 0, 4379, 489, 1, 0, 0, 0, 4380, 4381, 5, 206, 0, 0, 4381, 4384, 3, 524, 262, 0, 4382, 4384, 1, 0, 0, 0, 4383, 4380, 1, 0, 0, 0, 4383, 4382, 1, 0, 0, 0, 4384, 491, 1, 0, 0, 0, 4385, 4386, 5, 62, 0, 0, 4386, 4393, 5, 318, 0, 0, 4387, 4388, 5, 62, 0, 0, 4388, 4389, 5, 83, 0, 0, 4389, 4390, 5, 147, 0, 0, 4390, 4393, 3, 524, 262, 0, 4391, 4393, 1, 0, 0, 0, 4392, 4385, 1, 0, 0, 0, 4392, 4387, 1, 0, 0, 0, 4392, 4391, 1, 0, 0, 0, 4393, 493, 1, 0, 0, 0, 4394, 4397, 5, 295, 0, 0, 4395, 4397, 1, 0, 0, 0, 4396, 4394, 1, 0, 0, 0, 4396, 4395, 1, 0, 0, 0, 4397, 495, 1, 0, 0, 0, 4398, 4399, 5, 46, 0, 0, 4399, 4400, 5, 271, 0, 0, 4400, 4401, 5, 206, 0, 0, 4401, 4402, 3, 524, 262, 0, 4402, 4403, 5, 100, 0, 0, 4403, 4404, 3, 1342, 671, 0, 4404, 497, 1, 0, 0, 0, 4405, 4406, 5, 138, 0, 0, 4406, 4407, 5, 271, 0, 0, 4407, 4408, 5, 206, 0, 0, 4408, 4409, 3, 524, 262, 0, 4409, 4410, 5, 100, 0, 0, 4410, 4411, 3, 1342, 671, 0, 4411, 4412, 5, 133, 0, 0, 4412, 4413, 3, 484, 242, 0, 4413, 4424, 1, 0, 0, 0, 4414, 4415, 5, 138, 0, 0, 4415, 4416, 5, 271, 0, 0, 4416, 4417, 5, 206, 0, 0, 4417, 4418, 3, 524, 262, 0, 4418, 4419, 5, 100, 0, 0, 4419, 4420, 3, 1342, 671, 0, 4420, 4421, 5, 191, 0, 0, 4421, 4422, 3, 500, 250, 0, 4422, 4424, 1, 0, 0, 0, 4423, 4405, 1, 0, 0, 0, 4423, 4414, 1, 0, 0, 0, 4424, 499, 1, 0, 0, 0, 4425, 4430, 3, 502, 251, 0, 4426, 4427, 5, 6, 0, 0, 4427, 4429, 3, 502, 251, 0, 4428, 4426, 1, 0, 0, 0, 4429, 4432, 1, 0, 0, 0, 4430, 4428, 1, 0, 0, 0, 4430, 4431, 1, 0, 0, 0, 4431, 501, 1, 0, 0, 0, 4432, 4430, 1, 0, 0, 0, 4433, 4434, 5, 271, 0, 0, 4434, 4435, 3, 1358, 679, 0, 4435, 4436, 5, 2, 0, 0, 4436, 4437, 3, 1288, 644, 0, 4437, 4438, 5, 3, 0, 0, 4438, 4446, 1, 0, 0, 0, 4439, 4440, 5, 211, 0, 0, 4440, 4441, 3, 1358, 679, 0, 4441, 4442, 5, 2, 0, 0, 4442, 4443, 3, 1288, 644, 0, 4443, 4444, 5, 3, 0, 0, 4444, 4446, 1, 0, 0, 0, 4445, 4433, 1, 0, 0, 0, 4445, 4439, 1, 0, 0, 0, 4446, 503, 1, 0, 0, 0, 4447, 4448, 5, 191, 0, 0, 4448, 4449, 5, 271, 0, 0, 4449, 4450, 5, 156, 0, 0, 4450, 4451, 3, 524, 262, 0, 4451, 4452, 5, 100, 0, 0, 4452, 4453, 3, 1342, 671, 0, 4453, 4454, 3, 108, 54, 0, 4454, 4466, 1, 0, 0, 0, 4455, 4456, 5, 191, 0, 0, 4456, 4457, 5, 271, 0, 0, 4457, 4458, 5, 156, 0, 0, 4458, 4459, 5, 220, 0, 0, 4459, 4460, 5, 389, 0, 0, 4460, 4461, 3, 524, 262, 0, 4461, 4462, 5, 100, 0, 0, 4462, 4463, 3, 1342, 671, 0, 4463, 4464, 3, 108, 54, 0, 4464, 4466, 1, 0, 0, 0, 4465, 4447, 1, 0, 0, 0, 4465, 4455, 1, 0, 0, 0, 4466, 505, 1, 0, 0, 0, 4467, 4468, 5, 191, 0, 0, 4468, 4469, 5, 271, 0, 0, 4469, 4470, 5, 206, 0, 0, 4470, 4471, 3, 524, 262, 0, 4471, 4472, 5, 100, 0, 0, 4472, 4473, 3, 1342, 671, 0, 4473, 4474, 3, 108, 54, 0, 4474, 4486, 1, 0, 0, 0, 4475, 4476, 5, 191, 0, 0, 4476, 4477, 5, 271, 0, 0, 4477, 4478, 5, 206, 0, 0, 4478, 4479, 5, 220, 0, 0, 4479, 4480, 5, 389, 0, 0, 4480, 4481, 3, 524, 262, 0, 4481, 4482, 5, 100, 0, 0, 4482, 4483, 3, 1342, 671, 0, 4483, 4484, 3, 108, 54, 0, 4484, 4486, 1, 0, 0, 0, 4485, 4467, 1, 0, 0, 0, 4485, 4475, 1, 0, 0, 0, 4486, 507, 1, 0, 0, 0, 4487, 4488, 5, 191, 0, 0, 4488, 4489, 5, 274, 0, 0, 4489, 4490, 5, 147, 0, 0, 4490, 4491, 3, 1372, 686, 0, 4491, 4492, 3, 108, 54, 0, 4492, 509, 1, 0, 0, 0, 4493, 4494, 5, 294, 0, 0, 4494, 4495, 5, 274, 0, 0, 4495, 4496, 5, 147, 0, 0, 4496, 4497, 3, 1372, 686, 0, 4497, 4498, 5, 94, 0, 0, 4498, 4499, 3, 1370, 685, 0, 4499, 511, 1, 0, 0, 0, 4500, 4501, 5, 191, 0, 0, 4501, 4502, 3, 514, 257, 0, 4502, 4503, 5, 220, 0, 0, 4503, 4504, 5, 389, 0, 0, 4504, 4505, 3, 522, 261, 0, 4505, 4506, 3, 108, 54, 0, 4506, 4579, 1, 0, 0, 0, 4507, 4508, 5, 191, 0, 0, 4508, 4509, 3, 514, 257, 0, 4509, 4510, 3, 522, 261, 0, 4510, 4511, 3, 108, 54, 0, 4511, 4579, 1, 0, 0, 0, 4512, 4513, 5, 191, 0, 0, 4513, 4514, 3, 518, 259, 0, 4514, 4515, 5, 220, 0, 0, 4515, 4516, 5, 389, 0, 0, 4516, 4517, 3, 1340, 670, 0, 4517, 4518, 3, 108, 54, 0, 4518, 4579, 1, 0, 0, 0, 4519, 4520, 5, 191, 0, 0, 4520, 4521, 3, 518, 259, 0, 4521, 4522, 3, 1340, 670, 0, 4522, 4523, 3, 108, 54, 0, 4523, 4579, 1, 0, 0, 0, 4524, 4525, 5, 191, 0, 0, 4525, 4526, 3, 520, 260, 0, 4526, 4527, 3, 1342, 671, 0, 4527, 4528, 5, 80, 0, 0, 4528, 4529, 3, 524, 262, 0, 4529, 4530, 3, 108, 54, 0, 4530, 4579, 1, 0, 0, 0, 4531, 4532, 5, 191, 0, 0, 4532, 4533, 3, 520, 260, 0, 4533, 4534, 5, 220, 0, 0, 4534, 4535, 5, 389, 0, 0, 4535, 4536, 3, 1342, 671, 0, 4536, 4537, 5, 80, 0, 0, 4537, 4538, 3, 524, 262, 0, 4538, 4539, 3, 108, 54, 0, 4539, 4579, 1, 0, 0, 0, 4540, 4541, 5, 191, 0, 0, 4541, 4542, 5, 353, 0, 0, 4542, 4543, 3, 528, 264, 0, 4543, 4544, 3, 108, 54, 0, 4544, 4579, 1, 0, 0, 0, 4545, 4546, 5, 191, 0, 0, 4546, 4547, 5, 353, 0, 0, 4547, 4548, 5, 220, 0, 0, 4548, 4549, 5, 389, 0, 0, 4549, 4550, 3, 528, 264, 0, 4550, 4551, 3, 108, 54, 0, 4551, 4579, 1, 0, 0, 0, 4552, 4553, 5, 191, 0, 0, 4553, 4554, 5, 189, 0, 0, 4554, 4555, 3, 528, 264, 0, 4555, 4556, 3, 108, 54, 0, 4556, 4579, 1, 0, 0, 0, 4557, 4558, 5, 191, 0, 0, 4558, 4559, 5, 189, 0, 0, 4559, 4560, 5, 220, 0, 0, 4560, 4561, 5, 389, 0, 0, 4561, 4562, 3, 528, 264, 0, 4562, 4563, 3, 108, 54, 0, 4563, 4579, 1, 0, 0, 0, 4564, 4565, 5, 191, 0, 0, 4565, 4566, 5, 226, 0, 0, 4566, 4567, 5, 109, 0, 0, 4567, 4568, 3, 522, 261, 0, 4568, 4569, 3, 108, 54, 0, 4569, 4579, 1, 0, 0, 0, 4570, 4571, 5, 191, 0, 0, 4571, 4572, 5, 226, 0, 0, 4572, 4573, 5, 109, 0, 0, 4573, 4574, 5, 220, 0, 0, 4574, 4575, 5, 389, 0, 0, 4575, 4576, 3, 522, 261, 0, 4576, 4577, 3, 108, 54, 0, 4577, 4579, 1, 0, 0, 0, 4578, 4500, 1, 0, 0, 0, 4578, 4507, 1, 0, 0, 0, 4578, 4512, 1, 0, 0, 0, 4578, 4519, 1, 0, 0, 0, 4578, 4524, 1, 0, 0, 0, 4578, 4531, 1, 0, 0, 0, 4578, 4540, 1, 0, 0, 0, 4578, 4545, 1, 0, 0, 0, 4578, 4552, 1, 0, 0, 0, 4578, 4557, 1, 0, 0, 0, 4578, 4564, 1, 0, 0, 0, 4578, 4570, 1, 0, 0, 0, 4579, 513, 1, 0, 0, 0, 4580, 4604, 5, 92, 0, 0, 4581, 4604, 5, 321, 0, 0, 4582, 4604, 5, 369, 0, 0, 4583, 4584, 5, 251, 0, 0, 4584, 4604, 5, 369, 0, 0, 4585, 4604, 5, 226, 0, 0, 4586, 4587, 5, 63, 0, 0, 4587, 4604, 5, 92, 0, 0, 4588, 4604, 5, 108, 0, 0, 4589, 4604, 5, 168, 0, 0, 4590, 4604, 5, 335, 0, 0, 4591, 4592, 5, 348, 0, 0, 4592, 4593, 5, 318, 0, 0, 4593, 4604, 5, 276, 0, 0, 4594, 4595, 5, 348, 0, 0, 4595, 4596, 5, 318, 0, 0, 4596, 4604, 5, 185, 0, 0, 4597, 4598, 5, 348, 0, 0, 4598, 4599, 5, 318, 0, 0, 4599, 4604, 5, 346, 0, 0, 4600, 4601, 5, 348, 0, 0, 4601, 4602, 5, 318, 0, 0, 4602, 4604, 5, 163, 0, 0, 4603, 4580, 1, 0, 0, 0, 4603, 4581, 1, 0, 0, 0, 4603, 4582, 1, 0, 0, 0, 4603, 4583, 1, 0, 0, 0, 4603, 4585, 1, 0, 0, 0, 4603, 4586, 1, 0, 0, 0, 4603, 4588, 1, 0, 0, 0, 4603, 4589, 1, 0, 0, 0, 4603, 4590, 1, 0, 0, 0, 4603, 4591, 1, 0, 0, 0, 4603, 4594, 1, 0, 0, 0, 4603, 4597, 1, 0, 0, 0, 4603, 4600, 1, 0, 0, 0, 4604, 515, 1, 0, 0, 0, 4605, 4611, 3, 518, 259, 0, 4606, 4611, 5, 175, 0, 0, 4607, 4611, 5, 311, 0, 0, 4608, 4611, 5, 451, 0, 0, 4609, 4611, 5, 344, 0, 0, 4610, 4605, 1, 0, 0, 0, 4610, 4606, 1, 0, 0, 0, 4610, 4607, 1, 0, 0, 0, 4610, 4608, 1, 0, 0, 0, 4610, 4609, 1, 0, 0, 0, 4611, 517, 1, 0, 0, 0, 4612, 4613, 5, 131, 0, 0, 4613, 4627, 5, 446, 0, 0, 4614, 4615, 5, 198, 0, 0, 4615, 4627, 5, 350, 0, 0, 4616, 4627, 5, 204, 0, 0, 4617, 4618, 5, 63, 0, 0, 4618, 4619, 5, 174, 0, 0, 4619, 4627, 5, 374, 0, 0, 4620, 4621, 3, 308, 154, 0, 4621, 4622, 5, 238, 0, 0, 4622, 4627, 1, 0, 0, 0, 4623, 4627, 5, 452, 0, 0, 4624, 4627, 5, 316, 0, 0, 4625, 4627, 5, 324, 0, 0, 4626, 4612, 1, 0, 0, 0, 4626, 4614, 1, 0, 0, 0, 4626, 4616, 1, 0, 0, 0, 4626, 4617, 1, 0, 0, 0, 4626, 4620, 1, 0, 0, 0, 4626, 4623, 1, 0, 0, 0, 4626, 4624, 1, 0, 0, 0, 4626, 4625, 1, 0, 0, 0, 4627, 519, 1, 0, 0, 0, 4628, 4629, 7, 23, 0, 0, 4629, 521, 1, 0, 0, 0, 4630, 4635, 3, 524, 262, 0, 4631, 4632, 5, 6, 0, 0, 4632, 4634, 3, 524, 262, 0, 4633, 4631, 1, 0, 0, 0, 4634, 4637, 1, 0, 0, 0, 4635, 4633, 1, 0, 0, 0, 4635, 4636, 1, 0, 0, 0, 4636, 523, 1, 0, 0, 0, 4637, 4635, 1, 0, 0, 0, 4638, 4640, 3, 1374, 687, 0, 4639, 4641, 3, 526, 263, 0, 4640, 4639, 1, 0, 0, 0, 4640, 4641, 1, 0, 0, 0, 4641, 525, 1, 0, 0, 0, 4642, 4643, 5, 11, 0, 0, 4643, 4645, 3, 1344, 672, 0, 4644, 4642, 1, 0, 0, 0, 4645, 4646, 1, 0, 0, 0, 4646, 4644, 1, 0, 0, 0, 4646, 4647, 1, 0, 0, 0, 4647, 527, 1, 0, 0, 0, 4648, 4653, 3, 1120, 560, 0, 4649, 4650, 5, 6, 0, 0, 4650, 4652, 3, 1120, 560, 0, 4651, 4649, 1, 0, 0, 0, 4652, 4655, 1, 0, 0, 0, 4653, 4651, 1, 0, 0, 0, 4653, 4654, 1, 0, 0, 0, 4654, 529, 1, 0, 0, 0, 4655, 4653, 1, 0, 0, 0, 4656, 4657, 5, 351, 0, 0, 4657, 4658, 3, 990, 495, 0, 4658, 4659, 3, 1078, 539, 0, 4659, 4660, 3, 532, 266, 0, 4660, 4661, 3, 108, 54, 0, 4661, 531, 1, 0, 0, 0, 4662, 4663, 5, 167, 0, 0, 4663, 4668, 5, 219, 0, 0, 4664, 4665, 5, 307, 0, 0, 4665, 4668, 5, 219, 0, 0, 4666, 4668, 1, 0, 0, 0, 4667, 4662, 1, 0, 0, 0, 4667, 4664, 1, 0, 0, 0, 4667, 4666, 1, 0, 0, 0, 4668, 533, 1, 0, 0, 0, 4669, 4670, 5, 159, 0, 0, 4670, 4671, 5, 80, 0, 0, 4671, 4672, 3, 514, 257, 0, 4672, 4673, 3, 524, 262, 0, 4673, 4674, 5, 116, 0, 0, 4674, 4675, 3, 536, 268, 0, 4675, 4817, 1, 0, 0, 0, 4676, 4677, 5, 159, 0, 0, 4677, 4678, 5, 80, 0, 0, 4678, 4679, 5, 44, 0, 0, 4679, 4680, 3, 524, 262, 0, 4680, 4681, 5, 116, 0, 0, 4681, 4682, 3, 536, 268, 0, 4682, 4817, 1, 0, 0, 0, 4683, 4684, 5, 159, 0, 0, 4684, 4685, 5, 80, 0, 0, 4685, 4686, 3, 516, 258, 0, 4686, 4687, 3, 1342, 671, 0, 4687, 4688, 5, 116, 0, 0, 4688, 4689, 3, 536, 268, 0, 4689, 4817, 1, 0, 0, 0, 4690, 4691, 5, 159, 0, 0, 4691, 4692, 5, 80, 0, 0, 4692, 4693, 5, 353, 0, 0, 4693, 4694, 3, 1120, 560, 0, 4694, 4695, 5, 116, 0, 0, 4695, 4696, 3, 536, 268, 0, 4696, 4817, 1, 0, 0, 0, 4697, 4698, 5, 159, 0, 0, 4698, 4699, 5, 80, 0, 0, 4699, 4700, 5, 189, 0, 0, 4700, 4701, 3, 1120, 560, 0, 4701, 4702, 5, 116, 0, 0, 4702, 4703, 3, 536, 268, 0, 4703, 4817, 1, 0, 0, 0, 4704, 4705, 5, 159, 0, 0, 4705, 4706, 5, 80, 0, 0, 4706, 4707, 5, 136, 0, 0, 4707, 4708, 3, 650, 325, 0, 4708, 4709, 5, 116, 0, 0, 4709, 4710, 3, 536, 268, 0, 4710, 4817, 1, 0, 0, 0, 4711, 4712, 5, 159, 0, 0, 4712, 4713, 5, 80, 0, 0, 4713, 4714, 5, 211, 0, 0, 4714, 4715, 3, 626, 313, 0, 4715, 4716, 5, 116, 0, 0, 4716, 4717, 3, 536, 268, 0, 4717, 4817, 1, 0, 0, 0, 4718, 4719, 5, 159, 0, 0, 4719, 4720, 5, 80, 0, 0, 4720, 4721, 5, 271, 0, 0, 4721, 4722, 3, 688, 344, 0, 4722, 4723, 5, 116, 0, 0, 4723, 4724, 3, 536, 268, 0, 4724, 4817, 1, 0, 0, 0, 4725, 4726, 5, 159, 0, 0, 4726, 4727, 5, 80, 0, 0, 4727, 4728, 5, 45, 0, 0, 4728, 4729, 3, 1342, 671, 0, 4729, 4730, 5, 80, 0, 0, 4730, 4731, 3, 524, 262, 0, 4731, 4732, 5, 116, 0, 0, 4732, 4733, 3, 536, 268, 0, 4733, 4817, 1, 0, 0, 0, 4734, 4735, 5, 159, 0, 0, 4735, 4736, 5, 80, 0, 0, 4736, 4737, 5, 45, 0, 0, 4737, 4738, 3, 1342, 671, 0, 4738, 4739, 5, 80, 0, 0, 4739, 4740, 5, 189, 0, 0, 4740, 4741, 3, 524, 262, 0, 4741, 4742, 5, 116, 0, 0, 4742, 4743, 3, 536, 268, 0, 4743, 4817, 1, 0, 0, 0, 4744, 4745, 5, 159, 0, 0, 4745, 4746, 5, 80, 0, 0, 4746, 4747, 3, 520, 260, 0, 4747, 4748, 3, 1342, 671, 0, 4748, 4749, 5, 80, 0, 0, 4749, 4750, 3, 524, 262, 0, 4750, 4751, 5, 116, 0, 0, 4751, 4752, 3, 536, 268, 0, 4752, 4817, 1, 0, 0, 0, 4753, 4754, 5, 159, 0, 0, 4754, 4755, 5, 80, 0, 0, 4755, 4756, 5, 289, 0, 0, 4756, 4757, 3, 626, 313, 0, 4757, 4758, 5, 116, 0, 0, 4758, 4759, 3, 536, 268, 0, 4759, 4817, 1, 0, 0, 0, 4760, 4761, 5, 159, 0, 0, 4761, 4762, 5, 80, 0, 0, 4762, 4763, 5, 442, 0, 0, 4763, 4764, 3, 626, 313, 0, 4764, 4765, 5, 116, 0, 0, 4765, 4766, 3, 536, 268, 0, 4766, 4817, 1, 0, 0, 0, 4767, 4768, 5, 159, 0, 0, 4768, 4769, 5, 80, 0, 0, 4769, 4770, 5, 443, 0, 0, 4770, 4771, 5, 62, 0, 0, 4771, 4772, 3, 1120, 560, 0, 4772, 4773, 5, 238, 0, 0, 4773, 4774, 3, 1342, 671, 0, 4774, 4775, 5, 116, 0, 0, 4775, 4776, 3, 536, 268, 0, 4776, 4817, 1, 0, 0, 0, 4777, 4778, 5, 159, 0, 0, 4778, 4779, 5, 80, 0, 0, 4779, 4780, 5, 271, 0, 0, 4780, 4781, 5, 156, 0, 0, 4781, 4782, 3, 524, 262, 0, 4782, 4783, 5, 100, 0, 0, 4783, 4784, 3, 1342, 671, 0, 4784, 4785, 5, 116, 0, 0, 4785, 4786, 3, 536, 268, 0, 4786, 4817, 1, 0, 0, 0, 4787, 4788, 5, 159, 0, 0, 4788, 4789, 5, 80, 0, 0, 4789, 4790, 5, 271, 0, 0, 4790, 4791, 5, 206, 0, 0, 4791, 4792, 3, 524, 262, 0, 4792, 4793, 5, 100, 0, 0, 4793, 4794, 3, 1342, 671, 0, 4794, 4795, 5, 116, 0, 0, 4795, 4796, 3, 536, 268, 0, 4796, 4817, 1, 0, 0, 0, 4797, 4798, 5, 159, 0, 0, 4798, 4799, 5, 80, 0, 0, 4799, 4800, 5, 239, 0, 0, 4800, 4801, 5, 267, 0, 0, 4801, 4802, 3, 292, 146, 0, 4802, 4803, 5, 116, 0, 0, 4803, 4804, 3, 536, 268, 0, 4804, 4817, 1, 0, 0, 0, 4805, 4806, 5, 159, 0, 0, 4806, 4807, 5, 80, 0, 0, 4807, 4808, 5, 41, 0, 0, 4808, 4809, 5, 2, 0, 0, 4809, 4810, 3, 1120, 560, 0, 4810, 4811, 5, 36, 0, 0, 4811, 4812, 3, 1120, 560, 0, 4812, 4813, 5, 3, 0, 0, 4813, 4814, 5, 116, 0, 0, 4814, 4815, 3, 536, 268, 0, 4815, 4817, 1, 0, 0, 0, 4816, 4669, 1, 0, 0, 0, 4816, 4676, 1, 0, 0, 0, 4816, 4683, 1, 0, 0, 0, 4816, 4690, 1, 0, 0, 0, 4816, 4697, 1, 0, 0, 0, 4816, 4704, 1, 0, 0, 0, 4816, 4711, 1, 0, 0, 0, 4816, 4718, 1, 0, 0, 0, 4816, 4725, 1, 0, 0, 0, 4816, 4734, 1, 0, 0, 0, 4816, 4744, 1, 0, 0, 0, 4816, 4753, 1, 0, 0, 0, 4816, 4760, 1, 0, 0, 0, 4816, 4767, 1, 0, 0, 0, 4816, 4777, 1, 0, 0, 0, 4816, 4787, 1, 0, 0, 0, 4816, 4797, 1, 0, 0, 0, 4816, 4805, 1, 0, 0, 0, 4817, 535, 1, 0, 0, 0, 4818, 4821, 3, 1360, 680, 0, 4819, 4821, 5, 78, 0, 0, 4820, 4818, 1, 0, 0, 0, 4820, 4819, 1, 0, 0, 0, 4821, 537, 1, 0, 0, 0, 4822, 4823, 5, 320, 0, 0, 4823, 4824, 5, 237, 0, 0, 4824, 4825, 3, 540, 270, 0, 4825, 4826, 5, 80, 0, 0, 4826, 4827, 3, 514, 257, 0, 4827, 4828, 3, 524, 262, 0, 4828, 4829, 5, 116, 0, 0, 4829, 4830, 3, 542, 271, 0, 4830, 4914, 1, 0, 0, 0, 4831, 4832, 5, 320, 0, 0, 4832, 4833, 5, 237, 0, 0, 4833, 4834, 3, 540, 270, 0, 4834, 4835, 5, 80, 0, 0, 4835, 4836, 5, 44, 0, 0, 4836, 4837, 3, 524, 262, 0, 4837, 4838, 5, 116, 0, 0, 4838, 4839, 3, 542, 271, 0, 4839, 4914, 1, 0, 0, 0, 4840, 4841, 5, 320, 0, 0, 4841, 4842, 5, 237, 0, 0, 4842, 4843, 3, 540, 270, 0, 4843, 4844, 5, 80, 0, 0, 4844, 4845, 3, 516, 258, 0, 4845, 4846, 3, 1342, 671, 0, 4846, 4847, 5, 116, 0, 0, 4847, 4848, 3, 542, 271, 0, 4848, 4914, 1, 0, 0, 0, 4849, 4850, 5, 320, 0, 0, 4850, 4851, 5, 237, 0, 0, 4851, 4852, 3, 540, 270, 0, 4852, 4853, 5, 80, 0, 0, 4853, 4854, 5, 353, 0, 0, 4854, 4855, 3, 1120, 560, 0, 4855, 4856, 5, 116, 0, 0, 4856, 4857, 3, 542, 271, 0, 4857, 4914, 1, 0, 0, 0, 4858, 4859, 5, 320, 0, 0, 4859, 4860, 5, 237, 0, 0, 4860, 4861, 3, 540, 270, 0, 4861, 4862, 5, 80, 0, 0, 4862, 4863, 5, 189, 0, 0, 4863, 4864, 3, 1120, 560, 0, 4864, 4865, 5, 116, 0, 0, 4865, 4866, 3, 542, 271, 0, 4866, 4914, 1, 0, 0, 0, 4867, 4868, 5, 320, 0, 0, 4868, 4869, 5, 237, 0, 0, 4869, 4870, 3, 540, 270, 0, 4870, 4871, 5, 80, 0, 0, 4871, 4872, 5, 136, 0, 0, 4872, 4873, 3, 650, 325, 0, 4873, 4874, 5, 116, 0, 0, 4874, 4875, 3, 542, 271, 0, 4875, 4914, 1, 0, 0, 0, 4876, 4877, 5, 320, 0, 0, 4877, 4878, 5, 237, 0, 0, 4878, 4879, 3, 540, 270, 0, 4879, 4880, 5, 80, 0, 0, 4880, 4881, 5, 211, 0, 0, 4881, 4882, 3, 626, 313, 0, 4882, 4883, 5, 116, 0, 0, 4883, 4884, 3, 542, 271, 0, 4884, 4914, 1, 0, 0, 0, 4885, 4886, 5, 320, 0, 0, 4886, 4887, 5, 237, 0, 0, 4887, 4888, 3, 540, 270, 0, 4888, 4889, 5, 80, 0, 0, 4889, 4890, 5, 239, 0, 0, 4890, 4891, 5, 267, 0, 0, 4891, 4892, 3, 292, 146, 0, 4892, 4893, 5, 116, 0, 0, 4893, 4894, 3, 542, 271, 0, 4894, 4914, 1, 0, 0, 0, 4895, 4896, 5, 320, 0, 0, 4896, 4897, 5, 237, 0, 0, 4897, 4898, 3, 540, 270, 0, 4898, 4899, 5, 80, 0, 0, 4899, 4900, 5, 289, 0, 0, 4900, 4901, 3, 626, 313, 0, 4901, 4902, 5, 116, 0, 0, 4902, 4903, 3, 542, 271, 0, 4903, 4914, 1, 0, 0, 0, 4904, 4905, 5, 320, 0, 0, 4905, 4906, 5, 237, 0, 0, 4906, 4907, 3, 540, 270, 0, 4907, 4908, 5, 80, 0, 0, 4908, 4909, 5, 442, 0, 0, 4909, 4910, 3, 626, 313, 0, 4910, 4911, 5, 116, 0, 0, 4911, 4912, 3, 542, 271, 0, 4912, 4914, 1, 0, 0, 0, 4913, 4822, 1, 0, 0, 0, 4913, 4831, 1, 0, 0, 0, 4913, 4840, 1, 0, 0, 0, 4913, 4849, 1, 0, 0, 0, 4913, 4858, 1, 0, 0, 0, 4913, 4867, 1, 0, 0, 0, 4913, 4876, 1, 0, 0, 0, 4913, 4885, 1, 0, 0, 0, 4913, 4895, 1, 0, 0, 0, 4913, 4904, 1, 0, 0, 0, 4914, 539, 1, 0, 0, 0, 4915, 4916, 5, 62, 0, 0, 4916, 4919, 3, 72, 36, 0, 4917, 4919, 1, 0, 0, 0, 4918, 4915, 1, 0, 0, 0, 4918, 4917, 1, 0, 0, 0, 4919, 541, 1, 0, 0, 0, 4920, 4923, 3, 1360, 680, 0, 4921, 4923, 5, 78, 0, 0, 4922, 4920, 1, 0, 0, 0, 4922, 4921, 1, 0, 0, 0, 4923, 543, 1, 0, 0, 0, 4924, 4925, 5, 61, 0, 0, 4925, 4929, 3, 546, 273, 0, 4926, 4927, 5, 258, 0, 0, 4927, 4929, 3, 546, 273, 0, 4928, 4924, 1, 0, 0, 0, 4928, 4926, 1, 0, 0, 0, 4929, 545, 1, 0, 0, 0, 4930, 4997, 3, 954, 477, 0, 4931, 4932, 3, 548, 274, 0, 4932, 4933, 3, 954, 477, 0, 4933, 4997, 1, 0, 0, 0, 4934, 4935, 5, 261, 0, 0, 4935, 4936, 3, 550, 275, 0, 4936, 4937, 3, 954, 477, 0, 4937, 4997, 1, 0, 0, 0, 4938, 4939, 5, 286, 0, 0, 4939, 4940, 3, 550, 275, 0, 4940, 4941, 3, 954, 477, 0, 4941, 4997, 1, 0, 0, 0, 4942, 4943, 5, 207, 0, 0, 4943, 4944, 3, 550, 275, 0, 4944, 4945, 3, 954, 477, 0, 4945, 4997, 1, 0, 0, 0, 4946, 4947, 5, 240, 0, 0, 4947, 4948, 3, 550, 275, 0, 4948, 4949, 3, 954, 477, 0, 4949, 4997, 1, 0, 0, 0, 4950, 4951, 5, 130, 0, 0, 4951, 4952, 3, 1366, 683, 0, 4952, 4953, 3, 550, 275, 0, 4953, 4954, 3, 954, 477, 0, 4954, 4997, 1, 0, 0, 0, 4955, 4956, 5, 300, 0, 0, 4956, 4957, 3, 1366, 683, 0, 4957, 4958, 3, 550, 275, 0, 4958, 4959, 3, 954, 477, 0, 4959, 4997, 1, 0, 0, 0, 4960, 4961, 3, 1366, 683, 0, 4961, 4962, 3, 550, 275, 0, 4962, 4963, 3, 954, 477, 0, 4963, 4997, 1, 0, 0, 0, 4964, 4965, 5, 30, 0, 0, 4965, 4966, 3, 550, 275, 0, 4966, 4967, 3, 954, 477, 0, 4967, 4997, 1, 0, 0, 0, 4968, 4969, 5, 210, 0, 0, 4969, 4970, 3, 550, 275, 0, 4970, 4971, 3, 954, 477, 0, 4971, 4997, 1, 0, 0, 0, 4972, 4973, 5, 210, 0, 0, 4973, 4974, 3, 1366, 683, 0, 4974, 4975, 3, 550, 275, 0, 4975, 4976, 3, 954, 477, 0, 4976, 4997, 1, 0, 0, 0, 4977, 4978, 5, 210, 0, 0, 4978, 4979, 5, 30, 0, 0, 4979, 4980, 3, 550, 275, 0, 4980, 4981, 3, 954, 477, 0, 4981, 4997, 1, 0, 0, 0, 4982, 4983, 5, 144, 0, 0, 4983, 4984, 3, 550, 275, 0, 4984, 4985, 3, 954, 477, 0, 4985, 4997, 1, 0, 0, 0, 4986, 4987, 5, 144, 0, 0, 4987, 4988, 3, 1366, 683, 0, 4988, 4989, 3, 550, 275, 0, 4989, 4990, 3, 954, 477, 0, 4990, 4997, 1, 0, 0, 0, 4991, 4992, 5, 144, 0, 0, 4992, 4993, 5, 30, 0, 0, 4993, 4994, 3, 550, 275, 0, 4994, 4995, 3, 954, 477, 0, 4995, 4997, 1, 0, 0, 0, 4996, 4930, 1, 0, 0, 0, 4996, 4931, 1, 0, 0, 0, 4996, 4934, 1, 0, 0, 0, 4996, 4938, 1, 0, 0, 0, 4996, 4942, 1, 0, 0, 0, 4996, 4946, 1, 0, 0, 0, 4996, 4950, 1, 0, 0, 0, 4996, 4955, 1, 0, 0, 0, 4996, 4960, 1, 0, 0, 0, 4996, 4964, 1, 0, 0, 0, 4996, 4968, 1, 0, 0, 0, 4996, 4972, 1, 0, 0, 0, 4996, 4977, 1, 0, 0, 0, 4996, 4982, 1, 0, 0, 0, 4996, 4986, 1, 0, 0, 0, 4996, 4991, 1, 0, 0, 0, 4997, 547, 1, 0, 0, 0, 4998, 4999, 7, 24, 0, 0, 4999, 549, 1, 0, 0, 0, 5000, 5003, 3, 548, 274, 0, 5001, 5003, 1, 0, 0, 0, 5002, 5000, 1, 0, 0, 0, 5002, 5001, 1, 0, 0, 0, 5003, 551, 1, 0, 0, 0, 5004, 5005, 5, 65, 0, 0, 5005, 5006, 3, 556, 278, 0, 5006, 5007, 5, 80, 0, 0, 5007, 5008, 3, 562, 281, 0, 5008, 5009, 5, 94, 0, 0, 5009, 5010, 3, 564, 282, 0, 5010, 5011, 3, 568, 284, 0, 5011, 553, 1, 0, 0, 0, 5012, 5013, 5, 310, 0, 0, 5013, 5014, 3, 556, 278, 0, 5014, 5015, 5, 80, 0, 0, 5015, 5016, 3, 562, 281, 0, 5016, 5017, 5, 64, 0, 0, 5017, 5018, 3, 564, 282, 0, 5018, 5019, 3, 108, 54, 0, 5019, 5032, 1, 0, 0, 0, 5020, 5021, 5, 310, 0, 0, 5021, 5022, 5, 65, 0, 0, 5022, 5023, 5, 272, 0, 0, 5023, 5024, 5, 62, 0, 0, 5024, 5025, 3, 556, 278, 0, 5025, 5026, 5, 80, 0, 0, 5026, 5027, 3, 562, 281, 0, 5027, 5028, 5, 64, 0, 0, 5028, 5029, 3, 564, 282, 0, 5029, 5030, 3, 108, 54, 0, 5030, 5032, 1, 0, 0, 0, 5031, 5012, 1, 0, 0, 0, 5031, 5020, 1, 0, 0, 0, 5032, 555, 1, 0, 0, 0, 5033, 5049, 3, 558, 279, 0, 5034, 5049, 5, 30, 0, 0, 5035, 5036, 5, 30, 0, 0, 5036, 5049, 5, 287, 0, 0, 5037, 5038, 5, 30, 0, 0, 5038, 5039, 5, 2, 0, 0, 5039, 5040, 3, 216, 108, 0, 5040, 5041, 5, 3, 0, 0, 5041, 5049, 1, 0, 0, 0, 5042, 5043, 5, 30, 0, 0, 5043, 5044, 5, 287, 0, 0, 5044, 5045, 5, 2, 0, 0, 5045, 5046, 3, 216, 108, 0, 5046, 5047, 5, 3, 0, 0, 5047, 5049, 1, 0, 0, 0, 5048, 5033, 1, 0, 0, 0, 5048, 5034, 1, 0, 0, 0, 5048, 5035, 1, 0, 0, 0, 5048, 5037, 1, 0, 0, 0, 5048, 5042, 1, 0, 0, 0, 5049, 557, 1, 0, 0, 0, 5050, 5055, 3, 560, 280, 0, 5051, 5052, 5, 6, 0, 0, 5052, 5054, 3, 560, 280, 0, 5053, 5051, 1, 0, 0, 0, 5054, 5057, 1, 0, 0, 0, 5055, 5053, 1, 0, 0, 0, 5055, 5056, 1, 0, 0, 0, 5056, 559, 1, 0, 0, 0, 5057, 5055, 1, 0, 0, 0, 5058, 5059, 5, 88, 0, 0, 5059, 5068, 3, 214, 107, 0, 5060, 5061, 5, 86, 0, 0, 5061, 5068, 3, 214, 107, 0, 5062, 5063, 5, 46, 0, 0, 5063, 5068, 3, 214, 107, 0, 5064, 5065, 3, 1374, 687, 0, 5065, 5066, 3, 214, 107, 0, 5066, 5068, 1, 0, 0, 0, 5067, 5058, 1, 0, 0, 0, 5067, 5060, 1, 0, 0, 0, 5067, 5062, 1, 0, 0, 0, 5067, 5064, 1, 0, 0, 0, 5068, 561, 1, 0, 0, 0, 5069, 5128, 3, 1336, 668, 0, 5070, 5071, 5, 92, 0, 0, 5071, 5128, 3, 1336, 668, 0, 5072, 5073, 5, 321, 0, 0, 5073, 5128, 3, 1336, 668, 0, 5074, 5075, 5, 63, 0, 0, 5075, 5076, 5, 174, 0, 0, 5076, 5077, 5, 374, 0, 0, 5077, 5128, 3, 1340, 670, 0, 5078, 5079, 5, 63, 0, 0, 5079, 5080, 5, 324, 0, 0, 5080, 5128, 3, 1340, 670, 0, 5081, 5082, 5, 211, 0, 0, 5082, 5128, 3, 624, 312, 0, 5083, 5084, 5, 289, 0, 0, 5084, 5128, 3, 624, 312, 0, 5085, 5086, 5, 442, 0, 0, 5086, 5128, 3, 624, 312, 0, 5087, 5088, 5, 175, 0, 0, 5088, 5128, 3, 1340, 670, 0, 5089, 5090, 5, 189, 0, 0, 5090, 5128, 3, 522, 261, 0, 5091, 5092, 5, 238, 0, 0, 5092, 5128, 3, 1340, 670, 0, 5093, 5094, 5, 239, 0, 0, 5094, 5095, 5, 267, 0, 0, 5095, 5128, 3, 294, 147, 0, 5096, 5097, 5, 316, 0, 0, 5097, 5128, 3, 1340, 670, 0, 5098, 5099, 5, 344, 0, 0, 5099, 5128, 3, 1340, 670, 0, 5100, 5101, 5, 353, 0, 0, 5101, 5128, 3, 522, 261, 0, 5102, 5103, 5, 30, 0, 0, 5103, 5104, 5, 343, 0, 0, 5104, 5105, 5, 68, 0, 0, 5105, 5106, 5, 316, 0, 0, 5106, 5128, 3, 1340, 670, 0, 5107, 5108, 5, 30, 0, 0, 5108, 5109, 5, 322, 0, 0, 5109, 5110, 5, 68, 0, 0, 5110, 5111, 5, 316, 0, 0, 5111, 5128, 3, 1340, 670, 0, 5112, 5113, 5, 30, 0, 0, 5113, 5114, 5, 212, 0, 0, 5114, 5115, 5, 68, 0, 0, 5115, 5116, 5, 316, 0, 0, 5116, 5128, 3, 1340, 670, 0, 5117, 5118, 5, 30, 0, 0, 5118, 5119, 5, 457, 0, 0, 5119, 5120, 5, 68, 0, 0, 5120, 5121, 5, 316, 0, 0, 5121, 5128, 3, 1340, 670, 0, 5122, 5123, 5, 30, 0, 0, 5123, 5124, 5, 455, 0, 0, 5124, 5125, 5, 68, 0, 0, 5125, 5126, 5, 316, 0, 0, 5126, 5128, 3, 1340, 670, 0, 5127, 5069, 1, 0, 0, 0, 5127, 5070, 1, 0, 0, 0, 5127, 5072, 1, 0, 0, 0, 5127, 5074, 1, 0, 0, 0, 5127, 5078, 1, 0, 0, 0, 5127, 5081, 1, 0, 0, 0, 5127, 5083, 1, 0, 0, 0, 5127, 5085, 1, 0, 0, 0, 5127, 5087, 1, 0, 0, 0, 5127, 5089, 1, 0, 0, 0, 5127, 5091, 1, 0, 0, 0, 5127, 5093, 1, 0, 0, 0, 5127, 5096, 1, 0, 0, 0, 5127, 5098, 1, 0, 0, 0, 5127, 5100, 1, 0, 0, 0, 5127, 5102, 1, 0, 0, 0, 5127, 5107, 1, 0, 0, 0, 5127, 5112, 1, 0, 0, 0, 5127, 5117, 1, 0, 0, 0, 5127, 5122, 1, 0, 0, 0, 5128, 563, 1, 0, 0, 0, 5129, 5134, 3, 566, 283, 0, 5130, 5131, 5, 6, 0, 0, 5131, 5133, 3, 566, 283, 0, 5132, 5130, 1, 0, 0, 0, 5133, 5136, 1, 0, 0, 0, 5134, 5132, 1, 0, 0, 0, 5134, 5135, 1, 0, 0, 0, 5135, 565, 1, 0, 0, 0, 5136, 5134, 1, 0, 0, 0, 5137, 5141, 3, 1370, 685, 0, 5138, 5139, 5, 66, 0, 0, 5139, 5141, 3, 1370, 685, 0, 5140, 5137, 1, 0, 0, 0, 5140, 5138, 1, 0, 0, 0, 5141, 567, 1, 0, 0, 0, 5142, 5143, 5, 105, 0, 0, 5143, 5144, 5, 65, 0, 0, 5144, 5147, 5, 272, 0, 0, 5145, 5147, 1, 0, 0, 0, 5146, 5142, 1, 0, 0, 0, 5146, 5145, 1, 0, 0, 0, 5147, 569, 1, 0, 0, 0, 5148, 5149, 5, 65, 0, 0, 5149, 5150, 3, 558, 279, 0, 5150, 5151, 5, 94, 0, 0, 5151, 5152, 3, 1372, 686, 0, 5152, 5153, 3, 574, 287, 0, 5153, 5154, 3, 576, 288, 0, 5154, 571, 1, 0, 0, 0, 5155, 5156, 5, 310, 0, 0, 5156, 5157, 3, 558, 279, 0, 5157, 5158, 5, 64, 0, 0, 5158, 5159, 3, 1372, 686, 0, 5159, 5160, 3, 576, 288, 0, 5160, 5161, 3, 108, 54, 0, 5161, 5173, 1, 0, 0, 0, 5162, 5163, 5, 310, 0, 0, 5163, 5164, 5, 134, 0, 0, 5164, 5165, 5, 272, 0, 0, 5165, 5166, 5, 62, 0, 0, 5166, 5167, 3, 558, 279, 0, 5167, 5168, 5, 64, 0, 0, 5168, 5169, 3, 1372, 686, 0, 5169, 5170, 3, 576, 288, 0, 5170, 5171, 3, 108, 54, 0, 5171, 5173, 1, 0, 0, 0, 5172, 5155, 1, 0, 0, 0, 5172, 5162, 1, 0, 0, 0, 5173, 573, 1, 0, 0, 0, 5174, 5175, 5, 105, 0, 0, 5175, 5176, 5, 134, 0, 0, 5176, 5179, 5, 272, 0, 0, 5177, 5179, 1, 0, 0, 0, 5178, 5174, 1, 0, 0, 0, 5178, 5177, 1, 0, 0, 0, 5179, 575, 1, 0, 0, 0, 5180, 5181, 5, 214, 0, 0, 5181, 5182, 5, 147, 0, 0, 5182, 5185, 3, 1370, 685, 0, 5183, 5185, 1, 0, 0, 0, 5184, 5180, 1, 0, 0, 0, 5184, 5183, 1, 0, 0, 0, 5185, 577, 1, 0, 0, 0, 5186, 5187, 5, 138, 0, 0, 5187, 5188, 5, 53, 0, 0, 5188, 5189, 5, 287, 0, 0, 5189, 5190, 3, 580, 290, 0, 5190, 5191, 3, 584, 292, 0, 5191, 579, 1, 0, 0, 0, 5192, 5194, 3, 582, 291, 0, 5193, 5192, 1, 0, 0, 0, 5194, 5197, 1, 0, 0, 0, 5195, 5193, 1, 0, 0, 0, 5195, 5196, 1, 0, 0, 0, 5196, 581, 1, 0, 0, 0, 5197, 5195, 1, 0, 0, 0, 5198, 5199, 5, 68, 0, 0, 5199, 5200, 5, 316, 0, 0, 5200, 5208, 3, 1340, 670, 0, 5201, 5202, 5, 62, 0, 0, 5202, 5203, 5, 311, 0, 0, 5203, 5208, 3, 1372, 686, 0, 5204, 5205, 5, 62, 0, 0, 5205, 5206, 5, 99, 0, 0, 5206, 5208, 3, 1372, 686, 0, 5207, 5198, 1, 0, 0, 0, 5207, 5201, 1, 0, 0, 0, 5207, 5204, 1, 0, 0, 0, 5208, 583, 1, 0, 0, 0, 5209, 5210, 5, 65, 0, 0, 5210, 5211, 3, 556, 278, 0, 5211, 5212, 5, 80, 0, 0, 5212, 5213, 3, 586, 293, 0, 5213, 5214, 5, 94, 0, 0, 5214, 5215, 3, 564, 282, 0, 5215, 5216, 3, 568, 284, 0, 5216, 5237, 1, 0, 0, 0, 5217, 5218, 5, 310, 0, 0, 5218, 5219, 3, 556, 278, 0, 5219, 5220, 5, 80, 0, 0, 5220, 5221, 3, 586, 293, 0, 5221, 5222, 5, 64, 0, 0, 5222, 5223, 3, 564, 282, 0, 5223, 5224, 3, 108, 54, 0, 5224, 5237, 1, 0, 0, 0, 5225, 5226, 5, 310, 0, 0, 5226, 5227, 5, 65, 0, 0, 5227, 5228, 5, 272, 0, 0, 5228, 5229, 5, 62, 0, 0, 5229, 5230, 3, 556, 278, 0, 5230, 5231, 5, 80, 0, 0, 5231, 5232, 3, 586, 293, 0, 5232, 5233, 5, 64, 0, 0, 5233, 5234, 3, 564, 282, 0, 5234, 5235, 3, 108, 54, 0, 5235, 5237, 1, 0, 0, 0, 5236, 5209, 1, 0, 0, 0, 5236, 5217, 1, 0, 0, 0, 5236, 5225, 1, 0, 0, 0, 5237, 585, 1, 0, 0, 0, 5238, 5239, 7, 25, 0, 0, 5239, 587, 1, 0, 0, 0, 5240, 5241, 5, 46, 0, 0, 5241, 5242, 3, 590, 295, 0, 5242, 5243, 5, 226, 0, 0, 5243, 5244, 3, 592, 296, 0, 5244, 5245, 3, 594, 297, 0, 5245, 5246, 5, 80, 0, 0, 5246, 5247, 3, 1076, 538, 0, 5247, 5248, 3, 596, 298, 0, 5248, 5249, 5, 2, 0, 0, 5249, 5250, 3, 598, 299, 0, 5250, 5251, 5, 3, 0, 0, 5251, 5252, 3, 604, 302, 0, 5252, 5253, 3, 118, 59, 0, 5253, 5254, 3, 254, 127, 0, 5254, 5255, 3, 1096, 548, 0, 5255, 5276, 1, 0, 0, 0, 5256, 5257, 5, 46, 0, 0, 5257, 5258, 3, 590, 295, 0, 5258, 5259, 5, 226, 0, 0, 5259, 5260, 3, 592, 296, 0, 5260, 5261, 5, 220, 0, 0, 5261, 5262, 5, 77, 0, 0, 5262, 5263, 5, 389, 0, 0, 5263, 5264, 3, 1342, 671, 0, 5264, 5265, 5, 80, 0, 0, 5265, 5266, 3, 1076, 538, 0, 5266, 5267, 3, 596, 298, 0, 5267, 5268, 5, 2, 0, 0, 5268, 5269, 3, 598, 299, 0, 5269, 5270, 5, 3, 0, 0, 5270, 5271, 3, 604, 302, 0, 5271, 5272, 3, 118, 59, 0, 5272, 5273, 3, 254, 127, 0, 5273, 5274, 3, 1096, 548, 0, 5274, 5276, 1, 0, 0, 0, 5275, 5240, 1, 0, 0, 0, 5275, 5256, 1, 0, 0, 0, 5276, 589, 1, 0, 0, 0, 5277, 5280, 5, 98, 0, 0, 5278, 5280, 1, 0, 0, 0, 5279, 5277, 1, 0, 0, 0, 5279, 5278, 1, 0, 0, 0, 5280, 591, 1, 0, 0, 0, 5281, 5284, 5, 109, 0, 0, 5282, 5284, 1, 0, 0, 0, 5283, 5281, 1, 0, 0, 0, 5283, 5282, 1, 0, 0, 0, 5284, 593, 1, 0, 0, 0, 5285, 5288, 3, 1342, 671, 0, 5286, 5288, 1, 0, 0, 0, 5287, 5285, 1, 0, 0, 0, 5287, 5286, 1, 0, 0, 0, 5288, 595, 1, 0, 0, 0, 5289, 5290, 5, 100, 0, 0, 5290, 5293, 3, 1342, 671, 0, 5291, 5293, 1, 0, 0, 0, 5292, 5289, 1, 0, 0, 0, 5292, 5291, 1, 0, 0, 0, 5293, 597, 1, 0, 0, 0, 5294, 5299, 3, 602, 301, 0, 5295, 5296, 5, 6, 0, 0, 5296, 5298, 3, 602, 301, 0, 5297, 5295, 1, 0, 0, 0, 5298, 5301, 1, 0, 0, 0, 5299, 5297, 1, 0, 0, 0, 5299, 5300, 1, 0, 0, 0, 5300, 599, 1, 0, 0, 0, 5301, 5299, 1, 0, 0, 0, 5302, 5303, 3, 608, 304, 0, 5303, 5304, 3, 610, 305, 0, 5304, 5305, 3, 612, 306, 0, 5305, 5306, 3, 614, 307, 0, 5306, 5314, 1, 0, 0, 0, 5307, 5308, 3, 608, 304, 0, 5308, 5309, 3, 524, 262, 0, 5309, 5310, 3, 116, 58, 0, 5310, 5311, 3, 612, 306, 0, 5311, 5312, 3, 614, 307, 0, 5312, 5314, 1, 0, 0, 0, 5313, 5302, 1, 0, 0, 0, 5313, 5307, 1, 0, 0, 0, 5314, 601, 1, 0, 0, 0, 5315, 5316, 3, 1374, 687, 0, 5316, 5317, 3, 600, 300, 0, 5317, 5327, 1, 0, 0, 0, 5318, 5319, 3, 1216, 608, 0, 5319, 5320, 3, 600, 300, 0, 5320, 5327, 1, 0, 0, 0, 5321, 5322, 5, 2, 0, 0, 5322, 5323, 3, 1164, 582, 0, 5323, 5324, 5, 3, 0, 0, 5324, 5325, 3, 600, 300, 0, 5325, 5327, 1, 0, 0, 0, 5326, 5315, 1, 0, 0, 0, 5326, 5318, 1, 0, 0, 0, 5326, 5321, 1, 0, 0, 0, 5327, 603, 1, 0, 0, 0, 5328, 5329, 5, 441, 0, 0, 5329, 5330, 5, 2, 0, 0, 5330, 5331, 3, 606, 303, 0, 5331, 5332, 5, 3, 0, 0, 5332, 5335, 1, 0, 0, 0, 5333, 5335, 1, 0, 0, 0, 5334, 5328, 1, 0, 0, 0, 5334, 5333, 1, 0, 0, 0, 5335, 605, 1, 0, 0, 0, 5336, 5341, 3, 602, 301, 0, 5337, 5338, 5, 6, 0, 0, 5338, 5340, 3, 602, 301, 0, 5339, 5337, 1, 0, 0, 0, 5340, 5343, 1, 0, 0, 0, 5341, 5339, 1, 0, 0, 0, 5341, 5342, 1, 0, 0, 0, 5342, 607, 1, 0, 0, 0, 5343, 5341, 1, 0, 0, 0, 5344, 5345, 5, 43, 0, 0, 5345, 5348, 3, 524, 262, 0, 5346, 5348, 1, 0, 0, 0, 5347, 5344, 1, 0, 0, 0, 5347, 5346, 1, 0, 0, 0, 5348, 609, 1, 0, 0, 0, 5349, 5352, 3, 524, 262, 0, 5350, 5352, 1, 0, 0, 0, 5351, 5349, 1, 0, 0, 0, 5351, 5350, 1, 0, 0, 0, 5352, 611, 1, 0, 0, 0, 5353, 5357, 5, 37, 0, 0, 5354, 5357, 5, 55, 0, 0, 5355, 5357, 1, 0, 0, 0, 5356, 5353, 1, 0, 0, 0, 5356, 5354, 1, 0, 0, 0, 5356, 5355, 1, 0, 0, 0, 5357, 613, 1, 0, 0, 0, 5358, 5359, 5, 266, 0, 0, 5359, 5364, 5, 207, 0, 0, 5360, 5361, 5, 266, 0, 0, 5361, 5364, 5, 240, 0, 0, 5362, 5364, 1, 0, 0, 0, 5363, 5358, 1, 0, 0, 0, 5363, 5360, 1, 0, 0, 0, 5363, 5362, 1, 0, 0, 0, 5364, 615, 1, 0, 0, 0, 5365, 5366, 5, 46, 0, 0, 5366, 5367, 3, 618, 309, 0, 5367, 5368, 7, 22, 0, 0, 5368, 5369, 3, 1348, 674, 0, 5369, 5379, 3, 628, 314, 0, 5370, 5377, 5, 309, 0, 0, 5371, 5378, 3, 638, 319, 0, 5372, 5373, 5, 92, 0, 0, 5373, 5374, 5, 2, 0, 0, 5374, 5375, 3, 668, 334, 0, 5375, 5376, 5, 3, 0, 0, 5376, 5378, 1, 0, 0, 0, 5377, 5371, 1, 0, 0, 0, 5377, 5372, 1, 0, 0, 0, 5378, 5380, 1, 0, 0, 0, 5379, 5370, 1, 0, 0, 0, 5379, 5380, 1, 0, 0, 0, 5380, 5381, 1, 0, 0, 0, 5381, 5382, 3, 654, 327, 0, 5382, 617, 1, 0, 0, 0, 5383, 5384, 5, 82, 0, 0, 5384, 5387, 5, 304, 0, 0, 5385, 5387, 1, 0, 0, 0, 5386, 5383, 1, 0, 0, 0, 5386, 5385, 1, 0, 0, 0, 5387, 619, 1, 0, 0, 0, 5388, 5390, 5, 2, 0, 0, 5389, 5391, 3, 622, 311, 0, 5390, 5389, 1, 0, 0, 0, 5390, 5391, 1, 0, 0, 0, 5391, 5392, 1, 0, 0, 0, 5392, 5393, 5, 3, 0, 0, 5393, 621, 1, 0, 0, 0, 5394, 5399, 3, 632, 316, 0, 5395, 5396, 5, 6, 0, 0, 5396, 5398, 3, 632, 316, 0, 5397, 5395, 1, 0, 0, 0, 5398, 5401, 1, 0, 0, 0, 5399, 5397, 1, 0, 0, 0, 5399, 5400, 1, 0, 0, 0, 5400, 623, 1, 0, 0, 0, 5401, 5399, 1, 0, 0, 0, 5402, 5407, 3, 626, 313, 0, 5403, 5404, 5, 6, 0, 0, 5404, 5406, 3, 626, 313, 0, 5405, 5403, 1, 0, 0, 0, 5406, 5409, 1, 0, 0, 0, 5407, 5405, 1, 0, 0, 0, 5407, 5408, 1, 0, 0, 0, 5408, 625, 1, 0, 0, 0, 5409, 5407, 1, 0, 0, 0, 5410, 5411, 3, 1348, 674, 0, 5411, 5412, 3, 620, 310, 0, 5412, 5419, 1, 0, 0, 0, 5413, 5419, 3, 1392, 696, 0, 5414, 5416, 3, 1374, 687, 0, 5415, 5417, 3, 1326, 663, 0, 5416, 5415, 1, 0, 0, 0, 5416, 5417, 1, 0, 0, 0, 5417, 5419, 1, 0, 0, 0, 5418, 5410, 1, 0, 0, 0, 5418, 5413, 1, 0, 0, 0, 5418, 5414, 1, 0, 0, 0, 5419, 627, 1, 0, 0, 0, 5420, 5422, 5, 2, 0, 0, 5421, 5423, 3, 630, 315, 0, 5422, 5421, 1, 0, 0, 0, 5422, 5423, 1, 0, 0, 0, 5423, 5424, 1, 0, 0, 0, 5424, 5425, 5, 3, 0, 0, 5425, 629, 1, 0, 0, 0, 5426, 5431, 3, 642, 321, 0, 5427, 5428, 5, 6, 0, 0, 5428, 5430, 3, 642, 321, 0, 5429, 5427, 1, 0, 0, 0, 5430, 5433, 1, 0, 0, 0, 5431, 5429, 1, 0, 0, 0, 5431, 5432, 1, 0, 0, 0, 5432, 631, 1, 0, 0, 0, 5433, 5431, 1, 0, 0, 0, 5434, 5436, 3, 634, 317, 0, 5435, 5437, 3, 636, 318, 0, 5436, 5435, 1, 0, 0, 0, 5436, 5437, 1, 0, 0, 0, 5437, 5438, 1, 0, 0, 0, 5438, 5439, 3, 640, 320, 0, 5439, 5448, 1, 0, 0, 0, 5440, 5442, 3, 636, 318, 0, 5441, 5443, 3, 634, 317, 0, 5442, 5441, 1, 0, 0, 0, 5442, 5443, 1, 0, 0, 0, 5443, 5444, 1, 0, 0, 0, 5444, 5445, 3, 640, 320, 0, 5445, 5448, 1, 0, 0, 0, 5446, 5448, 3, 640, 320, 0, 5447, 5434, 1, 0, 0, 0, 5447, 5440, 1, 0, 0, 0, 5447, 5446, 1, 0, 0, 0, 5448, 633, 1, 0, 0, 0, 5449, 5451, 5, 68, 0, 0, 5450, 5452, 5, 453, 0, 0, 5451, 5450, 1, 0, 0, 0, 5451, 5452, 1, 0, 0, 0, 5452, 5457, 1, 0, 0, 0, 5453, 5457, 5, 453, 0, 0, 5454, 5457, 5, 393, 0, 0, 5455, 5457, 5, 101, 0, 0, 5456, 5449, 1, 0, 0, 0, 5456, 5453, 1, 0, 0, 0, 5456, 5454, 1, 0, 0, 0, 5456, 5455, 1, 0, 0, 0, 5457, 635, 1, 0, 0, 0, 5458, 5463, 3, 1378, 689, 0, 5459, 5463, 3, 1396, 698, 0, 5460, 5463, 5, 119, 0, 0, 5461, 5463, 5, 126, 0, 0, 5462, 5458, 1, 0, 0, 0, 5462, 5459, 1, 0, 0, 0, 5462, 5460, 1, 0, 0, 0, 5462, 5461, 1, 0, 0, 0, 5463, 637, 1, 0, 0, 0, 5464, 5465, 3, 640, 320, 0, 5465, 639, 1, 0, 0, 0, 5466, 5481, 3, 1120, 560, 0, 5467, 5469, 5, 408, 0, 0, 5468, 5467, 1, 0, 0, 0, 5468, 5469, 1, 0, 0, 0, 5469, 5474, 1, 0, 0, 0, 5470, 5475, 3, 1396, 698, 0, 5471, 5475, 3, 1378, 689, 0, 5472, 5475, 5, 119, 0, 0, 5473, 5475, 5, 126, 0, 0, 5474, 5470, 1, 0, 0, 0, 5474, 5471, 1, 0, 0, 0, 5474, 5472, 1, 0, 0, 0, 5474, 5473, 1, 0, 0, 0, 5475, 5476, 1, 0, 0, 0, 5476, 5477, 3, 526, 263, 0, 5477, 5478, 5, 27, 0, 0, 5478, 5479, 5, 353, 0, 0, 5479, 5481, 1, 0, 0, 0, 5480, 5466, 1, 0, 0, 0, 5480, 5468, 1, 0, 0, 0, 5481, 641, 1, 0, 0, 0, 5482, 5485, 3, 632, 316, 0, 5483, 5484, 7, 26, 0, 0, 5484, 5486, 3, 1164, 582, 0, 5485, 5483, 1, 0, 0, 0, 5485, 5486, 1, 0, 0, 0, 5486, 643, 1, 0, 0, 0, 5487, 5488, 3, 632, 316, 0, 5488, 645, 1, 0, 0, 0, 5489, 5500, 5, 2, 0, 0, 5490, 5501, 5, 9, 0, 0, 5491, 5501, 3, 648, 324, 0, 5492, 5493, 5, 83, 0, 0, 5493, 5494, 5, 147, 0, 0, 5494, 5501, 3, 648, 324, 0, 5495, 5496, 3, 648, 324, 0, 5496, 5497, 5, 83, 0, 0, 5497, 5498, 5, 147, 0, 0, 5498, 5499, 3, 648, 324, 0, 5499, 5501, 1, 0, 0, 0, 5500, 5490, 1, 0, 0, 0, 5500, 5491, 1, 0, 0, 0, 5500, 5492, 1, 0, 0, 0, 5500, 5495, 1, 0, 0, 0, 5501, 5502, 1, 0, 0, 0, 5502, 5503, 5, 3, 0, 0, 5503, 647, 1, 0, 0, 0, 5504, 5509, 3, 644, 322, 0, 5505, 5506, 5, 6, 0, 0, 5506, 5508, 3, 644, 322, 0, 5507, 5505, 1, 0, 0, 0, 5508, 5511, 1, 0, 0, 0, 5509, 5507, 1, 0, 0, 0, 5509, 5510, 1, 0, 0, 0, 5510, 649, 1, 0, 0, 0, 5511, 5509, 1, 0, 0, 0, 5512, 5513, 3, 1348, 674, 0, 5513, 5514, 3, 646, 323, 0, 5514, 651, 1, 0, 0, 0, 5515, 5520, 3, 650, 325, 0, 5516, 5517, 5, 6, 0, 0, 5517, 5519, 3, 650, 325, 0, 5518, 5516, 1, 0, 0, 0, 5519, 5522, 1, 0, 0, 0, 5520, 5518, 1, 0, 0, 0, 5520, 5521, 1, 0, 0, 0, 5521, 653, 1, 0, 0, 0, 5522, 5520, 1, 0, 0, 0, 5523, 5525, 3, 658, 329, 0, 5524, 5523, 1, 0, 0, 0, 5525, 5526, 1, 0, 0, 0, 5526, 5524, 1, 0, 0, 0, 5526, 5527, 1, 0, 0, 0, 5527, 5528, 1, 0, 0, 0, 5528, 5529, 6, 327, -1, 0, 5529, 655, 1, 0, 0, 0, 5530, 5531, 5, 149, 0, 0, 5531, 5532, 5, 80, 0, 0, 5532, 5533, 5, 78, 0, 0, 5533, 5566, 5, 458, 0, 0, 5534, 5535, 5, 309, 0, 0, 5535, 5536, 5, 78, 0, 0, 5536, 5537, 5, 80, 0, 0, 5537, 5538, 5, 78, 0, 0, 5538, 5566, 5, 458, 0, 0, 5539, 5566, 5, 339, 0, 0, 5540, 5566, 5, 222, 0, 0, 5541, 5566, 5, 331, 0, 0, 5542, 5566, 5, 370, 0, 0, 5543, 5544, 5, 205, 0, 0, 5544, 5545, 5, 320, 0, 0, 5545, 5566, 5, 181, 0, 0, 5546, 5547, 5, 205, 0, 0, 5547, 5548, 5, 320, 0, 0, 5548, 5566, 5, 234, 0, 0, 5549, 5550, 5, 320, 0, 0, 5550, 5566, 5, 181, 0, 0, 5551, 5552, 5, 320, 0, 0, 5552, 5566, 5, 234, 0, 0, 5553, 5566, 5, 241, 0, 0, 5554, 5555, 5, 77, 0, 0, 5555, 5566, 5, 241, 0, 0, 5556, 5557, 5, 170, 0, 0, 5557, 5566, 3, 292, 146, 0, 5558, 5559, 5, 313, 0, 0, 5559, 5566, 3, 292, 146, 0, 5560, 5561, 5, 459, 0, 0, 5561, 5566, 3, 524, 262, 0, 5562, 5566, 3, 82, 41, 0, 5563, 5564, 5, 460, 0, 0, 5564, 5566, 3, 1374, 687, 0, 5565, 5530, 1, 0, 0, 0, 5565, 5534, 1, 0, 0, 0, 5565, 5539, 1, 0, 0, 0, 5565, 5540, 1, 0, 0, 0, 5565, 5541, 1, 0, 0, 0, 5565, 5542, 1, 0, 0, 0, 5565, 5543, 1, 0, 0, 0, 5565, 5546, 1, 0, 0, 0, 5565, 5549, 1, 0, 0, 0, 5565, 5551, 1, 0, 0, 0, 5565, 5553, 1, 0, 0, 0, 5565, 5554, 1, 0, 0, 0, 5565, 5556, 1, 0, 0, 0, 5565, 5558, 1, 0, 0, 0, 5565, 5560, 1, 0, 0, 0, 5565, 5562, 1, 0, 0, 0, 5565, 5563, 1, 0, 0, 0, 5566, 657, 1, 0, 0, 0, 5567, 5568, 5, 36, 0, 0, 5568, 5576, 3, 660, 330, 0, 5569, 5570, 5, 238, 0, 0, 5570, 5576, 3, 72, 36, 0, 5571, 5572, 5, 443, 0, 0, 5572, 5576, 3, 662, 331, 0, 5573, 5576, 5, 104, 0, 0, 5574, 5576, 3, 656, 328, 0, 5575, 5567, 1, 0, 0, 0, 5575, 5569, 1, 0, 0, 0, 5575, 5571, 1, 0, 0, 0, 5575, 5573, 1, 0, 0, 0, 5575, 5574, 1, 0, 0, 0, 5576, 659, 1, 0, 0, 0, 5577, 5583, 3, 1360, 680, 0, 5578, 5579, 3, 1360, 680, 0, 5579, 5580, 5, 6, 0, 0, 5580, 5581, 3, 1360, 680, 0, 5581, 5583, 1, 0, 0, 0, 5582, 5577, 1, 0, 0, 0, 5582, 5578, 1, 0, 0, 0, 5583, 661, 1, 0, 0, 0, 5584, 5585, 5, 62, 0, 0, 5585, 5586, 5, 353, 0, 0, 5586, 5593, 3, 1120, 560, 0, 5587, 5588, 5, 6, 0, 0, 5588, 5589, 5, 62, 0, 0, 5589, 5590, 5, 353, 0, 0, 5590, 5592, 3, 1120, 560, 0, 5591, 5587, 1, 0, 0, 0, 5592, 5595, 1, 0, 0, 0, 5593, 5591, 1, 0, 0, 0, 5593, 5594, 1, 0, 0, 0, 5594, 663, 1, 0, 0, 0, 5595, 5593, 1, 0, 0, 0, 5596, 5597, 5, 105, 0, 0, 5597, 5600, 3, 460, 230, 0, 5598, 5600, 1, 0, 0, 0, 5599, 5596, 1, 0, 0, 0, 5599, 5598, 1, 0, 0, 0, 5600, 665, 1, 0, 0, 0, 5601, 5602, 3, 636, 318, 0, 5602, 5603, 3, 640, 320, 0, 5603, 667, 1, 0, 0, 0, 5604, 5609, 3, 666, 333, 0, 5605, 5606, 5, 6, 0, 0, 5606, 5608, 3, 666, 333, 0, 5607, 5605, 1, 0, 0, 0, 5608, 5611, 1, 0, 0, 0, 5609, 5607, 1, 0, 0, 0, 5609, 5610, 1, 0, 0, 0, 5610, 669, 1, 0, 0, 0, 5611, 5609, 1, 0, 0, 0, 5612, 5613, 5, 138, 0, 0, 5613, 5614, 7, 27, 0, 0, 5614, 5615, 3, 626, 313, 0, 5615, 5616, 3, 672, 336, 0, 5616, 5617, 3, 674, 337, 0, 5617, 671, 1, 0, 0, 0, 5618, 5620, 3, 656, 328, 0, 5619, 5618, 1, 0, 0, 0, 5620, 5621, 1, 0, 0, 0, 5621, 5619, 1, 0, 0, 0, 5621, 5622, 1, 0, 0, 0, 5622, 673, 1, 0, 0, 0, 5623, 5626, 5, 308, 0, 0, 5624, 5626, 1, 0, 0, 0, 5625, 5623, 1, 0, 0, 0, 5625, 5624, 1, 0, 0, 0, 5626, 675, 1, 0, 0, 0, 5627, 5628, 5, 191, 0, 0, 5628, 5629, 5, 211, 0, 0, 5629, 5630, 3, 624, 312, 0, 5630, 5631, 3, 108, 54, 0, 5631, 5664, 1, 0, 0, 0, 5632, 5633, 5, 191, 0, 0, 5633, 5634, 5, 211, 0, 0, 5634, 5635, 5, 220, 0, 0, 5635, 5636, 5, 389, 0, 0, 5636, 5637, 3, 624, 312, 0, 5637, 5638, 3, 108, 54, 0, 5638, 5664, 1, 0, 0, 0, 5639, 5640, 5, 191, 0, 0, 5640, 5641, 5, 289, 0, 0, 5641, 5642, 3, 624, 312, 0, 5642, 5643, 3, 108, 54, 0, 5643, 5664, 1, 0, 0, 0, 5644, 5645, 5, 191, 0, 0, 5645, 5646, 5, 289, 0, 0, 5646, 5647, 5, 220, 0, 0, 5647, 5648, 5, 389, 0, 0, 5648, 5649, 3, 624, 312, 0, 5649, 5650, 3, 108, 54, 0, 5650, 5664, 1, 0, 0, 0, 5651, 5652, 5, 191, 0, 0, 5652, 5653, 5, 442, 0, 0, 5653, 5654, 3, 624, 312, 0, 5654, 5655, 3, 108, 54, 0, 5655, 5664, 1, 0, 0, 0, 5656, 5657, 5, 191, 0, 0, 5657, 5658, 5, 442, 0, 0, 5658, 5659, 5, 220, 0, 0, 5659, 5660, 5, 389, 0, 0, 5660, 5661, 3, 624, 312, 0, 5661, 5662, 3, 108, 54, 0, 5662, 5664, 1, 0, 0, 0, 5663, 5627, 1, 0, 0, 0, 5663, 5632, 1, 0, 0, 0, 5663, 5639, 1, 0, 0, 0, 5663, 5644, 1, 0, 0, 0, 5663, 5651, 1, 0, 0, 0, 5663, 5656, 1, 0, 0, 0, 5664, 677, 1, 0, 0, 0, 5665, 5666, 5, 191, 0, 0, 5666, 5667, 5, 136, 0, 0, 5667, 5668, 3, 652, 326, 0, 5668, 5669, 3, 108, 54, 0, 5669, 5678, 1, 0, 0, 0, 5670, 5671, 5, 191, 0, 0, 5671, 5672, 5, 136, 0, 0, 5672, 5673, 5, 220, 0, 0, 5673, 5674, 5, 389, 0, 0, 5674, 5675, 3, 652, 326, 0, 5675, 5676, 3, 108, 54, 0, 5676, 5678, 1, 0, 0, 0, 5677, 5665, 1, 0, 0, 0, 5677, 5670, 1, 0, 0, 0, 5678, 679, 1, 0, 0, 0, 5679, 5680, 5, 191, 0, 0, 5680, 5681, 5, 271, 0, 0, 5681, 5682, 3, 686, 343, 0, 5682, 5683, 3, 108, 54, 0, 5683, 5692, 1, 0, 0, 0, 5684, 5685, 5, 191, 0, 0, 5685, 5686, 5, 271, 0, 0, 5686, 5687, 5, 220, 0, 0, 5687, 5688, 5, 389, 0, 0, 5688, 5689, 3, 686, 343, 0, 5689, 5690, 3, 108, 54, 0, 5690, 5692, 1, 0, 0, 0, 5691, 5679, 1, 0, 0, 0, 5691, 5684, 1, 0, 0, 0, 5692, 681, 1, 0, 0, 0, 5693, 5694, 5, 2, 0, 0, 5694, 5695, 3, 1120, 560, 0, 5695, 5696, 5, 3, 0, 0, 5696, 5716, 1, 0, 0, 0, 5697, 5698, 5, 2, 0, 0, 5698, 5699, 3, 1120, 560, 0, 5699, 5700, 5, 6, 0, 0, 5700, 5701, 3, 1120, 560, 0, 5701, 5702, 5, 3, 0, 0, 5702, 5716, 1, 0, 0, 0, 5703, 5704, 5, 2, 0, 0, 5704, 5705, 5, 400, 0, 0, 5705, 5706, 5, 6, 0, 0, 5706, 5707, 3, 1120, 560, 0, 5707, 5708, 5, 3, 0, 0, 5708, 5716, 1, 0, 0, 0, 5709, 5710, 5, 2, 0, 0, 5710, 5711, 3, 1120, 560, 0, 5711, 5712, 5, 6, 0, 0, 5712, 5713, 5, 400, 0, 0, 5713, 5714, 5, 3, 0, 0, 5714, 5716, 1, 0, 0, 0, 5715, 5693, 1, 0, 0, 0, 5715, 5697, 1, 0, 0, 0, 5715, 5703, 1, 0, 0, 0, 5715, 5709, 1, 0, 0, 0, 5716, 683, 1, 0, 0, 0, 5717, 5718, 3, 1374, 687, 0, 5718, 5719, 5, 11, 0, 0, 5719, 5721, 1, 0, 0, 0, 5720, 5717, 1, 0, 0, 0, 5721, 5724, 1, 0, 0, 0, 5722, 5720, 1, 0, 0, 0, 5722, 5723, 1, 0, 0, 0, 5723, 5725, 1, 0, 0, 0, 5724, 5722, 1, 0, 0, 0, 5725, 5726, 3, 1272, 636, 0, 5726, 685, 1, 0, 0, 0, 5727, 5732, 3, 688, 344, 0, 5728, 5729, 5, 6, 0, 0, 5729, 5731, 3, 688, 344, 0, 5730, 5728, 1, 0, 0, 0, 5731, 5734, 1, 0, 0, 0, 5732, 5730, 1, 0, 0, 0, 5732, 5733, 1, 0, 0, 0, 5733, 687, 1, 0, 0, 0, 5734, 5732, 1, 0, 0, 0, 5735, 5736, 3, 684, 342, 0, 5736, 5737, 3, 682, 341, 0, 5737, 689, 1, 0, 0, 0, 5738, 5739, 5, 57, 0, 0, 5739, 5740, 3, 692, 346, 0, 5740, 691, 1, 0, 0, 0, 5741, 5743, 3, 694, 347, 0, 5742, 5741, 1, 0, 0, 0, 5743, 5744, 1, 0, 0, 0, 5744, 5742, 1, 0, 0, 0, 5744, 5745, 1, 0, 0, 0, 5745, 693, 1, 0, 0, 0, 5746, 5750, 3, 1360, 680, 0, 5747, 5748, 5, 238, 0, 0, 5748, 5750, 3, 72, 36, 0, 5749, 5746, 1, 0, 0, 0, 5749, 5747, 1, 0, 0, 0, 5750, 695, 1, 0, 0, 0, 5751, 5752, 5, 46, 0, 0, 5752, 5753, 5, 41, 0, 0, 5753, 5754, 5, 2, 0, 0, 5754, 5755, 3, 1120, 560, 0, 5755, 5756, 5, 36, 0, 0, 5756, 5757, 3, 1120, 560, 0, 5757, 5758, 5, 3, 0, 0, 5758, 5759, 5, 105, 0, 0, 5759, 5760, 5, 211, 0, 0, 5760, 5761, 3, 626, 313, 0, 5761, 5762, 3, 698, 349, 0, 5762, 5786, 1, 0, 0, 0, 5763, 5764, 5, 46, 0, 0, 5764, 5765, 5, 41, 0, 0, 5765, 5766, 5, 2, 0, 0, 5766, 5767, 3, 1120, 560, 0, 5767, 5768, 5, 36, 0, 0, 5768, 5769, 3, 1120, 560, 0, 5769, 5770, 5, 3, 0, 0, 5770, 5771, 5, 372, 0, 0, 5771, 5772, 5, 211, 0, 0, 5772, 5773, 3, 698, 349, 0, 5773, 5786, 1, 0, 0, 0, 5774, 5775, 5, 46, 0, 0, 5775, 5776, 5, 41, 0, 0, 5776, 5777, 5, 2, 0, 0, 5777, 5778, 3, 1120, 560, 0, 5778, 5779, 5, 36, 0, 0, 5779, 5780, 3, 1120, 560, 0, 5780, 5781, 5, 3, 0, 0, 5781, 5782, 5, 105, 0, 0, 5782, 5783, 5, 393, 0, 0, 5783, 5784, 3, 698, 349, 0, 5784, 5786, 1, 0, 0, 0, 5785, 5751, 1, 0, 0, 0, 5785, 5763, 1, 0, 0, 0, 5785, 5774, 1, 0, 0, 0, 5786, 697, 1, 0, 0, 0, 5787, 5788, 5, 36, 0, 0, 5788, 5793, 5, 223, 0, 0, 5789, 5790, 5, 36, 0, 0, 5790, 5793, 5, 141, 0, 0, 5791, 5793, 1, 0, 0, 0, 5792, 5787, 1, 0, 0, 0, 5792, 5789, 1, 0, 0, 0, 5792, 5791, 1, 0, 0, 0, 5793, 699, 1, 0, 0, 0, 5794, 5795, 5, 191, 0, 0, 5795, 5796, 5, 41, 0, 0, 5796, 5797, 3, 702, 351, 0, 5797, 5798, 5, 2, 0, 0, 5798, 5799, 3, 1120, 560, 0, 5799, 5800, 5, 36, 0, 0, 5800, 5801, 3, 1120, 560, 0, 5801, 5802, 5, 3, 0, 0, 5802, 5803, 3, 108, 54, 0, 5803, 701, 1, 0, 0, 0, 5804, 5805, 5, 220, 0, 0, 5805, 5808, 5, 389, 0, 0, 5806, 5808, 1, 0, 0, 0, 5807, 5804, 1, 0, 0, 0, 5807, 5806, 1, 0, 0, 0, 5808, 703, 1, 0, 0, 0, 5809, 5810, 5, 46, 0, 0, 5810, 5811, 3, 618, 309, 0, 5811, 5812, 5, 443, 0, 0, 5812, 5813, 5, 62, 0, 0, 5813, 5814, 3, 1120, 560, 0, 5814, 5815, 5, 238, 0, 0, 5815, 5816, 3, 1342, 671, 0, 5816, 5817, 5, 2, 0, 0, 5817, 5818, 3, 706, 353, 0, 5818, 5819, 5, 3, 0, 0, 5819, 705, 1, 0, 0, 0, 5820, 5821, 5, 64, 0, 0, 5821, 5822, 5, 461, 0, 0, 5822, 5823, 5, 105, 0, 0, 5823, 5824, 5, 211, 0, 0, 5824, 5825, 3, 626, 313, 0, 5825, 5826, 5, 6, 0, 0, 5826, 5827, 5, 94, 0, 0, 5827, 5828, 5, 461, 0, 0, 5828, 5829, 5, 105, 0, 0, 5829, 5830, 5, 211, 0, 0, 5830, 5831, 3, 626, 313, 0, 5831, 5855, 1, 0, 0, 0, 5832, 5833, 5, 94, 0, 0, 5833, 5834, 5, 461, 0, 0, 5834, 5835, 5, 105, 0, 0, 5835, 5836, 5, 211, 0, 0, 5836, 5837, 3, 626, 313, 0, 5837, 5838, 5, 6, 0, 0, 5838, 5839, 5, 64, 0, 0, 5839, 5840, 5, 461, 0, 0, 5840, 5841, 5, 105, 0, 0, 5841, 5842, 5, 211, 0, 0, 5842, 5843, 3, 626, 313, 0, 5843, 5855, 1, 0, 0, 0, 5844, 5845, 5, 64, 0, 0, 5845, 5846, 5, 461, 0, 0, 5846, 5847, 5, 105, 0, 0, 5847, 5848, 5, 211, 0, 0, 5848, 5855, 3, 626, 313, 0, 5849, 5850, 5, 94, 0, 0, 5850, 5851, 5, 461, 0, 0, 5851, 5852, 5, 105, 0, 0, 5852, 5853, 5, 211, 0, 0, 5853, 5855, 3, 626, 313, 0, 5854, 5820, 1, 0, 0, 0, 5854, 5832, 1, 0, 0, 0, 5854, 5844, 1, 0, 0, 0, 5854, 5849, 1, 0, 0, 0, 5855, 707, 1, 0, 0, 0, 5856, 5857, 5, 191, 0, 0, 5857, 5858, 5, 443, 0, 0, 5858, 5859, 3, 702, 351, 0, 5859, 5860, 5, 62, 0, 0, 5860, 5861, 3, 1120, 560, 0, 5861, 5862, 5, 238, 0, 0, 5862, 5863, 3, 1342, 671, 0, 5863, 5864, 3, 108, 54, 0, 5864, 709, 1, 0, 0, 0, 5865, 5866, 5, 299, 0, 0, 5866, 5867, 3, 712, 356, 0, 5867, 5868, 3, 592, 296, 0, 5868, 5869, 3, 1338, 669, 0, 5869, 5892, 1, 0, 0, 0, 5870, 5871, 5, 299, 0, 0, 5871, 5872, 3, 714, 357, 0, 5872, 5873, 3, 592, 296, 0, 5873, 5874, 3, 1342, 671, 0, 5874, 5892, 1, 0, 0, 0, 5875, 5876, 5, 299, 0, 0, 5876, 5877, 5, 2, 0, 0, 5877, 5878, 3, 716, 358, 0, 5878, 5879, 5, 3, 0, 0, 5879, 5880, 3, 712, 356, 0, 5880, 5881, 3, 592, 296, 0, 5881, 5882, 3, 1338, 669, 0, 5882, 5892, 1, 0, 0, 0, 5883, 5884, 5, 299, 0, 0, 5884, 5885, 5, 2, 0, 0, 5885, 5886, 3, 716, 358, 0, 5886, 5887, 5, 3, 0, 0, 5887, 5888, 3, 714, 357, 0, 5888, 5889, 3, 592, 296, 0, 5889, 5890, 3, 1342, 671, 0, 5890, 5892, 1, 0, 0, 0, 5891, 5865, 1, 0, 0, 0, 5891, 5870, 1, 0, 0, 0, 5891, 5875, 1, 0, 0, 0, 5891, 5883, 1, 0, 0, 0, 5892, 711, 1, 0, 0, 0, 5893, 5894, 7, 18, 0, 0, 5894, 713, 1, 0, 0, 0, 5895, 5896, 7, 28, 0, 0, 5896, 715, 1, 0, 0, 0, 5897, 5902, 3, 718, 359, 0, 5898, 5899, 5, 6, 0, 0, 5899, 5901, 3, 718, 359, 0, 5900, 5898, 1, 0, 0, 0, 5901, 5904, 1, 0, 0, 0, 5902, 5900, 1, 0, 0, 0, 5902, 5903, 1, 0, 0, 0, 5903, 717, 1, 0, 0, 0, 5904, 5902, 1, 0, 0, 0, 5905, 5906, 5, 128, 0, 0, 5906, 719, 1, 0, 0, 0, 5907, 5908, 5, 138, 0, 0, 5908, 5909, 5, 344, 0, 0, 5909, 5910, 3, 1342, 671, 0, 5910, 5911, 5, 326, 0, 0, 5911, 5912, 3, 116, 58, 0, 5912, 5920, 1, 0, 0, 0, 5913, 5914, 5, 138, 0, 0, 5914, 5915, 5, 344, 0, 0, 5915, 5916, 3, 1342, 671, 0, 5916, 5917, 5, 306, 0, 0, 5917, 5918, 3, 116, 58, 0, 5918, 5920, 1, 0, 0, 0, 5919, 5907, 1, 0, 0, 0, 5919, 5913, 1, 0, 0, 0, 5920, 721, 1, 0, 0, 0, 5921, 5922, 5, 138, 0, 0, 5922, 5923, 5, 136, 0, 0, 5923, 5924, 3, 650, 325, 0, 5924, 5925, 5, 302, 0, 0, 5925, 5926, 5, 94, 0, 0, 5926, 5927, 3, 1342, 671, 0, 5927, 6390, 1, 0, 0, 0, 5928, 5929, 5, 138, 0, 0, 5929, 5930, 5, 108, 0, 0, 5930, 5931, 3, 524, 262, 0, 5931, 5932, 5, 302, 0, 0, 5932, 5933, 5, 94, 0, 0, 5933, 5934, 3, 1342, 671, 0, 5934, 6390, 1, 0, 0, 0, 5935, 5936, 5, 138, 0, 0, 5936, 5937, 5, 168, 0, 0, 5937, 5938, 3, 524, 262, 0, 5938, 5939, 5, 302, 0, 0, 5939, 5940, 5, 94, 0, 0, 5940, 5941, 3, 1342, 671, 0, 5941, 6390, 1, 0, 0, 0, 5942, 5943, 5, 138, 0, 0, 5943, 5944, 5, 175, 0, 0, 5944, 5945, 3, 1342, 671, 0, 5945, 5946, 5, 302, 0, 0, 5946, 5947, 5, 94, 0, 0, 5947, 5948, 3, 1342, 671, 0, 5948, 6390, 1, 0, 0, 0, 5949, 5950, 5, 138, 0, 0, 5950, 5951, 5, 189, 0, 0, 5951, 5952, 3, 524, 262, 0, 5952, 5953, 5, 302, 0, 0, 5953, 5954, 5, 94, 0, 0, 5954, 5955, 3, 1342, 671, 0, 5955, 6390, 1, 0, 0, 0, 5956, 5957, 5, 138, 0, 0, 5957, 5958, 5, 189, 0, 0, 5958, 5959, 3, 524, 262, 0, 5959, 5960, 5, 302, 0, 0, 5960, 5961, 5, 45, 0, 0, 5961, 5962, 3, 1342, 671, 0, 5962, 5963, 5, 94, 0, 0, 5963, 5964, 3, 1342, 671, 0, 5964, 6390, 1, 0, 0, 0, 5965, 5966, 5, 138, 0, 0, 5966, 5967, 5, 63, 0, 0, 5967, 5968, 5, 174, 0, 0, 5968, 5969, 5, 374, 0, 0, 5969, 5970, 3, 1342, 671, 0, 5970, 5971, 5, 302, 0, 0, 5971, 5972, 5, 94, 0, 0, 5972, 5973, 3, 1342, 671, 0, 5973, 6390, 1, 0, 0, 0, 5974, 5975, 5, 138, 0, 0, 5975, 5976, 5, 211, 0, 0, 5976, 5977, 3, 626, 313, 0, 5977, 5978, 5, 302, 0, 0, 5978, 5979, 5, 94, 0, 0, 5979, 5980, 3, 1342, 671, 0, 5980, 6390, 1, 0, 0, 0, 5981, 5982, 5, 138, 0, 0, 5982, 5983, 5, 66, 0, 0, 5983, 5984, 3, 1368, 684, 0, 5984, 5985, 5, 302, 0, 0, 5985, 5986, 5, 94, 0, 0, 5986, 5987, 3, 1368, 684, 0, 5987, 6390, 1, 0, 0, 0, 5988, 5989, 5, 138, 0, 0, 5989, 5990, 3, 308, 154, 0, 5990, 5991, 5, 238, 0, 0, 5991, 5992, 3, 1342, 671, 0, 5992, 5993, 5, 302, 0, 0, 5993, 5994, 5, 94, 0, 0, 5994, 5995, 3, 1342, 671, 0, 5995, 6390, 1, 0, 0, 0, 5996, 5997, 5, 138, 0, 0, 5997, 5998, 5, 271, 0, 0, 5998, 5999, 5, 156, 0, 0, 5999, 6000, 3, 524, 262, 0, 6000, 6001, 5, 100, 0, 0, 6001, 6002, 3, 1342, 671, 0, 6002, 6003, 5, 302, 0, 0, 6003, 6004, 5, 94, 0, 0, 6004, 6005, 3, 1342, 671, 0, 6005, 6390, 1, 0, 0, 0, 6006, 6007, 5, 138, 0, 0, 6007, 6008, 5, 271, 0, 0, 6008, 6009, 5, 206, 0, 0, 6009, 6010, 3, 524, 262, 0, 6010, 6011, 5, 100, 0, 0, 6011, 6012, 3, 1342, 671, 0, 6012, 6013, 5, 302, 0, 0, 6013, 6014, 5, 94, 0, 0, 6014, 6015, 3, 1342, 671, 0, 6015, 6390, 1, 0, 0, 0, 6016, 6017, 5, 138, 0, 0, 6017, 6018, 5, 445, 0, 0, 6018, 6019, 3, 1342, 671, 0, 6019, 6020, 5, 80, 0, 0, 6020, 6021, 3, 1338, 669, 0, 6021, 6022, 5, 302, 0, 0, 6022, 6023, 5, 94, 0, 0, 6023, 6024, 3, 1342, 671, 0, 6024, 6390, 1, 0, 0, 0, 6025, 6026, 5, 138, 0, 0, 6026, 6027, 5, 445, 0, 0, 6027, 6028, 5, 220, 0, 0, 6028, 6029, 5, 389, 0, 0, 6029, 6030, 3, 1342, 671, 0, 6030, 6031, 5, 80, 0, 0, 6031, 6032, 3, 1338, 669, 0, 6032, 6033, 5, 302, 0, 0, 6033, 6034, 5, 94, 0, 0, 6034, 6035, 3, 1342, 671, 0, 6035, 6390, 1, 0, 0, 0, 6036, 6037, 5, 138, 0, 0, 6037, 6038, 5, 289, 0, 0, 6038, 6039, 3, 626, 313, 0, 6039, 6040, 5, 302, 0, 0, 6040, 6041, 5, 94, 0, 0, 6041, 6042, 3, 1342, 671, 0, 6042, 6390, 1, 0, 0, 0, 6043, 6044, 5, 138, 0, 0, 6044, 6045, 5, 452, 0, 0, 6045, 6046, 3, 1342, 671, 0, 6046, 6047, 5, 302, 0, 0, 6047, 6048, 5, 94, 0, 0, 6048, 6049, 3, 1342, 671, 0, 6049, 6390, 1, 0, 0, 0, 6050, 6051, 5, 138, 0, 0, 6051, 6052, 5, 442, 0, 0, 6052, 6053, 3, 626, 313, 0, 6053, 6054, 5, 302, 0, 0, 6054, 6055, 5, 94, 0, 0, 6055, 6056, 3, 1342, 671, 0, 6056, 6390, 1, 0, 0, 0, 6057, 6058, 5, 138, 0, 0, 6058, 6059, 5, 316, 0, 0, 6059, 6060, 3, 1342, 671, 0, 6060, 6061, 5, 302, 0, 0, 6061, 6062, 5, 94, 0, 0, 6062, 6063, 3, 1342, 671, 0, 6063, 6390, 1, 0, 0, 0, 6064, 6065, 5, 138, 0, 0, 6065, 6066, 5, 324, 0, 0, 6066, 6067, 3, 1342, 671, 0, 6067, 6068, 5, 302, 0, 0, 6068, 6069, 5, 94, 0, 0, 6069, 6070, 3, 1342, 671, 0, 6070, 6390, 1, 0, 0, 0, 6071, 6072, 5, 138, 0, 0, 6072, 6073, 5, 451, 0, 0, 6073, 6074, 3, 1342, 671, 0, 6074, 6075, 5, 302, 0, 0, 6075, 6076, 5, 94, 0, 0, 6076, 6077, 3, 1342, 671, 0, 6077, 6390, 1, 0, 0, 0, 6078, 6079, 5, 138, 0, 0, 6079, 6080, 5, 92, 0, 0, 6080, 6081, 3, 1076, 538, 0, 6081, 6082, 5, 302, 0, 0, 6082, 6083, 5, 94, 0, 0, 6083, 6084, 3, 1342, 671, 0, 6084, 6390, 1, 0, 0, 0, 6085, 6086, 5, 138, 0, 0, 6086, 6087, 5, 92, 0, 0, 6087, 6088, 5, 220, 0, 0, 6088, 6089, 5, 389, 0, 0, 6089, 6090, 3, 1076, 538, 0, 6090, 6091, 5, 302, 0, 0, 6091, 6092, 5, 94, 0, 0, 6092, 6093, 3, 1342, 671, 0, 6093, 6390, 1, 0, 0, 0, 6094, 6095, 5, 138, 0, 0, 6095, 6096, 5, 321, 0, 0, 6096, 6097, 3, 1338, 669, 0, 6097, 6098, 5, 302, 0, 0, 6098, 6099, 5, 94, 0, 0, 6099, 6100, 3, 1342, 671, 0, 6100, 6390, 1, 0, 0, 0, 6101, 6102, 5, 138, 0, 0, 6102, 6103, 5, 321, 0, 0, 6103, 6104, 5, 220, 0, 0, 6104, 6105, 5, 389, 0, 0, 6105, 6106, 3, 1338, 669, 0, 6106, 6107, 5, 302, 0, 0, 6107, 6108, 5, 94, 0, 0, 6108, 6109, 3, 1342, 671, 0, 6109, 6390, 1, 0, 0, 0, 6110, 6111, 5, 138, 0, 0, 6111, 6112, 5, 369, 0, 0, 6112, 6113, 3, 1338, 669, 0, 6113, 6114, 5, 302, 0, 0, 6114, 6115, 5, 94, 0, 0, 6115, 6116, 3, 1342, 671, 0, 6116, 6390, 1, 0, 0, 0, 6117, 6118, 5, 138, 0, 0, 6118, 6119, 5, 369, 0, 0, 6119, 6120, 5, 220, 0, 0, 6120, 6121, 5, 389, 0, 0, 6121, 6122, 3, 1338, 669, 0, 6122, 6123, 5, 302, 0, 0, 6123, 6124, 5, 94, 0, 0, 6124, 6125, 3, 1342, 671, 0, 6125, 6390, 1, 0, 0, 0, 6126, 6127, 5, 138, 0, 0, 6127, 6128, 5, 251, 0, 0, 6128, 6129, 5, 369, 0, 0, 6129, 6130, 3, 1338, 669, 0, 6130, 6131, 5, 302, 0, 0, 6131, 6132, 5, 94, 0, 0, 6132, 6133, 3, 1342, 671, 0, 6133, 6390, 1, 0, 0, 0, 6134, 6135, 5, 138, 0, 0, 6135, 6136, 5, 251, 0, 0, 6136, 6137, 5, 369, 0, 0, 6137, 6138, 5, 220, 0, 0, 6138, 6139, 5, 389, 0, 0, 6139, 6140, 3, 1338, 669, 0, 6140, 6141, 5, 302, 0, 0, 6141, 6142, 5, 94, 0, 0, 6142, 6143, 3, 1342, 671, 0, 6143, 6390, 1, 0, 0, 0, 6144, 6145, 5, 138, 0, 0, 6145, 6146, 5, 226, 0, 0, 6146, 6147, 3, 1338, 669, 0, 6147, 6148, 5, 302, 0, 0, 6148, 6149, 5, 94, 0, 0, 6149, 6150, 3, 1342, 671, 0, 6150, 6390, 1, 0, 0, 0, 6151, 6152, 5, 138, 0, 0, 6152, 6153, 5, 226, 0, 0, 6153, 6154, 5, 220, 0, 0, 6154, 6155, 5, 389, 0, 0, 6155, 6156, 3, 1338, 669, 0, 6156, 6157, 5, 302, 0, 0, 6157, 6158, 5, 94, 0, 0, 6158, 6159, 3, 1342, 671, 0, 6159, 6390, 1, 0, 0, 0, 6160, 6161, 5, 138, 0, 0, 6161, 6162, 5, 63, 0, 0, 6162, 6163, 5, 92, 0, 0, 6163, 6164, 3, 1076, 538, 0, 6164, 6165, 5, 302, 0, 0, 6165, 6166, 5, 94, 0, 0, 6166, 6167, 3, 1342, 671, 0, 6167, 6390, 1, 0, 0, 0, 6168, 6169, 5, 138, 0, 0, 6169, 6170, 5, 63, 0, 0, 6170, 6171, 5, 92, 0, 0, 6171, 6172, 5, 220, 0, 0, 6172, 6173, 5, 389, 0, 0, 6173, 6174, 3, 1076, 538, 0, 6174, 6175, 5, 302, 0, 0, 6175, 6176, 5, 94, 0, 0, 6176, 6177, 3, 1342, 671, 0, 6177, 6390, 1, 0, 0, 0, 6178, 6179, 5, 138, 0, 0, 6179, 6180, 5, 92, 0, 0, 6180, 6181, 3, 1076, 538, 0, 6181, 6182, 5, 302, 0, 0, 6182, 6183, 3, 724, 362, 0, 6183, 6184, 3, 1342, 671, 0, 6184, 6185, 5, 94, 0, 0, 6185, 6186, 3, 1342, 671, 0, 6186, 6390, 1, 0, 0, 0, 6187, 6188, 5, 138, 0, 0, 6188, 6189, 5, 92, 0, 0, 6189, 6190, 5, 220, 0, 0, 6190, 6191, 5, 389, 0, 0, 6191, 6192, 3, 1076, 538, 0, 6192, 6193, 5, 302, 0, 0, 6193, 6194, 3, 724, 362, 0, 6194, 6195, 3, 1342, 671, 0, 6195, 6196, 5, 94, 0, 0, 6196, 6197, 3, 1342, 671, 0, 6197, 6390, 1, 0, 0, 0, 6198, 6199, 5, 138, 0, 0, 6199, 6200, 5, 369, 0, 0, 6200, 6201, 3, 1338, 669, 0, 6201, 6202, 5, 302, 0, 0, 6202, 6203, 3, 724, 362, 0, 6203, 6204, 3, 1342, 671, 0, 6204, 6205, 5, 94, 0, 0, 6205, 6206, 3, 1342, 671, 0, 6206, 6390, 1, 0, 0, 0, 6207, 6208, 5, 138, 0, 0, 6208, 6209, 5, 369, 0, 0, 6209, 6210, 5, 220, 0, 0, 6210, 6211, 5, 389, 0, 0, 6211, 6212, 3, 1338, 669, 0, 6212, 6213, 5, 302, 0, 0, 6213, 6214, 3, 724, 362, 0, 6214, 6215, 3, 1342, 671, 0, 6215, 6216, 5, 94, 0, 0, 6216, 6217, 3, 1342, 671, 0, 6217, 6390, 1, 0, 0, 0, 6218, 6219, 5, 138, 0, 0, 6219, 6220, 5, 251, 0, 0, 6220, 6221, 5, 369, 0, 0, 6221, 6222, 3, 1338, 669, 0, 6222, 6223, 5, 302, 0, 0, 6223, 6224, 3, 724, 362, 0, 6224, 6225, 3, 1342, 671, 0, 6225, 6226, 5, 94, 0, 0, 6226, 6227, 3, 1342, 671, 0, 6227, 6390, 1, 0, 0, 0, 6228, 6229, 5, 138, 0, 0, 6229, 6230, 5, 251, 0, 0, 6230, 6231, 5, 369, 0, 0, 6231, 6232, 5, 220, 0, 0, 6232, 6233, 5, 389, 0, 0, 6233, 6234, 3, 1338, 669, 0, 6234, 6235, 5, 302, 0, 0, 6235, 6236, 3, 724, 362, 0, 6236, 6237, 3, 1342, 671, 0, 6237, 6238, 5, 94, 0, 0, 6238, 6239, 3, 1342, 671, 0, 6239, 6390, 1, 0, 0, 0, 6240, 6241, 5, 138, 0, 0, 6241, 6242, 5, 92, 0, 0, 6242, 6243, 3, 1076, 538, 0, 6243, 6244, 5, 302, 0, 0, 6244, 6245, 5, 45, 0, 0, 6245, 6246, 3, 1342, 671, 0, 6246, 6247, 5, 94, 0, 0, 6247, 6248, 3, 1342, 671, 0, 6248, 6390, 1, 0, 0, 0, 6249, 6250, 5, 138, 0, 0, 6250, 6251, 5, 92, 0, 0, 6251, 6252, 5, 220, 0, 0, 6252, 6253, 5, 389, 0, 0, 6253, 6254, 3, 1076, 538, 0, 6254, 6255, 5, 302, 0, 0, 6255, 6256, 5, 45, 0, 0, 6256, 6257, 3, 1342, 671, 0, 6257, 6258, 5, 94, 0, 0, 6258, 6259, 3, 1342, 671, 0, 6259, 6390, 1, 0, 0, 0, 6260, 6261, 5, 138, 0, 0, 6261, 6262, 5, 63, 0, 0, 6262, 6263, 5, 92, 0, 0, 6263, 6264, 3, 1076, 538, 0, 6264, 6265, 5, 302, 0, 0, 6265, 6266, 3, 724, 362, 0, 6266, 6267, 3, 1342, 671, 0, 6267, 6268, 5, 94, 0, 0, 6268, 6269, 3, 1342, 671, 0, 6269, 6390, 1, 0, 0, 0, 6270, 6271, 5, 138, 0, 0, 6271, 6272, 5, 63, 0, 0, 6272, 6273, 5, 92, 0, 0, 6273, 6274, 5, 220, 0, 0, 6274, 6275, 5, 389, 0, 0, 6275, 6276, 3, 1076, 538, 0, 6276, 6277, 5, 302, 0, 0, 6277, 6278, 3, 724, 362, 0, 6278, 6279, 3, 1342, 671, 0, 6279, 6280, 5, 94, 0, 0, 6280, 6281, 3, 1342, 671, 0, 6281, 6390, 1, 0, 0, 0, 6282, 6283, 5, 138, 0, 0, 6283, 6284, 5, 314, 0, 0, 6284, 6285, 3, 1342, 671, 0, 6285, 6286, 5, 80, 0, 0, 6286, 6287, 3, 1338, 669, 0, 6287, 6288, 5, 302, 0, 0, 6288, 6289, 5, 94, 0, 0, 6289, 6290, 3, 1342, 671, 0, 6290, 6390, 1, 0, 0, 0, 6291, 6292, 5, 138, 0, 0, 6292, 6293, 5, 350, 0, 0, 6293, 6294, 3, 1342, 671, 0, 6294, 6295, 5, 80, 0, 0, 6295, 6296, 3, 1338, 669, 0, 6296, 6297, 5, 302, 0, 0, 6297, 6298, 5, 94, 0, 0, 6298, 6299, 3, 1342, 671, 0, 6299, 6390, 1, 0, 0, 0, 6300, 6301, 5, 138, 0, 0, 6301, 6302, 5, 198, 0, 0, 6302, 6303, 5, 350, 0, 0, 6303, 6304, 3, 1342, 671, 0, 6304, 6305, 5, 302, 0, 0, 6305, 6306, 5, 94, 0, 0, 6306, 6307, 3, 1342, 671, 0, 6307, 6390, 1, 0, 0, 0, 6308, 6309, 5, 138, 0, 0, 6309, 6310, 5, 311, 0, 0, 6310, 6311, 3, 1368, 684, 0, 6311, 6312, 5, 302, 0, 0, 6312, 6313, 5, 94, 0, 0, 6313, 6314, 3, 1368, 684, 0, 6314, 6390, 1, 0, 0, 0, 6315, 6316, 5, 138, 0, 0, 6316, 6317, 5, 99, 0, 0, 6317, 6318, 3, 1368, 684, 0, 6318, 6319, 5, 302, 0, 0, 6319, 6320, 5, 94, 0, 0, 6320, 6321, 3, 1368, 684, 0, 6321, 6390, 1, 0, 0, 0, 6322, 6323, 5, 138, 0, 0, 6323, 6324, 5, 344, 0, 0, 6324, 6325, 3, 1342, 671, 0, 6325, 6326, 5, 302, 0, 0, 6326, 6327, 5, 94, 0, 0, 6327, 6328, 3, 1342, 671, 0, 6328, 6390, 1, 0, 0, 0, 6329, 6330, 5, 138, 0, 0, 6330, 6331, 5, 335, 0, 0, 6331, 6332, 3, 524, 262, 0, 6332, 6333, 5, 302, 0, 0, 6333, 6334, 5, 94, 0, 0, 6334, 6335, 3, 1342, 671, 0, 6335, 6390, 1, 0, 0, 0, 6336, 6337, 5, 138, 0, 0, 6337, 6338, 5, 348, 0, 0, 6338, 6339, 5, 318, 0, 0, 6339, 6340, 5, 276, 0, 0, 6340, 6341, 3, 524, 262, 0, 6341, 6342, 5, 302, 0, 0, 6342, 6343, 5, 94, 0, 0, 6343, 6344, 3, 1342, 671, 0, 6344, 6390, 1, 0, 0, 0, 6345, 6346, 5, 138, 0, 0, 6346, 6347, 5, 348, 0, 0, 6347, 6348, 5, 318, 0, 0, 6348, 6349, 5, 185, 0, 0, 6349, 6350, 3, 524, 262, 0, 6350, 6351, 5, 302, 0, 0, 6351, 6352, 5, 94, 0, 0, 6352, 6353, 3, 1342, 671, 0, 6353, 6390, 1, 0, 0, 0, 6354, 6355, 5, 138, 0, 0, 6355, 6356, 5, 348, 0, 0, 6356, 6357, 5, 318, 0, 0, 6357, 6358, 5, 346, 0, 0, 6358, 6359, 3, 524, 262, 0, 6359, 6360, 5, 302, 0, 0, 6360, 6361, 5, 94, 0, 0, 6361, 6362, 3, 1342, 671, 0, 6362, 6390, 1, 0, 0, 0, 6363, 6364, 5, 138, 0, 0, 6364, 6365, 5, 348, 0, 0, 6365, 6366, 5, 318, 0, 0, 6366, 6367, 5, 163, 0, 0, 6367, 6368, 3, 524, 262, 0, 6368, 6369, 5, 302, 0, 0, 6369, 6370, 5, 94, 0, 0, 6370, 6371, 3, 1342, 671, 0, 6371, 6390, 1, 0, 0, 0, 6372, 6373, 5, 138, 0, 0, 6373, 6374, 5, 353, 0, 0, 6374, 6375, 3, 524, 262, 0, 6375, 6376, 5, 302, 0, 0, 6376, 6377, 5, 94, 0, 0, 6377, 6378, 3, 1342, 671, 0, 6378, 6390, 1, 0, 0, 0, 6379, 6380, 5, 138, 0, 0, 6380, 6381, 5, 353, 0, 0, 6381, 6382, 3, 524, 262, 0, 6382, 6383, 5, 302, 0, 0, 6383, 6384, 5, 143, 0, 0, 6384, 6385, 3, 1342, 671, 0, 6385, 6386, 5, 94, 0, 0, 6386, 6387, 3, 1342, 671, 0, 6387, 6388, 3, 108, 54, 0, 6388, 6390, 1, 0, 0, 0, 6389, 5921, 1, 0, 0, 0, 6389, 5928, 1, 0, 0, 0, 6389, 5935, 1, 0, 0, 0, 6389, 5942, 1, 0, 0, 0, 6389, 5949, 1, 0, 0, 0, 6389, 5956, 1, 0, 0, 0, 6389, 5965, 1, 0, 0, 0, 6389, 5974, 1, 0, 0, 0, 6389, 5981, 1, 0, 0, 0, 6389, 5988, 1, 0, 0, 0, 6389, 5996, 1, 0, 0, 0, 6389, 6006, 1, 0, 0, 0, 6389, 6016, 1, 0, 0, 0, 6389, 6025, 1, 0, 0, 0, 6389, 6036, 1, 0, 0, 0, 6389, 6043, 1, 0, 0, 0, 6389, 6050, 1, 0, 0, 0, 6389, 6057, 1, 0, 0, 0, 6389, 6064, 1, 0, 0, 0, 6389, 6071, 1, 0, 0, 0, 6389, 6078, 1, 0, 0, 0, 6389, 6085, 1, 0, 0, 0, 6389, 6094, 1, 0, 0, 0, 6389, 6101, 1, 0, 0, 0, 6389, 6110, 1, 0, 0, 0, 6389, 6117, 1, 0, 0, 0, 6389, 6126, 1, 0, 0, 0, 6389, 6134, 1, 0, 0, 0, 6389, 6144, 1, 0, 0, 0, 6389, 6151, 1, 0, 0, 0, 6389, 6160, 1, 0, 0, 0, 6389, 6168, 1, 0, 0, 0, 6389, 6178, 1, 0, 0, 0, 6389, 6187, 1, 0, 0, 0, 6389, 6198, 1, 0, 0, 0, 6389, 6207, 1, 0, 0, 0, 6389, 6218, 1, 0, 0, 0, 6389, 6228, 1, 0, 0, 0, 6389, 6240, 1, 0, 0, 0, 6389, 6249, 1, 0, 0, 0, 6389, 6260, 1, 0, 0, 0, 6389, 6270, 1, 0, 0, 0, 6389, 6282, 1, 0, 0, 0, 6389, 6291, 1, 0, 0, 0, 6389, 6300, 1, 0, 0, 0, 6389, 6308, 1, 0, 0, 0, 6389, 6315, 1, 0, 0, 0, 6389, 6322, 1, 0, 0, 0, 6389, 6329, 1, 0, 0, 0, 6389, 6336, 1, 0, 0, 0, 6389, 6345, 1, 0, 0, 0, 6389, 6354, 1, 0, 0, 0, 6389, 6363, 1, 0, 0, 0, 6389, 6372, 1, 0, 0, 0, 6389, 6379, 1, 0, 0, 0, 6390, 723, 1, 0, 0, 0, 6391, 6394, 5, 44, 0, 0, 6392, 6394, 1, 0, 0, 0, 6393, 6391, 1, 0, 0, 0, 6393, 6392, 1, 0, 0, 0, 6394, 725, 1, 0, 0, 0, 6395, 6396, 5, 326, 0, 0, 6396, 6399, 5, 174, 0, 0, 6397, 6399, 1, 0, 0, 0, 6398, 6395, 1, 0, 0, 0, 6398, 6397, 1, 0, 0, 0, 6399, 727, 1, 0, 0, 0, 6400, 6401, 5, 138, 0, 0, 6401, 6402, 5, 211, 0, 0, 6402, 6403, 3, 626, 313, 0, 6403, 6404, 3, 730, 365, 0, 6404, 6405, 5, 462, 0, 0, 6405, 6406, 5, 80, 0, 0, 6406, 6407, 5, 204, 0, 0, 6407, 6408, 3, 1342, 671, 0, 6408, 6458, 1, 0, 0, 0, 6409, 6410, 5, 138, 0, 0, 6410, 6411, 5, 289, 0, 0, 6411, 6412, 3, 626, 313, 0, 6412, 6413, 3, 730, 365, 0, 6413, 6414, 5, 462, 0, 0, 6414, 6415, 5, 80, 0, 0, 6415, 6416, 5, 204, 0, 0, 6416, 6417, 3, 1342, 671, 0, 6417, 6458, 1, 0, 0, 0, 6418, 6419, 5, 138, 0, 0, 6419, 6420, 5, 442, 0, 0, 6420, 6421, 3, 626, 313, 0, 6421, 6422, 3, 730, 365, 0, 6422, 6423, 5, 462, 0, 0, 6423, 6424, 5, 80, 0, 0, 6424, 6425, 5, 204, 0, 0, 6425, 6426, 3, 1342, 671, 0, 6426, 6458, 1, 0, 0, 0, 6427, 6428, 5, 138, 0, 0, 6428, 6429, 5, 350, 0, 0, 6429, 6430, 3, 1342, 671, 0, 6430, 6431, 5, 80, 0, 0, 6431, 6432, 3, 1338, 669, 0, 6432, 6433, 3, 730, 365, 0, 6433, 6434, 5, 462, 0, 0, 6434, 6435, 5, 80, 0, 0, 6435, 6436, 5, 204, 0, 0, 6436, 6437, 3, 1342, 671, 0, 6437, 6458, 1, 0, 0, 0, 6438, 6439, 5, 138, 0, 0, 6439, 6440, 5, 251, 0, 0, 6440, 6441, 5, 369, 0, 0, 6441, 6442, 3, 1338, 669, 0, 6442, 6443, 3, 730, 365, 0, 6443, 6444, 5, 462, 0, 0, 6444, 6445, 5, 80, 0, 0, 6445, 6446, 5, 204, 0, 0, 6446, 6447, 3, 1342, 671, 0, 6447, 6458, 1, 0, 0, 0, 6448, 6449, 5, 138, 0, 0, 6449, 6450, 5, 226, 0, 0, 6450, 6451, 3, 1338, 669, 0, 6451, 6452, 3, 730, 365, 0, 6452, 6453, 5, 462, 0, 0, 6453, 6454, 5, 80, 0, 0, 6454, 6455, 5, 204, 0, 0, 6455, 6456, 3, 1342, 671, 0, 6456, 6458, 1, 0, 0, 0, 6457, 6400, 1, 0, 0, 0, 6457, 6409, 1, 0, 0, 0, 6457, 6418, 1, 0, 0, 0, 6457, 6427, 1, 0, 0, 0, 6457, 6438, 1, 0, 0, 0, 6457, 6448, 1, 0, 0, 0, 6458, 729, 1, 0, 0, 0, 6459, 6462, 5, 262, 0, 0, 6460, 6462, 1, 0, 0, 0, 6461, 6459, 1, 0, 0, 0, 6461, 6460, 1, 0, 0, 0, 6462, 731, 1, 0, 0, 0, 6463, 6464, 5, 138, 0, 0, 6464, 6465, 5, 136, 0, 0, 6465, 6466, 3, 650, 325, 0, 6466, 6467, 5, 326, 0, 0, 6467, 6468, 5, 316, 0, 0, 6468, 6469, 3, 1342, 671, 0, 6469, 6681, 1, 0, 0, 0, 6470, 6471, 5, 138, 0, 0, 6471, 6472, 5, 108, 0, 0, 6472, 6473, 3, 524, 262, 0, 6473, 6474, 5, 326, 0, 0, 6474, 6475, 5, 316, 0, 0, 6475, 6476, 3, 1342, 671, 0, 6476, 6681, 1, 0, 0, 0, 6477, 6478, 5, 138, 0, 0, 6478, 6479, 5, 168, 0, 0, 6479, 6480, 3, 524, 262, 0, 6480, 6481, 5, 326, 0, 0, 6481, 6482, 5, 316, 0, 0, 6482, 6483, 3, 1342, 671, 0, 6483, 6681, 1, 0, 0, 0, 6484, 6485, 5, 138, 0, 0, 6485, 6486, 5, 189, 0, 0, 6486, 6487, 3, 524, 262, 0, 6487, 6488, 5, 326, 0, 0, 6488, 6489, 5, 316, 0, 0, 6489, 6490, 3, 1342, 671, 0, 6490, 6681, 1, 0, 0, 0, 6491, 6492, 5, 138, 0, 0, 6492, 6493, 5, 204, 0, 0, 6493, 6494, 3, 1342, 671, 0, 6494, 6495, 5, 326, 0, 0, 6495, 6496, 5, 316, 0, 0, 6496, 6497, 3, 1342, 671, 0, 6497, 6681, 1, 0, 0, 0, 6498, 6499, 5, 138, 0, 0, 6499, 6500, 5, 211, 0, 0, 6500, 6501, 3, 626, 313, 0, 6501, 6502, 5, 326, 0, 0, 6502, 6503, 5, 316, 0, 0, 6503, 6504, 3, 1342, 671, 0, 6504, 6681, 1, 0, 0, 0, 6505, 6506, 5, 138, 0, 0, 6506, 6507, 5, 271, 0, 0, 6507, 6508, 3, 688, 344, 0, 6508, 6509, 5, 326, 0, 0, 6509, 6510, 5, 316, 0, 0, 6510, 6511, 3, 1342, 671, 0, 6511, 6681, 1, 0, 0, 0, 6512, 6513, 5, 138, 0, 0, 6513, 6514, 5, 271, 0, 0, 6514, 6515, 5, 156, 0, 0, 6515, 6516, 3, 524, 262, 0, 6516, 6517, 5, 100, 0, 0, 6517, 6518, 3, 1342, 671, 0, 6518, 6519, 5, 326, 0, 0, 6519, 6520, 5, 316, 0, 0, 6520, 6521, 3, 1342, 671, 0, 6521, 6681, 1, 0, 0, 0, 6522, 6523, 5, 138, 0, 0, 6523, 6524, 5, 271, 0, 0, 6524, 6525, 5, 206, 0, 0, 6525, 6526, 3, 524, 262, 0, 6526, 6527, 5, 100, 0, 0, 6527, 6528, 3, 1342, 671, 0, 6528, 6529, 5, 326, 0, 0, 6529, 6530, 5, 316, 0, 0, 6530, 6531, 3, 1342, 671, 0, 6531, 6681, 1, 0, 0, 0, 6532, 6533, 5, 138, 0, 0, 6533, 6534, 5, 289, 0, 0, 6534, 6535, 3, 626, 313, 0, 6535, 6536, 5, 326, 0, 0, 6536, 6537, 5, 316, 0, 0, 6537, 6538, 3, 1342, 671, 0, 6538, 6681, 1, 0, 0, 0, 6539, 6540, 5, 138, 0, 0, 6540, 6541, 5, 442, 0, 0, 6541, 6542, 3, 626, 313, 0, 6542, 6543, 5, 326, 0, 0, 6543, 6544, 5, 316, 0, 0, 6544, 6545, 3, 1342, 671, 0, 6545, 6681, 1, 0, 0, 0, 6546, 6547, 5, 138, 0, 0, 6547, 6548, 5, 92, 0, 0, 6548, 6549, 3, 1076, 538, 0, 6549, 6550, 5, 326, 0, 0, 6550, 6551, 5, 316, 0, 0, 6551, 6552, 3, 1342, 671, 0, 6552, 6681, 1, 0, 0, 0, 6553, 6554, 5, 138, 0, 0, 6554, 6555, 5, 92, 0, 0, 6555, 6556, 5, 220, 0, 0, 6556, 6557, 5, 389, 0, 0, 6557, 6558, 3, 1076, 538, 0, 6558, 6559, 5, 326, 0, 0, 6559, 6560, 5, 316, 0, 0, 6560, 6561, 3, 1342, 671, 0, 6561, 6681, 1, 0, 0, 0, 6562, 6563, 5, 138, 0, 0, 6563, 6564, 5, 335, 0, 0, 6564, 6565, 3, 524, 262, 0, 6565, 6566, 5, 326, 0, 0, 6566, 6567, 5, 316, 0, 0, 6567, 6568, 3, 1342, 671, 0, 6568, 6681, 1, 0, 0, 0, 6569, 6570, 5, 138, 0, 0, 6570, 6571, 5, 348, 0, 0, 6571, 6572, 5, 318, 0, 0, 6572, 6573, 5, 276, 0, 0, 6573, 6574, 3, 524, 262, 0, 6574, 6575, 5, 326, 0, 0, 6575, 6576, 5, 316, 0, 0, 6576, 6577, 3, 1342, 671, 0, 6577, 6681, 1, 0, 0, 0, 6578, 6579, 5, 138, 0, 0, 6579, 6580, 5, 348, 0, 0, 6580, 6581, 5, 318, 0, 0, 6581, 6582, 5, 185, 0, 0, 6582, 6583, 3, 524, 262, 0, 6583, 6584, 5, 326, 0, 0, 6584, 6585, 5, 316, 0, 0, 6585, 6586, 3, 1342, 671, 0, 6586, 6681, 1, 0, 0, 0, 6587, 6588, 5, 138, 0, 0, 6588, 6589, 5, 348, 0, 0, 6589, 6590, 5, 318, 0, 0, 6590, 6591, 5, 346, 0, 0, 6591, 6592, 3, 524, 262, 0, 6592, 6593, 5, 326, 0, 0, 6593, 6594, 5, 316, 0, 0, 6594, 6595, 3, 1342, 671, 0, 6595, 6681, 1, 0, 0, 0, 6596, 6597, 5, 138, 0, 0, 6597, 6598, 5, 348, 0, 0, 6598, 6599, 5, 318, 0, 0, 6599, 6600, 5, 163, 0, 0, 6600, 6601, 3, 524, 262, 0, 6601, 6602, 5, 326, 0, 0, 6602, 6603, 5, 316, 0, 0, 6603, 6604, 3, 1342, 671, 0, 6604, 6681, 1, 0, 0, 0, 6605, 6606, 5, 138, 0, 0, 6606, 6607, 5, 321, 0, 0, 6607, 6608, 3, 1338, 669, 0, 6608, 6609, 5, 326, 0, 0, 6609, 6610, 5, 316, 0, 0, 6610, 6611, 3, 1342, 671, 0, 6611, 6681, 1, 0, 0, 0, 6612, 6613, 5, 138, 0, 0, 6613, 6614, 5, 321, 0, 0, 6614, 6615, 5, 220, 0, 0, 6615, 6616, 5, 389, 0, 0, 6616, 6617, 3, 1338, 669, 0, 6617, 6618, 5, 326, 0, 0, 6618, 6619, 5, 316, 0, 0, 6619, 6620, 3, 1342, 671, 0, 6620, 6681, 1, 0, 0, 0, 6621, 6622, 5, 138, 0, 0, 6622, 6623, 5, 369, 0, 0, 6623, 6624, 3, 1338, 669, 0, 6624, 6625, 5, 326, 0, 0, 6625, 6626, 5, 316, 0, 0, 6626, 6627, 3, 1342, 671, 0, 6627, 6681, 1, 0, 0, 0, 6628, 6629, 5, 138, 0, 0, 6629, 6630, 5, 369, 0, 0, 6630, 6631, 5, 220, 0, 0, 6631, 6632, 5, 389, 0, 0, 6632, 6633, 3, 1338, 669, 0, 6633, 6634, 5, 326, 0, 0, 6634, 6635, 5, 316, 0, 0, 6635, 6636, 3, 1342, 671, 0, 6636, 6681, 1, 0, 0, 0, 6637, 6638, 5, 138, 0, 0, 6638, 6639, 5, 251, 0, 0, 6639, 6640, 5, 369, 0, 0, 6640, 6641, 3, 1338, 669, 0, 6641, 6642, 5, 326, 0, 0, 6642, 6643, 5, 316, 0, 0, 6643, 6644, 3, 1342, 671, 0, 6644, 6681, 1, 0, 0, 0, 6645, 6646, 5, 138, 0, 0, 6646, 6647, 5, 251, 0, 0, 6647, 6648, 5, 369, 0, 0, 6648, 6649, 5, 220, 0, 0, 6649, 6650, 5, 389, 0, 0, 6650, 6651, 3, 1338, 669, 0, 6651, 6652, 5, 326, 0, 0, 6652, 6653, 5, 316, 0, 0, 6653, 6654, 3, 1342, 671, 0, 6654, 6681, 1, 0, 0, 0, 6655, 6656, 5, 138, 0, 0, 6656, 6657, 5, 63, 0, 0, 6657, 6658, 5, 92, 0, 0, 6658, 6659, 3, 1076, 538, 0, 6659, 6660, 5, 326, 0, 0, 6660, 6661, 5, 316, 0, 0, 6661, 6662, 3, 1342, 671, 0, 6662, 6681, 1, 0, 0, 0, 6663, 6664, 5, 138, 0, 0, 6664, 6665, 5, 63, 0, 0, 6665, 6666, 5, 92, 0, 0, 6666, 6667, 5, 220, 0, 0, 6667, 6668, 5, 389, 0, 0, 6668, 6669, 3, 1076, 538, 0, 6669, 6670, 5, 326, 0, 0, 6670, 6671, 5, 316, 0, 0, 6671, 6672, 3, 1342, 671, 0, 6672, 6681, 1, 0, 0, 0, 6673, 6674, 5, 138, 0, 0, 6674, 6675, 5, 353, 0, 0, 6675, 6676, 3, 524, 262, 0, 6676, 6677, 5, 326, 0, 0, 6677, 6678, 5, 316, 0, 0, 6678, 6679, 3, 1342, 671, 0, 6679, 6681, 1, 0, 0, 0, 6680, 6463, 1, 0, 0, 0, 6680, 6470, 1, 0, 0, 0, 6680, 6477, 1, 0, 0, 0, 6680, 6484, 1, 0, 0, 0, 6680, 6491, 1, 0, 0, 0, 6680, 6498, 1, 0, 0, 0, 6680, 6505, 1, 0, 0, 0, 6680, 6512, 1, 0, 0, 0, 6680, 6522, 1, 0, 0, 0, 6680, 6532, 1, 0, 0, 0, 6680, 6539, 1, 0, 0, 0, 6680, 6546, 1, 0, 0, 0, 6680, 6553, 1, 0, 0, 0, 6680, 6562, 1, 0, 0, 0, 6680, 6569, 1, 0, 0, 0, 6680, 6578, 1, 0, 0, 0, 6680, 6587, 1, 0, 0, 0, 6680, 6596, 1, 0, 0, 0, 6680, 6605, 1, 0, 0, 0, 6680, 6612, 1, 0, 0, 0, 6680, 6621, 1, 0, 0, 0, 6680, 6628, 1, 0, 0, 0, 6680, 6637, 1, 0, 0, 0, 6680, 6645, 1, 0, 0, 0, 6680, 6655, 1, 0, 0, 0, 6680, 6663, 1, 0, 0, 0, 6680, 6673, 1, 0, 0, 0, 6681, 733, 1, 0, 0, 0, 6682, 6683, 5, 138, 0, 0, 6683, 6684, 5, 271, 0, 0, 6684, 6685, 3, 688, 344, 0, 6685, 6686, 5, 326, 0, 0, 6686, 6687, 5, 2, 0, 0, 6687, 6688, 3, 736, 368, 0, 6688, 6689, 5, 3, 0, 0, 6689, 735, 1, 0, 0, 0, 6690, 6695, 3, 738, 369, 0, 6691, 6692, 5, 6, 0, 0, 6692, 6694, 3, 738, 369, 0, 6693, 6691, 1, 0, 0, 0, 6694, 6697, 1, 0, 0, 0, 6695, 6693, 1, 0, 0, 0, 6695, 6696, 1, 0, 0, 0, 6696, 737, 1, 0, 0, 0, 6697, 6695, 1, 0, 0, 0, 6698, 6699, 3, 1382, 691, 0, 6699, 6700, 5, 10, 0, 0, 6700, 6701, 5, 400, 0, 0, 6701, 6707, 1, 0, 0, 0, 6702, 6703, 3, 1382, 691, 0, 6703, 6704, 5, 10, 0, 0, 6704, 6705, 3, 740, 370, 0, 6705, 6707, 1, 0, 0, 0, 6706, 6698, 1, 0, 0, 0, 6706, 6702, 1, 0, 0, 0, 6707, 739, 1, 0, 0, 0, 6708, 6714, 3, 640, 320, 0, 6709, 6714, 3, 1394, 697, 0, 6710, 6714, 3, 1278, 639, 0, 6711, 6714, 3, 292, 146, 0, 6712, 6714, 3, 1360, 680, 0, 6713, 6708, 1, 0, 0, 0, 6713, 6709, 1, 0, 0, 0, 6713, 6710, 1, 0, 0, 0, 6713, 6711, 1, 0, 0, 0, 6713, 6712, 1, 0, 0, 0, 6714, 741, 1, 0, 0, 0, 6715, 6716, 5, 138, 0, 0, 6716, 6717, 5, 353, 0, 0, 6717, 6718, 3, 524, 262, 0, 6718, 6719, 5, 326, 0, 0, 6719, 6720, 5, 2, 0, 0, 6720, 6721, 3, 736, 368, 0, 6721, 6722, 5, 3, 0, 0, 6722, 743, 1, 0, 0, 0, 6723, 6724, 5, 138, 0, 0, 6724, 6725, 5, 136, 0, 0, 6725, 6726, 3, 650, 325, 0, 6726, 6727, 5, 275, 0, 0, 6727, 6728, 5, 94, 0, 0, 6728, 6729, 3, 1370, 685, 0, 6729, 6907, 1, 0, 0, 0, 6730, 6731, 5, 138, 0, 0, 6731, 6732, 5, 108, 0, 0, 6732, 6733, 3, 524, 262, 0, 6733, 6734, 5, 275, 0, 0, 6734, 6735, 5, 94, 0, 0, 6735, 6736, 3, 1370, 685, 0, 6736, 6907, 1, 0, 0, 0, 6737, 6738, 5, 138, 0, 0, 6738, 6739, 5, 168, 0, 0, 6739, 6740, 3, 524, 262, 0, 6740, 6741, 5, 275, 0, 0, 6741, 6742, 5, 94, 0, 0, 6742, 6743, 3, 1370, 685, 0, 6743, 6907, 1, 0, 0, 0, 6744, 6745, 5, 138, 0, 0, 6745, 6746, 5, 175, 0, 0, 6746, 6747, 3, 1342, 671, 0, 6747, 6748, 5, 275, 0, 0, 6748, 6749, 5, 94, 0, 0, 6749, 6750, 3, 1370, 685, 0, 6750, 6907, 1, 0, 0, 0, 6751, 6752, 5, 138, 0, 0, 6752, 6753, 5, 189, 0, 0, 6753, 6754, 3, 524, 262, 0, 6754, 6755, 5, 275, 0, 0, 6755, 6756, 5, 94, 0, 0, 6756, 6757, 3, 1370, 685, 0, 6757, 6907, 1, 0, 0, 0, 6758, 6759, 5, 138, 0, 0, 6759, 6760, 5, 211, 0, 0, 6760, 6761, 3, 626, 313, 0, 6761, 6762, 5, 275, 0, 0, 6762, 6763, 5, 94, 0, 0, 6763, 6764, 3, 1370, 685, 0, 6764, 6907, 1, 0, 0, 0, 6765, 6766, 5, 138, 0, 0, 6766, 6767, 3, 308, 154, 0, 6767, 6768, 5, 238, 0, 0, 6768, 6769, 3, 1342, 671, 0, 6769, 6770, 5, 275, 0, 0, 6770, 6771, 5, 94, 0, 0, 6771, 6772, 3, 1370, 685, 0, 6772, 6907, 1, 0, 0, 0, 6773, 6774, 5, 138, 0, 0, 6774, 6775, 5, 239, 0, 0, 6775, 6776, 5, 267, 0, 0, 6776, 6777, 3, 292, 146, 0, 6777, 6778, 5, 275, 0, 0, 6778, 6779, 5, 94, 0, 0, 6779, 6780, 3, 1370, 685, 0, 6780, 6907, 1, 0, 0, 0, 6781, 6782, 5, 138, 0, 0, 6782, 6783, 5, 271, 0, 0, 6783, 6784, 3, 688, 344, 0, 6784, 6785, 5, 275, 0, 0, 6785, 6786, 5, 94, 0, 0, 6786, 6787, 3, 1370, 685, 0, 6787, 6907, 1, 0, 0, 0, 6788, 6789, 5, 138, 0, 0, 6789, 6790, 5, 271, 0, 0, 6790, 6791, 5, 156, 0, 0, 6791, 6792, 3, 524, 262, 0, 6792, 6793, 5, 100, 0, 0, 6793, 6794, 3, 1342, 671, 0, 6794, 6795, 5, 275, 0, 0, 6795, 6796, 5, 94, 0, 0, 6796, 6797, 3, 1370, 685, 0, 6797, 6907, 1, 0, 0, 0, 6798, 6799, 5, 138, 0, 0, 6799, 6800, 5, 271, 0, 0, 6800, 6801, 5, 206, 0, 0, 6801, 6802, 3, 524, 262, 0, 6802, 6803, 5, 100, 0, 0, 6803, 6804, 3, 1342, 671, 0, 6804, 6805, 5, 275, 0, 0, 6805, 6806, 5, 94, 0, 0, 6806, 6807, 3, 1370, 685, 0, 6807, 6907, 1, 0, 0, 0, 6808, 6809, 5, 138, 0, 0, 6809, 6810, 5, 289, 0, 0, 6810, 6811, 3, 626, 313, 0, 6811, 6812, 5, 275, 0, 0, 6812, 6813, 5, 94, 0, 0, 6813, 6814, 3, 1370, 685, 0, 6814, 6907, 1, 0, 0, 0, 6815, 6816, 5, 138, 0, 0, 6816, 6817, 5, 442, 0, 0, 6817, 6818, 3, 626, 313, 0, 6818, 6819, 5, 275, 0, 0, 6819, 6820, 5, 94, 0, 0, 6820, 6821, 3, 1370, 685, 0, 6821, 6907, 1, 0, 0, 0, 6822, 6823, 5, 138, 0, 0, 6823, 6824, 5, 316, 0, 0, 6824, 6825, 3, 1342, 671, 0, 6825, 6826, 5, 275, 0, 0, 6826, 6827, 5, 94, 0, 0, 6827, 6828, 3, 1370, 685, 0, 6828, 6907, 1, 0, 0, 0, 6829, 6830, 5, 138, 0, 0, 6830, 6831, 5, 353, 0, 0, 6831, 6832, 3, 524, 262, 0, 6832, 6833, 5, 275, 0, 0, 6833, 6834, 5, 94, 0, 0, 6834, 6835, 3, 1370, 685, 0, 6835, 6907, 1, 0, 0, 0, 6836, 6837, 5, 138, 0, 0, 6837, 6838, 5, 344, 0, 0, 6838, 6839, 3, 1342, 671, 0, 6839, 6840, 5, 275, 0, 0, 6840, 6841, 5, 94, 0, 0, 6841, 6842, 3, 1370, 685, 0, 6842, 6907, 1, 0, 0, 0, 6843, 6844, 5, 138, 0, 0, 6844, 6845, 5, 335, 0, 0, 6845, 6846, 3, 524, 262, 0, 6846, 6847, 5, 275, 0, 0, 6847, 6848, 5, 94, 0, 0, 6848, 6849, 3, 1370, 685, 0, 6849, 6907, 1, 0, 0, 0, 6850, 6851, 5, 138, 0, 0, 6851, 6852, 5, 348, 0, 0, 6852, 6853, 5, 318, 0, 0, 6853, 6854, 5, 185, 0, 0, 6854, 6855, 3, 524, 262, 0, 6855, 6856, 5, 275, 0, 0, 6856, 6857, 5, 94, 0, 0, 6857, 6858, 3, 1370, 685, 0, 6858, 6907, 1, 0, 0, 0, 6859, 6860, 5, 138, 0, 0, 6860, 6861, 5, 348, 0, 0, 6861, 6862, 5, 318, 0, 0, 6862, 6863, 5, 163, 0, 0, 6863, 6864, 3, 524, 262, 0, 6864, 6865, 5, 275, 0, 0, 6865, 6866, 5, 94, 0, 0, 6866, 6867, 3, 1370, 685, 0, 6867, 6907, 1, 0, 0, 0, 6868, 6869, 5, 138, 0, 0, 6869, 6870, 5, 63, 0, 0, 6870, 6871, 5, 174, 0, 0, 6871, 6872, 5, 374, 0, 0, 6872, 6873, 3, 1342, 671, 0, 6873, 6874, 5, 275, 0, 0, 6874, 6875, 5, 94, 0, 0, 6875, 6876, 3, 1370, 685, 0, 6876, 6907, 1, 0, 0, 0, 6877, 6878, 5, 138, 0, 0, 6878, 6879, 5, 324, 0, 0, 6879, 6880, 3, 1342, 671, 0, 6880, 6881, 5, 275, 0, 0, 6881, 6882, 5, 94, 0, 0, 6882, 6883, 3, 1370, 685, 0, 6883, 6907, 1, 0, 0, 0, 6884, 6885, 5, 138, 0, 0, 6885, 6886, 5, 198, 0, 0, 6886, 6887, 5, 350, 0, 0, 6887, 6888, 3, 1342, 671, 0, 6888, 6889, 5, 275, 0, 0, 6889, 6890, 5, 94, 0, 0, 6890, 6891, 3, 1370, 685, 0, 6891, 6907, 1, 0, 0, 0, 6892, 6893, 5, 138, 0, 0, 6893, 6894, 5, 452, 0, 0, 6894, 6895, 3, 1342, 671, 0, 6895, 6896, 5, 275, 0, 0, 6896, 6897, 5, 94, 0, 0, 6897, 6898, 3, 1370, 685, 0, 6898, 6907, 1, 0, 0, 0, 6899, 6900, 5, 138, 0, 0, 6900, 6901, 5, 451, 0, 0, 6901, 6902, 3, 1342, 671, 0, 6902, 6903, 5, 275, 0, 0, 6903, 6904, 5, 94, 0, 0, 6904, 6905, 3, 1370, 685, 0, 6905, 6907, 1, 0, 0, 0, 6906, 6723, 1, 0, 0, 0, 6906, 6730, 1, 0, 0, 0, 6906, 6737, 1, 0, 0, 0, 6906, 6744, 1, 0, 0, 0, 6906, 6751, 1, 0, 0, 0, 6906, 6758, 1, 0, 0, 0, 6906, 6765, 1, 0, 0, 0, 6906, 6773, 1, 0, 0, 0, 6906, 6781, 1, 0, 0, 0, 6906, 6788, 1, 0, 0, 0, 6906, 6798, 1, 0, 0, 0, 6906, 6808, 1, 0, 0, 0, 6906, 6815, 1, 0, 0, 0, 6906, 6822, 1, 0, 0, 0, 6906, 6829, 1, 0, 0, 0, 6906, 6836, 1, 0, 0, 0, 6906, 6843, 1, 0, 0, 0, 6906, 6850, 1, 0, 0, 0, 6906, 6859, 1, 0, 0, 0, 6906, 6868, 1, 0, 0, 0, 6906, 6877, 1, 0, 0, 0, 6906, 6884, 1, 0, 0, 0, 6906, 6892, 1, 0, 0, 0, 6906, 6899, 1, 0, 0, 0, 6907, 745, 1, 0, 0, 0, 6908, 6909, 5, 46, 0, 0, 6909, 6910, 5, 452, 0, 0, 6910, 6911, 3, 1342, 671, 0, 6911, 6912, 3, 748, 374, 0, 6912, 6913, 3, 664, 332, 0, 6913, 747, 1, 0, 0, 0, 6914, 6917, 3, 750, 375, 0, 6915, 6917, 1, 0, 0, 0, 6916, 6914, 1, 0, 0, 0, 6916, 6915, 1, 0, 0, 0, 6917, 749, 1, 0, 0, 0, 6918, 6919, 5, 62, 0, 0, 6919, 6920, 5, 92, 0, 0, 6920, 6925, 3, 1078, 539, 0, 6921, 6922, 5, 62, 0, 0, 6922, 6923, 5, 30, 0, 0, 6923, 6925, 5, 343, 0, 0, 6924, 6918, 1, 0, 0, 0, 6924, 6921, 1, 0, 0, 0, 6925, 751, 1, 0, 0, 0, 6926, 6927, 5, 138, 0, 0, 6927, 6928, 5, 452, 0, 0, 6928, 6929, 3, 1342, 671, 0, 6929, 6930, 5, 326, 0, 0, 6930, 6931, 3, 460, 230, 0, 6931, 6954, 1, 0, 0, 0, 6932, 6933, 5, 138, 0, 0, 6933, 6934, 5, 452, 0, 0, 6934, 6935, 3, 1342, 671, 0, 6935, 6936, 5, 133, 0, 0, 6936, 6937, 5, 92, 0, 0, 6937, 6938, 3, 1078, 539, 0, 6938, 6954, 1, 0, 0, 0, 6939, 6940, 5, 138, 0, 0, 6940, 6941, 5, 452, 0, 0, 6941, 6942, 3, 1342, 671, 0, 6942, 6943, 5, 326, 0, 0, 6943, 6944, 5, 92, 0, 0, 6944, 6945, 3, 1078, 539, 0, 6945, 6954, 1, 0, 0, 0, 6946, 6947, 5, 138, 0, 0, 6947, 6948, 5, 452, 0, 0, 6948, 6949, 3, 1342, 671, 0, 6949, 6950, 5, 191, 0, 0, 6950, 6951, 5, 92, 0, 0, 6951, 6952, 3, 1078, 539, 0, 6952, 6954, 1, 0, 0, 0, 6953, 6926, 1, 0, 0, 0, 6953, 6932, 1, 0, 0, 0, 6953, 6939, 1, 0, 0, 0, 6953, 6946, 1, 0, 0, 0, 6954, 753, 1, 0, 0, 0, 6955, 6956, 5, 46, 0, 0, 6956, 6957, 5, 451, 0, 0, 6957, 6958, 3, 1342, 671, 0, 6958, 6959, 5, 164, 0, 0, 6959, 6960, 3, 1360, 680, 0, 6960, 6961, 5, 452, 0, 0, 6961, 6962, 3, 756, 378, 0, 6962, 6963, 3, 664, 332, 0, 6963, 755, 1, 0, 0, 0, 6964, 6969, 3, 758, 379, 0, 6965, 6966, 5, 6, 0, 0, 6966, 6968, 3, 758, 379, 0, 6967, 6965, 1, 0, 0, 0, 6968, 6971, 1, 0, 0, 0, 6969, 6967, 1, 0, 0, 0, 6969, 6970, 1, 0, 0, 0, 6970, 757, 1, 0, 0, 0, 6971, 6969, 1, 0, 0, 0, 6972, 6973, 3, 1382, 691, 0, 6973, 759, 1, 0, 0, 0, 6974, 6975, 5, 138, 0, 0, 6975, 6976, 5, 451, 0, 0, 6976, 6977, 3, 1342, 671, 0, 6977, 6978, 5, 326, 0, 0, 6978, 6979, 3, 460, 230, 0, 6979, 7012, 1, 0, 0, 0, 6980, 6981, 5, 138, 0, 0, 6981, 6982, 5, 451, 0, 0, 6982, 6983, 3, 1342, 671, 0, 6983, 6984, 5, 164, 0, 0, 6984, 6985, 3, 1360, 680, 0, 6985, 7012, 1, 0, 0, 0, 6986, 6987, 5, 138, 0, 0, 6987, 6988, 5, 451, 0, 0, 6988, 6989, 3, 1342, 671, 0, 6989, 6990, 5, 298, 0, 0, 6990, 6991, 5, 452, 0, 0, 6991, 6992, 3, 664, 332, 0, 6992, 7012, 1, 0, 0, 0, 6993, 6994, 5, 138, 0, 0, 6994, 6995, 5, 451, 0, 0, 6995, 6996, 3, 1342, 671, 0, 6996, 6997, 5, 326, 0, 0, 6997, 6998, 5, 452, 0, 0, 6998, 6999, 3, 756, 378, 0, 6999, 7000, 3, 664, 332, 0, 7000, 7012, 1, 0, 0, 0, 7001, 7002, 5, 138, 0, 0, 7002, 7003, 5, 451, 0, 0, 7003, 7004, 3, 1342, 671, 0, 7004, 7005, 5, 193, 0, 0, 7005, 7012, 1, 0, 0, 0, 7006, 7007, 5, 138, 0, 0, 7007, 7008, 5, 451, 0, 0, 7008, 7009, 3, 1342, 671, 0, 7009, 7010, 5, 186, 0, 0, 7010, 7012, 1, 0, 0, 0, 7011, 6974, 1, 0, 0, 0, 7011, 6980, 1, 0, 0, 0, 7011, 6986, 1, 0, 0, 0, 7011, 6993, 1, 0, 0, 0, 7011, 7001, 1, 0, 0, 0, 7011, 7006, 1, 0, 0, 0, 7012, 761, 1, 0, 0, 0, 7013, 7014, 5, 191, 0, 0, 7014, 7015, 5, 451, 0, 0, 7015, 7016, 3, 1342, 671, 0, 7016, 7017, 3, 108, 54, 0, 7017, 7026, 1, 0, 0, 0, 7018, 7019, 5, 191, 0, 0, 7019, 7020, 5, 451, 0, 0, 7020, 7021, 5, 220, 0, 0, 7021, 7022, 5, 389, 0, 0, 7022, 7023, 3, 1342, 671, 0, 7023, 7024, 3, 108, 54, 0, 7024, 7026, 1, 0, 0, 0, 7025, 7013, 1, 0, 0, 0, 7025, 7018, 1, 0, 0, 0, 7026, 763, 1, 0, 0, 0, 7027, 7028, 5, 46, 0, 0, 7028, 7029, 3, 618, 309, 0, 7029, 7030, 5, 314, 0, 0, 7030, 7031, 3, 1342, 671, 0, 7031, 7032, 5, 36, 0, 0, 7032, 7033, 5, 80, 0, 0, 7033, 7034, 3, 774, 387, 0, 7034, 7035, 5, 94, 0, 0, 7035, 7036, 3, 1338, 669, 0, 7036, 7037, 3, 1096, 548, 0, 7037, 7038, 5, 57, 0, 0, 7038, 7039, 3, 776, 388, 0, 7039, 7040, 3, 766, 383, 0, 7040, 765, 1, 0, 0, 0, 7041, 7048, 5, 263, 0, 0, 7042, 7048, 3, 770, 385, 0, 7043, 7044, 5, 2, 0, 0, 7044, 7045, 3, 768, 384, 0, 7045, 7046, 5, 3, 0, 0, 7046, 7048, 1, 0, 0, 0, 7047, 7041, 1, 0, 0, 0, 7047, 7042, 1, 0, 0, 0, 7047, 7043, 1, 0, 0, 0, 7048, 767, 1, 0, 0, 0, 7049, 7054, 3, 772, 386, 0, 7050, 7051, 5, 7, 0, 0, 7051, 7053, 3, 772, 386, 0, 7052, 7050, 1, 0, 0, 0, 7053, 7056, 1, 0, 0, 0, 7054, 7052, 1, 0, 0, 0, 7054, 7055, 1, 0, 0, 0, 7055, 769, 1, 0, 0, 0, 7056, 7054, 1, 0, 0, 0, 7057, 7063, 3, 960, 480, 0, 7058, 7063, 3, 902, 451, 0, 7059, 7063, 3, 942, 471, 0, 7060, 7063, 3, 928, 464, 0, 7061, 7063, 3, 778, 389, 0, 7062, 7057, 1, 0, 0, 0, 7062, 7058, 1, 0, 0, 0, 7062, 7059, 1, 0, 0, 0, 7062, 7060, 1, 0, 0, 0, 7062, 7061, 1, 0, 0, 0, 7063, 771, 1, 0, 0, 0, 7064, 7067, 3, 770, 385, 0, 7065, 7067, 1, 0, 0, 0, 7066, 7064, 1, 0, 0, 0, 7066, 7065, 1, 0, 0, 0, 7067, 773, 1, 0, 0, 0, 7068, 7069, 7, 29, 0, 0, 7069, 775, 1, 0, 0, 0, 7070, 7074, 5, 233, 0, 0, 7071, 7074, 5, 137, 0, 0, 7072, 7074, 1, 0, 0, 0, 7073, 7070, 1, 0, 0, 0, 7073, 7071, 1, 0, 0, 0, 7073, 7072, 1, 0, 0, 0, 7074, 777, 1, 0, 0, 0, 7075, 7076, 5, 264, 0, 0, 7076, 7077, 3, 1374, 687, 0, 7077, 7078, 3, 780, 390, 0, 7078, 779, 1, 0, 0, 0, 7079, 7080, 5, 6, 0, 0, 7080, 7083, 3, 1360, 680, 0, 7081, 7083, 1, 0, 0, 0, 7082, 7079, 1, 0, 0, 0, 7082, 7081, 1, 0, 0, 0, 7083, 781, 1, 0, 0, 0, 7084, 7085, 5, 243, 0, 0, 7085, 7086, 3, 1374, 687, 0, 7086, 783, 1, 0, 0, 0, 7087, 7088, 5, 359, 0, 0, 7088, 7092, 3, 1374, 687, 0, 7089, 7090, 5, 359, 0, 0, 7090, 7092, 5, 9, 0, 0, 7091, 7087, 1, 0, 0, 0, 7091, 7089, 1, 0, 0, 0, 7092, 785, 1, 0, 0, 0, 7093, 7094, 5, 129, 0, 0, 7094, 7095, 3, 788, 394, 0, 7095, 7096, 3, 796, 398, 0, 7096, 7144, 1, 0, 0, 0, 7097, 7098, 5, 146, 0, 0, 7098, 7099, 3, 788, 394, 0, 7099, 7100, 3, 794, 397, 0, 7100, 7144, 1, 0, 0, 0, 7101, 7102, 5, 333, 0, 0, 7102, 7103, 5, 349, 0, 0, 7103, 7144, 3, 794, 397, 0, 7104, 7105, 5, 161, 0, 0, 7105, 7106, 3, 788, 394, 0, 7106, 7107, 3, 796, 398, 0, 7107, 7144, 1, 0, 0, 0, 7108, 7109, 5, 454, 0, 0, 7109, 7110, 3, 788, 394, 0, 7110, 7111, 3, 796, 398, 0, 7111, 7144, 1, 0, 0, 0, 7112, 7113, 5, 312, 0, 0, 7113, 7114, 3, 788, 394, 0, 7114, 7115, 3, 796, 398, 0, 7115, 7144, 1, 0, 0, 0, 7116, 7117, 5, 315, 0, 0, 7117, 7144, 3, 1374, 687, 0, 7118, 7119, 5, 301, 0, 0, 7119, 7120, 5, 315, 0, 0, 7120, 7144, 3, 1374, 687, 0, 7121, 7122, 5, 301, 0, 0, 7122, 7144, 3, 1374, 687, 0, 7123, 7124, 5, 312, 0, 0, 7124, 7125, 3, 788, 394, 0, 7125, 7126, 5, 94, 0, 0, 7126, 7127, 5, 315, 0, 0, 7127, 7128, 3, 1374, 687, 0, 7128, 7144, 1, 0, 0, 0, 7129, 7130, 5, 312, 0, 0, 7130, 7131, 3, 788, 394, 0, 7131, 7132, 5, 94, 0, 0, 7132, 7133, 3, 1374, 687, 0, 7133, 7144, 1, 0, 0, 0, 7134, 7135, 5, 283, 0, 0, 7135, 7136, 5, 349, 0, 0, 7136, 7144, 3, 1360, 680, 0, 7137, 7138, 5, 161, 0, 0, 7138, 7139, 5, 284, 0, 0, 7139, 7144, 3, 1360, 680, 0, 7140, 7141, 5, 312, 0, 0, 7141, 7142, 5, 284, 0, 0, 7142, 7144, 3, 1360, 680, 0, 7143, 7093, 1, 0, 0, 0, 7143, 7097, 1, 0, 0, 0, 7143, 7101, 1, 0, 0, 0, 7143, 7104, 1, 0, 0, 0, 7143, 7108, 1, 0, 0, 0, 7143, 7112, 1, 0, 0, 0, 7143, 7116, 1, 0, 0, 0, 7143, 7118, 1, 0, 0, 0, 7143, 7121, 1, 0, 0, 0, 7143, 7123, 1, 0, 0, 0, 7143, 7129, 1, 0, 0, 0, 7143, 7134, 1, 0, 0, 0, 7143, 7137, 1, 0, 0, 0, 7143, 7140, 1, 0, 0, 0, 7144, 787, 1, 0, 0, 0, 7145, 7149, 5, 373, 0, 0, 7146, 7149, 5, 349, 0, 0, 7147, 7149, 1, 0, 0, 0, 7148, 7145, 1, 0, 0, 0, 7148, 7146, 1, 0, 0, 0, 7148, 7147, 1, 0, 0, 0, 7149, 789, 1, 0, 0, 0, 7150, 7151, 5, 235, 0, 0, 7151, 7152, 5, 242, 0, 0, 7152, 7161, 3, 64, 32, 0, 7153, 7154, 5, 293, 0, 0, 7154, 7161, 5, 81, 0, 0, 7155, 7156, 5, 293, 0, 0, 7156, 7161, 5, 375, 0, 0, 7157, 7161, 5, 54, 0, 0, 7158, 7159, 5, 77, 0, 0, 7159, 7161, 5, 54, 0, 0, 7160, 7150, 1, 0, 0, 0, 7160, 7153, 1, 0, 0, 0, 7160, 7155, 1, 0, 0, 0, 7160, 7157, 1, 0, 0, 0, 7160, 7158, 1, 0, 0, 0, 7161, 791, 1, 0, 0, 0, 7162, 7169, 3, 790, 395, 0, 7163, 7165, 5, 6, 0, 0, 7164, 7163, 1, 0, 0, 0, 7164, 7165, 1, 0, 0, 0, 7165, 7166, 1, 0, 0, 0, 7166, 7168, 3, 790, 395, 0, 7167, 7164, 1, 0, 0, 0, 7168, 7171, 1, 0, 0, 0, 7169, 7167, 1, 0, 0, 0, 7169, 7170, 1, 0, 0, 0, 7170, 793, 1, 0, 0, 0, 7171, 7169, 1, 0, 0, 0, 7172, 7175, 3, 792, 396, 0, 7173, 7175, 1, 0, 0, 0, 7174, 7172, 1, 0, 0, 0, 7174, 7173, 1, 0, 0, 0, 7175, 795, 1, 0, 0, 0, 7176, 7178, 5, 33, 0, 0, 7177, 7179, 5, 262, 0, 0, 7178, 7177, 1, 0, 0, 0, 7178, 7179, 1, 0, 0, 0, 7179, 7180, 1, 0, 0, 0, 7180, 7183, 5, 153, 0, 0, 7181, 7183, 1, 0, 0, 0, 7182, 7176, 1, 0, 0, 0, 7182, 7181, 1, 0, 0, 0, 7183, 797, 1, 0, 0, 0, 7184, 7187, 5, 46, 0, 0, 7185, 7186, 5, 82, 0, 0, 7186, 7188, 5, 304, 0, 0, 7187, 7185, 1, 0, 0, 0, 7187, 7188, 1, 0, 0, 0, 7188, 7189, 1, 0, 0, 0, 7189, 7203, 3, 174, 87, 0, 7190, 7191, 5, 369, 0, 0, 7191, 7192, 3, 1338, 669, 0, 7192, 7193, 3, 214, 107, 0, 7193, 7194, 3, 118, 59, 0, 7194, 7204, 1, 0, 0, 0, 7195, 7196, 5, 296, 0, 0, 7196, 7197, 5, 369, 0, 0, 7197, 7198, 3, 1338, 669, 0, 7198, 7199, 5, 2, 0, 0, 7199, 7200, 3, 216, 108, 0, 7200, 7201, 5, 3, 0, 0, 7201, 7202, 3, 118, 59, 0, 7202, 7204, 1, 0, 0, 0, 7203, 7190, 1, 0, 0, 0, 7203, 7195, 1, 0, 0, 0, 7204, 7205, 1, 0, 0, 0, 7205, 7206, 5, 36, 0, 0, 7206, 7207, 3, 960, 480, 0, 7207, 7208, 3, 800, 400, 0, 7208, 799, 1, 0, 0, 0, 7209, 7211, 5, 105, 0, 0, 7210, 7212, 7, 30, 0, 0, 7211, 7210, 1, 0, 0, 0, 7211, 7212, 1, 0, 0, 0, 7212, 7213, 1, 0, 0, 0, 7213, 7214, 5, 42, 0, 0, 7214, 7217, 5, 272, 0, 0, 7215, 7217, 1, 0, 0, 0, 7216, 7209, 1, 0, 0, 0, 7216, 7215, 1, 0, 0, 0, 7217, 801, 1, 0, 0, 0, 7218, 7219, 5, 244, 0, 0, 7219, 7220, 3, 1346, 673, 0, 7220, 803, 1, 0, 0, 0, 7221, 7222, 5, 46, 0, 0, 7222, 7223, 5, 175, 0, 0, 7223, 7224, 3, 1342, 671, 0, 7224, 7225, 3, 16, 8, 0, 7225, 7226, 3, 806, 403, 0, 7226, 805, 1, 0, 0, 0, 7227, 7230, 3, 808, 404, 0, 7228, 7230, 1, 0, 0, 0, 7229, 7227, 1, 0, 0, 0, 7229, 7228, 1, 0, 0, 0, 7230, 807, 1, 0, 0, 0, 7231, 7233, 3, 810, 405, 0, 7232, 7231, 1, 0, 0, 0, 7233, 7234, 1, 0, 0, 0, 7234, 7232, 1, 0, 0, 0, 7234, 7235, 1, 0, 0, 0, 7235, 809, 1, 0, 0, 0, 7236, 7237, 3, 812, 406, 0, 7237, 7241, 3, 814, 407, 0, 7238, 7242, 3, 1366, 683, 0, 7239, 7242, 3, 66, 33, 0, 7240, 7242, 5, 53, 0, 0, 7241, 7238, 1, 0, 0, 0, 7241, 7239, 1, 0, 0, 0, 7241, 7240, 1, 0, 0, 0, 7242, 811, 1, 0, 0, 0, 7243, 7252, 3, 1384, 692, 0, 7244, 7245, 5, 164, 0, 0, 7245, 7252, 5, 74, 0, 0, 7246, 7252, 5, 194, 0, 0, 7247, 7252, 5, 246, 0, 0, 7248, 7252, 5, 275, 0, 0, 7249, 7252, 5, 344, 0, 0, 7250, 7252, 5, 346, 0, 0, 7251, 7243, 1, 0, 0, 0, 7251, 7244, 1, 0, 0, 0, 7251, 7246, 1, 0, 0, 0, 7251, 7247, 1, 0, 0, 0, 7251, 7248, 1, 0, 0, 0, 7251, 7249, 1, 0, 0, 0, 7251, 7250, 1, 0, 0, 0, 7252, 813, 1, 0, 0, 0, 7253, 7256, 5, 10, 0, 0, 7254, 7256, 1, 0, 0, 0, 7255, 7253, 1, 0, 0, 0, 7255, 7254, 1, 0, 0, 0, 7256, 815, 1, 0, 0, 0, 7257, 7258, 5, 138, 0, 0, 7258, 7259, 5, 175, 0, 0, 7259, 7266, 3, 1342, 671, 0, 7260, 7261, 5, 105, 0, 0, 7261, 7267, 3, 806, 403, 0, 7262, 7267, 3, 806, 403, 0, 7263, 7264, 5, 326, 0, 0, 7264, 7265, 5, 344, 0, 0, 7265, 7267, 3, 1342, 671, 0, 7266, 7260, 1, 0, 0, 0, 7266, 7262, 1, 0, 0, 0, 7266, 7263, 1, 0, 0, 0, 7267, 817, 1, 0, 0, 0, 7268, 7269, 5, 138, 0, 0, 7269, 7270, 5, 175, 0, 0, 7270, 7271, 3, 1342, 671, 0, 7271, 7272, 3, 80, 40, 0, 7272, 819, 1, 0, 0, 0, 7273, 7274, 5, 191, 0, 0, 7274, 7277, 5, 175, 0, 0, 7275, 7276, 5, 220, 0, 0, 7276, 7278, 5, 389, 0, 0, 7277, 7275, 1, 0, 0, 0, 7277, 7278, 1, 0, 0, 0, 7278, 7279, 1, 0, 0, 0, 7279, 7285, 3, 1342, 671, 0, 7280, 7281, 3, 16, 8, 0, 7281, 7282, 5, 2, 0, 0, 7282, 7283, 3, 822, 411, 0, 7283, 7284, 5, 3, 0, 0, 7284, 7286, 1, 0, 0, 0, 7285, 7280, 1, 0, 0, 0, 7285, 7286, 1, 0, 0, 0, 7286, 821, 1, 0, 0, 0, 7287, 7292, 3, 824, 412, 0, 7288, 7289, 5, 6, 0, 0, 7289, 7291, 3, 824, 412, 0, 7290, 7288, 1, 0, 0, 0, 7291, 7294, 1, 0, 0, 0, 7292, 7290, 1, 0, 0, 0, 7292, 7293, 1, 0, 0, 0, 7293, 823, 1, 0, 0, 0, 7294, 7292, 1, 0, 0, 0, 7295, 7296, 5, 209, 0, 0, 7296, 825, 1, 0, 0, 0, 7297, 7298, 5, 138, 0, 0, 7298, 7299, 5, 108, 0, 0, 7299, 7300, 3, 524, 262, 0, 7300, 7301, 5, 298, 0, 0, 7301, 7302, 5, 368, 0, 0, 7302, 827, 1, 0, 0, 0, 7303, 7304, 5, 138, 0, 0, 7304, 7305, 5, 342, 0, 0, 7305, 7306, 7, 31, 0, 0, 7306, 7307, 3, 54, 27, 0, 7307, 829, 1, 0, 0, 0, 7308, 7309, 5, 46, 0, 0, 7309, 7310, 5, 189, 0, 0, 7310, 7311, 3, 524, 262, 0, 7311, 7312, 3, 834, 417, 0, 7312, 7313, 3, 1120, 560, 0, 7313, 7314, 3, 192, 96, 0, 7314, 831, 1, 0, 0, 0, 7315, 7316, 5, 138, 0, 0, 7316, 7317, 5, 189, 0, 0, 7317, 7339, 3, 524, 262, 0, 7318, 7340, 3, 106, 53, 0, 7319, 7320, 5, 191, 0, 0, 7320, 7321, 5, 77, 0, 0, 7321, 7340, 5, 78, 0, 0, 7322, 7323, 5, 326, 0, 0, 7323, 7324, 5, 77, 0, 0, 7324, 7340, 5, 78, 0, 0, 7325, 7326, 5, 133, 0, 0, 7326, 7340, 3, 208, 104, 0, 7327, 7328, 5, 191, 0, 0, 7328, 7331, 5, 45, 0, 0, 7329, 7330, 5, 220, 0, 0, 7330, 7332, 5, 389, 0, 0, 7331, 7329, 1, 0, 0, 0, 7331, 7332, 1, 0, 0, 0, 7332, 7333, 1, 0, 0, 0, 7333, 7334, 3, 1342, 671, 0, 7334, 7335, 3, 108, 54, 0, 7335, 7340, 1, 0, 0, 0, 7336, 7337, 5, 365, 0, 0, 7337, 7338, 5, 45, 0, 0, 7338, 7340, 3, 1342, 671, 0, 7339, 7318, 1, 0, 0, 0, 7339, 7319, 1, 0, 0, 0, 7339, 7322, 1, 0, 0, 0, 7339, 7325, 1, 0, 0, 0, 7339, 7327, 1, 0, 0, 0, 7339, 7336, 1, 0, 0, 0, 7340, 833, 1, 0, 0, 0, 7341, 7344, 5, 36, 0, 0, 7342, 7344, 1, 0, 0, 0, 7343, 7341, 1, 0, 0, 0, 7343, 7342, 1, 0, 0, 0, 7344, 835, 1, 0, 0, 0, 7345, 7346, 5, 138, 0, 0, 7346, 7347, 5, 348, 0, 0, 7347, 7348, 5, 318, 0, 0, 7348, 7349, 5, 185, 0, 0, 7349, 7350, 3, 524, 262, 0, 7350, 7351, 3, 460, 230, 0, 7351, 837, 1, 0, 0, 0, 7352, 7353, 5, 138, 0, 0, 7353, 7354, 5, 348, 0, 0, 7354, 7355, 5, 318, 0, 0, 7355, 7356, 5, 163, 0, 0, 7356, 7357, 3, 524, 262, 0, 7357, 7358, 5, 133, 0, 0, 7358, 7359, 5, 248, 0, 0, 7359, 7360, 5, 62, 0, 0, 7360, 7361, 3, 1340, 670, 0, 7361, 7362, 3, 840, 420, 0, 7362, 7363, 3, 522, 261, 0, 7363, 7425, 1, 0, 0, 0, 7364, 7365, 5, 138, 0, 0, 7365, 7366, 5, 348, 0, 0, 7366, 7367, 5, 318, 0, 0, 7367, 7368, 5, 163, 0, 0, 7368, 7369, 3, 524, 262, 0, 7369, 7370, 5, 138, 0, 0, 7370, 7371, 5, 248, 0, 0, 7371, 7372, 5, 62, 0, 0, 7372, 7373, 3, 1340, 670, 0, 7373, 7374, 3, 840, 420, 0, 7374, 7375, 3, 522, 261, 0, 7375, 7425, 1, 0, 0, 0, 7376, 7377, 5, 138, 0, 0, 7377, 7378, 5, 348, 0, 0, 7378, 7379, 5, 318, 0, 0, 7379, 7380, 5, 163, 0, 0, 7380, 7381, 3, 524, 262, 0, 7381, 7382, 5, 138, 0, 0, 7382, 7383, 5, 248, 0, 0, 7383, 7384, 5, 304, 0, 0, 7384, 7385, 3, 524, 262, 0, 7385, 7386, 3, 840, 420, 0, 7386, 7387, 3, 524, 262, 0, 7387, 7425, 1, 0, 0, 0, 7388, 7389, 5, 138, 0, 0, 7389, 7390, 5, 348, 0, 0, 7390, 7391, 5, 318, 0, 0, 7391, 7392, 5, 163, 0, 0, 7392, 7393, 3, 524, 262, 0, 7393, 7394, 5, 138, 0, 0, 7394, 7395, 5, 248, 0, 0, 7395, 7396, 5, 62, 0, 0, 7396, 7397, 3, 1340, 670, 0, 7397, 7398, 5, 304, 0, 0, 7398, 7399, 3, 524, 262, 0, 7399, 7400, 3, 840, 420, 0, 7400, 7401, 3, 524, 262, 0, 7401, 7425, 1, 0, 0, 0, 7402, 7403, 5, 138, 0, 0, 7403, 7404, 5, 348, 0, 0, 7404, 7405, 5, 318, 0, 0, 7405, 7406, 5, 163, 0, 0, 7406, 7407, 3, 524, 262, 0, 7407, 7408, 5, 191, 0, 0, 7408, 7409, 5, 248, 0, 0, 7409, 7410, 5, 62, 0, 0, 7410, 7411, 3, 1340, 670, 0, 7411, 7425, 1, 0, 0, 0, 7412, 7413, 5, 138, 0, 0, 7413, 7414, 5, 348, 0, 0, 7414, 7415, 5, 318, 0, 0, 7415, 7416, 5, 163, 0, 0, 7416, 7417, 3, 524, 262, 0, 7417, 7418, 5, 191, 0, 0, 7418, 7419, 5, 248, 0, 0, 7419, 7420, 5, 220, 0, 0, 7420, 7421, 5, 389, 0, 0, 7421, 7422, 5, 62, 0, 0, 7422, 7423, 3, 1340, 670, 0, 7423, 7425, 1, 0, 0, 0, 7424, 7352, 1, 0, 0, 0, 7424, 7364, 1, 0, 0, 0, 7424, 7376, 1, 0, 0, 0, 7424, 7388, 1, 0, 0, 0, 7424, 7402, 1, 0, 0, 0, 7424, 7412, 1, 0, 0, 0, 7425, 839, 1, 0, 0, 0, 7426, 7427, 5, 105, 0, 0, 7427, 841, 1, 0, 0, 0, 7428, 7429, 5, 46, 0, 0, 7429, 7430, 3, 488, 244, 0, 7430, 7431, 5, 168, 0, 0, 7431, 7432, 3, 524, 262, 0, 7432, 7433, 5, 62, 0, 0, 7433, 7434, 3, 1360, 680, 0, 7434, 7435, 5, 94, 0, 0, 7435, 7436, 3, 1360, 680, 0, 7436, 7437, 5, 64, 0, 0, 7437, 7438, 3, 524, 262, 0, 7438, 843, 1, 0, 0, 0, 7439, 7440, 5, 158, 0, 0, 7440, 7441, 3, 864, 432, 0, 7441, 7442, 3, 1338, 669, 0, 7442, 7443, 3, 846, 423, 0, 7443, 7453, 1, 0, 0, 0, 7444, 7445, 5, 158, 0, 0, 7445, 7453, 3, 864, 432, 0, 7446, 7447, 5, 158, 0, 0, 7447, 7448, 3, 864, 432, 0, 7448, 7449, 3, 1342, 671, 0, 7449, 7450, 5, 80, 0, 0, 7450, 7451, 3, 1338, 669, 0, 7451, 7453, 1, 0, 0, 0, 7452, 7439, 1, 0, 0, 0, 7452, 7444, 1, 0, 0, 0, 7452, 7446, 1, 0, 0, 0, 7453, 845, 1, 0, 0, 0, 7454, 7455, 5, 100, 0, 0, 7455, 7458, 3, 1342, 671, 0, 7456, 7458, 1, 0, 0, 0, 7457, 7454, 1, 0, 0, 0, 7457, 7456, 1, 0, 0, 0, 7458, 847, 1, 0, 0, 0, 7459, 7460, 5, 363, 0, 0, 7460, 7461, 3, 866, 433, 0, 7461, 7462, 3, 868, 434, 0, 7462, 7463, 3, 864, 432, 0, 7463, 7464, 3, 862, 431, 0, 7464, 7465, 3, 876, 438, 0, 7465, 7473, 1, 0, 0, 0, 7466, 7467, 5, 363, 0, 0, 7467, 7468, 5, 2, 0, 0, 7468, 7469, 3, 852, 426, 0, 7469, 7470, 5, 3, 0, 0, 7470, 7471, 3, 876, 438, 0, 7471, 7473, 1, 0, 0, 0, 7472, 7459, 1, 0, 0, 0, 7472, 7466, 1, 0, 0, 0, 7473, 849, 1, 0, 0, 0, 7474, 7475, 3, 854, 427, 0, 7475, 7476, 3, 864, 432, 0, 7476, 7477, 3, 876, 438, 0, 7477, 7485, 1, 0, 0, 0, 7478, 7479, 3, 854, 427, 0, 7479, 7480, 5, 2, 0, 0, 7480, 7481, 3, 852, 426, 0, 7481, 7482, 5, 3, 0, 0, 7482, 7483, 3, 876, 438, 0, 7483, 7485, 1, 0, 0, 0, 7484, 7474, 1, 0, 0, 0, 7484, 7478, 1, 0, 0, 0, 7485, 851, 1, 0, 0, 0, 7486, 7491, 3, 856, 428, 0, 7487, 7488, 5, 6, 0, 0, 7488, 7490, 3, 856, 428, 0, 7489, 7487, 1, 0, 0, 0, 7490, 7493, 1, 0, 0, 0, 7491, 7489, 1, 0, 0, 0, 7491, 7492, 1, 0, 0, 0, 7492, 853, 1, 0, 0, 0, 7493, 7491, 1, 0, 0, 0, 7494, 7495, 7, 32, 0, 0, 7495, 855, 1, 0, 0, 0, 7496, 7497, 3, 858, 429, 0, 7497, 7498, 3, 860, 430, 0, 7498, 857, 1, 0, 0, 0, 7499, 7502, 3, 1380, 690, 0, 7500, 7502, 3, 854, 427, 0, 7501, 7499, 1, 0, 0, 0, 7501, 7500, 1, 0, 0, 0, 7502, 859, 1, 0, 0, 0, 7503, 7507, 3, 66, 33, 0, 7504, 7507, 3, 292, 146, 0, 7505, 7507, 1, 0, 0, 0, 7506, 7503, 1, 0, 0, 0, 7506, 7504, 1, 0, 0, 0, 7506, 7505, 1, 0, 0, 0, 7507, 861, 1, 0, 0, 0, 7508, 7511, 3, 854, 427, 0, 7509, 7511, 1, 0, 0, 0, 7510, 7508, 1, 0, 0, 0, 7510, 7509, 1, 0, 0, 0, 7511, 863, 1, 0, 0, 0, 7512, 7515, 5, 128, 0, 0, 7513, 7515, 1, 0, 0, 0, 7514, 7512, 1, 0, 0, 0, 7514, 7513, 1, 0, 0, 0, 7515, 865, 1, 0, 0, 0, 7516, 7519, 5, 113, 0, 0, 7517, 7519, 1, 0, 0, 0, 7518, 7516, 1, 0, 0, 0, 7518, 7517, 1, 0, 0, 0, 7519, 867, 1, 0, 0, 0, 7520, 7523, 5, 112, 0, 0, 7521, 7523, 1, 0, 0, 0, 7522, 7520, 1, 0, 0, 0, 7522, 7521, 1, 0, 0, 0, 7523, 869, 1, 0, 0, 0, 7524, 7525, 5, 2, 0, 0, 7525, 7526, 3, 1340, 670, 0, 7526, 7527, 5, 3, 0, 0, 7527, 7530, 1, 0, 0, 0, 7528, 7530, 1, 0, 0, 0, 7529, 7524, 1, 0, 0, 0, 7529, 7528, 1, 0, 0, 0, 7530, 871, 1, 0, 0, 0, 7531, 7532, 3, 1338, 669, 0, 7532, 7533, 3, 870, 435, 0, 7533, 873, 1, 0, 0, 0, 7534, 7539, 3, 872, 436, 0, 7535, 7536, 5, 6, 0, 0, 7536, 7538, 3, 872, 436, 0, 7537, 7535, 1, 0, 0, 0, 7538, 7541, 1, 0, 0, 0, 7539, 7537, 1, 0, 0, 0, 7539, 7540, 1, 0, 0, 0, 7540, 875, 1, 0, 0, 0, 7541, 7539, 1, 0, 0, 0, 7542, 7545, 3, 874, 437, 0, 7543, 7545, 1, 0, 0, 0, 7544, 7542, 1, 0, 0, 0, 7544, 7543, 1, 0, 0, 0, 7545, 877, 1, 0, 0, 0, 7546, 7547, 5, 203, 0, 0, 7547, 7563, 3, 880, 440, 0, 7548, 7549, 5, 203, 0, 0, 7549, 7550, 3, 854, 427, 0, 7550, 7551, 3, 864, 432, 0, 7551, 7552, 3, 880, 440, 0, 7552, 7563, 1, 0, 0, 0, 7553, 7554, 5, 203, 0, 0, 7554, 7555, 5, 128, 0, 0, 7555, 7563, 3, 880, 440, 0, 7556, 7557, 5, 203, 0, 0, 7557, 7558, 5, 2, 0, 0, 7558, 7559, 3, 882, 441, 0, 7559, 7560, 5, 3, 0, 0, 7560, 7561, 3, 880, 440, 0, 7561, 7563, 1, 0, 0, 0, 7562, 7546, 1, 0, 0, 0, 7562, 7548, 1, 0, 0, 0, 7562, 7553, 1, 0, 0, 0, 7562, 7556, 1, 0, 0, 0, 7563, 879, 1, 0, 0, 0, 7564, 7574, 3, 960, 480, 0, 7565, 7574, 3, 902, 451, 0, 7566, 7574, 3, 942, 471, 0, 7567, 7574, 3, 928, 464, 0, 7568, 7574, 3, 952, 476, 0, 7569, 7574, 3, 264, 132, 0, 7570, 7574, 3, 270, 135, 0, 7571, 7574, 3, 276, 138, 0, 7572, 7574, 3, 896, 448, 0, 7573, 7564, 1, 0, 0, 0, 7573, 7565, 1, 0, 0, 0, 7573, 7566, 1, 0, 0, 0, 7573, 7567, 1, 0, 0, 0, 7573, 7568, 1, 0, 0, 0, 7573, 7569, 1, 0, 0, 0, 7573, 7570, 1, 0, 0, 0, 7573, 7571, 1, 0, 0, 0, 7573, 7572, 1, 0, 0, 0, 7574, 881, 1, 0, 0, 0, 7575, 7580, 3, 884, 442, 0, 7576, 7577, 5, 6, 0, 0, 7577, 7579, 3, 884, 442, 0, 7578, 7576, 1, 0, 0, 0, 7579, 7582, 1, 0, 0, 0, 7580, 7578, 1, 0, 0, 0, 7580, 7581, 1, 0, 0, 0, 7581, 883, 1, 0, 0, 0, 7582, 7580, 1, 0, 0, 0, 7583, 7584, 3, 886, 443, 0, 7584, 7585, 3, 888, 444, 0, 7585, 885, 1, 0, 0, 0, 7586, 7589, 3, 1380, 690, 0, 7587, 7589, 3, 854, 427, 0, 7588, 7586, 1, 0, 0, 0, 7588, 7587, 1, 0, 0, 0, 7589, 887, 1, 0, 0, 0, 7590, 7594, 3, 66, 33, 0, 7591, 7594, 3, 292, 146, 0, 7592, 7594, 1, 0, 0, 0, 7593, 7590, 1, 0, 0, 0, 7593, 7591, 1, 0, 0, 0, 7593, 7592, 1, 0, 0, 0, 7594, 889, 1, 0, 0, 0, 7595, 7596, 5, 283, 0, 0, 7596, 7597, 3, 1342, 671, 0, 7597, 7598, 3, 892, 446, 0, 7598, 7599, 5, 36, 0, 0, 7599, 7600, 3, 894, 447, 0, 7600, 891, 1, 0, 0, 0, 7601, 7602, 5, 2, 0, 0, 7602, 7603, 3, 1288, 644, 0, 7603, 7604, 5, 3, 0, 0, 7604, 7607, 1, 0, 0, 0, 7605, 7607, 1, 0, 0, 0, 7606, 7601, 1, 0, 0, 0, 7606, 7605, 1, 0, 0, 0, 7607, 893, 1, 0, 0, 0, 7608, 7613, 3, 960, 480, 0, 7609, 7613, 3, 902, 451, 0, 7610, 7613, 3, 942, 471, 0, 7611, 7613, 3, 928, 464, 0, 7612, 7608, 1, 0, 0, 0, 7612, 7609, 1, 0, 0, 0, 7612, 7610, 1, 0, 0, 0, 7612, 7611, 1, 0, 0, 0, 7613, 895, 1, 0, 0, 0, 7614, 7615, 5, 202, 0, 0, 7615, 7616, 3, 1342, 671, 0, 7616, 7617, 3, 898, 449, 0, 7617, 7642, 1, 0, 0, 0, 7618, 7619, 5, 46, 0, 0, 7619, 7620, 3, 174, 87, 0, 7620, 7621, 5, 92, 0, 0, 7621, 7622, 3, 266, 133, 0, 7622, 7623, 5, 36, 0, 0, 7623, 7624, 5, 202, 0, 0, 7624, 7625, 3, 1342, 671, 0, 7625, 7626, 3, 898, 449, 0, 7626, 7627, 3, 268, 134, 0, 7627, 7642, 1, 0, 0, 0, 7628, 7629, 5, 46, 0, 0, 7629, 7630, 3, 174, 87, 0, 7630, 7631, 5, 92, 0, 0, 7631, 7632, 5, 220, 0, 0, 7632, 7633, 5, 77, 0, 0, 7633, 7634, 5, 389, 0, 0, 7634, 7635, 3, 266, 133, 0, 7635, 7636, 5, 36, 0, 0, 7636, 7637, 5, 202, 0, 0, 7637, 7638, 3, 1342, 671, 0, 7638, 7639, 3, 898, 449, 0, 7639, 7640, 3, 268, 134, 0, 7640, 7642, 1, 0, 0, 0, 7641, 7614, 1, 0, 0, 0, 7641, 7618, 1, 0, 0, 0, 7641, 7628, 1, 0, 0, 0, 7642, 897, 1, 0, 0, 0, 7643, 7644, 5, 2, 0, 0, 7644, 7645, 3, 1282, 641, 0, 7645, 7646, 5, 3, 0, 0, 7646, 7649, 1, 0, 0, 0, 7647, 7649, 1, 0, 0, 0, 7648, 7643, 1, 0, 0, 0, 7648, 7647, 1, 0, 0, 0, 7649, 899, 1, 0, 0, 0, 7650, 7651, 5, 177, 0, 0, 7651, 7661, 3, 1342, 671, 0, 7652, 7653, 5, 177, 0, 0, 7653, 7654, 5, 283, 0, 0, 7654, 7661, 3, 1342, 671, 0, 7655, 7656, 5, 177, 0, 0, 7656, 7661, 5, 30, 0, 0, 7657, 7658, 5, 177, 0, 0, 7658, 7659, 5, 283, 0, 0, 7659, 7661, 5, 30, 0, 0, 7660, 7650, 1, 0, 0, 0, 7660, 7652, 1, 0, 0, 0, 7660, 7655, 1, 0, 0, 0, 7660, 7657, 1, 0, 0, 0, 7661, 901, 1, 0, 0, 0, 7662, 7663, 3, 982, 491, 0, 7663, 7664, 5, 232, 0, 0, 7664, 7665, 5, 71, 0, 0, 7665, 7666, 3, 904, 452, 0, 7666, 7667, 3, 906, 453, 0, 7667, 7668, 3, 914, 457, 0, 7668, 7669, 3, 918, 459, 0, 7669, 903, 1, 0, 0, 0, 7670, 7673, 3, 1338, 669, 0, 7671, 7672, 5, 36, 0, 0, 7672, 7674, 3, 1374, 687, 0, 7673, 7671, 1, 0, 0, 0, 7673, 7674, 1, 0, 0, 0, 7674, 905, 1, 0, 0, 0, 7675, 7695, 3, 960, 480, 0, 7676, 7677, 5, 463, 0, 0, 7677, 7678, 3, 908, 454, 0, 7678, 7679, 5, 450, 0, 0, 7679, 7680, 3, 960, 480, 0, 7680, 7695, 1, 0, 0, 0, 7681, 7682, 5, 2, 0, 0, 7682, 7683, 3, 910, 455, 0, 7683, 7688, 5, 3, 0, 0, 7684, 7685, 5, 463, 0, 0, 7685, 7686, 3, 908, 454, 0, 7686, 7687, 5, 450, 0, 0, 7687, 7689, 1, 0, 0, 0, 7688, 7684, 1, 0, 0, 0, 7688, 7689, 1, 0, 0, 0, 7689, 7690, 1, 0, 0, 0, 7690, 7691, 3, 960, 480, 0, 7691, 7695, 1, 0, 0, 0, 7692, 7693, 5, 53, 0, 0, 7693, 7695, 5, 415, 0, 0, 7694, 7675, 1, 0, 0, 0, 7694, 7676, 1, 0, 0, 0, 7694, 7681, 1, 0, 0, 0, 7694, 7692, 1, 0, 0, 0, 7695, 907, 1, 0, 0, 0, 7696, 7697, 7, 33, 0, 0, 7697, 909, 1, 0, 0, 0, 7698, 7703, 3, 912, 456, 0, 7699, 7700, 5, 6, 0, 0, 7700, 7702, 3, 912, 456, 0, 7701, 7699, 1, 0, 0, 0, 7702, 7705, 1, 0, 0, 0, 7703, 7701, 1, 0, 0, 0, 7703, 7704, 1, 0, 0, 0, 7704, 911, 1, 0, 0, 0, 7705, 7703, 1, 0, 0, 0, 7706, 7707, 3, 1374, 687, 0, 7707, 7708, 3, 1328, 664, 0, 7708, 913, 1, 0, 0, 0, 7709, 7710, 5, 80, 0, 0, 7710, 7711, 5, 464, 0, 0, 7711, 7712, 3, 916, 458, 0, 7712, 7719, 5, 57, 0, 0, 7713, 7714, 5, 362, 0, 0, 7714, 7715, 5, 326, 0, 0, 7715, 7716, 3, 944, 472, 0, 7716, 7717, 3, 1096, 548, 0, 7717, 7720, 1, 0, 0, 0, 7718, 7720, 5, 263, 0, 0, 7719, 7713, 1, 0, 0, 0, 7719, 7718, 1, 0, 0, 0, 7720, 7723, 1, 0, 0, 0, 7721, 7723, 1, 0, 0, 0, 7722, 7709, 1, 0, 0, 0, 7722, 7721, 1, 0, 0, 0, 7723, 915, 1, 0, 0, 0, 7724, 7725, 5, 2, 0, 0, 7725, 7726, 3, 598, 299, 0, 7726, 7727, 5, 3, 0, 0, 7727, 7728, 3, 1096, 548, 0, 7728, 7734, 1, 0, 0, 0, 7729, 7730, 5, 80, 0, 0, 7730, 7731, 5, 45, 0, 0, 7731, 7734, 3, 1342, 671, 0, 7732, 7734, 1, 0, 0, 0, 7733, 7724, 1, 0, 0, 0, 7733, 7729, 1, 0, 0, 0, 7733, 7732, 1, 0, 0, 0, 7734, 917, 1, 0, 0, 0, 7735, 7736, 5, 87, 0, 0, 7736, 7739, 3, 1332, 666, 0, 7737, 7739, 1, 0, 0, 0, 7738, 7735, 1, 0, 0, 0, 7738, 7737, 1, 0, 0, 0, 7739, 919, 1, 0, 0, 0, 7740, 7742, 5, 253, 0, 0, 7741, 7743, 5, 71, 0, 0, 7742, 7741, 1, 0, 0, 0, 7742, 7743, 1, 0, 0, 0, 7743, 7744, 1, 0, 0, 0, 7744, 7746, 3, 1338, 669, 0, 7745, 7747, 3, 1064, 532, 0, 7746, 7745, 1, 0, 0, 0, 7746, 7747, 1, 0, 0, 0, 7747, 7748, 1, 0, 0, 0, 7748, 7751, 5, 100, 0, 0, 7749, 7752, 3, 962, 481, 0, 7750, 7752, 3, 1338, 669, 0, 7751, 7749, 1, 0, 0, 0, 7751, 7750, 1, 0, 0, 0, 7752, 7754, 1, 0, 0, 0, 7753, 7755, 3, 1064, 532, 0, 7754, 7753, 1, 0, 0, 0, 7754, 7755, 1, 0, 0, 0, 7755, 7756, 1, 0, 0, 0, 7756, 7757, 5, 80, 0, 0, 7757, 7766, 3, 1164, 582, 0, 7758, 7760, 3, 922, 461, 0, 7759, 7761, 3, 924, 462, 0, 7760, 7759, 1, 0, 0, 0, 7760, 7761, 1, 0, 0, 0, 7761, 7767, 1, 0, 0, 0, 7762, 7764, 3, 924, 462, 0, 7763, 7765, 3, 922, 461, 0, 7764, 7763, 1, 0, 0, 0, 7764, 7765, 1, 0, 0, 0, 7765, 7767, 1, 0, 0, 0, 7766, 7758, 1, 0, 0, 0, 7766, 7762, 1, 0, 0, 0, 7767, 7769, 1, 0, 0, 0, 7768, 7770, 3, 926, 463, 0, 7769, 7768, 1, 0, 0, 0, 7769, 7770, 1, 0, 0, 0, 7770, 921, 1, 0, 0, 0, 7771, 7772, 5, 102, 0, 0, 7772, 7773, 5, 77, 0, 0, 7773, 7776, 5, 250, 0, 0, 7774, 7775, 5, 33, 0, 0, 7775, 7777, 3, 1164, 582, 0, 7776, 7774, 1, 0, 0, 0, 7776, 7777, 1, 0, 0, 0, 7777, 7779, 1, 0, 0, 0, 7778, 7780, 5, 93, 0, 0, 7779, 7778, 1, 0, 0, 0, 7779, 7780, 1, 0, 0, 0, 7780, 7781, 1, 0, 0, 0, 7781, 7786, 5, 232, 0, 0, 7782, 7783, 5, 2, 0, 0, 7783, 7784, 3, 910, 455, 0, 7784, 7785, 5, 3, 0, 0, 7785, 7787, 1, 0, 0, 0, 7786, 7782, 1, 0, 0, 0, 7786, 7787, 1, 0, 0, 0, 7787, 7788, 1, 0, 0, 0, 7788, 7789, 3, 1054, 527, 0, 7789, 923, 1, 0, 0, 0, 7790, 7791, 5, 102, 0, 0, 7791, 7794, 5, 250, 0, 0, 7792, 7793, 5, 33, 0, 0, 7793, 7795, 3, 1164, 582, 0, 7794, 7792, 1, 0, 0, 0, 7794, 7795, 1, 0, 0, 0, 7795, 7797, 1, 0, 0, 0, 7796, 7798, 5, 93, 0, 0, 7797, 7796, 1, 0, 0, 0, 7797, 7798, 1, 0, 0, 0, 7798, 7799, 1, 0, 0, 0, 7799, 7800, 5, 362, 0, 0, 7800, 7801, 5, 326, 0, 0, 7801, 7802, 3, 944, 472, 0, 7802, 925, 1, 0, 0, 0, 7803, 7804, 5, 102, 0, 0, 7804, 7806, 5, 250, 0, 0, 7805, 7807, 5, 93, 0, 0, 7806, 7805, 1, 0, 0, 0, 7806, 7807, 1, 0, 0, 0, 7807, 7808, 1, 0, 0, 0, 7808, 7809, 5, 182, 0, 0, 7809, 927, 1, 0, 0, 0, 7810, 7811, 3, 982, 491, 0, 7811, 7812, 5, 182, 0, 0, 7812, 7813, 5, 64, 0, 0, 7813, 7814, 3, 1080, 540, 0, 7814, 7815, 3, 930, 465, 0, 7815, 7816, 3, 1098, 549, 0, 7816, 7817, 3, 918, 459, 0, 7817, 929, 1, 0, 0, 0, 7818, 7819, 5, 100, 0, 0, 7819, 7822, 3, 1058, 529, 0, 7820, 7822, 1, 0, 0, 0, 7821, 7818, 1, 0, 0, 0, 7821, 7820, 1, 0, 0, 0, 7822, 931, 1, 0, 0, 0, 7823, 7824, 5, 247, 0, 0, 7824, 7825, 3, 990, 495, 0, 7825, 7826, 3, 1078, 539, 0, 7826, 7827, 3, 934, 467, 0, 7827, 7828, 3, 938, 469, 0, 7828, 933, 1, 0, 0, 0, 7829, 7830, 5, 68, 0, 0, 7830, 7831, 3, 936, 468, 0, 7831, 7832, 5, 256, 0, 0, 7832, 7835, 1, 0, 0, 0, 7833, 7835, 1, 0, 0, 0, 7834, 7829, 1, 0, 0, 0, 7834, 7833, 1, 0, 0, 0, 7835, 935, 1, 0, 0, 0, 7836, 7837, 5, 131, 0, 0, 7837, 7849, 7, 34, 0, 0, 7838, 7839, 5, 407, 0, 0, 7839, 7849, 7, 34, 0, 0, 7840, 7845, 5, 327, 0, 0, 7841, 7842, 5, 362, 0, 0, 7842, 7846, 5, 201, 0, 0, 7843, 7844, 5, 407, 0, 0, 7844, 7846, 5, 201, 0, 0, 7845, 7841, 1, 0, 0, 0, 7845, 7843, 1, 0, 0, 0, 7845, 7846, 1, 0, 0, 0, 7846, 7849, 1, 0, 0, 0, 7847, 7849, 5, 201, 0, 0, 7848, 7836, 1, 0, 0, 0, 7848, 7838, 1, 0, 0, 0, 7848, 7840, 1, 0, 0, 0, 7848, 7847, 1, 0, 0, 0, 7849, 937, 1, 0, 0, 0, 7850, 7853, 5, 265, 0, 0, 7851, 7853, 1, 0, 0, 0, 7852, 7850, 1, 0, 0, 0, 7852, 7851, 1, 0, 0, 0, 7853, 939, 1, 0, 0, 0, 7854, 7859, 5, 265, 0, 0, 7855, 7856, 5, 465, 0, 0, 7856, 7859, 5, 466, 0, 0, 7857, 7859, 1, 0, 0, 0, 7858, 7854, 1, 0, 0, 0, 7858, 7855, 1, 0, 0, 0, 7858, 7857, 1, 0, 0, 0, 7859, 941, 1, 0, 0, 0, 7860, 7861, 3, 982, 491, 0, 7861, 7862, 5, 362, 0, 0, 7862, 7863, 3, 1080, 540, 0, 7863, 7864, 5, 326, 0, 0, 7864, 7865, 3, 944, 472, 0, 7865, 7866, 3, 1056, 528, 0, 7866, 7867, 3, 1098, 549, 0, 7867, 7868, 3, 918, 459, 0, 7868, 943, 1, 0, 0, 0, 7869, 7874, 3, 946, 473, 0, 7870, 7871, 5, 6, 0, 0, 7871, 7873, 3, 946, 473, 0, 7872, 7870, 1, 0, 0, 0, 7873, 7876, 1, 0, 0, 0, 7874, 7872, 1, 0, 0, 0, 7874, 7875, 1, 0, 0, 0, 7875, 945, 1, 0, 0, 0, 7876, 7874, 1, 0, 0, 0, 7877, 7878, 3, 948, 474, 0, 7878, 7879, 5, 10, 0, 0, 7879, 7880, 3, 1164, 582, 0, 7880, 7888, 1, 0, 0, 0, 7881, 7882, 5, 2, 0, 0, 7882, 7883, 3, 950, 475, 0, 7883, 7884, 5, 3, 0, 0, 7884, 7885, 5, 10, 0, 0, 7885, 7886, 3, 1164, 582, 0, 7886, 7888, 1, 0, 0, 0, 7887, 7877, 1, 0, 0, 0, 7887, 7881, 1, 0, 0, 0, 7888, 947, 1, 0, 0, 0, 7889, 7890, 3, 1374, 687, 0, 7890, 7891, 3, 1328, 664, 0, 7891, 949, 1, 0, 0, 0, 7892, 7897, 3, 948, 474, 0, 7893, 7894, 5, 6, 0, 0, 7894, 7896, 3, 948, 474, 0, 7895, 7893, 1, 0, 0, 0, 7896, 7899, 1, 0, 0, 0, 7897, 7895, 1, 0, 0, 0, 7897, 7898, 1, 0, 0, 0, 7898, 951, 1, 0, 0, 0, 7899, 7897, 1, 0, 0, 0, 7900, 7901, 5, 178, 0, 0, 7901, 7902, 3, 954, 477, 0, 7902, 7903, 3, 956, 478, 0, 7903, 7904, 5, 172, 0, 0, 7904, 7905, 3, 958, 479, 0, 7905, 7906, 5, 62, 0, 0, 7906, 7907, 3, 960, 480, 0, 7907, 953, 1, 0, 0, 0, 7908, 7909, 3, 1342, 671, 0, 7909, 955, 1, 0, 0, 0, 7910, 7911, 5, 262, 0, 0, 7911, 7916, 5, 317, 0, 0, 7912, 7916, 5, 317, 0, 0, 7913, 7916, 5, 107, 0, 0, 7914, 7916, 5, 231, 0, 0, 7915, 7910, 1, 0, 0, 0, 7915, 7912, 1, 0, 0, 0, 7915, 7913, 1, 0, 0, 0, 7915, 7914, 1, 0, 0, 0, 7916, 7919, 1, 0, 0, 0, 7917, 7915, 1, 0, 0, 0, 7917, 7918, 1, 0, 0, 0, 7918, 957, 1, 0, 0, 0, 7919, 7917, 1, 0, 0, 0, 7920, 7926, 1, 0, 0, 0, 7921, 7922, 5, 105, 0, 0, 7922, 7926, 5, 217, 0, 0, 7923, 7924, 5, 372, 0, 0, 7924, 7926, 5, 217, 0, 0, 7925, 7920, 1, 0, 0, 0, 7925, 7921, 1, 0, 0, 0, 7925, 7923, 1, 0, 0, 0, 7926, 959, 1, 0, 0, 0, 7927, 7930, 3, 964, 482, 0, 7928, 7930, 3, 962, 481, 0, 7929, 7927, 1, 0, 0, 0, 7929, 7928, 1, 0, 0, 0, 7930, 961, 1, 0, 0, 0, 7931, 7932, 5, 2, 0, 0, 7932, 7933, 3, 964, 482, 0, 7933, 7934, 5, 3, 0, 0, 7934, 7940, 1, 0, 0, 0, 7935, 7936, 5, 2, 0, 0, 7936, 7937, 3, 962, 481, 0, 7937, 7938, 5, 3, 0, 0, 7938, 7940, 1, 0, 0, 0, 7939, 7931, 1, 0, 0, 0, 7939, 7935, 1, 0, 0, 0, 7940, 963, 1, 0, 0, 0, 7941, 7942, 3, 966, 483, 0, 7942, 7949, 3, 998, 499, 0, 7943, 7944, 3, 1042, 521, 0, 7944, 7945, 3, 1008, 504, 0, 7945, 7950, 1, 0, 0, 0, 7946, 7947, 3, 1006, 503, 0, 7947, 7948, 3, 1044, 522, 0, 7948, 7950, 1, 0, 0, 0, 7949, 7943, 1, 0, 0, 0, 7949, 7946, 1, 0, 0, 0, 7949, 7950, 1, 0, 0, 0, 7950, 7963, 1, 0, 0, 0, 7951, 7952, 3, 974, 487, 0, 7952, 7953, 3, 966, 483, 0, 7953, 7960, 3, 998, 499, 0, 7954, 7955, 3, 1042, 521, 0, 7955, 7956, 3, 1008, 504, 0, 7956, 7961, 1, 0, 0, 0, 7957, 7958, 3, 1006, 503, 0, 7958, 7959, 3, 1044, 522, 0, 7959, 7961, 1, 0, 0, 0, 7960, 7954, 1, 0, 0, 0, 7960, 7957, 1, 0, 0, 0, 7960, 7961, 1, 0, 0, 0, 7961, 7963, 1, 0, 0, 0, 7962, 7941, 1, 0, 0, 0, 7962, 7951, 1, 0, 0, 0, 7963, 965, 1, 0, 0, 0, 7964, 7967, 3, 968, 484, 0, 7965, 7967, 3, 962, 481, 0, 7966, 7964, 1, 0, 0, 0, 7966, 7965, 1, 0, 0, 0, 7967, 967, 1, 0, 0, 0, 7968, 7976, 5, 88, 0, 0, 7969, 7970, 3, 996, 498, 0, 7970, 7971, 3, 984, 492, 0, 7971, 7972, 3, 1330, 665, 0, 7972, 7977, 1, 0, 0, 0, 7973, 7974, 3, 994, 497, 0, 7974, 7975, 3, 1332, 666, 0, 7975, 7977, 1, 0, 0, 0, 7976, 7969, 1, 0, 0, 0, 7976, 7973, 1, 0, 0, 0, 7977, 7978, 1, 0, 0, 0, 7978, 7979, 3, 984, 492, 0, 7979, 7980, 3, 1056, 528, 0, 7980, 7981, 3, 1096, 548, 0, 7981, 7982, 3, 1026, 513, 0, 7982, 7983, 3, 1040, 520, 0, 7983, 7984, 3, 1242, 621, 0, 7984, 7995, 1, 0, 0, 0, 7985, 7995, 3, 1054, 527, 0, 7986, 7987, 5, 92, 0, 0, 7987, 7995, 3, 1076, 538, 0, 7988, 7989, 3, 962, 481, 0, 7989, 7992, 3, 972, 486, 0, 7990, 7993, 3, 968, 484, 0, 7991, 7993, 3, 962, 481, 0, 7992, 7990, 1, 0, 0, 0, 7992, 7991, 1, 0, 0, 0, 7993, 7995, 1, 0, 0, 0, 7994, 7968, 1, 0, 0, 0, 7994, 7985, 1, 0, 0, 0, 7994, 7986, 1, 0, 0, 0, 7994, 7988, 1, 0, 0, 0, 7995, 8003, 1, 0, 0, 0, 7996, 7999, 3, 972, 486, 0, 7997, 8000, 3, 968, 484, 0, 7998, 8000, 3, 962, 481, 0, 7999, 7997, 1, 0, 0, 0, 7999, 7998, 1, 0, 0, 0, 8000, 8002, 1, 0, 0, 0, 8001, 7996, 1, 0, 0, 0, 8002, 8005, 1, 0, 0, 0, 8003, 8001, 1, 0, 0, 0, 8003, 8004, 1, 0, 0, 0, 8004, 969, 1, 0, 0, 0, 8005, 8003, 1, 0, 0, 0, 8006, 8010, 5, 97, 0, 0, 8007, 8010, 5, 70, 0, 0, 8008, 8010, 5, 59, 0, 0, 8009, 8006, 1, 0, 0, 0, 8009, 8007, 1, 0, 0, 0, 8009, 8008, 1, 0, 0, 0, 8010, 971, 1, 0, 0, 0, 8011, 8012, 3, 970, 485, 0, 8012, 8013, 3, 992, 496, 0, 8013, 973, 1, 0, 0, 0, 8014, 8016, 5, 105, 0, 0, 8015, 8017, 5, 296, 0, 0, 8016, 8015, 1, 0, 0, 0, 8016, 8017, 1, 0, 0, 0, 8017, 8018, 1, 0, 0, 0, 8018, 8019, 3, 976, 488, 0, 8019, 975, 1, 0, 0, 0, 8020, 8025, 3, 978, 489, 0, 8021, 8022, 5, 6, 0, 0, 8022, 8024, 3, 978, 489, 0, 8023, 8021, 1, 0, 0, 0, 8024, 8027, 1, 0, 0, 0, 8025, 8023, 1, 0, 0, 0, 8025, 8026, 1, 0, 0, 0, 8026, 977, 1, 0, 0, 0, 8027, 8025, 1, 0, 0, 0, 8028, 8029, 3, 1342, 671, 0, 8029, 8030, 3, 870, 435, 0, 8030, 8031, 5, 36, 0, 0, 8031, 8032, 3, 980, 490, 0, 8032, 8033, 5, 2, 0, 0, 8033, 8034, 3, 894, 447, 0, 8034, 8035, 5, 3, 0, 0, 8035, 979, 1, 0, 0, 0, 8036, 8041, 5, 251, 0, 0, 8037, 8038, 5, 77, 0, 0, 8038, 8041, 5, 251, 0, 0, 8039, 8041, 1, 0, 0, 0, 8040, 8036, 1, 0, 0, 0, 8040, 8037, 1, 0, 0, 0, 8040, 8039, 1, 0, 0, 0, 8041, 981, 1, 0, 0, 0, 8042, 8045, 3, 974, 487, 0, 8043, 8045, 1, 0, 0, 0, 8044, 8042, 1, 0, 0, 0, 8044, 8043, 1, 0, 0, 0, 8045, 983, 1, 0, 0, 0, 8046, 8051, 5, 71, 0, 0, 8047, 8048, 3, 986, 493, 0, 8048, 8049, 3, 988, 494, 0, 8049, 8052, 1, 0, 0, 0, 8050, 8052, 3, 1568, 784, 0, 8051, 8047, 1, 0, 0, 0, 8051, 8050, 1, 0, 0, 0, 8052, 8055, 1, 0, 0, 0, 8053, 8055, 1, 0, 0, 0, 8054, 8046, 1, 0, 0, 0, 8054, 8053, 1, 0, 0, 0, 8055, 985, 1, 0, 0, 0, 8056, 8059, 1, 0, 0, 0, 8057, 8059, 5, 339, 0, 0, 8058, 8056, 1, 0, 0, 0, 8058, 8057, 1, 0, 0, 0, 8059, 987, 1, 0, 0, 0, 8060, 8062, 7, 35, 0, 0, 8061, 8060, 1, 0, 0, 0, 8061, 8062, 1, 0, 0, 0, 8062, 8063, 1, 0, 0, 0, 8063, 8064, 7, 11, 0, 0, 8064, 8065, 3, 990, 495, 0, 8065, 8066, 3, 1338, 669, 0, 8066, 8075, 1, 0, 0, 0, 8067, 8068, 5, 360, 0, 0, 8068, 8069, 3, 990, 495, 0, 8069, 8070, 3, 1338, 669, 0, 8070, 8075, 1, 0, 0, 0, 8071, 8072, 5, 92, 0, 0, 8072, 8075, 3, 1338, 669, 0, 8073, 8075, 3, 1338, 669, 0, 8074, 8061, 1, 0, 0, 0, 8074, 8067, 1, 0, 0, 0, 8074, 8071, 1, 0, 0, 0, 8074, 8073, 1, 0, 0, 0, 8075, 989, 1, 0, 0, 0, 8076, 8079, 5, 92, 0, 0, 8077, 8079, 1, 0, 0, 0, 8078, 8076, 1, 0, 0, 0, 8078, 8077, 1, 0, 0, 0, 8079, 991, 1, 0, 0, 0, 8080, 8084, 5, 30, 0, 0, 8081, 8084, 5, 56, 0, 0, 8082, 8084, 1, 0, 0, 0, 8083, 8080, 1, 0, 0, 0, 8083, 8081, 1, 0, 0, 0, 8083, 8082, 1, 0, 0, 0, 8084, 993, 1, 0, 0, 0, 8085, 8091, 5, 56, 0, 0, 8086, 8087, 5, 80, 0, 0, 8087, 8088, 5, 2, 0, 0, 8088, 8089, 3, 1282, 641, 0, 8089, 8090, 5, 3, 0, 0, 8090, 8092, 1, 0, 0, 0, 8091, 8086, 1, 0, 0, 0, 8091, 8092, 1, 0, 0, 0, 8092, 995, 1, 0, 0, 0, 8093, 8096, 5, 30, 0, 0, 8094, 8096, 1, 0, 0, 0, 8095, 8093, 1, 0, 0, 0, 8095, 8094, 1, 0, 0, 0, 8096, 997, 1, 0, 0, 0, 8097, 8100, 3, 1000, 500, 0, 8098, 8100, 1, 0, 0, 0, 8099, 8097, 1, 0, 0, 0, 8099, 8098, 1, 0, 0, 0, 8100, 999, 1, 0, 0, 0, 8101, 8102, 5, 83, 0, 0, 8102, 8103, 5, 147, 0, 0, 8103, 8104, 3, 1002, 501, 0, 8104, 1001, 1, 0, 0, 0, 8105, 8110, 3, 1004, 502, 0, 8106, 8107, 5, 6, 0, 0, 8107, 8109, 3, 1004, 502, 0, 8108, 8106, 1, 0, 0, 0, 8109, 8112, 1, 0, 0, 0, 8110, 8108, 1, 0, 0, 0, 8110, 8111, 1, 0, 0, 0, 8111, 1003, 1, 0, 0, 0, 8112, 8110, 1, 0, 0, 0, 8113, 8117, 3, 1164, 582, 0, 8114, 8115, 5, 100, 0, 0, 8115, 8118, 3, 1278, 639, 0, 8116, 8118, 3, 612, 306, 0, 8117, 8114, 1, 0, 0, 0, 8117, 8116, 1, 0, 0, 0, 8118, 8119, 1, 0, 0, 0, 8119, 8120, 3, 614, 307, 0, 8120, 1005, 1, 0, 0, 0, 8121, 8123, 3, 1010, 505, 0, 8122, 8124, 3, 1012, 506, 0, 8123, 8122, 1, 0, 0, 0, 8123, 8124, 1, 0, 0, 0, 8124, 8130, 1, 0, 0, 0, 8125, 8127, 3, 1012, 506, 0, 8126, 8128, 3, 1010, 505, 0, 8127, 8126, 1, 0, 0, 0, 8127, 8128, 1, 0, 0, 0, 8128, 8130, 1, 0, 0, 0, 8129, 8121, 1, 0, 0, 0, 8129, 8125, 1, 0, 0, 0, 8130, 1007, 1, 0, 0, 0, 8131, 8134, 3, 1006, 503, 0, 8132, 8134, 1, 0, 0, 0, 8133, 8131, 1, 0, 0, 0, 8133, 8132, 1, 0, 0, 0, 8134, 1009, 1, 0, 0, 0, 8135, 8136, 5, 74, 0, 0, 8136, 8139, 3, 1014, 507, 0, 8137, 8138, 5, 6, 0, 0, 8138, 8140, 3, 1016, 508, 0, 8139, 8137, 1, 0, 0, 0, 8139, 8140, 1, 0, 0, 0, 8140, 8159, 1, 0, 0, 0, 8141, 8142, 5, 61, 0, 0, 8142, 8156, 3, 1024, 512, 0, 8143, 8144, 3, 1018, 509, 0, 8144, 8148, 3, 1022, 511, 0, 8145, 8149, 5, 81, 0, 0, 8146, 8147, 5, 105, 0, 0, 8147, 8149, 5, 467, 0, 0, 8148, 8145, 1, 0, 0, 0, 8148, 8146, 1, 0, 0, 0, 8149, 8157, 1, 0, 0, 0, 8150, 8154, 3, 1022, 511, 0, 8151, 8155, 5, 81, 0, 0, 8152, 8153, 5, 105, 0, 0, 8153, 8155, 5, 467, 0, 0, 8154, 8151, 1, 0, 0, 0, 8154, 8152, 1, 0, 0, 0, 8155, 8157, 1, 0, 0, 0, 8156, 8143, 1, 0, 0, 0, 8156, 8150, 1, 0, 0, 0, 8157, 8159, 1, 0, 0, 0, 8158, 8135, 1, 0, 0, 0, 8158, 8141, 1, 0, 0, 0, 8159, 1011, 1, 0, 0, 0, 8160, 8165, 5, 79, 0, 0, 8161, 8166, 3, 1016, 508, 0, 8162, 8163, 3, 1018, 509, 0, 8163, 8164, 3, 1022, 511, 0, 8164, 8166, 1, 0, 0, 0, 8165, 8161, 1, 0, 0, 0, 8165, 8162, 1, 0, 0, 0, 8166, 1013, 1, 0, 0, 0, 8167, 8170, 3, 1164, 582, 0, 8168, 8170, 5, 30, 0, 0, 8169, 8167, 1, 0, 0, 0, 8169, 8168, 1, 0, 0, 0, 8170, 1015, 1, 0, 0, 0, 8171, 8172, 3, 1164, 582, 0, 8172, 1017, 1, 0, 0, 0, 8173, 8179, 3, 1208, 604, 0, 8174, 8175, 5, 12, 0, 0, 8175, 8179, 3, 1020, 510, 0, 8176, 8177, 5, 13, 0, 0, 8177, 8179, 3, 1020, 510, 0, 8178, 8173, 1, 0, 0, 0, 8178, 8174, 1, 0, 0, 0, 8178, 8176, 1, 0, 0, 0, 8179, 1019, 1, 0, 0, 0, 8180, 8183, 3, 1358, 679, 0, 8181, 8183, 3, 1356, 678, 0, 8182, 8180, 1, 0, 0, 0, 8182, 8181, 1, 0, 0, 0, 8183, 1021, 1, 0, 0, 0, 8184, 8185, 7, 36, 0, 0, 8185, 1023, 1, 0, 0, 0, 8186, 8187, 7, 37, 0, 0, 8187, 1025, 1, 0, 0, 0, 8188, 8189, 5, 66, 0, 0, 8189, 8190, 5, 147, 0, 0, 8190, 8193, 3, 1028, 514, 0, 8191, 8193, 1, 0, 0, 0, 8192, 8188, 1, 0, 0, 0, 8192, 8191, 1, 0, 0, 0, 8193, 1027, 1, 0, 0, 0, 8194, 8199, 3, 1030, 515, 0, 8195, 8196, 5, 6, 0, 0, 8196, 8198, 3, 1030, 515, 0, 8197, 8195, 1, 0, 0, 0, 8198, 8201, 1, 0, 0, 0, 8199, 8197, 1, 0, 0, 0, 8199, 8200, 1, 0, 0, 0, 8200, 1029, 1, 0, 0, 0, 8201, 8199, 1, 0, 0, 0, 8202, 8208, 3, 1164, 582, 0, 8203, 8208, 3, 1032, 516, 0, 8204, 8208, 3, 1036, 518, 0, 8205, 8208, 3, 1034, 517, 0, 8206, 8208, 3, 1038, 519, 0, 8207, 8202, 1, 0, 0, 0, 8207, 8203, 1, 0, 0, 0, 8207, 8204, 1, 0, 0, 0, 8207, 8205, 1, 0, 0, 0, 8207, 8206, 1, 0, 0, 0, 8208, 1031, 1, 0, 0, 0, 8209, 8210, 5, 2, 0, 0, 8210, 8211, 5, 3, 0, 0, 8211, 1033, 1, 0, 0, 0, 8212, 8213, 5, 468, 0, 0, 8213, 8214, 5, 2, 0, 0, 8214, 8215, 3, 1282, 641, 0, 8215, 8216, 5, 3, 0, 0, 8216, 1035, 1, 0, 0, 0, 8217, 8218, 5, 469, 0, 0, 8218, 8219, 5, 2, 0, 0, 8219, 8220, 3, 1282, 641, 0, 8220, 8221, 5, 3, 0, 0, 8221, 1037, 1, 0, 0, 0, 8222, 8223, 5, 470, 0, 0, 8223, 8224, 5, 471, 0, 0, 8224, 8225, 5, 2, 0, 0, 8225, 8226, 3, 1028, 514, 0, 8226, 8227, 5, 3, 0, 0, 8227, 1039, 1, 0, 0, 0, 8228, 8229, 5, 67, 0, 0, 8229, 8232, 3, 1164, 582, 0, 8230, 8232, 1, 0, 0, 0, 8231, 8228, 1, 0, 0, 0, 8231, 8230, 1, 0, 0, 0, 8232, 1041, 1, 0, 0, 0, 8233, 8238, 3, 1046, 523, 0, 8234, 8235, 5, 62, 0, 0, 8235, 8236, 5, 293, 0, 0, 8236, 8238, 5, 81, 0, 0, 8237, 8233, 1, 0, 0, 0, 8237, 8234, 1, 0, 0, 0, 8238, 1043, 1, 0, 0, 0, 8239, 8242, 3, 1042, 521, 0, 8240, 8242, 1, 0, 0, 0, 8241, 8239, 1, 0, 0, 0, 8241, 8240, 1, 0, 0, 0, 8242, 1045, 1, 0, 0, 0, 8243, 8245, 3, 1048, 524, 0, 8244, 8243, 1, 0, 0, 0, 8245, 8246, 1, 0, 0, 0, 8246, 8244, 1, 0, 0, 0, 8246, 8247, 1, 0, 0, 0, 8247, 1047, 1, 0, 0, 0, 8248, 8249, 3, 1050, 525, 0, 8249, 8250, 3, 1052, 526, 0, 8250, 8251, 3, 940, 470, 0, 8251, 1049, 1, 0, 0, 0, 8252, 8262, 5, 62, 0, 0, 8253, 8254, 5, 262, 0, 0, 8254, 8256, 5, 236, 0, 0, 8255, 8253, 1, 0, 0, 0, 8255, 8256, 1, 0, 0, 0, 8256, 8257, 1, 0, 0, 0, 8257, 8263, 5, 362, 0, 0, 8258, 8260, 5, 236, 0, 0, 8259, 8258, 1, 0, 0, 0, 8259, 8260, 1, 0, 0, 0, 8260, 8261, 1, 0, 0, 0, 8261, 8263, 5, 327, 0, 0, 8262, 8255, 1, 0, 0, 0, 8262, 8259, 1, 0, 0, 0, 8263, 1051, 1, 0, 0, 0, 8264, 8265, 5, 268, 0, 0, 8265, 8268, 3, 1336, 668, 0, 8266, 8268, 1, 0, 0, 0, 8267, 8264, 1, 0, 0, 0, 8267, 8266, 1, 0, 0, 0, 8268, 1053, 1, 0, 0, 0, 8269, 8270, 5, 415, 0, 0, 8270, 8271, 5, 2, 0, 0, 8271, 8272, 3, 1282, 641, 0, 8272, 8280, 5, 3, 0, 0, 8273, 8274, 5, 6, 0, 0, 8274, 8275, 5, 2, 0, 0, 8275, 8276, 3, 1282, 641, 0, 8276, 8277, 5, 3, 0, 0, 8277, 8279, 1, 0, 0, 0, 8278, 8273, 1, 0, 0, 0, 8279, 8282, 1, 0, 0, 0, 8280, 8278, 1, 0, 0, 0, 8280, 8281, 1, 0, 0, 0, 8281, 1055, 1, 0, 0, 0, 8282, 8280, 1, 0, 0, 0, 8283, 8284, 5, 64, 0, 0, 8284, 8287, 3, 1058, 529, 0, 8285, 8287, 1, 0, 0, 0, 8286, 8283, 1, 0, 0, 0, 8286, 8285, 1, 0, 0, 0, 8287, 1057, 1, 0, 0, 0, 8288, 8298, 3, 1060, 530, 0, 8289, 8294, 3, 1062, 531, 0, 8290, 8291, 5, 6, 0, 0, 8291, 8293, 3, 1062, 531, 0, 8292, 8290, 1, 0, 0, 0, 8293, 8296, 1, 0, 0, 0, 8294, 8292, 1, 0, 0, 0, 8294, 8295, 1, 0, 0, 0, 8295, 8298, 1, 0, 0, 0, 8296, 8294, 1, 0, 0, 0, 8297, 8288, 1, 0, 0, 0, 8297, 8289, 1, 0, 0, 0, 8298, 1059, 1, 0, 0, 0, 8299, 8302, 3, 1062, 531, 0, 8300, 8301, 5, 6, 0, 0, 8301, 8303, 3, 1062, 531, 0, 8302, 8300, 1, 0, 0, 0, 8303, 8304, 1, 0, 0, 0, 8304, 8302, 1, 0, 0, 0, 8304, 8305, 1, 0, 0, 0, 8305, 1061, 1, 0, 0, 0, 8306, 8307, 3, 1076, 538, 0, 8307, 8309, 3, 1066, 533, 0, 8308, 8310, 3, 1082, 541, 0, 8309, 8308, 1, 0, 0, 0, 8309, 8310, 1, 0, 0, 0, 8310, 8356, 1, 0, 0, 0, 8311, 8312, 3, 1086, 543, 0, 8312, 8313, 3, 1070, 535, 0, 8313, 8356, 1, 0, 0, 0, 8314, 8315, 3, 1106, 553, 0, 8315, 8316, 3, 1066, 533, 0, 8316, 8356, 1, 0, 0, 0, 8317, 8318, 3, 962, 481, 0, 8318, 8319, 3, 1066, 533, 0, 8319, 8356, 1, 0, 0, 0, 8320, 8330, 5, 72, 0, 0, 8321, 8322, 3, 1106, 553, 0, 8322, 8323, 3, 1066, 533, 0, 8323, 8331, 1, 0, 0, 0, 8324, 8325, 3, 1086, 543, 0, 8325, 8326, 3, 1070, 535, 0, 8326, 8331, 1, 0, 0, 0, 8327, 8328, 3, 962, 481, 0, 8328, 8329, 3, 1066, 533, 0, 8329, 8331, 1, 0, 0, 0, 8330, 8321, 1, 0, 0, 0, 8330, 8324, 1, 0, 0, 0, 8330, 8327, 1, 0, 0, 0, 8331, 8356, 1, 0, 0, 0, 8332, 8333, 5, 2, 0, 0, 8333, 8350, 3, 1062, 531, 0, 8334, 8335, 5, 110, 0, 0, 8335, 8336, 5, 118, 0, 0, 8336, 8351, 3, 1062, 531, 0, 8337, 8339, 5, 121, 0, 0, 8338, 8340, 3, 1072, 536, 0, 8339, 8338, 1, 0, 0, 0, 8339, 8340, 1, 0, 0, 0, 8340, 8341, 1, 0, 0, 0, 8341, 8342, 5, 118, 0, 0, 8342, 8351, 3, 1062, 531, 0, 8343, 8345, 3, 1072, 536, 0, 8344, 8343, 1, 0, 0, 0, 8344, 8345, 1, 0, 0, 0, 8345, 8346, 1, 0, 0, 0, 8346, 8347, 5, 118, 0, 0, 8347, 8348, 3, 1062, 531, 0, 8348, 8349, 3, 1074, 537, 0, 8349, 8351, 1, 0, 0, 0, 8350, 8334, 1, 0, 0, 0, 8350, 8337, 1, 0, 0, 0, 8350, 8344, 1, 0, 0, 0, 8350, 8351, 1, 0, 0, 0, 8351, 8352, 1, 0, 0, 0, 8352, 8353, 5, 3, 0, 0, 8353, 8354, 3, 1066, 533, 0, 8354, 8356, 1, 0, 0, 0, 8355, 8306, 1, 0, 0, 0, 8355, 8311, 1, 0, 0, 0, 8355, 8314, 1, 0, 0, 0, 8355, 8317, 1, 0, 0, 0, 8355, 8320, 1, 0, 0, 0, 8355, 8332, 1, 0, 0, 0, 8356, 8375, 1, 0, 0, 0, 8357, 8358, 5, 110, 0, 0, 8358, 8359, 5, 118, 0, 0, 8359, 8374, 3, 1062, 531, 0, 8360, 8362, 5, 121, 0, 0, 8361, 8363, 3, 1072, 536, 0, 8362, 8361, 1, 0, 0, 0, 8362, 8363, 1, 0, 0, 0, 8363, 8364, 1, 0, 0, 0, 8364, 8365, 5, 118, 0, 0, 8365, 8374, 3, 1062, 531, 0, 8366, 8368, 3, 1072, 536, 0, 8367, 8366, 1, 0, 0, 0, 8367, 8368, 1, 0, 0, 0, 8368, 8369, 1, 0, 0, 0, 8369, 8370, 5, 118, 0, 0, 8370, 8371, 3, 1062, 531, 0, 8371, 8372, 3, 1074, 537, 0, 8372, 8374, 1, 0, 0, 0, 8373, 8357, 1, 0, 0, 0, 8373, 8360, 1, 0, 0, 0, 8373, 8367, 1, 0, 0, 0, 8374, 8377, 1, 0, 0, 0, 8375, 8373, 1, 0, 0, 0, 8375, 8376, 1, 0, 0, 0, 8376, 1063, 1, 0, 0, 0, 8377, 8375, 1, 0, 0, 0, 8378, 8380, 5, 36, 0, 0, 8379, 8378, 1, 0, 0, 0, 8379, 8380, 1, 0, 0, 0, 8380, 8381, 1, 0, 0, 0, 8381, 8386, 3, 1374, 687, 0, 8382, 8383, 5, 2, 0, 0, 8383, 8384, 3, 1340, 670, 0, 8384, 8385, 5, 3, 0, 0, 8385, 8387, 1, 0, 0, 0, 8386, 8382, 1, 0, 0, 0, 8386, 8387, 1, 0, 0, 0, 8387, 1065, 1, 0, 0, 0, 8388, 8391, 3, 1068, 534, 0, 8389, 8391, 1, 0, 0, 0, 8390, 8388, 1, 0, 0, 0, 8390, 8389, 1, 0, 0, 0, 8391, 1067, 1, 0, 0, 0, 8392, 8394, 5, 36, 0, 0, 8393, 8392, 1, 0, 0, 0, 8393, 8394, 1, 0, 0, 0, 8394, 8395, 1, 0, 0, 0, 8395, 8400, 3, 1376, 688, 0, 8396, 8397, 5, 2, 0, 0, 8397, 8398, 3, 1340, 670, 0, 8398, 8399, 5, 3, 0, 0, 8399, 8401, 1, 0, 0, 0, 8400, 8396, 1, 0, 0, 0, 8400, 8401, 1, 0, 0, 0, 8401, 1069, 1, 0, 0, 0, 8402, 8416, 3, 1064, 532, 0, 8403, 8405, 5, 36, 0, 0, 8404, 8406, 3, 1374, 687, 0, 8405, 8404, 1, 0, 0, 0, 8405, 8406, 1, 0, 0, 0, 8406, 8409, 1, 0, 0, 0, 8407, 8409, 3, 1374, 687, 0, 8408, 8403, 1, 0, 0, 0, 8408, 8407, 1, 0, 0, 0, 8409, 8410, 1, 0, 0, 0, 8410, 8411, 5, 2, 0, 0, 8411, 8412, 3, 1102, 551, 0, 8412, 8413, 5, 3, 0, 0, 8413, 8416, 1, 0, 0, 0, 8414, 8416, 1, 0, 0, 0, 8415, 8402, 1, 0, 0, 0, 8415, 8408, 1, 0, 0, 0, 8415, 8414, 1, 0, 0, 0, 8416, 1071, 1, 0, 0, 0, 8417, 8419, 7, 38, 0, 0, 8418, 8420, 5, 123, 0, 0, 8419, 8418, 1, 0, 0, 0, 8419, 8420, 1, 0, 0, 0, 8420, 1073, 1, 0, 0, 0, 8421, 8422, 5, 100, 0, 0, 8422, 8423, 5, 2, 0, 0, 8423, 8424, 3, 1340, 670, 0, 8424, 8425, 5, 3, 0, 0, 8425, 8429, 1, 0, 0, 0, 8426, 8427, 5, 80, 0, 0, 8427, 8429, 3, 1164, 582, 0, 8428, 8421, 1, 0, 0, 0, 8428, 8426, 1, 0, 0, 0, 8429, 1075, 1, 0, 0, 0, 8430, 8432, 3, 1338, 669, 0, 8431, 8433, 5, 9, 0, 0, 8432, 8431, 1, 0, 0, 0, 8432, 8433, 1, 0, 0, 0, 8433, 8443, 1, 0, 0, 0, 8434, 8440, 5, 81, 0, 0, 8435, 8441, 3, 1338, 669, 0, 8436, 8437, 5, 2, 0, 0, 8437, 8438, 3, 1338, 669, 0, 8438, 8439, 5, 3, 0, 0, 8439, 8441, 1, 0, 0, 0, 8440, 8435, 1, 0, 0, 0, 8440, 8436, 1, 0, 0, 0, 8441, 8443, 1, 0, 0, 0, 8442, 8430, 1, 0, 0, 0, 8442, 8434, 1, 0, 0, 0, 8443, 1077, 1, 0, 0, 0, 8444, 8449, 3, 1076, 538, 0, 8445, 8446, 5, 6, 0, 0, 8446, 8448, 3, 1076, 538, 0, 8447, 8445, 1, 0, 0, 0, 8448, 8451, 1, 0, 0, 0, 8449, 8447, 1, 0, 0, 0, 8449, 8450, 1, 0, 0, 0, 8450, 1079, 1, 0, 0, 0, 8451, 8449, 1, 0, 0, 0, 8452, 8457, 3, 1076, 538, 0, 8453, 8455, 5, 36, 0, 0, 8454, 8453, 1, 0, 0, 0, 8454, 8455, 1, 0, 0, 0, 8455, 8456, 1, 0, 0, 0, 8456, 8458, 3, 1374, 687, 0, 8457, 8454, 1, 0, 0, 0, 8457, 8458, 1, 0, 0, 0, 8458, 1081, 1, 0, 0, 0, 8459, 8460, 5, 472, 0, 0, 8460, 8461, 3, 1348, 674, 0, 8461, 8462, 5, 2, 0, 0, 8462, 8463, 3, 1282, 641, 0, 8463, 8464, 5, 3, 0, 0, 8464, 8465, 3, 1084, 542, 0, 8465, 1083, 1, 0, 0, 0, 8466, 8467, 5, 303, 0, 0, 8467, 8468, 5, 2, 0, 0, 8468, 8469, 3, 1164, 582, 0, 8469, 8470, 5, 3, 0, 0, 8470, 8473, 1, 0, 0, 0, 8471, 8473, 1, 0, 0, 0, 8472, 8466, 1, 0, 0, 0, 8472, 8471, 1, 0, 0, 0, 8473, 1085, 1, 0, 0, 0, 8474, 8475, 3, 1216, 608, 0, 8475, 8476, 3, 1094, 547, 0, 8476, 8485, 1, 0, 0, 0, 8477, 8478, 5, 313, 0, 0, 8478, 8479, 5, 64, 0, 0, 8479, 8480, 5, 2, 0, 0, 8480, 8481, 3, 1090, 545, 0, 8481, 8482, 5, 3, 0, 0, 8482, 8483, 3, 1094, 547, 0, 8483, 8485, 1, 0, 0, 0, 8484, 8474, 1, 0, 0, 0, 8484, 8477, 1, 0, 0, 0, 8485, 1087, 1, 0, 0, 0, 8486, 8487, 3, 1216, 608, 0, 8487, 8488, 3, 1092, 546, 0, 8488, 1089, 1, 0, 0, 0, 8489, 8494, 3, 1088, 544, 0, 8490, 8491, 5, 6, 0, 0, 8491, 8493, 3, 1088, 544, 0, 8492, 8490, 1, 0, 0, 0, 8493, 8496, 1, 0, 0, 0, 8494, 8492, 1, 0, 0, 0, 8494, 8495, 1, 0, 0, 0, 8495, 1091, 1, 0, 0, 0, 8496, 8494, 1, 0, 0, 0, 8497, 8498, 5, 36, 0, 0, 8498, 8499, 5, 2, 0, 0, 8499, 8500, 3, 1102, 551, 0, 8500, 8501, 5, 3, 0, 0, 8501, 8504, 1, 0, 0, 0, 8502, 8504, 1, 0, 0, 0, 8503, 8497, 1, 0, 0, 0, 8503, 8502, 1, 0, 0, 0, 8504, 1093, 1, 0, 0, 0, 8505, 8506, 5, 105, 0, 0, 8506, 8509, 5, 473, 0, 0, 8507, 8509, 1, 0, 0, 0, 8508, 8505, 1, 0, 0, 0, 8508, 8507, 1, 0, 0, 0, 8509, 1095, 1, 0, 0, 0, 8510, 8511, 5, 103, 0, 0, 8511, 8514, 3, 1164, 582, 0, 8512, 8514, 1, 0, 0, 0, 8513, 8510, 1, 0, 0, 0, 8513, 8512, 1, 0, 0, 0, 8514, 1097, 1, 0, 0, 0, 8515, 8520, 5, 103, 0, 0, 8516, 8517, 5, 434, 0, 0, 8517, 8518, 5, 268, 0, 0, 8518, 8521, 3, 954, 477, 0, 8519, 8521, 3, 1164, 582, 0, 8520, 8516, 1, 0, 0, 0, 8520, 8519, 1, 0, 0, 0, 8521, 8524, 1, 0, 0, 0, 8522, 8524, 1, 0, 0, 0, 8523, 8515, 1, 0, 0, 0, 8523, 8522, 1, 0, 0, 0, 8524, 1099, 1, 0, 0, 0, 8525, 8528, 3, 1102, 551, 0, 8526, 8528, 1, 0, 0, 0, 8527, 8525, 1, 0, 0, 0, 8527, 8526, 1, 0, 0, 0, 8528, 1101, 1, 0, 0, 0, 8529, 8534, 3, 1104, 552, 0, 8530, 8531, 5, 6, 0, 0, 8531, 8533, 3, 1104, 552, 0, 8532, 8530, 1, 0, 0, 0, 8533, 8536, 1, 0, 0, 0, 8534, 8532, 1, 0, 0, 0, 8534, 8535, 1, 0, 0, 0, 8535, 1103, 1, 0, 0, 0, 8536, 8534, 1, 0, 0, 0, 8537, 8538, 3, 1374, 687, 0, 8538, 8539, 3, 1120, 560, 0, 8539, 8540, 3, 110, 55, 0, 8540, 1105, 1, 0, 0, 0, 8541, 8542, 5, 474, 0, 0, 8542, 8558, 5, 2, 0, 0, 8543, 8544, 3, 1208, 604, 0, 8544, 8545, 3, 1234, 617, 0, 8545, 8546, 5, 475, 0, 0, 8546, 8547, 3, 1108, 554, 0, 8547, 8559, 1, 0, 0, 0, 8548, 8549, 5, 476, 0, 0, 8549, 8550, 5, 2, 0, 0, 8550, 8551, 3, 1116, 558, 0, 8551, 8552, 5, 3, 0, 0, 8552, 8553, 5, 6, 0, 0, 8553, 8554, 3, 1208, 604, 0, 8554, 8555, 3, 1234, 617, 0, 8555, 8556, 5, 475, 0, 0, 8556, 8557, 3, 1108, 554, 0, 8557, 8559, 1, 0, 0, 0, 8558, 8543, 1, 0, 0, 0, 8558, 8548, 1, 0, 0, 0, 8559, 8560, 1, 0, 0, 0, 8560, 8561, 5, 3, 0, 0, 8561, 1107, 1, 0, 0, 0, 8562, 8567, 3, 1110, 555, 0, 8563, 8564, 5, 6, 0, 0, 8564, 8566, 3, 1110, 555, 0, 8565, 8563, 1, 0, 0, 0, 8566, 8569, 1, 0, 0, 0, 8567, 8565, 1, 0, 0, 0, 8567, 8568, 1, 0, 0, 0, 8568, 1109, 1, 0, 0, 0, 8569, 8567, 1, 0, 0, 0, 8570, 8577, 3, 1374, 687, 0, 8571, 8573, 3, 1120, 560, 0, 8572, 8574, 3, 1112, 556, 0, 8573, 8572, 1, 0, 0, 0, 8573, 8574, 1, 0, 0, 0, 8574, 8578, 1, 0, 0, 0, 8575, 8576, 5, 62, 0, 0, 8576, 8578, 5, 473, 0, 0, 8577, 8571, 1, 0, 0, 0, 8577, 8575, 1, 0, 0, 0, 8578, 1111, 1, 0, 0, 0, 8579, 8581, 3, 1114, 557, 0, 8580, 8579, 1, 0, 0, 0, 8581, 8582, 1, 0, 0, 0, 8582, 8580, 1, 0, 0, 0, 8582, 8583, 1, 0, 0, 0, 8583, 1113, 1, 0, 0, 0, 8584, 8585, 5, 53, 0, 0, 8585, 8593, 3, 1164, 582, 0, 8586, 8587, 3, 1384, 692, 0, 8587, 8588, 3, 1164, 582, 0, 8588, 8593, 1, 0, 0, 0, 8589, 8590, 5, 77, 0, 0, 8590, 8593, 5, 78, 0, 0, 8591, 8593, 5, 78, 0, 0, 8592, 8584, 1, 0, 0, 0, 8592, 8586, 1, 0, 0, 0, 8592, 8589, 1, 0, 0, 0, 8592, 8591, 1, 0, 0, 0, 8593, 1115, 1, 0, 0, 0, 8594, 8599, 3, 1118, 559, 0, 8595, 8596, 5, 6, 0, 0, 8596, 8598, 3, 1118, 559, 0, 8597, 8595, 1, 0, 0, 0, 8598, 8601, 1, 0, 0, 0, 8599, 8597, 1, 0, 0, 0, 8599, 8600, 1, 0, 0, 0, 8600, 1117, 1, 0, 0, 0, 8601, 8599, 1, 0, 0, 0, 8602, 8603, 3, 1206, 603, 0, 8603, 8604, 5, 36, 0, 0, 8604, 8605, 3, 1382, 691, 0, 8605, 8609, 1, 0, 0, 0, 8606, 8607, 5, 53, 0, 0, 8607, 8609, 3, 1206, 603, 0, 8608, 8602, 1, 0, 0, 0, 8608, 8606, 1, 0, 0, 0, 8609, 1119, 1, 0, 0, 0, 8610, 8612, 5, 408, 0, 0, 8611, 8610, 1, 0, 0, 0, 8611, 8612, 1, 0, 0, 0, 8612, 8613, 1, 0, 0, 0, 8613, 8622, 3, 1124, 562, 0, 8614, 8623, 3, 1122, 561, 0, 8615, 8620, 5, 35, 0, 0, 8616, 8617, 5, 4, 0, 0, 8617, 8618, 3, 1358, 679, 0, 8618, 8619, 5, 5, 0, 0, 8619, 8621, 1, 0, 0, 0, 8620, 8616, 1, 0, 0, 0, 8620, 8621, 1, 0, 0, 0, 8621, 8623, 1, 0, 0, 0, 8622, 8614, 1, 0, 0, 0, 8622, 8615, 1, 0, 0, 0, 8623, 8629, 1, 0, 0, 0, 8624, 8625, 3, 1338, 669, 0, 8625, 8626, 5, 27, 0, 0, 8626, 8627, 7, 39, 0, 0, 8627, 8629, 1, 0, 0, 0, 8628, 8611, 1, 0, 0, 0, 8628, 8624, 1, 0, 0, 0, 8629, 1121, 1, 0, 0, 0, 8630, 8632, 5, 4, 0, 0, 8631, 8633, 3, 1358, 679, 0, 8632, 8631, 1, 0, 0, 0, 8632, 8633, 1, 0, 0, 0, 8633, 8634, 1, 0, 0, 0, 8634, 8636, 5, 5, 0, 0, 8635, 8630, 1, 0, 0, 0, 8636, 8639, 1, 0, 0, 0, 8637, 8635, 1, 0, 0, 0, 8637, 8638, 1, 0, 0, 0, 8638, 1123, 1, 0, 0, 0, 8639, 8637, 1, 0, 0, 0, 8640, 8654, 3, 1128, 564, 0, 8641, 8654, 3, 1132, 566, 0, 8642, 8654, 3, 1136, 568, 0, 8643, 8654, 3, 1144, 572, 0, 8644, 8654, 3, 1152, 576, 0, 8645, 8651, 3, 1154, 577, 0, 8646, 8652, 3, 1158, 579, 0, 8647, 8648, 5, 2, 0, 0, 8648, 8649, 3, 1358, 679, 0, 8649, 8650, 5, 3, 0, 0, 8650, 8652, 1, 0, 0, 0, 8651, 8646, 1, 0, 0, 0, 8651, 8647, 1, 0, 0, 0, 8652, 8654, 1, 0, 0, 0, 8653, 8640, 1, 0, 0, 0, 8653, 8641, 1, 0, 0, 0, 8653, 8642, 1, 0, 0, 0, 8653, 8643, 1, 0, 0, 0, 8653, 8644, 1, 0, 0, 0, 8653, 8645, 1, 0, 0, 0, 8654, 1125, 1, 0, 0, 0, 8655, 8660, 3, 1132, 566, 0, 8656, 8660, 3, 1138, 569, 0, 8657, 8660, 3, 1146, 573, 0, 8658, 8660, 3, 1152, 576, 0, 8659, 8655, 1, 0, 0, 0, 8659, 8656, 1, 0, 0, 0, 8659, 8657, 1, 0, 0, 0, 8659, 8658, 1, 0, 0, 0, 8660, 1127, 1, 0, 0, 0, 8661, 8666, 3, 1396, 698, 0, 8662, 8666, 3, 1378, 689, 0, 8663, 8666, 5, 119, 0, 0, 8664, 8666, 5, 126, 0, 0, 8665, 8661, 1, 0, 0, 0, 8665, 8662, 1, 0, 0, 0, 8665, 8663, 1, 0, 0, 0, 8665, 8664, 1, 0, 0, 0, 8666, 8668, 1, 0, 0, 0, 8667, 8669, 3, 526, 263, 0, 8668, 8667, 1, 0, 0, 0, 8668, 8669, 1, 0, 0, 0, 8669, 8670, 1, 0, 0, 0, 8670, 8671, 3, 1130, 565, 0, 8671, 1129, 1, 0, 0, 0, 8672, 8673, 5, 2, 0, 0, 8673, 8674, 3, 1282, 641, 0, 8674, 8675, 5, 3, 0, 0, 8675, 8678, 1, 0, 0, 0, 8676, 8678, 1, 0, 0, 0, 8677, 8672, 1, 0, 0, 0, 8677, 8676, 1, 0, 0, 0, 8678, 1131, 1, 0, 0, 0, 8679, 8696, 5, 394, 0, 0, 8680, 8696, 5, 395, 0, 0, 8681, 8696, 5, 409, 0, 0, 8682, 8696, 5, 381, 0, 0, 8683, 8696, 5, 406, 0, 0, 8684, 8685, 5, 391, 0, 0, 8685, 8696, 3, 1134, 567, 0, 8686, 8687, 5, 190, 0, 0, 8687, 8696, 5, 405, 0, 0, 8688, 8689, 5, 388, 0, 0, 8689, 8696, 3, 1130, 565, 0, 8690, 8691, 5, 387, 0, 0, 8691, 8696, 3, 1130, 565, 0, 8692, 8693, 5, 402, 0, 0, 8693, 8696, 3, 1130, 565, 0, 8694, 8696, 5, 383, 0, 0, 8695, 8679, 1, 0, 0, 0, 8695, 8680, 1, 0, 0, 0, 8695, 8681, 1, 0, 0, 0, 8695, 8682, 1, 0, 0, 0, 8695, 8683, 1, 0, 0, 0, 8695, 8684, 1, 0, 0, 0, 8695, 8686, 1, 0, 0, 0, 8695, 8688, 1, 0, 0, 0, 8695, 8690, 1, 0, 0, 0, 8695, 8692, 1, 0, 0, 0, 8695, 8694, 1, 0, 0, 0, 8696, 1133, 1, 0, 0, 0, 8697, 8698, 5, 2, 0, 0, 8698, 8699, 3, 1358, 679, 0, 8699, 8700, 5, 3, 0, 0, 8700, 8703, 1, 0, 0, 0, 8701, 8703, 1, 0, 0, 0, 8702, 8697, 1, 0, 0, 0, 8702, 8701, 1, 0, 0, 0, 8703, 1135, 1, 0, 0, 0, 8704, 8707, 3, 1140, 570, 0, 8705, 8707, 3, 1142, 571, 0, 8706, 8704, 1, 0, 0, 0, 8706, 8705, 1, 0, 0, 0, 8707, 1137, 1, 0, 0, 0, 8708, 8711, 3, 1140, 570, 0, 8709, 8711, 3, 1142, 571, 0, 8710, 8708, 1, 0, 0, 0, 8710, 8709, 1, 0, 0, 0, 8711, 1139, 1, 0, 0, 0, 8712, 8713, 5, 382, 0, 0, 8713, 8714, 3, 1150, 575, 0, 8714, 8715, 5, 2, 0, 0, 8715, 8716, 3, 1282, 641, 0, 8716, 8717, 5, 3, 0, 0, 8717, 1141, 1, 0, 0, 0, 8718, 8719, 5, 382, 0, 0, 8719, 8720, 3, 1150, 575, 0, 8720, 1143, 1, 0, 0, 0, 8721, 8726, 3, 1148, 574, 0, 8722, 8723, 5, 2, 0, 0, 8723, 8724, 3, 1358, 679, 0, 8724, 8725, 5, 3, 0, 0, 8725, 8727, 1, 0, 0, 0, 8726, 8722, 1, 0, 0, 0, 8726, 8727, 1, 0, 0, 0, 8727, 1145, 1, 0, 0, 0, 8728, 8733, 3, 1148, 574, 0, 8729, 8730, 5, 2, 0, 0, 8730, 8731, 3, 1358, 679, 0, 8731, 8732, 5, 3, 0, 0, 8732, 8734, 1, 0, 0, 0, 8733, 8729, 1, 0, 0, 0, 8733, 8734, 1, 0, 0, 0, 8734, 1147, 1, 0, 0, 0, 8735, 8736, 7, 40, 0, 0, 8736, 8742, 3, 1150, 575, 0, 8737, 8742, 5, 416, 0, 0, 8738, 8739, 5, 398, 0, 0, 8739, 8740, 7, 41, 0, 0, 8740, 8742, 3, 1150, 575, 0, 8741, 8735, 1, 0, 0, 0, 8741, 8737, 1, 0, 0, 0, 8741, 8738, 1, 0, 0, 0, 8742, 1149, 1, 0, 0, 0, 8743, 8746, 5, 367, 0, 0, 8744, 8746, 1, 0, 0, 0, 8745, 8743, 1, 0, 0, 0, 8745, 8744, 1, 0, 0, 0, 8746, 1151, 1, 0, 0, 0, 8747, 8752, 7, 42, 0, 0, 8748, 8749, 5, 2, 0, 0, 8749, 8750, 3, 1358, 679, 0, 8750, 8751, 5, 3, 0, 0, 8751, 8753, 1, 0, 0, 0, 8752, 8748, 1, 0, 0, 0, 8752, 8753, 1, 0, 0, 0, 8753, 8754, 1, 0, 0, 0, 8754, 8755, 3, 1156, 578, 0, 8755, 1153, 1, 0, 0, 0, 8756, 8757, 5, 396, 0, 0, 8757, 1155, 1, 0, 0, 0, 8758, 8759, 5, 105, 0, 0, 8759, 8760, 5, 411, 0, 0, 8760, 8766, 5, 379, 0, 0, 8761, 8762, 5, 372, 0, 0, 8762, 8763, 5, 411, 0, 0, 8763, 8766, 5, 379, 0, 0, 8764, 8766, 1, 0, 0, 0, 8765, 8758, 1, 0, 0, 0, 8765, 8761, 1, 0, 0, 0, 8765, 8764, 1, 0, 0, 0, 8766, 1157, 1, 0, 0, 0, 8767, 8794, 5, 377, 0, 0, 8768, 8794, 5, 257, 0, 0, 8769, 8794, 5, 176, 0, 0, 8770, 8794, 5, 218, 0, 0, 8771, 8794, 5, 254, 0, 0, 8772, 8794, 3, 1160, 580, 0, 8773, 8774, 5, 377, 0, 0, 8774, 8775, 5, 94, 0, 0, 8775, 8794, 5, 257, 0, 0, 8776, 8777, 5, 176, 0, 0, 8777, 8781, 5, 94, 0, 0, 8778, 8782, 5, 218, 0, 0, 8779, 8782, 5, 254, 0, 0, 8780, 8782, 3, 1160, 580, 0, 8781, 8778, 1, 0, 0, 0, 8781, 8779, 1, 0, 0, 0, 8781, 8780, 1, 0, 0, 0, 8782, 8794, 1, 0, 0, 0, 8783, 8784, 5, 218, 0, 0, 8784, 8787, 5, 94, 0, 0, 8785, 8788, 5, 254, 0, 0, 8786, 8788, 3, 1160, 580, 0, 8787, 8785, 1, 0, 0, 0, 8787, 8786, 1, 0, 0, 0, 8788, 8794, 1, 0, 0, 0, 8789, 8790, 5, 254, 0, 0, 8790, 8791, 5, 94, 0, 0, 8791, 8794, 3, 1160, 580, 0, 8792, 8794, 1, 0, 0, 0, 8793, 8767, 1, 0, 0, 0, 8793, 8768, 1, 0, 0, 0, 8793, 8769, 1, 0, 0, 0, 8793, 8770, 1, 0, 0, 0, 8793, 8771, 1, 0, 0, 0, 8793, 8772, 1, 0, 0, 0, 8793, 8773, 1, 0, 0, 0, 8793, 8776, 1, 0, 0, 0, 8793, 8783, 1, 0, 0, 0, 8793, 8789, 1, 0, 0, 0, 8793, 8792, 1, 0, 0, 0, 8794, 1159, 1, 0, 0, 0, 8795, 8800, 5, 319, 0, 0, 8796, 8797, 5, 2, 0, 0, 8797, 8798, 3, 1358, 679, 0, 8798, 8799, 5, 3, 0, 0, 8799, 8801, 1, 0, 0, 0, 8800, 8796, 1, 0, 0, 0, 8800, 8801, 1, 0, 0, 0, 8801, 1161, 1, 0, 0, 0, 8802, 8803, 5, 197, 0, 0, 8803, 8806, 3, 1164, 582, 0, 8804, 8806, 1, 0, 0, 0, 8805, 8802, 1, 0, 0, 0, 8805, 8804, 1, 0, 0, 0, 8806, 1163, 1, 0, 0, 0, 8807, 8808, 3, 1166, 583, 0, 8808, 1165, 1, 0, 0, 0, 8809, 8811, 3, 1168, 584, 0, 8810, 8812, 3, 1276, 638, 0, 8811, 8810, 1, 0, 0, 0, 8811, 8812, 1, 0, 0, 0, 8812, 1167, 1, 0, 0, 0, 8813, 8818, 3, 1170, 585, 0, 8814, 8815, 7, 43, 0, 0, 8815, 8817, 3, 1170, 585, 0, 8816, 8814, 1, 0, 0, 0, 8817, 8820, 1, 0, 0, 0, 8818, 8816, 1, 0, 0, 0, 8818, 8819, 1, 0, 0, 0, 8819, 1169, 1, 0, 0, 0, 8820, 8818, 1, 0, 0, 0, 8821, 8826, 3, 1172, 586, 0, 8822, 8823, 5, 82, 0, 0, 8823, 8825, 3, 1172, 586, 0, 8824, 8822, 1, 0, 0, 0, 8825, 8828, 1, 0, 0, 0, 8826, 8824, 1, 0, 0, 0, 8826, 8827, 1, 0, 0, 0, 8827, 1171, 1, 0, 0, 0, 8828, 8826, 1, 0, 0, 0, 8829, 8834, 3, 1174, 587, 0, 8830, 8831, 5, 33, 0, 0, 8831, 8833, 3, 1174, 587, 0, 8832, 8830, 1, 0, 0, 0, 8833, 8836, 1, 0, 0, 0, 8834, 8832, 1, 0, 0, 0, 8834, 8835, 1, 0, 0, 0, 8835, 1173, 1, 0, 0, 0, 8836, 8834, 1, 0, 0, 0, 8837, 8849, 3, 1176, 588, 0, 8838, 8840, 5, 77, 0, 0, 8839, 8838, 1, 0, 0, 0, 8839, 8840, 1, 0, 0, 0, 8840, 8841, 1, 0, 0, 0, 8841, 8843, 5, 380, 0, 0, 8842, 8844, 5, 91, 0, 0, 8843, 8842, 1, 0, 0, 0, 8843, 8844, 1, 0, 0, 0, 8844, 8845, 1, 0, 0, 0, 8845, 8846, 3, 1176, 588, 0, 8846, 8847, 5, 33, 0, 0, 8847, 8848, 3, 1176, 588, 0, 8848, 8850, 1, 0, 0, 0, 8849, 8839, 1, 0, 0, 0, 8849, 8850, 1, 0, 0, 0, 8850, 1175, 1, 0, 0, 0, 8851, 8857, 3, 1178, 589, 0, 8852, 8854, 5, 77, 0, 0, 8853, 8852, 1, 0, 0, 0, 8853, 8854, 1, 0, 0, 0, 8854, 8855, 1, 0, 0, 0, 8855, 8856, 5, 68, 0, 0, 8856, 8858, 3, 1308, 654, 0, 8857, 8853, 1, 0, 0, 0, 8857, 8858, 1, 0, 0, 0, 8858, 1177, 1, 0, 0, 0, 8859, 8861, 5, 77, 0, 0, 8860, 8859, 1, 0, 0, 0, 8860, 8861, 1, 0, 0, 0, 8861, 8862, 1, 0, 0, 0, 8862, 8863, 3, 1180, 590, 0, 8863, 1179, 1, 0, 0, 0, 8864, 8866, 3, 1182, 591, 0, 8865, 8867, 7, 44, 0, 0, 8866, 8865, 1, 0, 0, 0, 8866, 8867, 1, 0, 0, 0, 8867, 1181, 1, 0, 0, 0, 8868, 8892, 3, 1184, 592, 0, 8869, 8871, 5, 116, 0, 0, 8870, 8872, 5, 77, 0, 0, 8871, 8870, 1, 0, 0, 0, 8871, 8872, 1, 0, 0, 0, 8872, 8890, 1, 0, 0, 0, 8873, 8891, 5, 78, 0, 0, 8874, 8891, 5, 96, 0, 0, 8875, 8891, 5, 60, 0, 0, 8876, 8891, 5, 358, 0, 0, 8877, 8878, 5, 56, 0, 0, 8878, 8879, 5, 64, 0, 0, 8879, 8891, 3, 1164, 582, 0, 8880, 8881, 5, 268, 0, 0, 8881, 8882, 5, 2, 0, 0, 8882, 8883, 3, 1288, 644, 0, 8883, 8884, 5, 3, 0, 0, 8884, 8891, 1, 0, 0, 0, 8885, 8891, 5, 188, 0, 0, 8886, 8888, 3, 1298, 649, 0, 8887, 8886, 1, 0, 0, 0, 8887, 8888, 1, 0, 0, 0, 8888, 8889, 1, 0, 0, 0, 8889, 8891, 5, 478, 0, 0, 8890, 8873, 1, 0, 0, 0, 8890, 8874, 1, 0, 0, 0, 8890, 8875, 1, 0, 0, 0, 8890, 8876, 1, 0, 0, 0, 8890, 8877, 1, 0, 0, 0, 8890, 8880, 1, 0, 0, 0, 8890, 8885, 1, 0, 0, 0, 8890, 8887, 1, 0, 0, 0, 8891, 8893, 1, 0, 0, 0, 8892, 8869, 1, 0, 0, 0, 8892, 8893, 1, 0, 0, 0, 8893, 1183, 1, 0, 0, 0, 8894, 8906, 3, 1186, 593, 0, 8895, 8896, 7, 45, 0, 0, 8896, 8907, 3, 1186, 593, 0, 8897, 8898, 3, 1280, 640, 0, 8898, 8904, 3, 1270, 635, 0, 8899, 8905, 3, 962, 481, 0, 8900, 8901, 5, 2, 0, 0, 8901, 8902, 3, 1164, 582, 0, 8902, 8903, 5, 3, 0, 0, 8903, 8905, 1, 0, 0, 0, 8904, 8899, 1, 0, 0, 0, 8904, 8900, 1, 0, 0, 0, 8905, 8907, 1, 0, 0, 0, 8906, 8895, 1, 0, 0, 0, 8906, 8897, 1, 0, 0, 0, 8906, 8907, 1, 0, 0, 0, 8907, 1185, 1, 0, 0, 0, 8908, 8921, 3, 1188, 594, 0, 8909, 8911, 5, 77, 0, 0, 8910, 8909, 1, 0, 0, 0, 8910, 8911, 1, 0, 0, 0, 8911, 8916, 1, 0, 0, 0, 8912, 8917, 5, 120, 0, 0, 8913, 8917, 5, 114, 0, 0, 8914, 8915, 5, 127, 0, 0, 8915, 8917, 5, 94, 0, 0, 8916, 8912, 1, 0, 0, 0, 8916, 8913, 1, 0, 0, 0, 8916, 8914, 1, 0, 0, 0, 8917, 8918, 1, 0, 0, 0, 8918, 8919, 3, 1188, 594, 0, 8919, 8920, 3, 1162, 581, 0, 8920, 8922, 1, 0, 0, 0, 8921, 8910, 1, 0, 0, 0, 8921, 8922, 1, 0, 0, 0, 8922, 1187, 1, 0, 0, 0, 8923, 8929, 3, 1190, 595, 0, 8924, 8925, 3, 1276, 638, 0, 8925, 8926, 3, 1190, 595, 0, 8926, 8928, 1, 0, 0, 0, 8927, 8924, 1, 0, 0, 0, 8928, 8931, 1, 0, 0, 0, 8929, 8927, 1, 0, 0, 0, 8929, 8930, 1, 0, 0, 0, 8930, 1189, 1, 0, 0, 0, 8931, 8929, 1, 0, 0, 0, 8932, 8934, 3, 1276, 638, 0, 8933, 8932, 1, 0, 0, 0, 8933, 8934, 1, 0, 0, 0, 8934, 8935, 1, 0, 0, 0, 8935, 8936, 3, 1192, 596, 0, 8936, 1191, 1, 0, 0, 0, 8937, 8942, 3, 1194, 597, 0, 8938, 8939, 7, 46, 0, 0, 8939, 8941, 3, 1194, 597, 0, 8940, 8938, 1, 0, 0, 0, 8941, 8944, 1, 0, 0, 0, 8942, 8940, 1, 0, 0, 0, 8942, 8943, 1, 0, 0, 0, 8943, 1193, 1, 0, 0, 0, 8944, 8942, 1, 0, 0, 0, 8945, 8950, 3, 1196, 598, 0, 8946, 8947, 7, 47, 0, 0, 8947, 8949, 3, 1196, 598, 0, 8948, 8946, 1, 0, 0, 0, 8949, 8952, 1, 0, 0, 0, 8950, 8948, 1, 0, 0, 0, 8950, 8951, 1, 0, 0, 0, 8951, 1195, 1, 0, 0, 0, 8952, 8950, 1, 0, 0, 0, 8953, 8956, 3, 1198, 599, 0, 8954, 8955, 5, 15, 0, 0, 8955, 8957, 3, 1164, 582, 0, 8956, 8954, 1, 0, 0, 0, 8956, 8957, 1, 0, 0, 0, 8957, 1197, 1, 0, 0, 0, 8958, 8960, 7, 46, 0, 0, 8959, 8958, 1, 0, 0, 0, 8959, 8960, 1, 0, 0, 0, 8960, 8961, 1, 0, 0, 0, 8961, 8962, 3, 1200, 600, 0, 8962, 1199, 1, 0, 0, 0, 8963, 8968, 3, 1202, 601, 0, 8964, 8965, 5, 142, 0, 0, 8965, 8966, 5, 411, 0, 0, 8966, 8967, 5, 379, 0, 0, 8967, 8969, 3, 1164, 582, 0, 8968, 8964, 1, 0, 0, 0, 8968, 8969, 1, 0, 0, 0, 8969, 1201, 1, 0, 0, 0, 8970, 8973, 3, 1204, 602, 0, 8971, 8972, 5, 43, 0, 0, 8972, 8974, 3, 524, 262, 0, 8973, 8971, 1, 0, 0, 0, 8973, 8974, 1, 0, 0, 0, 8974, 1203, 1, 0, 0, 0, 8975, 8980, 3, 1208, 604, 0, 8976, 8977, 5, 26, 0, 0, 8977, 8979, 3, 1120, 560, 0, 8978, 8976, 1, 0, 0, 0, 8979, 8982, 1, 0, 0, 0, 8980, 8978, 1, 0, 0, 0, 8980, 8981, 1, 0, 0, 0, 8981, 1205, 1, 0, 0, 0, 8982, 8980, 1, 0, 0, 0, 8983, 8984, 6, 603, -1, 0, 8984, 8991, 3, 1208, 604, 0, 8985, 8986, 7, 46, 0, 0, 8986, 8991, 3, 1206, 603, 9, 8987, 8988, 3, 1276, 638, 0, 8988, 8989, 3, 1206, 603, 3, 8989, 8991, 1, 0, 0, 0, 8990, 8983, 1, 0, 0, 0, 8990, 8985, 1, 0, 0, 0, 8990, 8987, 1, 0, 0, 0, 8991, 9031, 1, 0, 0, 0, 8992, 8993, 10, 8, 0, 0, 8993, 8994, 5, 15, 0, 0, 8994, 9030, 3, 1206, 603, 9, 8995, 8996, 10, 7, 0, 0, 8996, 8997, 7, 47, 0, 0, 8997, 9030, 3, 1206, 603, 8, 8998, 8999, 10, 6, 0, 0, 8999, 9000, 7, 46, 0, 0, 9000, 9030, 3, 1206, 603, 7, 9001, 9002, 10, 5, 0, 0, 9002, 9003, 3, 1276, 638, 0, 9003, 9004, 3, 1206, 603, 6, 9004, 9030, 1, 0, 0, 0, 9005, 9006, 10, 4, 0, 0, 9006, 9007, 7, 45, 0, 0, 9007, 9030, 3, 1206, 603, 5, 9008, 9009, 10, 10, 0, 0, 9009, 9010, 5, 26, 0, 0, 9010, 9030, 3, 1120, 560, 0, 9011, 9012, 10, 2, 0, 0, 9012, 9030, 3, 1276, 638, 0, 9013, 9014, 10, 1, 0, 0, 9014, 9016, 5, 116, 0, 0, 9015, 9017, 5, 77, 0, 0, 9016, 9015, 1, 0, 0, 0, 9016, 9017, 1, 0, 0, 0, 9017, 9027, 1, 0, 0, 0, 9018, 9019, 5, 56, 0, 0, 9019, 9020, 5, 64, 0, 0, 9020, 9028, 3, 1206, 603, 0, 9021, 9022, 5, 268, 0, 0, 9022, 9023, 5, 2, 0, 0, 9023, 9024, 3, 1288, 644, 0, 9024, 9025, 5, 3, 0, 0, 9025, 9028, 1, 0, 0, 0, 9026, 9028, 5, 188, 0, 0, 9027, 9018, 1, 0, 0, 0, 9027, 9021, 1, 0, 0, 0, 9027, 9026, 1, 0, 0, 0, 9028, 9030, 1, 0, 0, 0, 9029, 8992, 1, 0, 0, 0, 9029, 8995, 1, 0, 0, 0, 9029, 8998, 1, 0, 0, 0, 9029, 9001, 1, 0, 0, 0, 9029, 9005, 1, 0, 0, 0, 9029, 9008, 1, 0, 0, 0, 9029, 9011, 1, 0, 0, 0, 9029, 9013, 1, 0, 0, 0, 9030, 9033, 1, 0, 0, 0, 9031, 9029, 1, 0, 0, 0, 9031, 9032, 1, 0, 0, 0, 9032, 1207, 1, 0, 0, 0, 9033, 9031, 1, 0, 0, 0, 9034, 9035, 5, 389, 0, 0, 9035, 9071, 3, 962, 481, 0, 9036, 9039, 5, 35, 0, 0, 9037, 9040, 3, 962, 481, 0, 9038, 9040, 3, 1290, 645, 0, 9039, 9037, 1, 0, 0, 0, 9039, 9038, 1, 0, 0, 0, 9040, 9071, 1, 0, 0, 0, 9041, 9042, 5, 28, 0, 0, 9042, 9071, 3, 1328, 664, 0, 9043, 9044, 5, 470, 0, 0, 9044, 9045, 5, 2, 0, 0, 9045, 9046, 3, 1282, 641, 0, 9046, 9047, 5, 3, 0, 0, 9047, 9071, 1, 0, 0, 0, 9048, 9049, 5, 98, 0, 0, 9049, 9071, 3, 962, 481, 0, 9050, 9071, 3, 1320, 660, 0, 9051, 9071, 3, 1350, 675, 0, 9052, 9071, 3, 1210, 605, 0, 9053, 9054, 5, 2, 0, 0, 9054, 9055, 3, 1164, 582, 0, 9055, 9056, 5, 3, 0, 0, 9056, 9057, 3, 1328, 664, 0, 9057, 9071, 1, 0, 0, 0, 9058, 9071, 3, 1310, 655, 0, 9059, 9071, 3, 1214, 607, 0, 9060, 9062, 3, 962, 481, 0, 9061, 9063, 3, 1326, 663, 0, 9062, 9061, 1, 0, 0, 0, 9062, 9063, 1, 0, 0, 0, 9063, 9071, 1, 0, 0, 0, 9064, 9071, 3, 1266, 633, 0, 9065, 9071, 3, 1268, 634, 0, 9066, 9067, 3, 1264, 632, 0, 9067, 9068, 5, 125, 0, 0, 9068, 9069, 3, 1264, 632, 0, 9069, 9071, 1, 0, 0, 0, 9070, 9034, 1, 0, 0, 0, 9070, 9036, 1, 0, 0, 0, 9070, 9041, 1, 0, 0, 0, 9070, 9043, 1, 0, 0, 0, 9070, 9048, 1, 0, 0, 0, 9070, 9050, 1, 0, 0, 0, 9070, 9051, 1, 0, 0, 0, 9070, 9052, 1, 0, 0, 0, 9070, 9053, 1, 0, 0, 0, 9070, 9058, 1, 0, 0, 0, 9070, 9059, 1, 0, 0, 0, 9070, 9060, 1, 0, 0, 0, 9070, 9064, 1, 0, 0, 0, 9070, 9065, 1, 0, 0, 0, 9070, 9066, 1, 0, 0, 0, 9071, 1209, 1, 0, 0, 0, 9072, 9073, 5, 661, 0, 0, 9073, 1211, 1, 0, 0, 0, 9074, 9075, 3, 1348, 674, 0, 9075, 9094, 5, 2, 0, 0, 9076, 9080, 3, 1284, 642, 0, 9077, 9078, 5, 6, 0, 0, 9078, 9079, 5, 101, 0, 0, 9079, 9081, 3, 1286, 643, 0, 9080, 9077, 1, 0, 0, 0, 9080, 9081, 1, 0, 0, 0, 9081, 9082, 1, 0, 0, 0, 9082, 9083, 3, 998, 499, 0, 9083, 9095, 1, 0, 0, 0, 9084, 9085, 5, 101, 0, 0, 9085, 9086, 3, 1286, 643, 0, 9086, 9087, 3, 998, 499, 0, 9087, 9095, 1, 0, 0, 0, 9088, 9089, 7, 48, 0, 0, 9089, 9090, 3, 1284, 642, 0, 9090, 9091, 3, 998, 499, 0, 9091, 9095, 1, 0, 0, 0, 9092, 9095, 5, 9, 0, 0, 9093, 9095, 1, 0, 0, 0, 9094, 9076, 1, 0, 0, 0, 9094, 9084, 1, 0, 0, 0, 9094, 9088, 1, 0, 0, 0, 9094, 9092, 1, 0, 0, 0, 9094, 9093, 1, 0, 0, 0, 9095, 9096, 1, 0, 0, 0, 9096, 9097, 5, 3, 0, 0, 9097, 1213, 1, 0, 0, 0, 9098, 9099, 3, 1212, 606, 0, 9099, 9100, 3, 1238, 619, 0, 9100, 9101, 3, 1240, 620, 0, 9101, 9102, 3, 1248, 624, 0, 9102, 9105, 1, 0, 0, 0, 9103, 9105, 3, 1218, 609, 0, 9104, 9098, 1, 0, 0, 0, 9104, 9103, 1, 0, 0, 0, 9105, 1215, 1, 0, 0, 0, 9106, 9109, 3, 1212, 606, 0, 9107, 9109, 3, 1218, 609, 0, 9108, 9106, 1, 0, 0, 0, 9108, 9107, 1, 0, 0, 0, 9109, 1217, 1, 0, 0, 0, 9110, 9111, 5, 108, 0, 0, 9111, 9112, 5, 62, 0, 0, 9112, 9113, 5, 2, 0, 0, 9113, 9114, 3, 1164, 582, 0, 9114, 9115, 5, 3, 0, 0, 9115, 9288, 1, 0, 0, 0, 9116, 9288, 5, 48, 0, 0, 9117, 9122, 5, 50, 0, 0, 9118, 9119, 5, 2, 0, 0, 9119, 9120, 3, 1358, 679, 0, 9120, 9121, 5, 3, 0, 0, 9121, 9123, 1, 0, 0, 0, 9122, 9118, 1, 0, 0, 0, 9122, 9123, 1, 0, 0, 0, 9123, 9288, 1, 0, 0, 0, 9124, 9129, 5, 51, 0, 0, 9125, 9126, 5, 2, 0, 0, 9126, 9127, 3, 1358, 679, 0, 9127, 9128, 5, 3, 0, 0, 9128, 9130, 1, 0, 0, 0, 9129, 9125, 1, 0, 0, 0, 9129, 9130, 1, 0, 0, 0, 9130, 9288, 1, 0, 0, 0, 9131, 9136, 5, 75, 0, 0, 9132, 9133, 5, 2, 0, 0, 9133, 9134, 3, 1358, 679, 0, 9134, 9135, 5, 3, 0, 0, 9135, 9137, 1, 0, 0, 0, 9136, 9132, 1, 0, 0, 0, 9136, 9137, 1, 0, 0, 0, 9137, 9288, 1, 0, 0, 0, 9138, 9143, 5, 76, 0, 0, 9139, 9140, 5, 2, 0, 0, 9140, 9141, 3, 1358, 679, 0, 9141, 9142, 5, 3, 0, 0, 9142, 9144, 1, 0, 0, 0, 9143, 9139, 1, 0, 0, 0, 9143, 9144, 1, 0, 0, 0, 9144, 9288, 1, 0, 0, 0, 9145, 9288, 5, 49, 0, 0, 9146, 9288, 5, 52, 0, 0, 9147, 9288, 5, 89, 0, 0, 9148, 9288, 5, 99, 0, 0, 9149, 9288, 5, 47, 0, 0, 9150, 9288, 5, 111, 0, 0, 9151, 9152, 5, 41, 0, 0, 9152, 9153, 5, 2, 0, 0, 9153, 9154, 3, 1164, 582, 0, 9154, 9155, 5, 36, 0, 0, 9155, 9156, 3, 1120, 560, 0, 9156, 9157, 5, 3, 0, 0, 9157, 9288, 1, 0, 0, 0, 9158, 9159, 5, 390, 0, 0, 9159, 9160, 5, 2, 0, 0, 9160, 9161, 3, 1294, 647, 0, 9161, 9162, 5, 3, 0, 0, 9162, 9288, 1, 0, 0, 0, 9163, 9164, 5, 489, 0, 0, 9164, 9165, 5, 2, 0, 0, 9165, 9168, 3, 1164, 582, 0, 9166, 9167, 5, 6, 0, 0, 9167, 9169, 3, 1298, 649, 0, 9168, 9166, 1, 0, 0, 0, 9168, 9169, 1, 0, 0, 0, 9169, 9170, 1, 0, 0, 0, 9170, 9171, 5, 3, 0, 0, 9171, 9288, 1, 0, 0, 0, 9172, 9173, 5, 403, 0, 0, 9173, 9174, 5, 2, 0, 0, 9174, 9175, 3, 1300, 650, 0, 9175, 9176, 5, 3, 0, 0, 9176, 9288, 1, 0, 0, 0, 9177, 9178, 5, 404, 0, 0, 9178, 9179, 5, 2, 0, 0, 9179, 9180, 3, 1302, 651, 0, 9180, 9181, 5, 3, 0, 0, 9181, 9288, 1, 0, 0, 0, 9182, 9183, 5, 410, 0, 0, 9183, 9184, 5, 2, 0, 0, 9184, 9185, 3, 1304, 652, 0, 9185, 9186, 5, 3, 0, 0, 9186, 9288, 1, 0, 0, 0, 9187, 9188, 5, 413, 0, 0, 9188, 9189, 5, 2, 0, 0, 9189, 9190, 3, 1164, 582, 0, 9190, 9191, 5, 36, 0, 0, 9191, 9192, 3, 1120, 560, 0, 9192, 9193, 5, 3, 0, 0, 9193, 9288, 1, 0, 0, 0, 9194, 9195, 5, 414, 0, 0, 9195, 9197, 5, 2, 0, 0, 9196, 9198, 7, 49, 0, 0, 9197, 9196, 1, 0, 0, 0, 9197, 9198, 1, 0, 0, 0, 9198, 9199, 1, 0, 0, 0, 9199, 9200, 3, 1306, 653, 0, 9200, 9201, 5, 3, 0, 0, 9201, 9288, 1, 0, 0, 0, 9202, 9203, 5, 401, 0, 0, 9203, 9204, 5, 2, 0, 0, 9204, 9205, 3, 1164, 582, 0, 9205, 9206, 5, 6, 0, 0, 9206, 9207, 3, 1164, 582, 0, 9207, 9208, 5, 3, 0, 0, 9208, 9288, 1, 0, 0, 0, 9209, 9210, 5, 386, 0, 0, 9210, 9211, 5, 2, 0, 0, 9211, 9212, 3, 1282, 641, 0, 9212, 9213, 5, 3, 0, 0, 9213, 9288, 1, 0, 0, 0, 9214, 9215, 5, 392, 0, 0, 9215, 9216, 5, 2, 0, 0, 9216, 9217, 3, 1282, 641, 0, 9217, 9218, 5, 3, 0, 0, 9218, 9288, 1, 0, 0, 0, 9219, 9220, 5, 397, 0, 0, 9220, 9221, 5, 2, 0, 0, 9221, 9222, 3, 1282, 641, 0, 9222, 9223, 5, 3, 0, 0, 9223, 9288, 1, 0, 0, 0, 9224, 9225, 5, 425, 0, 0, 9225, 9226, 5, 2, 0, 0, 9226, 9227, 3, 1282, 641, 0, 9227, 9228, 5, 3, 0, 0, 9228, 9288, 1, 0, 0, 0, 9229, 9230, 5, 426, 0, 0, 9230, 9231, 5, 2, 0, 0, 9231, 9232, 5, 259, 0, 0, 9232, 9238, 3, 1382, 691, 0, 9233, 9236, 5, 6, 0, 0, 9234, 9237, 3, 1224, 612, 0, 9235, 9237, 3, 1282, 641, 0, 9236, 9234, 1, 0, 0, 0, 9236, 9235, 1, 0, 0, 0, 9237, 9239, 1, 0, 0, 0, 9238, 9233, 1, 0, 0, 0, 9238, 9239, 1, 0, 0, 0, 9239, 9240, 1, 0, 0, 0, 9240, 9241, 5, 3, 0, 0, 9241, 9288, 1, 0, 0, 0, 9242, 9243, 5, 427, 0, 0, 9243, 9244, 5, 2, 0, 0, 9244, 9245, 3, 1208, 604, 0, 9245, 9246, 3, 1234, 617, 0, 9246, 9247, 5, 3, 0, 0, 9247, 9288, 1, 0, 0, 0, 9248, 9249, 5, 428, 0, 0, 9249, 9250, 5, 2, 0, 0, 9250, 9251, 3, 1226, 613, 0, 9251, 9252, 5, 3, 0, 0, 9252, 9288, 1, 0, 0, 0, 9253, 9254, 5, 429, 0, 0, 9254, 9255, 5, 2, 0, 0, 9255, 9256, 3, 1230, 615, 0, 9256, 9257, 3, 1164, 582, 0, 9257, 9258, 3, 1232, 616, 0, 9258, 9259, 5, 3, 0, 0, 9259, 9288, 1, 0, 0, 0, 9260, 9261, 5, 430, 0, 0, 9261, 9262, 5, 2, 0, 0, 9262, 9263, 5, 259, 0, 0, 9263, 9266, 3, 1382, 691, 0, 9264, 9265, 5, 6, 0, 0, 9265, 9267, 3, 1164, 582, 0, 9266, 9264, 1, 0, 0, 0, 9266, 9267, 1, 0, 0, 0, 9267, 9268, 1, 0, 0, 0, 9268, 9269, 5, 3, 0, 0, 9269, 9288, 1, 0, 0, 0, 9270, 9271, 5, 431, 0, 0, 9271, 9272, 5, 2, 0, 0, 9272, 9273, 5, 376, 0, 0, 9273, 9274, 3, 1164, 582, 0, 9274, 9275, 5, 6, 0, 0, 9275, 9276, 3, 1220, 610, 0, 9276, 9277, 3, 1222, 611, 0, 9277, 9278, 5, 3, 0, 0, 9278, 9288, 1, 0, 0, 0, 9279, 9280, 5, 432, 0, 0, 9280, 9281, 5, 2, 0, 0, 9281, 9282, 3, 1230, 615, 0, 9282, 9283, 3, 1164, 582, 0, 9283, 9284, 5, 36, 0, 0, 9284, 9285, 3, 1124, 562, 0, 9285, 9286, 5, 3, 0, 0, 9286, 9288, 1, 0, 0, 0, 9287, 9110, 1, 0, 0, 0, 9287, 9116, 1, 0, 0, 0, 9287, 9117, 1, 0, 0, 0, 9287, 9124, 1, 0, 0, 0, 9287, 9131, 1, 0, 0, 0, 9287, 9138, 1, 0, 0, 0, 9287, 9145, 1, 0, 0, 0, 9287, 9146, 1, 0, 0, 0, 9287, 9147, 1, 0, 0, 0, 9287, 9148, 1, 0, 0, 0, 9287, 9149, 1, 0, 0, 0, 9287, 9150, 1, 0, 0, 0, 9287, 9151, 1, 0, 0, 0, 9287, 9158, 1, 0, 0, 0, 9287, 9163, 1, 0, 0, 0, 9287, 9172, 1, 0, 0, 0, 9287, 9177, 1, 0, 0, 0, 9287, 9182, 1, 0, 0, 0, 9287, 9187, 1, 0, 0, 0, 9287, 9194, 1, 0, 0, 0, 9287, 9202, 1, 0, 0, 0, 9287, 9209, 1, 0, 0, 0, 9287, 9214, 1, 0, 0, 0, 9287, 9219, 1, 0, 0, 0, 9287, 9224, 1, 0, 0, 0, 9287, 9229, 1, 0, 0, 0, 9287, 9242, 1, 0, 0, 0, 9287, 9248, 1, 0, 0, 0, 9287, 9253, 1, 0, 0, 0, 9287, 9260, 1, 0, 0, 0, 9287, 9270, 1, 0, 0, 0, 9287, 9279, 1, 0, 0, 0, 9288, 1219, 1, 0, 0, 0, 9289, 9290, 5, 368, 0, 0, 9290, 9295, 3, 1164, 582, 0, 9291, 9292, 5, 368, 0, 0, 9292, 9293, 5, 262, 0, 0, 9293, 9295, 5, 450, 0, 0, 9294, 9289, 1, 0, 0, 0, 9294, 9291, 1, 0, 0, 0, 9295, 1221, 1, 0, 0, 0, 9296, 9297, 5, 6, 0, 0, 9297, 9298, 5, 332, 0, 0, 9298, 9308, 5, 378, 0, 0, 9299, 9300, 5, 6, 0, 0, 9300, 9301, 5, 332, 0, 0, 9301, 9308, 5, 262, 0, 0, 9302, 9303, 5, 6, 0, 0, 9303, 9304, 5, 332, 0, 0, 9304, 9305, 5, 262, 0, 0, 9305, 9308, 5, 450, 0, 0, 9306, 9308, 1, 0, 0, 0, 9307, 9296, 1, 0, 0, 0, 9307, 9299, 1, 0, 0, 0, 9307, 9302, 1, 0, 0, 0, 9307, 9306, 1, 0, 0, 0, 9308, 1223, 1, 0, 0, 0, 9309, 9310, 5, 417, 0, 0, 9310, 9311, 5, 2, 0, 0, 9311, 9312, 3, 1226, 613, 0, 9312, 9313, 5, 3, 0, 0, 9313, 1225, 1, 0, 0, 0, 9314, 9319, 3, 1228, 614, 0, 9315, 9316, 5, 6, 0, 0, 9316, 9318, 3, 1228, 614, 0, 9317, 9315, 1, 0, 0, 0, 9318, 9321, 1, 0, 0, 0, 9319, 9317, 1, 0, 0, 0, 9319, 9320, 1, 0, 0, 0, 9320, 1227, 1, 0, 0, 0, 9321, 9319, 1, 0, 0, 0, 9322, 9325, 3, 1164, 582, 0, 9323, 9324, 5, 36, 0, 0, 9324, 9326, 3, 1382, 691, 0, 9325, 9323, 1, 0, 0, 0, 9325, 9326, 1, 0, 0, 0, 9326, 1229, 1, 0, 0, 0, 9327, 9328, 7, 50, 0, 0, 9328, 1231, 1, 0, 0, 0, 9329, 9330, 5, 285, 0, 0, 9330, 9335, 5, 371, 0, 0, 9331, 9332, 5, 340, 0, 0, 9332, 9335, 5, 371, 0, 0, 9333, 9335, 1, 0, 0, 0, 9334, 9329, 1, 0, 0, 0, 9334, 9331, 1, 0, 0, 0, 9334, 9333, 1, 0, 0, 0, 9335, 1233, 1, 0, 0, 0, 9336, 9337, 5, 279, 0, 0, 9337, 9352, 3, 1208, 604, 0, 9338, 9339, 5, 279, 0, 0, 9339, 9340, 3, 1208, 604, 0, 9340, 9341, 3, 1236, 618, 0, 9341, 9352, 1, 0, 0, 0, 9342, 9343, 5, 279, 0, 0, 9343, 9344, 3, 1236, 618, 0, 9344, 9345, 3, 1208, 604, 0, 9345, 9352, 1, 0, 0, 0, 9346, 9347, 5, 279, 0, 0, 9347, 9348, 3, 1236, 618, 0, 9348, 9349, 3, 1208, 604, 0, 9349, 9350, 3, 1236, 618, 0, 9350, 9352, 1, 0, 0, 0, 9351, 9336, 1, 0, 0, 0, 9351, 9338, 1, 0, 0, 0, 9351, 9342, 1, 0, 0, 0, 9351, 9346, 1, 0, 0, 0, 9352, 1235, 1, 0, 0, 0, 9353, 9354, 5, 147, 0, 0, 9354, 9355, 7, 51, 0, 0, 9355, 1237, 1, 0, 0, 0, 9356, 9357, 5, 479, 0, 0, 9357, 9358, 5, 66, 0, 0, 9358, 9359, 5, 2, 0, 0, 9359, 9360, 3, 1000, 500, 0, 9360, 9361, 5, 3, 0, 0, 9361, 9364, 1, 0, 0, 0, 9362, 9364, 1, 0, 0, 0, 9363, 9356, 1, 0, 0, 0, 9363, 9362, 1, 0, 0, 0, 9364, 1239, 1, 0, 0, 0, 9365, 9366, 5, 480, 0, 0, 9366, 9367, 5, 2, 0, 0, 9367, 9368, 5, 103, 0, 0, 9368, 9369, 3, 1164, 582, 0, 9369, 9370, 5, 3, 0, 0, 9370, 9373, 1, 0, 0, 0, 9371, 9373, 1, 0, 0, 0, 9372, 9365, 1, 0, 0, 0, 9372, 9371, 1, 0, 0, 0, 9373, 1241, 1, 0, 0, 0, 9374, 9375, 5, 104, 0, 0, 9375, 9378, 3, 1244, 622, 0, 9376, 9378, 1, 0, 0, 0, 9377, 9374, 1, 0, 0, 0, 9377, 9376, 1, 0, 0, 0, 9378, 1243, 1, 0, 0, 0, 9379, 9384, 3, 1246, 623, 0, 9380, 9381, 5, 6, 0, 0, 9381, 9383, 3, 1246, 623, 0, 9382, 9380, 1, 0, 0, 0, 9383, 9386, 1, 0, 0, 0, 9384, 9382, 1, 0, 0, 0, 9384, 9385, 1, 0, 0, 0, 9385, 1245, 1, 0, 0, 0, 9386, 9384, 1, 0, 0, 0, 9387, 9388, 3, 1374, 687, 0, 9388, 9389, 5, 36, 0, 0, 9389, 9390, 3, 1250, 625, 0, 9390, 1247, 1, 0, 0, 0, 9391, 9394, 5, 124, 0, 0, 9392, 9395, 3, 1250, 625, 0, 9393, 9395, 3, 1374, 687, 0, 9394, 9392, 1, 0, 0, 0, 9394, 9393, 1, 0, 0, 0, 9395, 9398, 1, 0, 0, 0, 9396, 9398, 1, 0, 0, 0, 9397, 9391, 1, 0, 0, 0, 9397, 9396, 1, 0, 0, 0, 9398, 1249, 1, 0, 0, 0, 9399, 9400, 5, 2, 0, 0, 9400, 9401, 3, 1252, 626, 0, 9401, 9402, 3, 1254, 627, 0, 9402, 9403, 3, 998, 499, 0, 9403, 9404, 3, 1256, 628, 0, 9404, 9405, 5, 3, 0, 0, 9405, 1251, 1, 0, 0, 0, 9406, 9409, 3, 1374, 687, 0, 9407, 9409, 1, 0, 0, 0, 9408, 9406, 1, 0, 0, 0, 9408, 9407, 1, 0, 0, 0, 9409, 1253, 1, 0, 0, 0, 9410, 9411, 5, 278, 0, 0, 9411, 9412, 5, 147, 0, 0, 9412, 9415, 3, 1282, 641, 0, 9413, 9415, 1, 0, 0, 0, 9414, 9410, 1, 0, 0, 0, 9414, 9413, 1, 0, 0, 0, 9415, 1255, 1, 0, 0, 0, 9416, 9417, 5, 292, 0, 0, 9417, 9418, 3, 1258, 629, 0, 9418, 9419, 3, 1262, 631, 0, 9419, 9430, 1, 0, 0, 0, 9420, 9421, 5, 313, 0, 0, 9421, 9422, 3, 1258, 629, 0, 9422, 9423, 3, 1262, 631, 0, 9423, 9430, 1, 0, 0, 0, 9424, 9425, 5, 481, 0, 0, 9425, 9426, 3, 1258, 629, 0, 9426, 9427, 3, 1262, 631, 0, 9427, 9430, 1, 0, 0, 0, 9428, 9430, 1, 0, 0, 0, 9429, 9416, 1, 0, 0, 0, 9429, 9420, 1, 0, 0, 0, 9429, 9424, 1, 0, 0, 0, 9429, 9428, 1, 0, 0, 0, 9430, 1257, 1, 0, 0, 0, 9431, 9438, 3, 1260, 630, 0, 9432, 9433, 5, 380, 0, 0, 9433, 9434, 3, 1260, 630, 0, 9434, 9435, 5, 33, 0, 0, 9435, 9436, 3, 1260, 630, 0, 9436, 9438, 1, 0, 0, 0, 9437, 9431, 1, 0, 0, 0, 9437, 9432, 1, 0, 0, 0, 9438, 1259, 1, 0, 0, 0, 9439, 9440, 5, 355, 0, 0, 9440, 9447, 7, 52, 0, 0, 9441, 9442, 5, 434, 0, 0, 9442, 9447, 5, 407, 0, 0, 9443, 9444, 3, 1164, 582, 0, 9444, 9445, 7, 52, 0, 0, 9445, 9447, 1, 0, 0, 0, 9446, 9439, 1, 0, 0, 0, 9446, 9441, 1, 0, 0, 0, 9446, 9443, 1, 0, 0, 0, 9447, 1261, 1, 0, 0, 0, 9448, 9455, 5, 199, 0, 0, 9449, 9450, 5, 434, 0, 0, 9450, 9456, 5, 407, 0, 0, 9451, 9456, 5, 66, 0, 0, 9452, 9456, 5, 467, 0, 0, 9453, 9454, 5, 262, 0, 0, 9454, 9456, 5, 482, 0, 0, 9455, 9449, 1, 0, 0, 0, 9455, 9451, 1, 0, 0, 0, 9455, 9452, 1, 0, 0, 0, 9455, 9453, 1, 0, 0, 0, 9456, 9459, 1, 0, 0, 0, 9457, 9459, 1, 0, 0, 0, 9458, 9448, 1, 0, 0, 0, 9458, 9457, 1, 0, 0, 0, 9459, 1263, 1, 0, 0, 0, 9460, 9461, 5, 407, 0, 0, 9461, 9463, 5, 2, 0, 0, 9462, 9464, 3, 1282, 641, 0, 9463, 9462, 1, 0, 0, 0, 9463, 9464, 1, 0, 0, 0, 9464, 9465, 1, 0, 0, 0, 9465, 9473, 5, 3, 0, 0, 9466, 9467, 5, 2, 0, 0, 9467, 9468, 3, 1282, 641, 0, 9468, 9469, 5, 6, 0, 0, 9469, 9470, 3, 1164, 582, 0, 9470, 9471, 5, 3, 0, 0, 9471, 9473, 1, 0, 0, 0, 9472, 9460, 1, 0, 0, 0, 9472, 9466, 1, 0, 0, 0, 9473, 1265, 1, 0, 0, 0, 9474, 9475, 5, 407, 0, 0, 9475, 9477, 5, 2, 0, 0, 9476, 9478, 3, 1282, 641, 0, 9477, 9476, 1, 0, 0, 0, 9477, 9478, 1, 0, 0, 0, 9478, 9479, 1, 0, 0, 0, 9479, 9480, 5, 3, 0, 0, 9480, 1267, 1, 0, 0, 0, 9481, 9482, 5, 2, 0, 0, 9482, 9483, 3, 1282, 641, 0, 9483, 9484, 5, 6, 0, 0, 9484, 9485, 3, 1164, 582, 0, 9485, 9486, 5, 3, 0, 0, 9486, 1269, 1, 0, 0, 0, 9487, 9488, 7, 53, 0, 0, 9488, 1271, 1, 0, 0, 0, 9489, 9492, 5, 29, 0, 0, 9490, 9492, 3, 1274, 637, 0, 9491, 9489, 1, 0, 0, 0, 9491, 9490, 1, 0, 0, 0, 9492, 1273, 1, 0, 0, 0, 9493, 9494, 7, 54, 0, 0, 9494, 1275, 1, 0, 0, 0, 9495, 9502, 5, 29, 0, 0, 9496, 9497, 5, 271, 0, 0, 9497, 9498, 5, 2, 0, 0, 9498, 9499, 3, 684, 342, 0, 9499, 9500, 5, 3, 0, 0, 9500, 9502, 1, 0, 0, 0, 9501, 9495, 1, 0, 0, 0, 9501, 9496, 1, 0, 0, 0, 9502, 1277, 1, 0, 0, 0, 9503, 9510, 3, 1272, 636, 0, 9504, 9505, 5, 271, 0, 0, 9505, 9506, 5, 2, 0, 0, 9506, 9507, 3, 684, 342, 0, 9507, 9508, 5, 3, 0, 0, 9508, 9510, 1, 0, 0, 0, 9509, 9503, 1, 0, 0, 0, 9509, 9504, 1, 0, 0, 0, 9510, 1279, 1, 0, 0, 0, 9511, 9524, 3, 1272, 636, 0, 9512, 9513, 5, 271, 0, 0, 9513, 9514, 5, 2, 0, 0, 9514, 9515, 3, 684, 342, 0, 9515, 9516, 5, 3, 0, 0, 9516, 9524, 1, 0, 0, 0, 9517, 9524, 5, 120, 0, 0, 9518, 9519, 5, 77, 0, 0, 9519, 9524, 5, 120, 0, 0, 9520, 9524, 5, 114, 0, 0, 9521, 9522, 5, 77, 0, 0, 9522, 9524, 5, 114, 0, 0, 9523, 9511, 1, 0, 0, 0, 9523, 9512, 1, 0, 0, 0, 9523, 9517, 1, 0, 0, 0, 9523, 9518, 1, 0, 0, 0, 9523, 9520, 1, 0, 0, 0, 9523, 9521, 1, 0, 0, 0, 9524, 1281, 1, 0, 0, 0, 9525, 9530, 3, 1164, 582, 0, 9526, 9527, 5, 6, 0, 0, 9527, 9529, 3, 1164, 582, 0, 9528, 9526, 1, 0, 0, 0, 9529, 9532, 1, 0, 0, 0, 9530, 9528, 1, 0, 0, 0, 9530, 9531, 1, 0, 0, 0, 9531, 1283, 1, 0, 0, 0, 9532, 9530, 1, 0, 0, 0, 9533, 9538, 3, 1286, 643, 0, 9534, 9535, 5, 6, 0, 0, 9535, 9537, 3, 1286, 643, 0, 9536, 9534, 1, 0, 0, 0, 9537, 9540, 1, 0, 0, 0, 9538, 9536, 1, 0, 0, 0, 9538, 9539, 1, 0, 0, 0, 9539, 1285, 1, 0, 0, 0, 9540, 9538, 1, 0, 0, 0, 9541, 9547, 3, 1164, 582, 0, 9542, 9543, 3, 636, 318, 0, 9543, 9544, 7, 55, 0, 0, 9544, 9545, 3, 1164, 582, 0, 9545, 9547, 1, 0, 0, 0, 9546, 9541, 1, 0, 0, 0, 9546, 9542, 1, 0, 0, 0, 9547, 1287, 1, 0, 0, 0, 9548, 9553, 3, 1120, 560, 0, 9549, 9550, 5, 6, 0, 0, 9550, 9552, 3, 1120, 560, 0, 9551, 9549, 1, 0, 0, 0, 9552, 9555, 1, 0, 0, 0, 9553, 9551, 1, 0, 0, 0, 9553, 9554, 1, 0, 0, 0, 9554, 1289, 1, 0, 0, 0, 9555, 9553, 1, 0, 0, 0, 9556, 9559, 5, 4, 0, 0, 9557, 9560, 3, 1282, 641, 0, 9558, 9560, 3, 1292, 646, 0, 9559, 9557, 1, 0, 0, 0, 9559, 9558, 1, 0, 0, 0, 9559, 9560, 1, 0, 0, 0, 9560, 9561, 1, 0, 0, 0, 9561, 9562, 5, 5, 0, 0, 9562, 1291, 1, 0, 0, 0, 9563, 9568, 3, 1290, 645, 0, 9564, 9565, 5, 6, 0, 0, 9565, 9567, 3, 1290, 645, 0, 9566, 9564, 1, 0, 0, 0, 9567, 9570, 1, 0, 0, 0, 9568, 9566, 1, 0, 0, 0, 9568, 9569, 1, 0, 0, 0, 9569, 1293, 1, 0, 0, 0, 9570, 9568, 1, 0, 0, 0, 9571, 9572, 3, 1296, 648, 0, 9572, 9573, 5, 64, 0, 0, 9573, 9574, 3, 1164, 582, 0, 9574, 9577, 1, 0, 0, 0, 9575, 9577, 1, 0, 0, 0, 9576, 9571, 1, 0, 0, 0, 9576, 9575, 1, 0, 0, 0, 9577, 1295, 1, 0, 0, 0, 9578, 9587, 3, 1384, 692, 0, 9579, 9587, 5, 377, 0, 0, 9580, 9587, 5, 257, 0, 0, 9581, 9587, 5, 176, 0, 0, 9582, 9587, 5, 218, 0, 0, 9583, 9587, 5, 254, 0, 0, 9584, 9587, 5, 319, 0, 0, 9585, 9587, 3, 1360, 680, 0, 9586, 9578, 1, 0, 0, 0, 9586, 9579, 1, 0, 0, 0, 9586, 9580, 1, 0, 0, 0, 9586, 9581, 1, 0, 0, 0, 9586, 9582, 1, 0, 0, 0, 9586, 9583, 1, 0, 0, 0, 9586, 9584, 1, 0, 0, 0, 9586, 9585, 1, 0, 0, 0, 9587, 1297, 1, 0, 0, 0, 9588, 9589, 7, 56, 0, 0, 9589, 1299, 1, 0, 0, 0, 9590, 9591, 3, 1164, 582, 0, 9591, 9592, 5, 84, 0, 0, 9592, 9593, 3, 1164, 582, 0, 9593, 9594, 5, 64, 0, 0, 9594, 9597, 3, 1164, 582, 0, 9595, 9596, 5, 62, 0, 0, 9596, 9598, 3, 1164, 582, 0, 9597, 9595, 1, 0, 0, 0, 9597, 9598, 1, 0, 0, 0, 9598, 1301, 1, 0, 0, 0, 9599, 9600, 3, 1206, 603, 0, 9600, 9601, 5, 68, 0, 0, 9601, 9602, 3, 1206, 603, 0, 9602, 9605, 1, 0, 0, 0, 9603, 9605, 1, 0, 0, 0, 9604, 9599, 1, 0, 0, 0, 9604, 9603, 1, 0, 0, 0, 9605, 1303, 1, 0, 0, 0, 9606, 9607, 3, 1164, 582, 0, 9607, 9608, 5, 64, 0, 0, 9608, 9609, 3, 1164, 582, 0, 9609, 9610, 5, 62, 0, 0, 9610, 9611, 3, 1164, 582, 0, 9611, 9635, 1, 0, 0, 0, 9612, 9613, 3, 1164, 582, 0, 9613, 9614, 5, 62, 0, 0, 9614, 9615, 3, 1164, 582, 0, 9615, 9616, 5, 64, 0, 0, 9616, 9617, 3, 1164, 582, 0, 9617, 9635, 1, 0, 0, 0, 9618, 9619, 3, 1164, 582, 0, 9619, 9620, 5, 64, 0, 0, 9620, 9621, 3, 1164, 582, 0, 9621, 9635, 1, 0, 0, 0, 9622, 9623, 3, 1164, 582, 0, 9623, 9624, 5, 62, 0, 0, 9624, 9625, 3, 1164, 582, 0, 9625, 9635, 1, 0, 0, 0, 9626, 9627, 3, 1164, 582, 0, 9627, 9628, 5, 127, 0, 0, 9628, 9629, 3, 1164, 582, 0, 9629, 9630, 5, 197, 0, 0, 9630, 9631, 3, 1164, 582, 0, 9631, 9635, 1, 0, 0, 0, 9632, 9635, 3, 1282, 641, 0, 9633, 9635, 1, 0, 0, 0, 9634, 9606, 1, 0, 0, 0, 9634, 9612, 1, 0, 0, 0, 9634, 9618, 1, 0, 0, 0, 9634, 9622, 1, 0, 0, 0, 9634, 9626, 1, 0, 0, 0, 9634, 9632, 1, 0, 0, 0, 9634, 9633, 1, 0, 0, 0, 9635, 1305, 1, 0, 0, 0, 9636, 9637, 3, 1164, 582, 0, 9637, 9638, 5, 64, 0, 0, 9638, 9639, 3, 1282, 641, 0, 9639, 9644, 1, 0, 0, 0, 9640, 9641, 5, 64, 0, 0, 9641, 9644, 3, 1282, 641, 0, 9642, 9644, 3, 1282, 641, 0, 9643, 9636, 1, 0, 0, 0, 9643, 9640, 1, 0, 0, 0, 9643, 9642, 1, 0, 0, 0, 9644, 1307, 1, 0, 0, 0, 9645, 9651, 3, 962, 481, 0, 9646, 9647, 5, 2, 0, 0, 9647, 9648, 3, 1282, 641, 0, 9648, 9649, 5, 3, 0, 0, 9649, 9651, 1, 0, 0, 0, 9650, 9645, 1, 0, 0, 0, 9650, 9646, 1, 0, 0, 0, 9651, 1309, 1, 0, 0, 0, 9652, 9653, 5, 40, 0, 0, 9653, 9654, 3, 1318, 659, 0, 9654, 9655, 3, 1312, 656, 0, 9655, 9656, 3, 1316, 658, 0, 9656, 9657, 5, 454, 0, 0, 9657, 1311, 1, 0, 0, 0, 9658, 9660, 3, 1314, 657, 0, 9659, 9658, 1, 0, 0, 0, 9660, 9661, 1, 0, 0, 0, 9661, 9659, 1, 0, 0, 0, 9661, 9662, 1, 0, 0, 0, 9662, 1313, 1, 0, 0, 0, 9663, 9664, 5, 102, 0, 0, 9664, 9665, 3, 1164, 582, 0, 9665, 9666, 5, 93, 0, 0, 9666, 9667, 3, 1164, 582, 0, 9667, 1315, 1, 0, 0, 0, 9668, 9669, 5, 58, 0, 0, 9669, 9672, 3, 1164, 582, 0, 9670, 9672, 1, 0, 0, 0, 9671, 9668, 1, 0, 0, 0, 9671, 9670, 1, 0, 0, 0, 9672, 1317, 1, 0, 0, 0, 9673, 9676, 3, 1164, 582, 0, 9674, 9676, 1, 0, 0, 0, 9675, 9673, 1, 0, 0, 0, 9675, 9674, 1, 0, 0, 0, 9676, 1319, 1, 0, 0, 0, 9677, 9679, 3, 1374, 687, 0, 9678, 9680, 3, 1326, 663, 0, 9679, 9678, 1, 0, 0, 0, 9679, 9680, 1, 0, 0, 0, 9680, 1321, 1, 0, 0, 0, 9681, 9684, 5, 11, 0, 0, 9682, 9685, 3, 1344, 672, 0, 9683, 9685, 5, 9, 0, 0, 9684, 9682, 1, 0, 0, 0, 9684, 9683, 1, 0, 0, 0, 9685, 9697, 1, 0, 0, 0, 9686, 9692, 5, 4, 0, 0, 9687, 9693, 3, 1164, 582, 0, 9688, 9689, 3, 1324, 662, 0, 9689, 9690, 5, 8, 0, 0, 9690, 9691, 3, 1324, 662, 0, 9691, 9693, 1, 0, 0, 0, 9692, 9687, 1, 0, 0, 0, 9692, 9688, 1, 0, 0, 0, 9693, 9694, 1, 0, 0, 0, 9694, 9695, 5, 5, 0, 0, 9695, 9697, 1, 0, 0, 0, 9696, 9681, 1, 0, 0, 0, 9696, 9686, 1, 0, 0, 0, 9697, 1323, 1, 0, 0, 0, 9698, 9701, 3, 1164, 582, 0, 9699, 9701, 1, 0, 0, 0, 9700, 9698, 1, 0, 0, 0, 9700, 9699, 1, 0, 0, 0, 9701, 1325, 1, 0, 0, 0, 9702, 9704, 3, 1322, 661, 0, 9703, 9702, 1, 0, 0, 0, 9704, 9705, 1, 0, 0, 0, 9705, 9703, 1, 0, 0, 0, 9705, 9706, 1, 0, 0, 0, 9706, 1327, 1, 0, 0, 0, 9707, 9709, 3, 1322, 661, 0, 9708, 9707, 1, 0, 0, 0, 9709, 9712, 1, 0, 0, 0, 9710, 9708, 1, 0, 0, 0, 9710, 9711, 1, 0, 0, 0, 9711, 1329, 1, 0, 0, 0, 9712, 9710, 1, 0, 0, 0, 9713, 9716, 3, 1332, 666, 0, 9714, 9716, 1, 0, 0, 0, 9715, 9713, 1, 0, 0, 0, 9715, 9714, 1, 0, 0, 0, 9716, 1331, 1, 0, 0, 0, 9717, 9722, 3, 1334, 667, 0, 9718, 9719, 5, 6, 0, 0, 9719, 9721, 3, 1334, 667, 0, 9720, 9718, 1, 0, 0, 0, 9721, 9724, 1, 0, 0, 0, 9722, 9720, 1, 0, 0, 0, 9722, 9723, 1, 0, 0, 0, 9723, 1333, 1, 0, 0, 0, 9724, 9722, 1, 0, 0, 0, 9725, 9730, 3, 1164, 582, 0, 9726, 9727, 5, 36, 0, 0, 9727, 9731, 3, 1382, 691, 0, 9728, 9731, 3, 1384, 692, 0, 9729, 9731, 1, 0, 0, 0, 9730, 9726, 1, 0, 0, 0, 9730, 9728, 1, 0, 0, 0, 9730, 9729, 1, 0, 0, 0, 9731, 9734, 1, 0, 0, 0, 9732, 9734, 5, 9, 0, 0, 9733, 9725, 1, 0, 0, 0, 9733, 9732, 1, 0, 0, 0, 9734, 1335, 1, 0, 0, 0, 9735, 9740, 3, 1338, 669, 0, 9736, 9737, 5, 6, 0, 0, 9737, 9739, 3, 1338, 669, 0, 9738, 9736, 1, 0, 0, 0, 9739, 9742, 1, 0, 0, 0, 9740, 9738, 1, 0, 0, 0, 9740, 9741, 1, 0, 0, 0, 9741, 1337, 1, 0, 0, 0, 9742, 9740, 1, 0, 0, 0, 9743, 9745, 3, 1374, 687, 0, 9744, 9746, 3, 1326, 663, 0, 9745, 9744, 1, 0, 0, 0, 9745, 9746, 1, 0, 0, 0, 9746, 1339, 1, 0, 0, 0, 9747, 9752, 3, 1342, 671, 0, 9748, 9749, 5, 6, 0, 0, 9749, 9751, 3, 1342, 671, 0, 9750, 9748, 1, 0, 0, 0, 9751, 9754, 1, 0, 0, 0, 9752, 9750, 1, 0, 0, 0, 9752, 9753, 1, 0, 0, 0, 9753, 1341, 1, 0, 0, 0, 9754, 9752, 1, 0, 0, 0, 9755, 9756, 3, 1374, 687, 0, 9756, 1343, 1, 0, 0, 0, 9757, 9758, 3, 1382, 691, 0, 9758, 1345, 1, 0, 0, 0, 9759, 9760, 3, 1360, 680, 0, 9760, 1347, 1, 0, 0, 0, 9761, 9769, 3, 1396, 698, 0, 9762, 9769, 3, 1378, 689, 0, 9763, 9764, 3, 1374, 687, 0, 9764, 9765, 3, 1326, 663, 0, 9765, 9769, 1, 0, 0, 0, 9766, 9769, 5, 119, 0, 0, 9767, 9769, 5, 126, 0, 0, 9768, 9761, 1, 0, 0, 0, 9768, 9762, 1, 0, 0, 0, 9768, 9763, 1, 0, 0, 0, 9768, 9766, 1, 0, 0, 0, 9768, 9767, 1, 0, 0, 0, 9769, 1349, 1, 0, 0, 0, 9770, 9803, 3, 1358, 679, 0, 9771, 9803, 3, 1356, 678, 0, 9772, 9803, 3, 1360, 680, 0, 9773, 9803, 3, 1354, 677, 0, 9774, 9803, 3, 1352, 676, 0, 9775, 9783, 3, 1348, 674, 0, 9776, 9784, 3, 1360, 680, 0, 9777, 9778, 5, 2, 0, 0, 9778, 9779, 3, 1284, 642, 0, 9779, 9780, 3, 998, 499, 0, 9780, 9781, 5, 3, 0, 0, 9781, 9782, 3, 1360, 680, 0, 9782, 9784, 1, 0, 0, 0, 9783, 9776, 1, 0, 0, 0, 9783, 9777, 1, 0, 0, 0, 9784, 9803, 1, 0, 0, 0, 9785, 9786, 3, 1126, 563, 0, 9786, 9787, 3, 1360, 680, 0, 9787, 9803, 1, 0, 0, 0, 9788, 9797, 3, 1154, 577, 0, 9789, 9790, 3, 1360, 680, 0, 9790, 9791, 3, 1158, 579, 0, 9791, 9798, 1, 0, 0, 0, 9792, 9793, 5, 2, 0, 0, 9793, 9794, 3, 1358, 679, 0, 9794, 9795, 5, 3, 0, 0, 9795, 9796, 3, 1360, 680, 0, 9796, 9798, 1, 0, 0, 0, 9797, 9789, 1, 0, 0, 0, 9797, 9792, 1, 0, 0, 0, 9798, 9803, 1, 0, 0, 0, 9799, 9803, 5, 96, 0, 0, 9800, 9803, 5, 60, 0, 0, 9801, 9803, 5, 78, 0, 0, 9802, 9770, 1, 0, 0, 0, 9802, 9771, 1, 0, 0, 0, 9802, 9772, 1, 0, 0, 0, 9802, 9773, 1, 0, 0, 0, 9802, 9774, 1, 0, 0, 0, 9802, 9775, 1, 0, 0, 0, 9802, 9785, 1, 0, 0, 0, 9802, 9788, 1, 0, 0, 0, 9802, 9799, 1, 0, 0, 0, 9802, 9800, 1, 0, 0, 0, 9802, 9801, 1, 0, 0, 0, 9803, 1351, 1, 0, 0, 0, 9804, 9805, 5, 654, 0, 0, 9805, 1353, 1, 0, 0, 0, 9806, 9807, 5, 650, 0, 0, 9807, 1355, 1, 0, 0, 0, 9808, 9809, 5, 660, 0, 0, 9809, 1357, 1, 0, 0, 0, 9810, 9811, 5, 658, 0, 0, 9811, 1359, 1, 0, 0, 0, 9812, 9813, 3, 1362, 681, 0, 9813, 9814, 3, 1364, 682, 0, 9814, 1361, 1, 0, 0, 0, 9815, 9827, 5, 645, 0, 0, 9816, 9827, 5, 647, 0, 0, 9817, 9821, 5, 649, 0, 0, 9818, 9820, 5, 677, 0, 0, 9819, 9818, 1, 0, 0, 0, 9820, 9823, 1, 0, 0, 0, 9821, 9819, 1, 0, 0, 0, 9821, 9822, 1, 0, 0, 0, 9822, 9824, 1, 0, 0, 0, 9823, 9821, 1, 0, 0, 0, 9824, 9827, 5, 678, 0, 0, 9825, 9827, 5, 671, 0, 0, 9826, 9815, 1, 0, 0, 0, 9826, 9816, 1, 0, 0, 0, 9826, 9817, 1, 0, 0, 0, 9826, 9825, 1, 0, 0, 0, 9827, 1363, 1, 0, 0, 0, 9828, 9829, 5, 487, 0, 0, 9829, 9832, 3, 1362, 681, 0, 9830, 9832, 1, 0, 0, 0, 9831, 9828, 1, 0, 0, 0, 9831, 9830, 1, 0, 0, 0, 9832, 1365, 1, 0, 0, 0, 9833, 9839, 3, 1358, 679, 0, 9834, 9835, 5, 12, 0, 0, 9835, 9839, 3, 1358, 679, 0, 9836, 9837, 5, 13, 0, 0, 9837, 9839, 3, 1358, 679, 0, 9838, 9833, 1, 0, 0, 0, 9838, 9834, 1, 0, 0, 0, 9838, 9836, 1, 0, 0, 0, 9839, 1367, 1, 0, 0, 0, 9840, 9841, 3, 1370, 685, 0, 9841, 1369, 1, 0, 0, 0, 9842, 9846, 3, 1380, 690, 0, 9843, 9846, 5, 52, 0, 0, 9844, 9846, 5, 89, 0, 0, 9845, 9842, 1, 0, 0, 0, 9845, 9843, 1, 0, 0, 0, 9845, 9844, 1, 0, 0, 0, 9846, 1371, 1, 0, 0, 0, 9847, 9852, 3, 1370, 685, 0, 9848, 9849, 5, 6, 0, 0, 9849, 9851, 3, 1370, 685, 0, 9850, 9848, 1, 0, 0, 0, 9851, 9854, 1, 0, 0, 0, 9852, 9850, 1, 0, 0, 0, 9852, 9853, 1, 0, 0, 0, 9853, 1373, 1, 0, 0, 0, 9854, 9852, 1, 0, 0, 0, 9855, 9862, 3, 1384, 692, 0, 9856, 9862, 3, 1388, 694, 0, 9857, 9862, 3, 1390, 695, 0, 9858, 9862, 3, 1610, 805, 0, 9859, 9862, 5, 119, 0, 0, 9860, 9862, 5, 126, 0, 0, 9861, 9855, 1, 0, 0, 0, 9861, 9856, 1, 0, 0, 0, 9861, 9857, 1, 0, 0, 0, 9861, 9858, 1, 0, 0, 0, 9861, 9859, 1, 0, 0, 0, 9861, 9860, 1, 0, 0, 0, 9862, 1375, 1, 0, 0, 0, 9863, 9868, 3, 1384, 692, 0, 9864, 9868, 3, 1388, 694, 0, 9865, 9868, 3, 1390, 695, 0, 9866, 9868, 3, 1610, 805, 0, 9867, 9863, 1, 0, 0, 0, 9867, 9864, 1, 0, 0, 0, 9867, 9865, 1, 0, 0, 0, 9867, 9866, 1, 0, 0, 0, 9868, 1377, 1, 0, 0, 0, 9869, 9874, 3, 1384, 692, 0, 9870, 9874, 3, 1388, 694, 0, 9871, 9874, 3, 1610, 805, 0, 9872, 9874, 3, 1392, 696, 0, 9873, 9869, 1, 0, 0, 0, 9873, 9870, 1, 0, 0, 0, 9873, 9871, 1, 0, 0, 0, 9873, 9872, 1, 0, 0, 0, 9874, 1379, 1, 0, 0, 0, 9875, 9880, 3, 1384, 692, 0, 9876, 9880, 3, 1388, 694, 0, 9877, 9880, 3, 1390, 695, 0, 9878, 9880, 3, 1392, 696, 0, 9879, 9875, 1, 0, 0, 0, 9879, 9876, 1, 0, 0, 0, 9879, 9877, 1, 0, 0, 0, 9879, 9878, 1, 0, 0, 0, 9880, 1381, 1, 0, 0, 0, 9881, 9888, 3, 1384, 692, 0, 9882, 9888, 3, 1610, 805, 0, 9883, 9888, 3, 1388, 694, 0, 9884, 9888, 3, 1390, 695, 0, 9885, 9888, 3, 1392, 696, 0, 9886, 9888, 3, 1394, 697, 0, 9887, 9881, 1, 0, 0, 0, 9887, 9882, 1, 0, 0, 0, 9887, 9883, 1, 0, 0, 0, 9887, 9884, 1, 0, 0, 0, 9887, 9885, 1, 0, 0, 0, 9887, 9886, 1, 0, 0, 0, 9888, 1383, 1, 0, 0, 0, 9889, 9890, 5, 636, 0, 0, 9890, 9897, 3, 1364, 682, 0, 9891, 9897, 5, 637, 0, 0, 9892, 9897, 5, 641, 0, 0, 9893, 9897, 3, 1210, 605, 0, 9894, 9897, 3, 1386, 693, 0, 9895, 9897, 3, 1610, 805, 0, 9896, 9889, 1, 0, 0, 0, 9896, 9891, 1, 0, 0, 0, 9896, 9892, 1, 0, 0, 0, 9896, 9893, 1, 0, 0, 0, 9896, 9894, 1, 0, 0, 0, 9896, 9895, 1, 0, 0, 0, 9897, 1385, 1, 0, 0, 0, 9898, 9899, 5, 662, 0, 0, 9899, 1387, 1, 0, 0, 0, 9900, 9901, 7, 57, 0, 0, 9901, 1389, 1, 0, 0, 0, 9902, 9955, 5, 380, 0, 0, 9903, 9955, 5, 381, 0, 0, 9904, 9955, 3, 1136, 568, 0, 9905, 9955, 5, 383, 0, 0, 9906, 9955, 5, 384, 0, 0, 9907, 9955, 3, 1144, 572, 0, 9908, 9955, 5, 386, 0, 0, 9909, 9955, 5, 387, 0, 0, 9910, 9955, 5, 388, 0, 0, 9911, 9955, 5, 389, 0, 0, 9912, 9955, 5, 390, 0, 0, 9913, 9955, 5, 391, 0, 0, 9914, 9955, 5, 392, 0, 0, 9915, 9955, 5, 470, 0, 0, 9916, 9955, 5, 393, 0, 0, 9917, 9955, 5, 394, 0, 0, 9918, 9955, 5, 395, 0, 0, 9919, 9955, 5, 396, 0, 0, 9920, 9955, 5, 397, 0, 0, 9921, 9955, 5, 398, 0, 0, 9922, 9955, 5, 399, 0, 0, 9923, 9955, 5, 400, 0, 0, 9924, 9955, 5, 489, 0, 0, 9925, 9955, 5, 401, 0, 0, 9926, 9955, 3, 1132, 566, 0, 9927, 9955, 5, 453, 0, 0, 9928, 9955, 5, 403, 0, 0, 9929, 9955, 5, 404, 0, 0, 9930, 9955, 5, 405, 0, 0, 9931, 9955, 5, 406, 0, 0, 9932, 9955, 5, 407, 0, 0, 9933, 9955, 5, 408, 0, 0, 9934, 9955, 5, 409, 0, 0, 9935, 9955, 5, 410, 0, 0, 9936, 9955, 5, 411, 0, 0, 9937, 9955, 5, 412, 0, 0, 9938, 9955, 5, 413, 0, 0, 9939, 9955, 5, 414, 0, 0, 9940, 9955, 5, 415, 0, 0, 9941, 9955, 5, 416, 0, 0, 9942, 9955, 5, 417, 0, 0, 9943, 9955, 5, 425, 0, 0, 9944, 9955, 5, 426, 0, 0, 9945, 9955, 5, 427, 0, 0, 9946, 9955, 5, 428, 0, 0, 9947, 9955, 5, 476, 0, 0, 9948, 9955, 5, 429, 0, 0, 9949, 9955, 5, 430, 0, 0, 9950, 9955, 5, 431, 0, 0, 9951, 9955, 5, 432, 0, 0, 9952, 9955, 5, 474, 0, 0, 9953, 9955, 3, 1396, 698, 0, 9954, 9902, 1, 0, 0, 0, 9954, 9903, 1, 0, 0, 0, 9954, 9904, 1, 0, 0, 0, 9954, 9905, 1, 0, 0, 0, 9954, 9906, 1, 0, 0, 0, 9954, 9907, 1, 0, 0, 0, 9954, 9908, 1, 0, 0, 0, 9954, 9909, 1, 0, 0, 0, 9954, 9910, 1, 0, 0, 0, 9954, 9911, 1, 0, 0, 0, 9954, 9912, 1, 0, 0, 0, 9954, 9913, 1, 0, 0, 0, 9954, 9914, 1, 0, 0, 0, 9954, 9915, 1, 0, 0, 0, 9954, 9916, 1, 0, 0, 0, 9954, 9917, 1, 0, 0, 0, 9954, 9918, 1, 0, 0, 0, 9954, 9919, 1, 0, 0, 0, 9954, 9920, 1, 0, 0, 0, 9954, 9921, 1, 0, 0, 0, 9954, 9922, 1, 0, 0, 0, 9954, 9923, 1, 0, 0, 0, 9954, 9924, 1, 0, 0, 0, 9954, 9925, 1, 0, 0, 0, 9954, 9926, 1, 0, 0, 0, 9954, 9927, 1, 0, 0, 0, 9954, 9928, 1, 0, 0, 0, 9954, 9929, 1, 0, 0, 0, 9954, 9930, 1, 0, 0, 0, 9954, 9931, 1, 0, 0, 0, 9954, 9932, 1, 0, 0, 0, 9954, 9933, 1, 0, 0, 0, 9954, 9934, 1, 0, 0, 0, 9954, 9935, 1, 0, 0, 0, 9954, 9936, 1, 0, 0, 0, 9954, 9937, 1, 0, 0, 0, 9954, 9938, 1, 0, 0, 0, 9954, 9939, 1, 0, 0, 0, 9954, 9940, 1, 0, 0, 0, 9954, 9941, 1, 0, 0, 0, 9954, 9942, 1, 0, 0, 0, 9954, 9943, 1, 0, 0, 0, 9954, 9944, 1, 0, 0, 0, 9954, 9945, 1, 0, 0, 0, 9954, 9946, 1, 0, 0, 0, 9954, 9947, 1, 0, 0, 0, 9954, 9948, 1, 0, 0, 0, 9954, 9949, 1, 0, 0, 0, 9954, 9950, 1, 0, 0, 0, 9954, 9951, 1, 0, 0, 0, 9954, 9952, 1, 0, 0, 0, 9954, 9953, 1, 0, 0, 0, 9955, 1391, 1, 0, 0, 0, 9956, 9957, 7, 58, 0, 0, 9957, 1393, 1, 0, 0, 0, 9958, 9959, 7, 59, 0, 0, 9959, 1395, 1, 0, 0, 0, 9960, 9961, 7, 60, 0, 0, 9961, 1397, 1, 0, 0, 0, 9962, 9963, 3, 1400, 700, 0, 9963, 9964, 3, 1410, 705, 0, 9964, 9965, 3, 1408, 704, 0, 9965, 1399, 1, 0, 0, 0, 9966, 9968, 3, 1402, 701, 0, 9967, 9966, 1, 0, 0, 0, 9968, 9971, 1, 0, 0, 0, 9969, 9967, 1, 0, 0, 0, 9969, 9970, 1, 0, 0, 0, 9970, 1401, 1, 0, 0, 0, 9971, 9969, 1, 0, 0, 0, 9972, 9973, 3, 1404, 702, 0, 9973, 9974, 5, 272, 0, 0, 9974, 9975, 5, 490, 0, 0, 9975, 9993, 1, 0, 0, 0, 9976, 9977, 3, 1404, 702, 0, 9977, 9978, 5, 491, 0, 0, 9978, 9979, 3, 1406, 703, 0, 9979, 9993, 1, 0, 0, 0, 9980, 9981, 3, 1404, 702, 0, 9981, 9982, 5, 492, 0, 0, 9982, 9983, 5, 493, 0, 0, 9983, 9993, 1, 0, 0, 0, 9984, 9985, 3, 1404, 702, 0, 9985, 9986, 5, 492, 0, 0, 9986, 9987, 5, 494, 0, 0, 9987, 9993, 1, 0, 0, 0, 9988, 9989, 3, 1404, 702, 0, 9989, 9990, 5, 492, 0, 0, 9990, 9991, 5, 495, 0, 0, 9991, 9993, 1, 0, 0, 0, 9992, 9972, 1, 0, 0, 0, 9992, 9976, 1, 0, 0, 0, 9992, 9980, 1, 0, 0, 0, 9992, 9984, 1, 0, 0, 0, 9992, 9988, 1, 0, 0, 0, 9993, 1403, 1, 0, 0, 0, 9994, 9995, 5, 29, 0, 0, 9995, 1405, 1, 0, 0, 0, 9996, 10001, 3, 1360, 680, 0, 9997, 10001, 3, 1394, 697, 0, 9998, 10001, 3, 1610, 805, 0, 9999, 10001, 3, 1388, 694, 0, 10000, 9996, 1, 0, 0, 0, 10000, 9997, 1, 0, 0, 0, 10000, 9998, 1, 0, 0, 0, 10000, 9999, 1, 0, 0, 0, 10001, 1407, 1, 0, 0, 0, 10002, 10005, 1, 0, 0, 0, 10003, 10005, 5, 7, 0, 0, 10004, 10002, 1, 0, 0, 0, 10004, 10003, 1, 0, 0, 0, 10005, 1409, 1, 0, 0, 0, 10006, 10007, 3, 1412, 706, 0, 10007, 10008, 5, 146, 0, 0, 10008, 10009, 3, 1454, 727, 0, 10009, 10010, 3, 1590, 795, 0, 10010, 10011, 5, 454, 0, 0, 10011, 10012, 3, 1604, 802, 0, 10012, 1411, 1, 0, 0, 0, 10013, 10018, 3, 1600, 800, 0, 10014, 10016, 3, 1414, 707, 0, 10015, 10017, 3, 1416, 708, 0, 10016, 10015, 1, 0, 0, 0, 10016, 10017, 1, 0, 0, 0, 10017, 10019, 1, 0, 0, 0, 10018, 10014, 1, 0, 0, 0, 10018, 10019, 1, 0, 0, 0, 10019, 1413, 1, 0, 0, 0, 10020, 10021, 5, 178, 0, 0, 10021, 1415, 1, 0, 0, 0, 10022, 10024, 3, 1420, 710, 0, 10023, 10022, 1, 0, 0, 0, 10024, 10025, 1, 0, 0, 0, 10025, 10023, 1, 0, 0, 0, 10025, 10026, 1, 0, 0, 0, 10026, 1417, 1, 0, 0, 0, 10027, 10028, 5, 18, 0, 0, 10028, 10029, 3, 1608, 804, 0, 10029, 10030, 5, 19, 0, 0, 10030, 1419, 1, 0, 0, 0, 10031, 10035, 3, 1422, 711, 0, 10032, 10035, 5, 178, 0, 0, 10033, 10035, 3, 1418, 709, 0, 10034, 10031, 1, 0, 0, 0, 10034, 10032, 1, 0, 0, 0, 10034, 10033, 1, 0, 0, 0, 10035, 1421, 1, 0, 0, 0, 10036, 10052, 3, 1438, 719, 0, 10037, 10038, 5, 496, 0, 0, 10038, 10039, 5, 62, 0, 0, 10039, 10053, 3, 1436, 718, 0, 10040, 10041, 3, 1440, 720, 0, 10041, 10042, 3, 1442, 721, 0, 10042, 10043, 3, 1444, 722, 0, 10043, 10044, 3, 1446, 723, 0, 10044, 10045, 3, 1448, 724, 0, 10045, 10053, 1, 0, 0, 0, 10046, 10047, 3, 1424, 712, 0, 10047, 10048, 5, 172, 0, 0, 10048, 10049, 3, 1428, 714, 0, 10049, 10050, 3, 1434, 717, 0, 10050, 10051, 3, 1426, 713, 0, 10051, 10053, 1, 0, 0, 0, 10052, 10037, 1, 0, 0, 0, 10052, 10040, 1, 0, 0, 0, 10052, 10046, 1, 0, 0, 0, 10053, 10054, 1, 0, 0, 0, 10054, 10055, 5, 7, 0, 0, 10055, 1423, 1, 0, 0, 0, 10056, 10061, 1, 0, 0, 0, 10057, 10058, 5, 262, 0, 0, 10058, 10061, 5, 317, 0, 0, 10059, 10061, 5, 317, 0, 0, 10060, 10056, 1, 0, 0, 0, 10060, 10057, 1, 0, 0, 0, 10060, 10059, 1, 0, 0, 0, 10061, 1425, 1, 0, 0, 0, 10062, 10063, 3, 960, 480, 0, 10063, 1427, 1, 0, 0, 0, 10064, 10070, 1, 0, 0, 0, 10065, 10066, 5, 2, 0, 0, 10066, 10067, 3, 1430, 715, 0, 10067, 10068, 5, 3, 0, 0, 10068, 10070, 1, 0, 0, 0, 10069, 10064, 1, 0, 0, 0, 10069, 10065, 1, 0, 0, 0, 10070, 1429, 1, 0, 0, 0, 10071, 10076, 3, 1432, 716, 0, 10072, 10073, 5, 6, 0, 0, 10073, 10075, 3, 1432, 716, 0, 10074, 10072, 1, 0, 0, 0, 10075, 10078, 1, 0, 0, 0, 10076, 10074, 1, 0, 0, 0, 10076, 10077, 1, 0, 0, 0, 10077, 1431, 1, 0, 0, 0, 10078, 10076, 1, 0, 0, 0, 10079, 10080, 3, 1438, 719, 0, 10080, 10081, 3, 1442, 721, 0, 10081, 1433, 1, 0, 0, 0, 10082, 10083, 7, 61, 0, 0, 10083, 1435, 1, 0, 0, 0, 10084, 10087, 5, 28, 0, 0, 10085, 10087, 3, 1374, 687, 0, 10086, 10084, 1, 0, 0, 0, 10086, 10085, 1, 0, 0, 0, 10087, 1437, 1, 0, 0, 0, 10088, 10089, 3, 1608, 804, 0, 10089, 1439, 1, 0, 0, 0, 10090, 10093, 1, 0, 0, 0, 10091, 10093, 5, 497, 0, 0, 10092, 10090, 1, 0, 0, 0, 10092, 10091, 1, 0, 0, 0, 10093, 1441, 1, 0, 0, 0, 10094, 10095, 3, 1120, 560, 0, 10095, 1443, 1, 0, 0, 0, 10096, 10100, 1, 0, 0, 0, 10097, 10098, 5, 43, 0, 0, 10098, 10100, 3, 524, 262, 0, 10099, 10096, 1, 0, 0, 0, 10099, 10097, 1, 0, 0, 0, 10100, 1445, 1, 0, 0, 0, 10101, 10105, 1, 0, 0, 0, 10102, 10103, 5, 77, 0, 0, 10103, 10105, 5, 78, 0, 0, 10104, 10101, 1, 0, 0, 0, 10104, 10102, 1, 0, 0, 0, 10105, 1447, 1, 0, 0, 0, 10106, 10111, 1, 0, 0, 0, 10107, 10108, 3, 1450, 725, 0, 10108, 10109, 3, 1612, 806, 0, 10109, 10111, 1, 0, 0, 0, 10110, 10106, 1, 0, 0, 0, 10110, 10107, 1, 0, 0, 0, 10111, 1449, 1, 0, 0, 0, 10112, 10115, 3, 1452, 726, 0, 10113, 10115, 5, 53, 0, 0, 10114, 10112, 1, 0, 0, 0, 10114, 10113, 1, 0, 0, 0, 10115, 1451, 1, 0, 0, 0, 10116, 10117, 7, 62, 0, 0, 10117, 1453, 1, 0, 0, 0, 10118, 10120, 3, 1456, 728, 0, 10119, 10118, 1, 0, 0, 0, 10120, 10123, 1, 0, 0, 0, 10121, 10119, 1, 0, 0, 0, 10121, 10122, 1, 0, 0, 0, 10122, 1455, 1, 0, 0, 0, 10123, 10121, 1, 0, 0, 0, 10124, 10125, 3, 1410, 705, 0, 10125, 10126, 5, 7, 0, 0, 10126, 10152, 1, 0, 0, 0, 10127, 10152, 3, 1522, 761, 0, 10128, 10152, 3, 1526, 763, 0, 10129, 10152, 3, 1464, 732, 0, 10130, 10152, 3, 1480, 740, 0, 10131, 10152, 3, 1486, 743, 0, 10132, 10152, 3, 1496, 748, 0, 10133, 10152, 3, 1498, 749, 0, 10134, 10152, 3, 1500, 750, 0, 10135, 10152, 3, 1514, 757, 0, 10136, 10152, 3, 1518, 759, 0, 10137, 10152, 3, 1538, 769, 0, 10138, 10152, 3, 1544, 772, 0, 10139, 10152, 3, 1546, 773, 0, 10140, 10152, 3, 1458, 729, 0, 10141, 10152, 3, 1460, 730, 0, 10142, 10152, 3, 1466, 733, 0, 10143, 10152, 3, 1554, 777, 0, 10144, 10152, 3, 1566, 783, 0, 10145, 10152, 3, 1574, 787, 0, 10146, 10152, 3, 1576, 788, 0, 10147, 10152, 3, 1578, 789, 0, 10148, 10152, 3, 1580, 790, 0, 10149, 10152, 3, 1582, 791, 0, 10150, 10152, 3, 1586, 793, 0, 10151, 10124, 1, 0, 0, 0, 10151, 10127, 1, 0, 0, 0, 10151, 10128, 1, 0, 0, 0, 10151, 10129, 1, 0, 0, 0, 10151, 10130, 1, 0, 0, 0, 10151, 10131, 1, 0, 0, 0, 10151, 10132, 1, 0, 0, 0, 10151, 10133, 1, 0, 0, 0, 10151, 10134, 1, 0, 0, 0, 10151, 10135, 1, 0, 0, 0, 10151, 10136, 1, 0, 0, 0, 10151, 10137, 1, 0, 0, 0, 10151, 10138, 1, 0, 0, 0, 10151, 10139, 1, 0, 0, 0, 10151, 10140, 1, 0, 0, 0, 10151, 10141, 1, 0, 0, 0, 10151, 10142, 1, 0, 0, 0, 10151, 10143, 1, 0, 0, 0, 10151, 10144, 1, 0, 0, 0, 10151, 10145, 1, 0, 0, 0, 10151, 10146, 1, 0, 0, 0, 10151, 10147, 1, 0, 0, 0, 10151, 10148, 1, 0, 0, 0, 10151, 10149, 1, 0, 0, 0, 10151, 10150, 1, 0, 0, 0, 10152, 1457, 1, 0, 0, 0, 10153, 10154, 5, 498, 0, 0, 10154, 10155, 3, 1616, 808, 0, 10155, 10156, 5, 7, 0, 0, 10156, 1459, 1, 0, 0, 0, 10157, 10158, 5, 433, 0, 0, 10158, 10159, 3, 1608, 804, 0, 10159, 10160, 5, 2, 0, 0, 10160, 10161, 3, 1462, 731, 0, 10161, 10162, 5, 3, 0, 0, 10162, 10163, 5, 7, 0, 0, 10163, 10172, 1, 0, 0, 0, 10164, 10165, 5, 57, 0, 0, 10165, 10166, 3, 1608, 804, 0, 10166, 10167, 5, 2, 0, 0, 10167, 10168, 3, 1462, 731, 0, 10168, 10169, 5, 3, 0, 0, 10169, 10170, 5, 7, 0, 0, 10170, 10172, 1, 0, 0, 0, 10171, 10157, 1, 0, 0, 0, 10171, 10164, 1, 0, 0, 0, 10172, 1461, 1, 0, 0, 0, 10173, 10176, 1, 0, 0, 0, 10174, 10176, 3, 1282, 641, 0, 10175, 10173, 1, 0, 0, 0, 10175, 10174, 1, 0, 0, 0, 10176, 1463, 1, 0, 0, 0, 10177, 10178, 3, 1478, 739, 0, 10178, 10179, 3, 1452, 726, 0, 10179, 10180, 3, 1612, 806, 0, 10180, 10181, 5, 7, 0, 0, 10181, 1465, 1, 0, 0, 0, 10182, 10183, 5, 499, 0, 0, 10183, 10184, 3, 1468, 734, 0, 10184, 10185, 5, 500, 0, 0, 10185, 10186, 3, 1470, 735, 0, 10186, 10187, 5, 7, 0, 0, 10187, 1467, 1, 0, 0, 0, 10188, 10192, 1, 0, 0, 0, 10189, 10192, 5, 434, 0, 0, 10190, 10192, 5, 501, 0, 0, 10191, 10188, 1, 0, 0, 0, 10191, 10189, 1, 0, 0, 0, 10191, 10190, 1, 0, 0, 0, 10192, 1469, 1, 0, 0, 0, 10193, 10198, 3, 1472, 736, 0, 10194, 10195, 5, 6, 0, 0, 10195, 10197, 3, 1472, 736, 0, 10196, 10194, 1, 0, 0, 0, 10197, 10200, 1, 0, 0, 0, 10198, 10196, 1, 0, 0, 0, 10198, 10199, 1, 0, 0, 0, 10199, 1471, 1, 0, 0, 0, 10200, 10198, 1, 0, 0, 0, 10201, 10202, 3, 1476, 738, 0, 10202, 10203, 3, 1452, 726, 0, 10203, 10204, 3, 1474, 737, 0, 10204, 1473, 1, 0, 0, 0, 10205, 10206, 3, 1374, 687, 0, 10206, 1475, 1, 0, 0, 0, 10207, 10208, 3, 1478, 739, 0, 10208, 1477, 1, 0, 0, 0, 10209, 10212, 3, 524, 262, 0, 10210, 10212, 5, 28, 0, 0, 10211, 10209, 1, 0, 0, 0, 10211, 10210, 1, 0, 0, 0, 10212, 10219, 1, 0, 0, 0, 10213, 10214, 5, 4, 0, 0, 10214, 10215, 3, 1618, 809, 0, 10215, 10216, 5, 5, 0, 0, 10216, 10218, 1, 0, 0, 0, 10217, 10213, 1, 0, 0, 0, 10218, 10221, 1, 0, 0, 0, 10219, 10217, 1, 0, 0, 0, 10219, 10220, 1, 0, 0, 0, 10220, 1479, 1, 0, 0, 0, 10221, 10219, 1, 0, 0, 0, 10222, 10223, 5, 220, 0, 0, 10223, 10224, 3, 1614, 807, 0, 10224, 10225, 5, 93, 0, 0, 10225, 10226, 3, 1454, 727, 0, 10226, 10227, 3, 1482, 741, 0, 10227, 10228, 3, 1484, 742, 0, 10228, 10229, 5, 454, 0, 0, 10229, 10230, 5, 220, 0, 0, 10230, 10231, 5, 7, 0, 0, 10231, 1481, 1, 0, 0, 0, 10232, 10233, 5, 502, 0, 0, 10233, 10234, 3, 1164, 582, 0, 10234, 10235, 5, 93, 0, 0, 10235, 10236, 3, 1454, 727, 0, 10236, 10238, 1, 0, 0, 0, 10237, 10232, 1, 0, 0, 0, 10238, 10241, 1, 0, 0, 0, 10239, 10237, 1, 0, 0, 0, 10239, 10240, 1, 0, 0, 0, 10240, 1483, 1, 0, 0, 0, 10241, 10239, 1, 0, 0, 0, 10242, 10246, 1, 0, 0, 0, 10243, 10244, 5, 58, 0, 0, 10244, 10246, 3, 1454, 727, 0, 10245, 10242, 1, 0, 0, 0, 10245, 10243, 1, 0, 0, 0, 10246, 1485, 1, 0, 0, 0, 10247, 10248, 5, 40, 0, 0, 10248, 10249, 3, 1488, 744, 0, 10249, 10250, 3, 1490, 745, 0, 10250, 10251, 3, 1494, 747, 0, 10251, 10252, 5, 454, 0, 0, 10252, 10253, 5, 40, 0, 0, 10253, 10254, 5, 7, 0, 0, 10254, 1487, 1, 0, 0, 0, 10255, 10258, 1, 0, 0, 0, 10256, 10258, 3, 1612, 806, 0, 10257, 10255, 1, 0, 0, 0, 10257, 10256, 1, 0, 0, 0, 10258, 1489, 1, 0, 0, 0, 10259, 10261, 3, 1492, 746, 0, 10260, 10259, 1, 0, 0, 0, 10261, 10262, 1, 0, 0, 0, 10262, 10260, 1, 0, 0, 0, 10262, 10263, 1, 0, 0, 0, 10263, 1491, 1, 0, 0, 0, 10264, 10265, 5, 102, 0, 0, 10265, 10266, 3, 1282, 641, 0, 10266, 10267, 5, 93, 0, 0, 10267, 10268, 3, 1454, 727, 0, 10268, 1493, 1, 0, 0, 0, 10269, 10273, 1, 0, 0, 0, 10270, 10271, 5, 58, 0, 0, 10271, 10273, 3, 1454, 727, 0, 10272, 10269, 1, 0, 0, 0, 10272, 10270, 1, 0, 0, 0, 10273, 1495, 1, 0, 0, 0, 10274, 10275, 3, 1602, 801, 0, 10275, 10276, 3, 1542, 771, 0, 10276, 1497, 1, 0, 0, 0, 10277, 10278, 3, 1602, 801, 0, 10278, 10279, 5, 503, 0, 0, 10279, 10280, 3, 1620, 810, 0, 10280, 10281, 3, 1542, 771, 0, 10281, 1499, 1, 0, 0, 0, 10282, 10283, 3, 1602, 801, 0, 10283, 10284, 5, 62, 0, 0, 10284, 10285, 3, 1502, 751, 0, 10285, 10286, 3, 1542, 771, 0, 10286, 1501, 1, 0, 0, 0, 10287, 10288, 3, 1512, 756, 0, 10288, 10304, 5, 68, 0, 0, 10289, 10290, 3, 954, 477, 0, 10290, 10291, 3, 1506, 753, 0, 10291, 10305, 1, 0, 0, 0, 10292, 10305, 3, 960, 480, 0, 10293, 10305, 3, 878, 439, 0, 10294, 10295, 5, 202, 0, 0, 10295, 10296, 3, 1164, 582, 0, 10296, 10297, 3, 1504, 752, 0, 10297, 10305, 1, 0, 0, 0, 10298, 10299, 3, 1508, 754, 0, 10299, 10300, 3, 1164, 582, 0, 10300, 10301, 5, 24, 0, 0, 10301, 10302, 3, 1164, 582, 0, 10302, 10303, 3, 1510, 755, 0, 10303, 10305, 1, 0, 0, 0, 10304, 10289, 1, 0, 0, 0, 10304, 10292, 1, 0, 0, 0, 10304, 10293, 1, 0, 0, 0, 10304, 10294, 1, 0, 0, 0, 10304, 10298, 1, 0, 0, 0, 10305, 1503, 1, 0, 0, 0, 10306, 10310, 1, 0, 0, 0, 10307, 10308, 5, 100, 0, 0, 10308, 10310, 3, 1282, 641, 0, 10309, 10306, 1, 0, 0, 0, 10309, 10307, 1, 0, 0, 0, 10310, 1505, 1, 0, 0, 0, 10311, 10324, 1, 0, 0, 0, 10312, 10313, 5, 2, 0, 0, 10313, 10318, 3, 1164, 582, 0, 10314, 10315, 5, 6, 0, 0, 10315, 10317, 3, 1164, 582, 0, 10316, 10314, 1, 0, 0, 0, 10317, 10320, 1, 0, 0, 0, 10318, 10316, 1, 0, 0, 0, 10318, 10319, 1, 0, 0, 0, 10319, 10321, 1, 0, 0, 0, 10320, 10318, 1, 0, 0, 0, 10321, 10322, 5, 3, 0, 0, 10322, 10324, 1, 0, 0, 0, 10323, 10311, 1, 0, 0, 0, 10323, 10312, 1, 0, 0, 0, 10324, 1507, 1, 0, 0, 0, 10325, 10328, 1, 0, 0, 0, 10326, 10328, 5, 504, 0, 0, 10327, 10325, 1, 0, 0, 0, 10327, 10326, 1, 0, 0, 0, 10328, 1509, 1, 0, 0, 0, 10329, 10333, 1, 0, 0, 0, 10330, 10331, 5, 147, 0, 0, 10331, 10333, 3, 1164, 582, 0, 10332, 10329, 1, 0, 0, 0, 10332, 10330, 1, 0, 0, 0, 10333, 1511, 1, 0, 0, 0, 10334, 10335, 3, 522, 261, 0, 10335, 1513, 1, 0, 0, 0, 10336, 10337, 3, 1602, 801, 0, 10337, 10338, 5, 505, 0, 0, 10338, 10339, 3, 1512, 756, 0, 10339, 10340, 3, 1516, 758, 0, 10340, 10341, 5, 68, 0, 0, 10341, 10342, 5, 35, 0, 0, 10342, 10343, 3, 1164, 582, 0, 10343, 10344, 3, 1542, 771, 0, 10344, 1515, 1, 0, 0, 0, 10345, 10349, 1, 0, 0, 0, 10346, 10347, 5, 506, 0, 0, 10347, 10349, 3, 1358, 679, 0, 10348, 10345, 1, 0, 0, 0, 10348, 10346, 1, 0, 0, 0, 10349, 1517, 1, 0, 0, 0, 10350, 10351, 3, 1520, 760, 0, 10351, 10352, 3, 1604, 802, 0, 10352, 10353, 3, 1606, 803, 0, 10353, 10354, 5, 7, 0, 0, 10354, 1519, 1, 0, 0, 0, 10355, 10356, 7, 63, 0, 0, 10356, 1521, 1, 0, 0, 0, 10357, 10369, 5, 508, 0, 0, 10358, 10359, 5, 261, 0, 0, 10359, 10370, 3, 1612, 806, 0, 10360, 10366, 5, 509, 0, 0, 10361, 10362, 5, 202, 0, 0, 10362, 10363, 3, 1164, 582, 0, 10363, 10364, 3, 1504, 752, 0, 10364, 10367, 1, 0, 0, 0, 10365, 10367, 3, 960, 480, 0, 10366, 10361, 1, 0, 0, 0, 10366, 10365, 1, 0, 0, 0, 10367, 10370, 1, 0, 0, 0, 10368, 10370, 3, 1524, 762, 0, 10369, 10358, 1, 0, 0, 0, 10369, 10360, 1, 0, 0, 0, 10369, 10368, 1, 0, 0, 0, 10370, 10371, 1, 0, 0, 0, 10371, 10372, 5, 7, 0, 0, 10372, 1523, 1, 0, 0, 0, 10373, 10376, 1, 0, 0, 0, 10374, 10376, 3, 1612, 806, 0, 10375, 10373, 1, 0, 0, 0, 10375, 10374, 1, 0, 0, 0, 10376, 1525, 1, 0, 0, 0, 10377, 10378, 5, 510, 0, 0, 10378, 10379, 3, 1528, 764, 0, 10379, 10380, 3, 1360, 680, 0, 10380, 10381, 3, 1530, 765, 0, 10381, 10382, 3, 1532, 766, 0, 10382, 10383, 5, 7, 0, 0, 10383, 10404, 1, 0, 0, 0, 10384, 10385, 5, 510, 0, 0, 10385, 10386, 3, 1528, 764, 0, 10386, 10387, 3, 1384, 692, 0, 10387, 10388, 3, 1532, 766, 0, 10388, 10389, 5, 7, 0, 0, 10389, 10404, 1, 0, 0, 0, 10390, 10391, 5, 510, 0, 0, 10391, 10392, 3, 1528, 764, 0, 10392, 10393, 5, 511, 0, 0, 10393, 10394, 3, 1360, 680, 0, 10394, 10395, 3, 1532, 766, 0, 10395, 10396, 5, 7, 0, 0, 10396, 10404, 1, 0, 0, 0, 10397, 10398, 5, 510, 0, 0, 10398, 10399, 3, 1528, 764, 0, 10399, 10400, 3, 1532, 766, 0, 10400, 10401, 5, 7, 0, 0, 10401, 10404, 1, 0, 0, 0, 10402, 10404, 5, 510, 0, 0, 10403, 10377, 1, 0, 0, 0, 10403, 10384, 1, 0, 0, 0, 10403, 10390, 1, 0, 0, 0, 10403, 10397, 1, 0, 0, 0, 10403, 10402, 1, 0, 0, 0, 10404, 1527, 1, 0, 0, 0, 10405, 10414, 1, 0, 0, 0, 10406, 10414, 1, 0, 0, 0, 10407, 10414, 5, 512, 0, 0, 10408, 10414, 5, 513, 0, 0, 10409, 10414, 5, 514, 0, 0, 10410, 10414, 5, 515, 0, 0, 10411, 10414, 5, 516, 0, 0, 10412, 10414, 5, 517, 0, 0, 10413, 10405, 1, 0, 0, 0, 10413, 10406, 1, 0, 0, 0, 10413, 10407, 1, 0, 0, 0, 10413, 10408, 1, 0, 0, 0, 10413, 10409, 1, 0, 0, 0, 10413, 10410, 1, 0, 0, 0, 10413, 10411, 1, 0, 0, 0, 10413, 10412, 1, 0, 0, 0, 10414, 1529, 1, 0, 0, 0, 10415, 10423, 1, 0, 0, 0, 10416, 10417, 5, 6, 0, 0, 10417, 10419, 3, 1164, 582, 0, 10418, 10416, 1, 0, 0, 0, 10419, 10420, 1, 0, 0, 0, 10420, 10418, 1, 0, 0, 0, 10420, 10421, 1, 0, 0, 0, 10421, 10423, 1, 0, 0, 0, 10422, 10415, 1, 0, 0, 0, 10422, 10418, 1, 0, 0, 0, 10423, 1531, 1, 0, 0, 0, 10424, 10428, 1, 0, 0, 0, 10425, 10426, 5, 100, 0, 0, 10426, 10428, 3, 1536, 768, 0, 10427, 10424, 1, 0, 0, 0, 10427, 10425, 1, 0, 0, 0, 10428, 1533, 1, 0, 0, 0, 10429, 10430, 3, 1384, 692, 0, 10430, 10431, 5, 10, 0, 0, 10431, 10432, 3, 1164, 582, 0, 10432, 1535, 1, 0, 0, 0, 10433, 10438, 3, 1534, 767, 0, 10434, 10435, 5, 6, 0, 0, 10435, 10437, 3, 1534, 767, 0, 10436, 10434, 1, 0, 0, 0, 10437, 10440, 1, 0, 0, 0, 10438, 10436, 1, 0, 0, 0, 10438, 10439, 1, 0, 0, 0, 10439, 1537, 1, 0, 0, 0, 10440, 10438, 1, 0, 0, 0, 10441, 10442, 5, 518, 0, 0, 10442, 10443, 3, 1612, 806, 0, 10443, 10444, 3, 1540, 770, 0, 10444, 10445, 5, 7, 0, 0, 10445, 1539, 1, 0, 0, 0, 10446, 10450, 1, 0, 0, 0, 10447, 10448, 5, 6, 0, 0, 10448, 10450, 3, 1612, 806, 0, 10449, 10446, 1, 0, 0, 0, 10449, 10447, 1, 0, 0, 0, 10450, 1541, 1, 0, 0, 0, 10451, 10452, 5, 519, 0, 0, 10452, 10453, 3, 1454, 727, 0, 10453, 10454, 5, 454, 0, 0, 10454, 10455, 5, 519, 0, 0, 10455, 10456, 3, 1604, 802, 0, 10456, 10457, 5, 7, 0, 0, 10457, 1543, 1, 0, 0, 0, 10458, 10459, 3, 1622, 811, 0, 10459, 10460, 5, 7, 0, 0, 10460, 1545, 1, 0, 0, 0, 10461, 10462, 5, 202, 0, 0, 10462, 10470, 3, 1164, 582, 0, 10463, 10464, 3, 1552, 776, 0, 10464, 10465, 3, 1548, 774, 0, 10465, 10471, 1, 0, 0, 0, 10466, 10467, 3, 1548, 774, 0, 10467, 10468, 3, 1552, 776, 0, 10468, 10471, 1, 0, 0, 0, 10469, 10471, 1, 0, 0, 0, 10470, 10463, 1, 0, 0, 0, 10470, 10466, 1, 0, 0, 0, 10470, 10469, 1, 0, 0, 0, 10471, 10472, 1, 0, 0, 0, 10472, 10473, 5, 7, 0, 0, 10473, 1547, 1, 0, 0, 0, 10474, 10478, 1, 0, 0, 0, 10475, 10476, 5, 100, 0, 0, 10476, 10478, 3, 1550, 775, 0, 10477, 10474, 1, 0, 0, 0, 10477, 10475, 1, 0, 0, 0, 10478, 1549, 1, 0, 0, 0, 10479, 10484, 3, 1164, 582, 0, 10480, 10481, 5, 6, 0, 0, 10481, 10483, 3, 1164, 582, 0, 10482, 10480, 1, 0, 0, 0, 10483, 10486, 1, 0, 0, 0, 10484, 10482, 1, 0, 0, 0, 10484, 10485, 1, 0, 0, 0, 10485, 1551, 1, 0, 0, 0, 10486, 10484, 1, 0, 0, 0, 10487, 10494, 1, 0, 0, 0, 10488, 10490, 5, 71, 0, 0, 10489, 10491, 5, 339, 0, 0, 10490, 10489, 1, 0, 0, 0, 10490, 10491, 1, 0, 0, 0, 10491, 10492, 1, 0, 0, 0, 10492, 10494, 3, 1568, 784, 0, 10493, 10487, 1, 0, 0, 0, 10493, 10488, 1, 0, 0, 0, 10494, 1553, 1, 0, 0, 0, 10495, 10513, 5, 520, 0, 0, 10496, 10497, 3, 1588, 794, 0, 10497, 10498, 3, 1562, 781, 0, 10498, 10504, 5, 62, 0, 0, 10499, 10505, 3, 960, 480, 0, 10500, 10501, 5, 202, 0, 0, 10501, 10502, 3, 1612, 806, 0, 10502, 10503, 3, 1560, 780, 0, 10503, 10505, 1, 0, 0, 0, 10504, 10499, 1, 0, 0, 0, 10504, 10500, 1, 0, 0, 0, 10505, 10514, 1, 0, 0, 0, 10506, 10511, 3, 1374, 687, 0, 10507, 10508, 5, 2, 0, 0, 10508, 10509, 3, 1558, 779, 0, 10509, 10510, 5, 3, 0, 0, 10510, 10512, 1, 0, 0, 0, 10511, 10507, 1, 0, 0, 0, 10511, 10512, 1, 0, 0, 0, 10512, 10514, 1, 0, 0, 0, 10513, 10496, 1, 0, 0, 0, 10513, 10506, 1, 0, 0, 0, 10514, 10515, 1, 0, 0, 0, 10515, 10516, 5, 7, 0, 0, 10516, 1555, 1, 0, 0, 0, 10517, 10518, 3, 1374, 687, 0, 10518, 10519, 5, 20, 0, 0, 10519, 10520, 3, 1164, 582, 0, 10520, 10523, 1, 0, 0, 0, 10521, 10523, 3, 1164, 582, 0, 10522, 10517, 1, 0, 0, 0, 10522, 10521, 1, 0, 0, 0, 10523, 1557, 1, 0, 0, 0, 10524, 10529, 3, 1556, 778, 0, 10525, 10526, 5, 6, 0, 0, 10526, 10528, 3, 1556, 778, 0, 10527, 10525, 1, 0, 0, 0, 10528, 10531, 1, 0, 0, 0, 10529, 10527, 1, 0, 0, 0, 10529, 10530, 1, 0, 0, 0, 10530, 1559, 1, 0, 0, 0, 10531, 10529, 1, 0, 0, 0, 10532, 10536, 1, 0, 0, 0, 10533, 10534, 5, 100, 0, 0, 10534, 10536, 3, 1282, 641, 0, 10535, 10532, 1, 0, 0, 0, 10535, 10533, 1, 0, 0, 0, 10536, 1561, 1, 0, 0, 0, 10537, 10542, 1, 0, 0, 0, 10538, 10539, 3, 1564, 782, 0, 10539, 10540, 5, 317, 0, 0, 10540, 10542, 1, 0, 0, 0, 10541, 10537, 1, 0, 0, 0, 10541, 10538, 1, 0, 0, 0, 10542, 1563, 1, 0, 0, 0, 10543, 10546, 1, 0, 0, 0, 10544, 10546, 5, 262, 0, 0, 10545, 10543, 1, 0, 0, 0, 10545, 10544, 1, 0, 0, 0, 10546, 1565, 1, 0, 0, 0, 10547, 10548, 5, 61, 0, 0, 10548, 10549, 3, 1572, 786, 0, 10549, 10550, 3, 1570, 785, 0, 10550, 10551, 3, 1588, 794, 0, 10551, 10552, 5, 71, 0, 0, 10552, 10553, 3, 1568, 784, 0, 10553, 10554, 5, 7, 0, 0, 10554, 1567, 1, 0, 0, 0, 10555, 10556, 3, 1282, 641, 0, 10556, 1569, 1, 0, 0, 0, 10557, 10561, 1, 0, 0, 0, 10558, 10561, 5, 64, 0, 0, 10559, 10561, 5, 68, 0, 0, 10560, 10557, 1, 0, 0, 0, 10560, 10558, 1, 0, 0, 0, 10560, 10559, 1, 0, 0, 0, 10561, 1571, 1, 0, 0, 0, 10562, 10580, 1, 0, 0, 0, 10563, 10580, 1, 0, 0, 0, 10564, 10580, 5, 261, 0, 0, 10565, 10580, 5, 286, 0, 0, 10566, 10580, 5, 207, 0, 0, 10567, 10580, 5, 240, 0, 0, 10568, 10569, 5, 130, 0, 0, 10569, 10580, 3, 1164, 582, 0, 10570, 10571, 5, 300, 0, 0, 10571, 10580, 3, 1164, 582, 0, 10572, 10580, 3, 1164, 582, 0, 10573, 10580, 5, 30, 0, 0, 10574, 10577, 7, 64, 0, 0, 10575, 10578, 3, 1164, 582, 0, 10576, 10578, 5, 30, 0, 0, 10577, 10575, 1, 0, 0, 0, 10577, 10576, 1, 0, 0, 0, 10577, 10578, 1, 0, 0, 0, 10578, 10580, 1, 0, 0, 0, 10579, 10562, 1, 0, 0, 0, 10579, 10563, 1, 0, 0, 0, 10579, 10564, 1, 0, 0, 0, 10579, 10565, 1, 0, 0, 0, 10579, 10566, 1, 0, 0, 0, 10579, 10567, 1, 0, 0, 0, 10579, 10568, 1, 0, 0, 0, 10579, 10570, 1, 0, 0, 0, 10579, 10572, 1, 0, 0, 0, 10579, 10573, 1, 0, 0, 0, 10579, 10574, 1, 0, 0, 0, 10580, 1573, 1, 0, 0, 0, 10581, 10582, 5, 258, 0, 0, 10582, 10583, 3, 1572, 786, 0, 10583, 10584, 3, 1588, 794, 0, 10584, 10585, 5, 7, 0, 0, 10585, 1575, 1, 0, 0, 0, 10586, 10587, 5, 157, 0, 0, 10587, 10588, 3, 1588, 794, 0, 10588, 10589, 5, 7, 0, 0, 10589, 1577, 1, 0, 0, 0, 10590, 10591, 5, 78, 0, 0, 10591, 10592, 5, 7, 0, 0, 10592, 1579, 1, 0, 0, 0, 10593, 10594, 5, 161, 0, 0, 10594, 10595, 3, 1584, 792, 0, 10595, 10596, 5, 7, 0, 0, 10596, 1581, 1, 0, 0, 0, 10597, 10598, 5, 312, 0, 0, 10598, 10599, 3, 1584, 792, 0, 10599, 10600, 5, 7, 0, 0, 10600, 1583, 1, 0, 0, 0, 10601, 10603, 5, 33, 0, 0, 10602, 10604, 5, 262, 0, 0, 10603, 10602, 1, 0, 0, 0, 10603, 10604, 1, 0, 0, 0, 10604, 10605, 1, 0, 0, 0, 10605, 10608, 5, 153, 0, 0, 10606, 10608, 1, 0, 0, 0, 10607, 10601, 1, 0, 0, 0, 10607, 10606, 1, 0, 0, 0, 10608, 1585, 1, 0, 0, 0, 10609, 10610, 5, 326, 0, 0, 10610, 10611, 3, 524, 262, 0, 10611, 10612, 5, 94, 0, 0, 10612, 10613, 5, 53, 0, 0, 10613, 10614, 5, 7, 0, 0, 10614, 10622, 1, 0, 0, 0, 10615, 10618, 5, 306, 0, 0, 10616, 10619, 3, 524, 262, 0, 10617, 10619, 5, 30, 0, 0, 10618, 10616, 1, 0, 0, 0, 10618, 10617, 1, 0, 0, 0, 10619, 10620, 1, 0, 0, 0, 10620, 10622, 5, 7, 0, 0, 10621, 10609, 1, 0, 0, 0, 10621, 10615, 1, 0, 0, 0, 10622, 1587, 1, 0, 0, 0, 10623, 10626, 3, 1374, 687, 0, 10624, 10626, 5, 28, 0, 0, 10625, 10623, 1, 0, 0, 0, 10625, 10624, 1, 0, 0, 0, 10626, 1589, 1, 0, 0, 0, 10627, 10631, 1, 0, 0, 0, 10628, 10629, 5, 517, 0, 0, 10629, 10631, 3, 1592, 796, 0, 10630, 10627, 1, 0, 0, 0, 10630, 10628, 1, 0, 0, 0, 10631, 1591, 1, 0, 0, 0, 10632, 10634, 3, 1594, 797, 0, 10633, 10632, 1, 0, 0, 0, 10634, 10635, 1, 0, 0, 0, 10635, 10633, 1, 0, 0, 0, 10635, 10636, 1, 0, 0, 0, 10636, 1593, 1, 0, 0, 0, 10637, 10638, 5, 102, 0, 0, 10638, 10639, 3, 1596, 798, 0, 10639, 10640, 5, 93, 0, 0, 10640, 10641, 3, 1454, 727, 0, 10641, 1595, 1, 0, 0, 0, 10642, 10647, 3, 1598, 799, 0, 10643, 10644, 5, 82, 0, 0, 10644, 10646, 3, 1598, 799, 0, 10645, 10643, 1, 0, 0, 0, 10646, 10649, 1, 0, 0, 0, 10647, 10645, 1, 0, 0, 0, 10647, 10648, 1, 0, 0, 0, 10648, 1597, 1, 0, 0, 0, 10649, 10647, 1, 0, 0, 0, 10650, 10654, 3, 1608, 804, 0, 10651, 10652, 5, 511, 0, 0, 10652, 10654, 3, 1360, 680, 0, 10653, 10650, 1, 0, 0, 0, 10653, 10651, 1, 0, 0, 0, 10654, 1599, 1, 0, 0, 0, 10655, 10658, 1, 0, 0, 0, 10656, 10658, 3, 1418, 709, 0, 10657, 10655, 1, 0, 0, 0, 10657, 10656, 1, 0, 0, 0, 10658, 1601, 1, 0, 0, 0, 10659, 10662, 1, 0, 0, 0, 10660, 10662, 3, 1418, 709, 0, 10661, 10659, 1, 0, 0, 0, 10661, 10660, 1, 0, 0, 0, 10662, 1603, 1, 0, 0, 0, 10663, 10666, 1, 0, 0, 0, 10664, 10666, 3, 1608, 804, 0, 10665, 10663, 1, 0, 0, 0, 10665, 10664, 1, 0, 0, 0, 10666, 1605, 1, 0, 0, 0, 10667, 10668, 5, 102, 0, 0, 10668, 10671, 3, 1616, 808, 0, 10669, 10671, 1, 0, 0, 0, 10670, 10667, 1, 0, 0, 0, 10670, 10669, 1, 0, 0, 0, 10671, 1607, 1, 0, 0, 0, 10672, 10675, 3, 1374, 687, 0, 10673, 10675, 3, 1610, 805, 0, 10674, 10672, 1, 0, 0, 0, 10674, 10673, 1, 0, 0, 0, 10675, 1609, 1, 0, 0, 0, 10676, 10677, 7, 65, 0, 0, 10677, 1611, 1, 0, 0, 0, 10678, 10679, 3, 1330, 665, 0, 10679, 10680, 3, 984, 492, 0, 10680, 10681, 3, 1056, 528, 0, 10681, 10682, 3, 1096, 548, 0, 10682, 10683, 3, 1026, 513, 0, 10683, 10684, 3, 1040, 520, 0, 10684, 10685, 3, 1242, 621, 0, 10685, 1613, 1, 0, 0, 0, 10686, 10687, 3, 1612, 806, 0, 10687, 1615, 1, 0, 0, 0, 10688, 10689, 3, 1612, 806, 0, 10689, 1617, 1, 0, 0, 0, 10690, 10691, 3, 1164, 582, 0, 10691, 1619, 1, 0, 0, 0, 10692, 10693, 3, 1164, 582, 0, 10693, 1621, 1, 0, 0, 0, 10694, 10695, 3, 8, 4, 0, 10695, 10696, 3, 1624, 812, 0, 10696, 1623, 1, 0, 0, 0, 10697, 10698, 5, 71, 0, 0, 10698, 10699, 3, 986, 493, 0, 10699, 10700, 3, 1568, 784, 0, 10700, 10703, 1, 0, 0, 0, 10701, 10703, 1, 0, 0, 0, 10702, 10697, 1, 0, 0, 0, 10702, 10701, 1, 0, 0, 0, 10703, 1625, 1, 0, 0, 0, 747, 1635, 1639, 1767, 1771, 1784, 1789, 1795, 1801, 1816, 1828, 1846, 1851, 1861, 1885, 1892, 1898, 1903, 1912, 1916, 1928, 1959, 1966, 1974, 1979, 1986, 1992, 2009, 2014, 2018, 2031, 2035, 2040, 2045, 2057, 2066, 2079, 2084, 2095, 2106, 2111, 2122, 2133, 2142, 2152, 2167, 2179, 2184, 2191, 2202, 2460, 2467, 2472, 2477, 2482, 2490, 2499, 2506, 2516, 2518, 2523, 2529, 2535, 2537, 2565, 2575, 2588, 2600, 2614, 2619, 2643, 2649, 2654, 2661, 2666, 2704, 2708, 2715, 2719, 2726, 2740, 2747, 2758, 2791, 2801, 2805, 2812, 2819, 2827, 2833, 2837, 2847, 2854, 2865, 2897, 2905, 2910, 2917, 2927, 2937, 2957, 2972, 2997, 3002, 3009, 3016, 3027, 3032, 3039, 3050, 3058, 3069, 3085, 3093, 3097, 3111, 3128, 3133, 3140, 3149, 3152, 3157, 3164, 3175, 3188, 3201, 3219, 3222, 3231, 3246, 3261, 3270, 3277, 3284, 3289, 3319, 3321, 3325, 3333, 3340, 3354, 3358, 3362, 3367, 3373, 3377, 3381, 3394, 3400, 3409, 3418, 3428, 3439, 3549, 3567, 3572, 3576, 3593, 3601, 3608, 3621, 3631, 3665, 3670, 3675, 3679, 3687, 3689, 3747, 3764, 3772, 3795, 3799, 3819, 3856, 3865, 3870, 3875, 3880, 3885, 3938, 3944, 3951, 3961, 3966, 3971, 3989, 3993, 4003, 4009, 4015, 4022, 4027, 4032, 4046, 4074, 4081, 4095, 4110, 4227, 4238, 4244, 4252, 4263, 4272, 4279, 4319, 4325, 4346, 4374, 4378, 4383, 4392, 4396, 4423, 4430, 4445, 4465, 4485, 4578, 4603, 4610, 4626, 4635, 4640, 4646, 4653, 4667, 4816, 4820, 4913, 4918, 4922, 4928, 4996, 5002, 5031, 5048, 5055, 5067, 5127, 5134, 5140, 5146, 5172, 5178, 5184, 5195, 5207, 5236, 5275, 5279, 5283, 5287, 5292, 5299, 5313, 5326, 5334, 5341, 5347, 5351, 5356, 5363, 5377, 5379, 5386, 5390, 5399, 5407, 5416, 5418, 5422, 5431, 5436, 5442, 5447, 5451, 5456, 5462, 5468, 5474, 5480, 5485, 5500, 5509, 5520, 5526, 5565, 5575, 5582, 5593, 5599, 5609, 5621, 5625, 5663, 5677, 5691, 5715, 5722, 5732, 5744, 5749, 5785, 5792, 5807, 5854, 5891, 5902, 5919, 6389, 6393, 6398, 6457, 6461, 6680, 6695, 6706, 6713, 6906, 6916, 6924, 6953, 6969, 7011, 7025, 7047, 7054, 7062, 7066, 7073, 7082, 7091, 7143, 7148, 7160, 7164, 7169, 7174, 7178, 7182, 7187, 7203, 7211, 7216, 7229, 7234, 7241, 7251, 7255, 7266, 7277, 7285, 7292, 7331, 7339, 7343, 7424, 7452, 7457, 7472, 7484, 7491, 7501, 7506, 7510, 7514, 7518, 7522, 7529, 7539, 7544, 7562, 7573, 7580, 7588, 7593, 7606, 7612, 7641, 7648, 7660, 7673, 7688, 7694, 7703, 7719, 7722, 7733, 7738, 7742, 7746, 7751, 7754, 7760, 7764, 7766, 7769, 7776, 7779, 7786, 7794, 7797, 7806, 7821, 7834, 7845, 7848, 7852, 7858, 7874, 7887, 7897, 7915, 7917, 7925, 7929, 7939, 7949, 7960, 7962, 7966, 7976, 7992, 7994, 7999, 8003, 8009, 8016, 8025, 8040, 8044, 8051, 8054, 8058, 8061, 8074, 8078, 8083, 8091, 8095, 8099, 8110, 8117, 8123, 8127, 8129, 8133, 8139, 8148, 8154, 8156, 8158, 8165, 8169, 8178, 8182, 8192, 8199, 8207, 8231, 8237, 8241, 8246, 8255, 8259, 8262, 8267, 8280, 8286, 8294, 8297, 8304, 8309, 8330, 8339, 8344, 8350, 8355, 8362, 8367, 8373, 8375, 8379, 8386, 8390, 8393, 8400, 8405, 8408, 8415, 8419, 8428, 8432, 8440, 8442, 8449, 8454, 8457, 8472, 8484, 8494, 8503, 8508, 8513, 8520, 8523, 8527, 8534, 8558, 8567, 8573, 8577, 8582, 8592, 8599, 8608, 8611, 8620, 8622, 8628, 8632, 8637, 8651, 8653, 8659, 8665, 8668, 8677, 8695, 8702, 8706, 8710, 8726, 8733, 8741, 8745, 8752, 8765, 8781, 8787, 8793, 8800, 8805, 8811, 8818, 8826, 8834, 8839, 8843, 8849, 8853, 8857, 8860, 8866, 8871, 8887, 8890, 8892, 8904, 8906, 8910, 8916, 8921, 8929, 8933, 8942, 8950, 8956, 8959, 8968, 8973, 8980, 8990, 9016, 9027, 9029, 9031, 9039, 9062, 9070, 9080, 9094, 9104, 9108, 9122, 9129, 9136, 9143, 9168, 9197, 9236, 9238, 9266, 9287, 9294, 9307, 9319, 9325, 9334, 9351, 9363, 9372, 9377, 9384, 9394, 9397, 9408, 9414, 9429, 9437, 9446, 9455, 9458, 9463, 9472, 9477, 9491, 9501, 9509, 9523, 9530, 9538, 9546, 9553, 9559, 9568, 9576, 9586, 9597, 9604, 9634, 9643, 9650, 9661, 9671, 9675, 9679, 9684, 9692, 9696, 9700, 9705, 9710, 9715, 9722, 9730, 9733, 9740, 9745, 9752, 9768, 9783, 9797, 9802, 9821, 9826, 9831, 9838, 9845, 9852, 9861, 9867, 9873, 9879, 9887, 9896, 9954, 9969, 9992, 10000, 10004, 10016, 10018, 10025, 10034, 10052, 10060, 10069, 10076, 10086, 10092, 10099, 10104, 10110, 10114, 10121, 10151, 10171, 10175, 10191, 10198, 10211, 10219, 10239, 10245, 10257, 10262, 10272, 10304, 10309, 10318, 10323, 10327, 10332, 10348, 10366, 10369, 10375, 10403, 10413, 10420, 10422, 10427, 10438, 10449, 10470, 10477, 10484, 10490, 10493, 10504, 10511, 10513, 10522, 10529, 10535, 10541, 10545, 10560, 10577, 10579, 10603, 10607, 10618, 10621, 10625, 10630, 10635, 10647, 10653, 10657, 10661, 10665, 10670, 10674, 10702] \ No newline at end of file diff --git a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.js b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.js index 6d7ea85e7..d97ebe3fd 100644 --- a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.js +++ b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.js @@ -1,13 +1,11 @@ -// Generated from .\src\parse\ANTLR\postgresql\PostgreSQLParser.g4 by ANTLR 4.13.0 +// Generated from PostgreSQLParser.g4 by ANTLR 4.13.2 // jshint ignore: start import antlr4 from 'antlr4'; import PostgreSQLParserVisitor from './PostgreSQLParserVisitor.js'; -import PostgreSQLParserBase, { ParseRoutineBody } from '../../ASTGeneration/postgres/PostgreSQLParserBase.js'; - -const _localctx = null; +import PostgreSQLParserBase from '../../ASTGeneration/postgres/PostgreSQLParserBase.js'; const serializedATN = [4,1,679,10705,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, @@ -1003,7 +1001,7 @@ const serializedATN = [4,1,679,10705,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4, 471,473,473,475,475,478,488,5,0,106,118,120,123,125,125,127,128,472,472, 4,0,30,52,54,70,72,105,454,454,5,0,304,304,418,424,504,504,513,513,521,635, 2,0,62,62,116,116,2,0,10,10,20,20,2,0,167,167,507,507,2,0,144,144,210,210, -36,0,33,33,35,35,43,45,53,53,57,57,61,61,92,92,116,116,123,123,130,130,144, +36,0,33,33,35,35,43,44,53,53,57,57,61,61,92,92,116,116,123,123,130,130,144, 144,153,153,157,157,161,161,167,167,172,172,207,207,210,210,232,232,240, 240,258,258,261,262,272,272,286,286,300,300,306,306,312,312,316,317,326, 326,353,353,433,434,477,477,490,502,506,512,514,518,520,520,11570,0,1626, @@ -5960,7 +5958,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -6059,7 +6056,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -6556,7 +6552,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -7518,7 +7513,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 60: @@ -8167,7 +8161,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -8934,7 +8927,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -9590,7 +9582,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -10315,7 +10306,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -13050,7 +13040,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -14007,7 +13996,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -14759,7 +14747,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 60: @@ -21609,7 +21596,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 52: case 53: case 57: @@ -28593,7 +28579,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -29371,7 +29356,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -30179,7 +30163,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 52: case 53: case 57: @@ -31401,7 +31384,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -31950,7 +31932,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -33159,7 +33140,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 5390; this._errHandler.sync(this); _la = this._input.LA(1); - if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268421) !== 0) || _la===68 || _la===92 || ((((_la - 101)) & ~0x1f) === 0 && ((1 << (_la - 101)) & 4294967265) !== 0) || ((((_la - 133)) & ~0x1f) === 0 && ((1 << (_la - 133)) & 4294967295) !== 0) || ((((_la - 165)) & ~0x1f) === 0 && ((1 << (_la - 165)) & 4294967295) !== 0) || ((((_la - 197)) & ~0x1f) === 0 && ((1 << (_la - 197)) & 4294967295) !== 0) || ((((_la - 229)) & ~0x1f) === 0 && ((1 << (_la - 229)) & 4276092927) !== 0) || ((((_la - 261)) & ~0x1f) === 0 && ((1 << (_la - 261)) & 4294967295) !== 0) || ((((_la - 293)) & ~0x1f) === 0 && ((1 << (_la - 293)) & 4294967295) !== 0) || ((((_la - 325)) & ~0x1f) === 0 && ((1 << (_la - 325)) & 4294967295) !== 0) || ((((_la - 357)) & ~0x1f) === 0 && ((1 << (_la - 357)) & 4294967295) !== 0) || ((((_la - 389)) & ~0x1f) === 0 && ((1 << (_la - 389)) & 4294967295) !== 0) || ((((_la - 421)) & ~0x1f) === 0 && ((1 << (_la - 421)) & 4294967295) !== 0) || ((((_la - 453)) & ~0x1f) === 0 && ((1 << (_la - 453)) & 4294967293) !== 0) || ((((_la - 485)) & ~0x1f) === 0 && ((1 << (_la - 485)) & 4293656575) !== 0) || ((((_la - 517)) & ~0x1f) === 0 && ((1 << (_la - 517)) & 4294967291) !== 0) || ((((_la - 549)) & ~0x1f) === 0 && ((1 << (_la - 549)) & 4294967295) !== 0) || ((((_la - 581)) & ~0x1f) === 0 && ((1 << (_la - 581)) & 4294967295) !== 0) || ((((_la - 613)) & ~0x1f) === 0 && ((1 << (_la - 613)) & 301989887) !== 0) || _la===661 || _la===662) { + if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264325) !== 0) || _la===68 || _la===92 || ((((_la - 101)) & ~0x1f) === 0 && ((1 << (_la - 101)) & 4294967265) !== 0) || ((((_la - 133)) & ~0x1f) === 0 && ((1 << (_la - 133)) & 4294967295) !== 0) || ((((_la - 165)) & ~0x1f) === 0 && ((1 << (_la - 165)) & 4294967295) !== 0) || ((((_la - 197)) & ~0x1f) === 0 && ((1 << (_la - 197)) & 4294967295) !== 0) || ((((_la - 229)) & ~0x1f) === 0 && ((1 << (_la - 229)) & 4276092927) !== 0) || ((((_la - 261)) & ~0x1f) === 0 && ((1 << (_la - 261)) & 4294967295) !== 0) || ((((_la - 293)) & ~0x1f) === 0 && ((1 << (_la - 293)) & 4294967295) !== 0) || ((((_la - 325)) & ~0x1f) === 0 && ((1 << (_la - 325)) & 4294967295) !== 0) || ((((_la - 357)) & ~0x1f) === 0 && ((1 << (_la - 357)) & 4294967295) !== 0) || ((((_la - 389)) & ~0x1f) === 0 && ((1 << (_la - 389)) & 4294967295) !== 0) || ((((_la - 421)) & ~0x1f) === 0 && ((1 << (_la - 421)) & 4294967295) !== 0) || ((((_la - 453)) & ~0x1f) === 0 && ((1 << (_la - 453)) & 4294967293) !== 0) || ((((_la - 485)) & ~0x1f) === 0 && ((1 << (_la - 485)) & 4293656575) !== 0) || ((((_la - 517)) & ~0x1f) === 0 && ((1 << (_la - 517)) & 4294967291) !== 0) || ((((_la - 549)) & ~0x1f) === 0 && ((1 << (_la - 549)) & 4294967295) !== 0) || ((((_la - 581)) & ~0x1f) === 0 && ((1 << (_la - 581)) & 4294967295) !== 0) || ((((_la - 613)) & ~0x1f) === 0 && ((1 << (_la - 613)) & 301989887) !== 0) || _la===661 || _la===662) { this.state = 5389; this.func_args_list(); } @@ -33319,7 +33300,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 5422; this._errHandler.sync(this); _la = this._input.LA(1); - if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268421) !== 0) || _la===68 || _la===92 || ((((_la - 101)) & ~0x1f) === 0 && ((1 << (_la - 101)) & 4294967265) !== 0) || ((((_la - 133)) & ~0x1f) === 0 && ((1 << (_la - 133)) & 4294967295) !== 0) || ((((_la - 165)) & ~0x1f) === 0 && ((1 << (_la - 165)) & 4294967295) !== 0) || ((((_la - 197)) & ~0x1f) === 0 && ((1 << (_la - 197)) & 4294967295) !== 0) || ((((_la - 229)) & ~0x1f) === 0 && ((1 << (_la - 229)) & 4276092927) !== 0) || ((((_la - 261)) & ~0x1f) === 0 && ((1 << (_la - 261)) & 4294967295) !== 0) || ((((_la - 293)) & ~0x1f) === 0 && ((1 << (_la - 293)) & 4294967295) !== 0) || ((((_la - 325)) & ~0x1f) === 0 && ((1 << (_la - 325)) & 4294967295) !== 0) || ((((_la - 357)) & ~0x1f) === 0 && ((1 << (_la - 357)) & 4294967295) !== 0) || ((((_la - 389)) & ~0x1f) === 0 && ((1 << (_la - 389)) & 4294967295) !== 0) || ((((_la - 421)) & ~0x1f) === 0 && ((1 << (_la - 421)) & 4294967295) !== 0) || ((((_la - 453)) & ~0x1f) === 0 && ((1 << (_la - 453)) & 4294967293) !== 0) || ((((_la - 485)) & ~0x1f) === 0 && ((1 << (_la - 485)) & 4293656575) !== 0) || ((((_la - 517)) & ~0x1f) === 0 && ((1 << (_la - 517)) & 4294967291) !== 0) || ((((_la - 549)) & ~0x1f) === 0 && ((1 << (_la - 549)) & 4294967295) !== 0) || ((((_la - 581)) & ~0x1f) === 0 && ((1 << (_la - 581)) & 4294967295) !== 0) || ((((_la - 613)) & ~0x1f) === 0 && ((1 << (_la - 613)) & 301989887) !== 0) || _la===661 || _la===662) { + if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264325) !== 0) || _la===68 || _la===92 || ((((_la - 101)) & ~0x1f) === 0 && ((1 << (_la - 101)) & 4294967265) !== 0) || ((((_la - 133)) & ~0x1f) === 0 && ((1 << (_la - 133)) & 4294967295) !== 0) || ((((_la - 165)) & ~0x1f) === 0 && ((1 << (_la - 165)) & 4294967295) !== 0) || ((((_la - 197)) & ~0x1f) === 0 && ((1 << (_la - 197)) & 4294967295) !== 0) || ((((_la - 229)) & ~0x1f) === 0 && ((1 << (_la - 229)) & 4276092927) !== 0) || ((((_la - 261)) & ~0x1f) === 0 && ((1 << (_la - 261)) & 4294967295) !== 0) || ((((_la - 293)) & ~0x1f) === 0 && ((1 << (_la - 293)) & 4294967295) !== 0) || ((((_la - 325)) & ~0x1f) === 0 && ((1 << (_la - 325)) & 4294967295) !== 0) || ((((_la - 357)) & ~0x1f) === 0 && ((1 << (_la - 357)) & 4294967295) !== 0) || ((((_la - 389)) & ~0x1f) === 0 && ((1 << (_la - 389)) & 4294967295) !== 0) || ((((_la - 421)) & ~0x1f) === 0 && ((1 << (_la - 421)) & 4294967295) !== 0) || ((((_la - 453)) & ~0x1f) === 0 && ((1 << (_la - 453)) & 4294967293) !== 0) || ((((_la - 485)) & ~0x1f) === 0 && ((1 << (_la - 485)) & 4293656575) !== 0) || ((((_la - 517)) & ~0x1f) === 0 && ((1 << (_la - 517)) & 4294967291) !== 0) || ((((_la - 549)) & ~0x1f) === 0 && ((1 << (_la - 549)) & 4294967295) !== 0) || ((((_la - 581)) & ~0x1f) === 0 && ((1 << (_la - 581)) & 4294967295) !== 0) || ((((_la - 613)) & ~0x1f) === 0 && ((1 << (_la - 613)) & 301989887) !== 0) || _la===661 || _la===662) { this.state = 5421; this.func_args_with_defaults_list(); } @@ -33506,7 +33487,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -34207,7 +34187,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -35751,7 +35730,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 5722; this._errHandler.sync(this); _la = this._input.LA(1); - while(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268421) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { + while(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264325) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { this.state = 5717; this.colid(); this.state = 5718; @@ -40991,7 +40970,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -41128,7 +41106,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 60: @@ -42091,7 +42068,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -43289,7 +43265,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -43861,7 +43836,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 60: @@ -44493,7 +44467,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 46: case 53: case 57: @@ -45059,7 +45032,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 46: case 53: case 57: @@ -45627,7 +45599,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 46: case 53: case 57: @@ -46530,7 +46501,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -47102,7 +47072,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 60: @@ -48507,7 +48476,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 7746; this._errHandler.sync(this); _la = this._input.LA(1); - if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268429) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { + if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264333) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { this.state = 7745; this.alias_clause(); } @@ -48525,7 +48494,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -49049,7 +49017,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 7754; this._errHandler.sync(this); _la = this._input.LA(1); - if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268429) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { + if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264333) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { this.state = 7753; this.alias_clause(); } @@ -49889,7 +49857,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -50889,7 +50856,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 46: case 47: case 48: @@ -52145,7 +52111,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 46: case 47: case 48: @@ -53272,7 +53237,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -53895,7 +53859,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -55993,7 +55956,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 8405; this._errHandler.sync(this); _la = this._input.LA(1); - if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268421) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { + if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264325) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2298478593) !== 0) || ((((_la - 124)) & ~0x1f) === 0 && ((1 << (_la - 124)) & 4294967269) !== 0) || ((((_la - 156)) & ~0x1f) === 0 && ((1 << (_la - 156)) & 4294967295) !== 0) || ((((_la - 188)) & ~0x1f) === 0 && ((1 << (_la - 188)) & 4294967295) !== 0) || ((((_la - 220)) & ~0x1f) === 0 && ((1 << (_la - 220)) & 3221225471) !== 0) || ((((_la - 252)) & ~0x1f) === 0 && ((1 << (_la - 252)) & 4294967293) !== 0) || ((((_la - 284)) & ~0x1f) === 0 && ((1 << (_la - 284)) & 4294967295) !== 0) || ((((_la - 316)) & ~0x1f) === 0 && ((1 << (_la - 316)) & 4294967295) !== 0) || ((((_la - 348)) & ~0x1f) === 0 && ((1 << (_la - 348)) & 4294967295) !== 0) || ((((_la - 380)) & ~0x1f) === 0 && ((1 << (_la - 380)) & 4294967295) !== 0) || ((((_la - 412)) & ~0x1f) === 0 && ((1 << (_la - 412)) & 4294967295) !== 0) || ((((_la - 444)) & ~0x1f) === 0 && ((1 << (_la - 444)) & 4026530815) !== 0) || ((((_la - 476)) & ~0x1f) === 0 && ((1 << (_la - 476)) & 3623878655) !== 0) || ((((_la - 508)) & ~0x1f) === 0 && ((1 << (_la - 508)) & 4294965247) !== 0) || ((((_la - 540)) & ~0x1f) === 0 && ((1 << (_la - 540)) & 4294967295) !== 0) || ((((_la - 572)) & ~0x1f) === 0 && ((1 << (_la - 572)) & 4294967295) !== 0) || ((((_la - 604)) & ~0x1f) === 0 && ((1 << (_la - 604)) & 4294967295) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { this.state = 8404; this.colid(); } @@ -56003,7 +55966,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -56649,7 +56611,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -57187,7 +57148,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -58396,7 +58356,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -59116,7 +59075,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -59655,7 +59613,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 8573; this._errHandler.sync(this); _la = this._input.LA(1); - if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268421) !== 0) || ((((_la - 77)) & ~0x1f) === 0 && ((1 << (_la - 77)) & 32771) !== 0) || ((((_la - 116)) & ~0x1f) === 0 && ((1 << (_la - 116)) & 268451969) !== 0) || ((((_la - 153)) & ~0x1f) === 0 && ((1 << (_la - 153)) & 540945) !== 0) || ((((_la - 207)) & ~0x1f) === 0 && ((1 << (_la - 207)) & 33554441) !== 0) || ((((_la - 240)) & ~0x1f) === 0 && ((1 << (_la - 240)) & 6553601) !== 0) || ((((_la - 272)) & ~0x1f) === 0 && ((1 << (_la - 272)) & 268451841) !== 0) || ((((_la - 306)) & ~0x1f) === 0 && ((1 << (_la - 306)) & 1051713) !== 0) || _la===353 || _la===433 || _la===434 || ((((_la - 477)) & ~0x1f) === 0 && ((1 << (_la - 477)) & 3825197057) !== 0) || ((((_la - 509)) & ~0x1f) === 0 && ((1 << (_la - 509)) & 3055) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { + if(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264325) !== 0) || ((((_la - 77)) & ~0x1f) === 0 && ((1 << (_la - 77)) & 32771) !== 0) || ((((_la - 116)) & ~0x1f) === 0 && ((1 << (_la - 116)) & 268451969) !== 0) || ((((_la - 153)) & ~0x1f) === 0 && ((1 << (_la - 153)) & 540945) !== 0) || ((((_la - 207)) & ~0x1f) === 0 && ((1 << (_la - 207)) & 33554441) !== 0) || ((((_la - 240)) & ~0x1f) === 0 && ((1 << (_la - 240)) & 6553601) !== 0) || ((((_la - 272)) & ~0x1f) === 0 && ((1 << (_la - 272)) & 268451841) !== 0) || ((((_la - 306)) & ~0x1f) === 0 && ((1 << (_la - 306)) & 1051713) !== 0) || _la===353 || _la===433 || _la===434 || ((((_la - 477)) & ~0x1f) === 0 && ((1 << (_la - 477)) & 3825197057) !== 0) || ((((_la - 509)) & ~0x1f) === 0 && ((1 << (_la - 509)) & 3055) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)) { this.state = 8572; this.xmltable_column_option_list(); } @@ -59701,7 +59659,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 8582; this._errHandler.sync(this); _la = this._input.LA(1); - } while(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268421) !== 0) || ((((_la - 77)) & ~0x1f) === 0 && ((1 << (_la - 77)) & 32771) !== 0) || ((((_la - 116)) & ~0x1f) === 0 && ((1 << (_la - 116)) & 268451969) !== 0) || ((((_la - 153)) & ~0x1f) === 0 && ((1 << (_la - 153)) & 540945) !== 0) || ((((_la - 207)) & ~0x1f) === 0 && ((1 << (_la - 207)) & 33554441) !== 0) || ((((_la - 240)) & ~0x1f) === 0 && ((1 << (_la - 240)) & 6553601) !== 0) || ((((_la - 272)) & ~0x1f) === 0 && ((1 << (_la - 272)) & 268451841) !== 0) || ((((_la - 306)) & ~0x1f) === 0 && ((1 << (_la - 306)) & 1051713) !== 0) || _la===353 || _la===433 || _la===434 || ((((_la - 477)) & ~0x1f) === 0 && ((1 << (_la - 477)) & 3825197057) !== 0) || ((((_la - 509)) & ~0x1f) === 0 && ((1 << (_la - 509)) & 3055) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)); + } while(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264325) !== 0) || ((((_la - 77)) & ~0x1f) === 0 && ((1 << (_la - 77)) & 32771) !== 0) || ((((_la - 116)) & ~0x1f) === 0 && ((1 << (_la - 116)) & 268451969) !== 0) || ((((_la - 153)) & ~0x1f) === 0 && ((1 << (_la - 153)) & 540945) !== 0) || ((((_la - 207)) & ~0x1f) === 0 && ((1 << (_la - 207)) & 33554441) !== 0) || ((((_la - 240)) & ~0x1f) === 0 && ((1 << (_la - 240)) & 6553601) !== 0) || ((((_la - 272)) & ~0x1f) === 0 && ((1 << (_la - 272)) & 268451841) !== 0) || ((((_la - 306)) & ~0x1f) === 0 && ((1 << (_la - 306)) & 1051713) !== 0) || _la===353 || _la===433 || _la===434 || ((((_la - 477)) & ~0x1f) === 0 && ((1 << (_la - 477)) & 3825197057) !== 0) || ((((_la - 509)) & ~0x1f) === 0 && ((1 << (_la - 509)) & 3055) !== 0) || ((((_la - 636)) & ~0x1f) === 0 && ((1 << (_la - 636)) & 100663331) !== 0)); } catch (re) { if(re instanceof antlr4.error.RecognitionException) { localctx.exception = re; @@ -60262,7 +60220,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -62823,7 +62780,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -64647,7 +64603,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -65546,7 +65501,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 9463; this._errHandler.sync(this); _la = this._input.LA(1); - if((((_la) & ~0x1f) === 0 && ((1 << _la) & 805318660) !== 0) || ((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 421518725) !== 0) || ((((_la - 75)) & ~0x1f) === 0 && ((1 << (_la - 75)) & 2174894095) !== 0) || ((((_la - 107)) & ~0x1f) === 0 && ((1 << (_la - 107)) & 4294967295) !== 0) || ((((_la - 139)) & ~0x1f) === 0 && ((1 << (_la - 139)) & 4294967295) !== 0) || ((((_la - 171)) & ~0x1f) === 0 && ((1 << (_la - 171)) & 4294967295) !== 0) || ((((_la - 203)) & ~0x1f) === 0 && ((1 << (_la - 203)) & 4294967295) !== 0) || ((((_la - 235)) & ~0x1f) === 0 && ((1 << (_la - 235)) & 4294672383) !== 0) || ((((_la - 267)) & ~0x1f) === 0 && ((1 << (_la - 267)) & 4294967295) !== 0) || ((((_la - 299)) & ~0x1f) === 0 && ((1 << (_la - 299)) & 4294967295) !== 0) || ((((_la - 331)) & ~0x1f) === 0 && ((1 << (_la - 331)) & 4294967295) !== 0) || ((((_la - 363)) & ~0x1f) === 0 && ((1 << (_la - 363)) & 4294967295) !== 0) || ((((_la - 395)) & ~0x1f) === 0 && ((1 << (_la - 395)) & 4294967295) !== 0) || ((((_la - 427)) & ~0x1f) === 0 && ((1 << (_la - 427)) & 4160749567) !== 0) || ((((_la - 459)) & ~0x1f) === 0 && ((1 << (_la - 459)) & 4294967295) !== 0) || ((((_la - 491)) & ~0x1f) === 0 && ((1 << (_la - 491)) & 4026511359) !== 0) || ((((_la - 523)) & ~0x1f) === 0 && ((1 << (_la - 523)) & 4294967295) !== 0) || ((((_la - 555)) & ~0x1f) === 0 && ((1 << (_la - 555)) & 4294967295) !== 0) || ((((_la - 587)) & ~0x1f) === 0 && ((1 << (_la - 587)) & 4294967295) !== 0) || ((((_la - 619)) & ~0x1f) === 0 && ((1 << (_la - 619)) & 3561488383) !== 0) || ((((_la - 654)) & ~0x1f) === 0 && ((1 << (_la - 654)) & 131537) !== 0)) { + if((((_la) & ~0x1f) === 0 && ((1 << _la) & 805318660) !== 0) || ((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 421514629) !== 0) || ((((_la - 75)) & ~0x1f) === 0 && ((1 << (_la - 75)) & 2174894095) !== 0) || ((((_la - 107)) & ~0x1f) === 0 && ((1 << (_la - 107)) & 4294967295) !== 0) || ((((_la - 139)) & ~0x1f) === 0 && ((1 << (_la - 139)) & 4294967295) !== 0) || ((((_la - 171)) & ~0x1f) === 0 && ((1 << (_la - 171)) & 4294967295) !== 0) || ((((_la - 203)) & ~0x1f) === 0 && ((1 << (_la - 203)) & 4294967295) !== 0) || ((((_la - 235)) & ~0x1f) === 0 && ((1 << (_la - 235)) & 4294672383) !== 0) || ((((_la - 267)) & ~0x1f) === 0 && ((1 << (_la - 267)) & 4294967295) !== 0) || ((((_la - 299)) & ~0x1f) === 0 && ((1 << (_la - 299)) & 4294967295) !== 0) || ((((_la - 331)) & ~0x1f) === 0 && ((1 << (_la - 331)) & 4294967295) !== 0) || ((((_la - 363)) & ~0x1f) === 0 && ((1 << (_la - 363)) & 4294967295) !== 0) || ((((_la - 395)) & ~0x1f) === 0 && ((1 << (_la - 395)) & 4294967295) !== 0) || ((((_la - 427)) & ~0x1f) === 0 && ((1 << (_la - 427)) & 4160749567) !== 0) || ((((_la - 459)) & ~0x1f) === 0 && ((1 << (_la - 459)) & 4294967295) !== 0) || ((((_la - 491)) & ~0x1f) === 0 && ((1 << (_la - 491)) & 4026511359) !== 0) || ((((_la - 523)) & ~0x1f) === 0 && ((1 << (_la - 523)) & 4294967295) !== 0) || ((((_la - 555)) & ~0x1f) === 0 && ((1 << (_la - 555)) & 4294967295) !== 0) || ((((_la - 587)) & ~0x1f) === 0 && ((1 << (_la - 587)) & 4294967295) !== 0) || ((((_la - 619)) & ~0x1f) === 0 && ((1 << (_la - 619)) & 3561488383) !== 0) || ((((_la - 654)) & ~0x1f) === 0 && ((1 << (_la - 654)) & 131537) !== 0)) { this.state = 9462; this.expr_list(); } @@ -65599,7 +65554,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.state = 9477; this._errHandler.sync(this); _la = this._input.LA(1); - if((((_la) & ~0x1f) === 0 && ((1 << _la) & 805318660) !== 0) || ((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 421518725) !== 0) || ((((_la - 75)) & ~0x1f) === 0 && ((1 << (_la - 75)) & 2174894095) !== 0) || ((((_la - 107)) & ~0x1f) === 0 && ((1 << (_la - 107)) & 4294967295) !== 0) || ((((_la - 139)) & ~0x1f) === 0 && ((1 << (_la - 139)) & 4294967295) !== 0) || ((((_la - 171)) & ~0x1f) === 0 && ((1 << (_la - 171)) & 4294967295) !== 0) || ((((_la - 203)) & ~0x1f) === 0 && ((1 << (_la - 203)) & 4294967295) !== 0) || ((((_la - 235)) & ~0x1f) === 0 && ((1 << (_la - 235)) & 4294672383) !== 0) || ((((_la - 267)) & ~0x1f) === 0 && ((1 << (_la - 267)) & 4294967295) !== 0) || ((((_la - 299)) & ~0x1f) === 0 && ((1 << (_la - 299)) & 4294967295) !== 0) || ((((_la - 331)) & ~0x1f) === 0 && ((1 << (_la - 331)) & 4294967295) !== 0) || ((((_la - 363)) & ~0x1f) === 0 && ((1 << (_la - 363)) & 4294967295) !== 0) || ((((_la - 395)) & ~0x1f) === 0 && ((1 << (_la - 395)) & 4294967295) !== 0) || ((((_la - 427)) & ~0x1f) === 0 && ((1 << (_la - 427)) & 4160749567) !== 0) || ((((_la - 459)) & ~0x1f) === 0 && ((1 << (_la - 459)) & 4294967295) !== 0) || ((((_la - 491)) & ~0x1f) === 0 && ((1 << (_la - 491)) & 4026511359) !== 0) || ((((_la - 523)) & ~0x1f) === 0 && ((1 << (_la - 523)) & 4294967295) !== 0) || ((((_la - 555)) & ~0x1f) === 0 && ((1 << (_la - 555)) & 4294967295) !== 0) || ((((_la - 587)) & ~0x1f) === 0 && ((1 << (_la - 587)) & 4294967295) !== 0) || ((((_la - 619)) & ~0x1f) === 0 && ((1 << (_la - 619)) & 3561488383) !== 0) || ((((_la - 654)) & ~0x1f) === 0 && ((1 << (_la - 654)) & 131537) !== 0)) { + if((((_la) & ~0x1f) === 0 && ((1 << _la) & 805318660) !== 0) || ((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 421514629) !== 0) || ((((_la - 75)) & ~0x1f) === 0 && ((1 << (_la - 75)) & 2174894095) !== 0) || ((((_la - 107)) & ~0x1f) === 0 && ((1 << (_la - 107)) & 4294967295) !== 0) || ((((_la - 139)) & ~0x1f) === 0 && ((1 << (_la - 139)) & 4294967295) !== 0) || ((((_la - 171)) & ~0x1f) === 0 && ((1 << (_la - 171)) & 4294967295) !== 0) || ((((_la - 203)) & ~0x1f) === 0 && ((1 << (_la - 203)) & 4294967295) !== 0) || ((((_la - 235)) & ~0x1f) === 0 && ((1 << (_la - 235)) & 4294672383) !== 0) || ((((_la - 267)) & ~0x1f) === 0 && ((1 << (_la - 267)) & 4294967295) !== 0) || ((((_la - 299)) & ~0x1f) === 0 && ((1 << (_la - 299)) & 4294967295) !== 0) || ((((_la - 331)) & ~0x1f) === 0 && ((1 << (_la - 331)) & 4294967295) !== 0) || ((((_la - 363)) & ~0x1f) === 0 && ((1 << (_la - 363)) & 4294967295) !== 0) || ((((_la - 395)) & ~0x1f) === 0 && ((1 << (_la - 395)) & 4294967295) !== 0) || ((((_la - 427)) & ~0x1f) === 0 && ((1 << (_la - 427)) & 4160749567) !== 0) || ((((_la - 459)) & ~0x1f) === 0 && ((1 << (_la - 459)) & 4294967295) !== 0) || ((((_la - 491)) & ~0x1f) === 0 && ((1 << (_la - 491)) & 4026511359) !== 0) || ((((_la - 523)) & ~0x1f) === 0 && ((1 << (_la - 523)) & 4294967295) !== 0) || ((((_la - 555)) & ~0x1f) === 0 && ((1 << (_la - 555)) & 4294967295) !== 0) || ((((_la - 587)) & ~0x1f) === 0 && ((1 << (_la - 587)) & 4294967295) !== 0) || ((((_la - 619)) & ~0x1f) === 0 && ((1 << (_la - 619)) & 3561488383) !== 0) || ((((_la - 654)) & ~0x1f) === 0 && ((1 << (_la - 654)) & 131537) !== 0)) { this.state = 9476; this.expr_list(); } @@ -66111,7 +66066,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -66745,7 +66699,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -66861,7 +66814,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -67077,7 +67029,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -68001,7 +67952,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -69307,7 +69257,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -70055,7 +70004,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -71328,7 +71276,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -72236,7 +72183,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -73524,7 +73470,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -74648,7 +74593,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 41: case 43: case 44: - case 45: case 47: case 48: case 49: @@ -75450,7 +75394,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -77801,7 +77744,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -78673,7 +78615,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -79231,7 +79172,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -80038,7 +79978,6 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { case 35: case 43: case 44: - case 45: case 53: case 57: case 61: @@ -80658,7 +80597,7 @@ export default class PostgreSQLParser extends PostgreSQLParserBase { this.enterOuterAlt(localctx, 1); this.state = 10676; _la = this._input.LA(1); - if(!(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286268421) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2164260865) !== 0) || ((((_la - 130)) & ~0x1f) === 0 && ((1 << (_la - 130)) & 2290106369) !== 0) || _la===167 || _la===172 || ((((_la - 207)) & ~0x1f) === 0 && ((1 << (_la - 207)) & 33554441) !== 0) || ((((_la - 240)) & ~0x1f) === 0 && ((1 << (_la - 240)) & 6553601) !== 0) || ((((_la - 272)) & ~0x1f) === 0 && ((1 << (_la - 272)) & 268451841) !== 0) || ((((_la - 306)) & ~0x1f) === 0 && ((1 << (_la - 306)) & 1051713) !== 0) || _la===353 || _la===433 || _la===434 || ((((_la - 477)) & ~0x1f) === 0 && ((1 << (_la - 477)) & 3825197057) !== 0) || ((((_la - 509)) & ~0x1f) === 0 && ((1 << (_la - 509)) & 3055) !== 0))) { + if(!(((((_la - 33)) & ~0x1f) === 0 && ((1 << (_la - 33)) & 286264325) !== 0) || ((((_la - 92)) & ~0x1f) === 0 && ((1 << (_la - 92)) & 2164260865) !== 0) || ((((_la - 130)) & ~0x1f) === 0 && ((1 << (_la - 130)) & 2290106369) !== 0) || _la===167 || _la===172 || ((((_la - 207)) & ~0x1f) === 0 && ((1 << (_la - 207)) & 33554441) !== 0) || ((((_la - 240)) & ~0x1f) === 0 && ((1 << (_la - 240)) & 6553601) !== 0) || ((((_la - 272)) & ~0x1f) === 0 && ((1 << (_la - 272)) & 268451841) !== 0) || ((((_la - 306)) & ~0x1f) === 0 && ((1 << (_la - 306)) & 1051713) !== 0) || _la===353 || _la===433 || _la===434 || ((((_la - 477)) & ~0x1f) === 0 && ((1 << (_la - 477)) & 3825197057) !== 0) || ((((_la - 509)) & ~0x1f) === 0 && ((1 << (_la - 509)) & 3055) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -124580,10 +124519,6 @@ class Plsql_unreserved_keywordContext extends antlr4.ParserRuleContext { return this.getToken(PostgreSQLParser.CONSTANT, 0); }; - CONSTRAINT() { - return this.getToken(PostgreSQLParser.CONSTRAINT, 0); - }; - CONTINUE_P() { return this.getToken(PostgreSQLParser.CONTINUE_P, 0); }; diff --git a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.tokens b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.tokens index 03ca671a9..1d45608bf 100644 --- a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.tokens +++ b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParser.tokens @@ -1,1314 +1,1314 @@ -Dollar=1 -OPEN_PAREN=2 -CLOSE_PAREN=3 -OPEN_BRACKET=4 -CLOSE_BRACKET=5 -COMMA=6 -SEMI=7 -COLON=8 -STAR=9 -EQUAL=10 -DOT=11 -PLUS=12 -MINUS=13 -SLASH=14 -CARET=15 -LT=16 -GT=17 -LESS_LESS=18 -GREATER_GREATER=19 -COLON_EQUALS=20 -LESS_EQUALS=21 -EQUALS_GREATER=22 -GREATER_EQUALS=23 -DOT_DOT=24 -NOT_EQUALS=25 -TYPECAST=26 -PERCENT=27 -PARAM=28 -Operator=29 -ALL=30 -ANALYSE=31 -ANALYZE=32 -AND=33 -ANY=34 -ARRAY=35 -AS=36 -ASC=37 -ASYMMETRIC=38 -BOTH=39 -CASE=40 -CAST=41 -CHECK=42 -COLLATE=43 -COLUMN=44 -CONSTRAINT=45 -CREATE=46 -CURRENT_CATALOG=47 -CURRENT_DATE=48 -CURRENT_ROLE=49 -CURRENT_TIME=50 -CURRENT_TIMESTAMP=51 -CURRENT_USER=52 -DEFAULT=53 -DEFERRABLE=54 -DESC=55 -DISTINCT=56 -DO=57 -ELSE=58 -EXCEPT=59 -FALSE_P=60 -FETCH=61 -FOR=62 -FOREIGN=63 -FROM=64 -GRANT=65 -GROUP_P=66 -HAVING=67 -IN_P=68 -INITIALLY=69 -INTERSECT=70 -INTO=71 -LATERAL_P=72 -LEADING=73 -LIMIT=74 -LOCALTIME=75 -LOCALTIMESTAMP=76 -NOT=77 -NULL_P=78 -OFFSET=79 -ON=80 -ONLY=81 -OR=82 -ORDER=83 -PLACING=84 -PRIMARY=85 -REFERENCES=86 -RETURNING=87 -SELECT=88 -SESSION_USER=89 -SOME=90 -SYMMETRIC=91 -TABLE=92 -THEN=93 -TO=94 -TRAILING=95 -TRUE_P=96 -UNION=97 -UNIQUE=98 -USER=99 -USING=100 -VARIADIC=101 -WHEN=102 -WHERE=103 -WINDOW=104 -WITH=105 -AUTHORIZATION=106 -BINARY=107 -COLLATION=108 -CONCURRENTLY=109 -CROSS=110 -CURRENT_SCHEMA=111 -FREEZE=112 -FULL=113 -ILIKE=114 -INNER_P=115 -IS=116 -ISNULL=117 -JOIN=118 -LEFT=119 -LIKE=120 -NATURAL=121 -NOTNULL=122 -OUTER_P=123 -OVER=124 -OVERLAPS=125 -RIGHT=126 -SIMILAR=127 -VERBOSE=128 -ABORT_P=129 -ABSOLUTE_P=130 -ACCESS=131 -ACTION=132 -ADD_P=133 -ADMIN=134 -AFTER=135 -AGGREGATE=136 -ALSO=137 -ALTER=138 -ALWAYS=139 -ASSERTION=140 -ASSIGNMENT=141 -AT=142 -ATTRIBUTE=143 -BACKWARD=144 -BEFORE=145 -BEGIN_P=146 -BY=147 -CACHE=148 -CALLED=149 -CASCADE=150 -CASCADED=151 -CATALOG=152 -CHAIN=153 -CHARACTERISTICS=154 -CHECKPOINT=155 -CLASS=156 -CLOSE=157 -CLUSTER=158 -COMMENT=159 -COMMENTS=160 -COMMIT=161 -COMMITTED=162 -CONFIGURATION=163 -CONNECTION=164 -CONSTRAINTS=165 -CONTENT_P=166 -CONTINUE_P=167 -CONVERSION_P=168 -COPY=169 -COST=170 -CSV=171 -CURSOR=172 -CYCLE=173 -DATA_P=174 -DATABASE=175 -DAY_P=176 -DEALLOCATE=177 -DECLARE=178 -DEFAULTS=179 -DEFERRED=180 -DEFINER=181 -DELETE_P=182 -DELIMITER=183 -DELIMITERS=184 -DICTIONARY=185 -DISABLE_P=186 -DISCARD=187 -DOCUMENT_P=188 -DOMAIN_P=189 -DOUBLE_P=190 -DROP=191 -EACH=192 -ENABLE_P=193 -ENCODING=194 -ENCRYPTED=195 -ENUM_P=196 -ESCAPE=197 -EVENT=198 -EXCLUDE=199 -EXCLUDING=200 -EXCLUSIVE=201 -EXECUTE=202 -EXPLAIN=203 -EXTENSION=204 -EXTERNAL=205 -FAMILY=206 -FIRST_P=207 -FOLLOWING=208 -FORCE=209 -FORWARD=210 -FUNCTION=211 -FUNCTIONS=212 -GLOBAL=213 -GRANTED=214 -HANDLER=215 -HEADER_P=216 -HOLD=217 -HOUR_P=218 -IDENTITY_P=219 -IF_P=220 -IMMEDIATE=221 -IMMUTABLE=222 -IMPLICIT_P=223 -INCLUDING=224 -INCREMENT=225 -INDEX=226 -INDEXES=227 -INHERIT=228 -INHERITS=229 -INLINE_P=230 -INSENSITIVE=231 -INSERT=232 -INSTEAD=233 -INVOKER=234 -ISOLATION=235 -KEY=236 -LABEL=237 -LANGUAGE=238 -LARGE_P=239 -LAST_P=240 -LEAKPROOF=241 -LEVEL=242 -LISTEN=243 -LOAD=244 -LOCAL=245 -LOCATION=246 -LOCK_P=247 -MAPPING=248 -MATCH=249 -MATCHED=250 -MATERIALIZED=251 -MAXVALUE=252 -MERGE=253 -MINUTE_P=254 -MINVALUE=255 -MODE=256 -MONTH_P=257 -MOVE=258 -NAME_P=259 -NAMES=260 -NEXT=261 -NO=262 -NOTHING=263 -NOTIFY=264 -NOWAIT=265 -NULLS_P=266 -OBJECT_P=267 -OF=268 -OFF=269 -OIDS=270 -OPERATOR=271 -OPTION=272 -OPTIONS=273 -OWNED=274 -OWNER=275 -PARSER=276 -PARTIAL=277 -PARTITION=278 -PASSING=279 -PASSWORD=280 -PLANS=281 -PRECEDING=282 -PREPARE=283 -PREPARED=284 -PRESERVE=285 -PRIOR=286 -PRIVILEGES=287 -PROCEDURAL=288 -PROCEDURE=289 -PROGRAM=290 -QUOTE=291 -RANGE=292 -READ=293 -REASSIGN=294 -RECHECK=295 -RECURSIVE=296 -REF=297 -REFRESH=298 -REINDEX=299 -RELATIVE_P=300 -RELEASE=301 -RENAME=302 -REPEATABLE=303 -REPLACE=304 -REPLICA=305 -RESET=306 -RESTART=307 -RESTRICT=308 -RETURNS=309 -REVOKE=310 -ROLE=311 -ROLLBACK=312 -ROWS=313 -RULE=314 -SAVEPOINT=315 -SCHEMA=316 -SCROLL=317 -SEARCH=318 -SECOND_P=319 -SECURITY=320 -SEQUENCE=321 -SEQUENCES=322 -SERIALIZABLE=323 -SERVER=324 -SESSION=325 -SET=326 -SHARE=327 -SHOW=328 -SIMPLE=329 -SNAPSHOT=330 -STABLE=331 -STANDALONE_P=332 -START=333 -STATEMENT=334 -STATISTICS=335 -STDIN=336 -STDOUT=337 -STORAGE=338 -STRICT_P=339 -STRIP_P=340 -SYSID=341 -SYSTEM_P=342 -TABLES=343 -TABLESPACE=344 -TEMP=345 -TEMPLATE=346 -TEMPORARY=347 -TEXT_P=348 -TRANSACTION=349 -TRIGGER=350 -TRUNCATE=351 -TRUSTED=352 -TYPE_P=353 -TYPES_P=354 -UNBOUNDED=355 -UNCOMMITTED=356 -UNENCRYPTED=357 -UNKNOWN=358 -UNLISTEN=359 -UNLOGGED=360 -UNTIL=361 -UPDATE=362 -VACUUM=363 -VALID=364 -VALIDATE=365 -VALIDATOR=366 -VARYING=367 -VERSION_P=368 -VIEW=369 -VOLATILE=370 -WHITESPACE_P=371 -WITHOUT=372 -WORK=373 -WRAPPER=374 -WRITE=375 -XML_P=376 -YEAR_P=377 -YES_P=378 -ZONE=379 -BETWEEN=380 -BIGINT=381 -BIT=382 -BOOLEAN_P=383 -CHAR_P=384 -CHARACTER=385 -COALESCE=386 -DEC=387 -DECIMAL_P=388 -EXISTS=389 -EXTRACT=390 -FLOAT_P=391 -GREATEST=392 -INOUT=393 -INT_P=394 -INTEGER=395 -INTERVAL=396 -LEAST=397 -NATIONAL=398 -NCHAR=399 -NONE=400 -NULLIF=401 -NUMERIC=402 -OVERLAY=403 -POSITION=404 -PRECISION=405 -REAL=406 -ROW=407 -SETOF=408 -SMALLINT=409 -SUBSTRING=410 -TIME=411 -TIMESTAMP=412 -TREAT=413 -TRIM=414 -VALUES=415 -VARCHAR=416 -XMLATTRIBUTES=417 -XMLCOMMENT=418 -XMLAGG=419 -XML_IS_WELL_FORMED=420 -XML_IS_WELL_FORMED_DOCUMENT=421 -XML_IS_WELL_FORMED_CONTENT=422 -XPATH=423 -XPATH_EXISTS=424 -XMLCONCAT=425 -XMLELEMENT=426 -XMLEXISTS=427 -XMLFOREST=428 -XMLPARSE=429 -XMLPI=430 -XMLROOT=431 -XMLSERIALIZE=432 -CALL=433 -CURRENT_P=434 -ATTACH=435 -DETACH=436 -EXPRESSION=437 -GENERATED=438 -LOGGED=439 -STORED=440 -INCLUDE=441 -ROUTINE=442 -TRANSFORM=443 -IMPORT_P=444 -POLICY=445 -METHOD=446 -REFERENCING=447 -NEW=448 -OLD=449 -VALUE_P=450 -SUBSCRIPTION=451 -PUBLICATION=452 -OUT_P=453 -END_P=454 -ROUTINES=455 -SCHEMAS=456 -PROCEDURES=457 -INPUT_P=458 -SUPPORT=459 -PARALLEL=460 -SQL_P=461 -DEPENDS=462 -OVERRIDING=463 -CONFLICT=464 -SKIP_P=465 -LOCKED=466 -TIES=467 -ROLLUP=468 -CUBE=469 -GROUPING=470 -SETS=471 -TABLESAMPLE=472 -ORDINALITY=473 -XMLTABLE=474 -COLUMNS=475 -XMLNAMESPACES=476 -ROWTYPE=477 -NORMALIZED=478 -WITHIN=479 -FILTER=480 -GROUPS=481 -OTHERS=482 -NFC=483 -NFD=484 -NFKC=485 -NFKD=486 -UESCAPE=487 -VIEWS=488 -NORMALIZE=489 -DUMP=490 -PRINT_STRICT_PARAMS=491 -VARIABLE_CONFLICT=492 -ERROR=493 -USE_VARIABLE=494 -USE_COLUMN=495 -ALIAS=496 -CONSTANT=497 -PERFORM=498 -GET=499 -DIAGNOSTICS=500 -STACKED=501 -ELSIF=502 -WHILE=503 -REVERSE=504 -FOREACH=505 -SLICE=506 -EXIT=507 -RETURN=508 -QUERY=509 -RAISE=510 -SQLSTATE=511 -DEBUG=512 -LOG=513 -INFO=514 -NOTICE=515 -WARNING=516 -EXCEPTION=517 -ASSERT=518 -LOOP=519 -OPEN=520 -ABS=521 -CBRT=522 -CEIL=523 -CEILING=524 -DEGREES=525 -DIV=526 -EXP=527 -FACTORIAL=528 -FLOOR=529 -GCD=530 -LCM=531 -LN=532 -LOG10=533 -MIN_SCALE=534 -MOD=535 -PI=536 -POWER=537 -RADIANS=538 -ROUND=539 -SCALE=540 -SIGN=541 -SQRT=542 -TRIM_SCALE=543 -TRUNC=544 -WIDTH_BUCKET=545 -RANDOM=546 -SETSEED=547 -ACOS=548 -ACOSD=549 -ASIN=550 -ASIND=551 -ATAN=552 -ATAND=553 -ATAN2=554 -ATAN2D=555 -COS=556 -COSD=557 -COT=558 -COTD=559 -SIN=560 -SIND=561 -TAN=562 -TAND=563 -SINH=564 -COSH=565 -TANH=566 -ASINH=567 -ACOSH=568 -ATANH=569 -BIT_LENGTH=570 -CHAR_LENGTH=571 -CHARACTER_LENGTH=572 -LOWER=573 -OCTET_LENGTH=574 -UPPER=575 -ASCII=576 -BTRIM=577 -CHR=578 -CONCAT=579 -CONCAT_WS=580 -FORMAT=581 -INITCAP=582 -LENGTH=583 -LPAD=584 -LTRIM=585 -MD5=586 -PARSE_IDENT=587 -PG_CLIENT_ENCODING=588 -QUOTE_IDENT=589 -QUOTE_LITERAL=590 -QUOTE_NULLABLE=591 -REGEXP_COUNT=592 -REGEXP_INSTR=593 -REGEXP_LIKE=594 -REGEXP_MATCH=595 -REGEXP_MATCHES=596 -REGEXP_REPLACE=597 -REGEXP_SPLIT_TO_ARRAY=598 -REGEXP_SPLIT_TO_TABLE=599 -REGEXP_SUBSTR=600 -REPEAT=601 -RPAD=602 -RTRIM=603 -SPLIT_PART=604 -STARTS_WITH=605 -STRING_TO_ARRAY=606 -STRING_TO_TABLE=607 -STRPOS=608 -SUBSTR=609 -TO_ASCII=610 -TO_HEX=611 -TRANSLATE=612 -UNISTR=613 -AGE=614 -CLOCK_TIMESTAMP=615 -DATE_BIN=616 -DATE_PART=617 -DATE_TRUNC=618 -ISFINITE=619 -JUSTIFY_DAYS=620 -JUSTIFY_HOURS=621 -JUSTIFY_INTERVAL=622 -MAKE_DATE=623 -MAKE_INTERVAL=624 -MAKE_TIME=625 -MAKE_TIMESTAMP=626 -MAKE_TIMESTAMPTZ=627 -NOW=628 -STATEMENT_TIMESTAMP=629 -TIMEOFDAY=630 -TRANSACTION_TIMESTAMP=631 -TO_TIMESTAMP=632 -TO_CHAR=633 -TO_DATE=634 -TO_NUMBER=635 -Identifier=636 -QuotedIdentifier=637 -UnterminatedQuotedIdentifier=638 -InvalidQuotedIdentifier=639 -InvalidUnterminatedQuotedIdentifier=640 -UnicodeQuotedIdentifier=641 -UnterminatedUnicodeQuotedIdentifier=642 -InvalidUnicodeQuotedIdentifier=643 -InvalidUnterminatedUnicodeQuotedIdentifier=644 -StringConstant=645 -UnterminatedStringConstant=646 -UnicodeEscapeStringConstant=647 -UnterminatedUnicodeEscapeStringConstant=648 -BeginDollarStringConstant=649 -BinaryStringConstant=650 -UnterminatedBinaryStringConstant=651 -InvalidBinaryStringConstant=652 -InvalidUnterminatedBinaryStringConstant=653 -HexadecimalStringConstant=654 -UnterminatedHexadecimalStringConstant=655 -InvalidHexadecimalStringConstant=656 -InvalidUnterminatedHexadecimalStringConstant=657 -Integral=658 -NumericFail=659 -Numeric=660 -PLSQLVARIABLENAME=661 -PLSQLIDENTIFIER=662 -Whitespace=663 -Newline=664 -LineComment=665 -BlockComment=666 -UnterminatedBlockComment=667 -MetaCommand=668 -EndMetaCommand=669 -ErrorCharacter=670 -EscapeStringConstant=671 -UnterminatedEscapeStringConstant=672 -InvalidEscapeStringConstant=673 -InvalidUnterminatedEscapeStringConstant=674 -AfterEscapeStringConstantMode_NotContinued=675 -AfterEscapeStringConstantWithNewlineMode_NotContinued=676 -DollarText=677 -EndDollarStringConstant=678 -AfterEscapeStringConstantWithNewlineMode_Continued=679 -'$'=1 -'('=2 -')'=3 -'['=4 -']'=5 -','=6 -';'=7 -':'=8 -'*'=9 -'='=10 -'.'=11 -'+'=12 -'-'=13 -'/'=14 -'^'=15 -'<'=16 -'>'=17 -'<<'=18 -'>>'=19 -':='=20 -'<='=21 -'=>'=22 -'>='=23 -'..'=24 -'<>'=25 -'::'=26 -'%'=27 -'ALL'=30 -'ANALYSE'=31 -'ANALYZE'=32 -'AND'=33 -'ANY'=34 -'ARRAY'=35 -'AS'=36 -'ASC'=37 -'ASYMMETRIC'=38 -'BOTH'=39 -'CASE'=40 -'CAST'=41 -'CHECK'=42 -'COLLATE'=43 -'COLUMN'=44 -'CONSTRAINT'=45 -'CREATE'=46 -'CURRENT_CATALOG'=47 -'CURRENT_DATE'=48 -'CURRENT_ROLE'=49 -'CURRENT_TIME'=50 -'CURRENT_TIMESTAMP'=51 -'CURRENT_USER'=52 -'DEFAULT'=53 -'DEFERRABLE'=54 -'DESC'=55 -'DISTINCT'=56 -'DO'=57 -'ELSE'=58 -'EXCEPT'=59 -'FALSE'=60 -'FETCH'=61 -'FOR'=62 -'FOREIGN'=63 -'FROM'=64 -'GRANT'=65 -'GROUP'=66 -'HAVING'=67 -'IN'=68 -'INITIALLY'=69 -'INTERSECT'=70 -'INTO'=71 -'LATERAL'=72 -'LEADING'=73 -'LIMIT'=74 -'LOCALTIME'=75 -'LOCALTIMESTAMP'=76 -'NOT'=77 -'NULL'=78 -'OFFSET'=79 -'ON'=80 -'ONLY'=81 -'OR'=82 -'ORDER'=83 -'PLACING'=84 -'PRIMARY'=85 -'REFERENCES'=86 -'RETURNING'=87 -'SELECT'=88 -'SESSION_USER'=89 -'SOME'=90 -'SYMMETRIC'=91 -'TABLE'=92 -'THEN'=93 -'TO'=94 -'TRAILING'=95 -'TRUE'=96 -'UNION'=97 -'UNIQUE'=98 -'USER'=99 -'USING'=100 -'VARIADIC'=101 -'WHEN'=102 -'WHERE'=103 -'WINDOW'=104 -'WITH'=105 -'AUTHORIZATION'=106 -'BINARY'=107 -'COLLATION'=108 -'CONCURRENTLY'=109 -'CROSS'=110 -'CURRENT_SCHEMA'=111 -'FREEZE'=112 -'FULL'=113 -'ILIKE'=114 -'INNER'=115 -'IS'=116 -'ISNULL'=117 -'JOIN'=118 -'LEFT'=119 -'LIKE'=120 -'NATURAL'=121 -'NOTNULL'=122 -'OUTER'=123 -'OVER'=124 -'OVERLAPS'=125 -'RIGHT'=126 -'SIMILAR'=127 -'VERBOSE'=128 -'ABORT'=129 -'ABSOLUTE'=130 -'ACCESS'=131 -'ACTION'=132 -'ADD'=133 -'ADMIN'=134 -'AFTER'=135 -'AGGREGATE'=136 -'ALSO'=137 -'ALTER'=138 -'ALWAYS'=139 -'ASSERTION'=140 -'ASSIGNMENT'=141 -'AT'=142 -'ATTRIBUTE'=143 -'BACKWARD'=144 -'BEFORE'=145 -'BEGIN'=146 -'BY'=147 -'CACHE'=148 -'CALLED'=149 -'CASCADE'=150 -'CASCADED'=151 -'CATALOG'=152 -'CHAIN'=153 -'CHARACTERISTICS'=154 -'CHECKPOINT'=155 -'CLASS'=156 -'CLOSE'=157 -'CLUSTER'=158 -'COMMENT'=159 -'COMMENTS'=160 -'COMMIT'=161 -'COMMITTED'=162 -'CONFIGURATION'=163 -'CONNECTION'=164 -'CONSTRAINTS'=165 -'CONTENT'=166 -'CONTINUE'=167 -'CONVERSION'=168 -'COPY'=169 -'COST'=170 -'CSV'=171 -'CURSOR'=172 -'CYCLE'=173 -'DATA'=174 -'DATABASE'=175 -'DAY'=176 -'DEALLOCATE'=177 -'DECLARE'=178 -'DEFAULTS'=179 -'DEFERRED'=180 -'DEFINER'=181 -'DELETE'=182 -'DELIMITER'=183 -'DELIMITERS'=184 -'DICTIONARY'=185 -'DISABLE'=186 -'DISCARD'=187 -'DOCUMENT'=188 -'DOMAIN'=189 -'DOUBLE'=190 -'DROP'=191 -'EACH'=192 -'ENABLE'=193 -'ENCODING'=194 -'ENCRYPTED'=195 -'ENUM'=196 -'ESCAPE'=197 -'EVENT'=198 -'EXCLUDE'=199 -'EXCLUDING'=200 -'EXCLUSIVE'=201 -'EXECUTE'=202 -'EXPLAIN'=203 -'EXTENSION'=204 -'EXTERNAL'=205 -'FAMILY'=206 -'FIRST'=207 -'FOLLOWING'=208 -'FORCE'=209 -'FORWARD'=210 -'FUNCTION'=211 -'FUNCTIONS'=212 -'GLOBAL'=213 -'GRANTED'=214 -'HANDLER'=215 -'HEADER'=216 -'HOLD'=217 -'HOUR'=218 -'IDENTITY'=219 -'IF'=220 -'IMMEDIATE'=221 -'IMMUTABLE'=222 -'IMPLICIT'=223 -'INCLUDING'=224 -'INCREMENT'=225 -'INDEX'=226 -'INDEXES'=227 -'INHERIT'=228 -'INHERITS'=229 -'INLINE'=230 -'INSENSITIVE'=231 -'INSERT'=232 -'INSTEAD'=233 -'INVOKER'=234 -'ISOLATION'=235 -'KEY'=236 -'LABEL'=237 -'LANGUAGE'=238 -'LARGE'=239 -'LAST'=240 -'LEAKPROOF'=241 -'LEVEL'=242 -'LISTEN'=243 -'LOAD'=244 -'LOCAL'=245 -'LOCATION'=246 -'LOCK'=247 -'MAPPING'=248 -'MATCH'=249 -'MATCHED'=250 -'MATERIALIZED'=251 -'MAXVALUE'=252 -'MERGE'=253 -'MINUTE'=254 -'MINVALUE'=255 -'MODE'=256 -'MONTH'=257 -'MOVE'=258 -'NAME'=259 -'NAMES'=260 -'NEXT'=261 -'NO'=262 -'NOTHING'=263 -'NOTIFY'=264 -'NOWAIT'=265 -'NULLS'=266 -'OBJECT'=267 -'OF'=268 -'OFF'=269 -'OIDS'=270 -'OPERATOR'=271 -'OPTION'=272 -'OPTIONS'=273 -'OWNED'=274 -'OWNER'=275 -'PARSER'=276 -'PARTIAL'=277 -'PARTITION'=278 -'PASSING'=279 -'PASSWORD'=280 -'PLANS'=281 -'PRECEDING'=282 -'PREPARE'=283 -'PREPARED'=284 -'PRESERVE'=285 -'PRIOR'=286 -'PRIVILEGES'=287 -'PROCEDURAL'=288 -'PROCEDURE'=289 -'PROGRAM'=290 -'QUOTE'=291 -'RANGE'=292 -'READ'=293 -'REASSIGN'=294 -'RECHECK'=295 -'RECURSIVE'=296 -'REF'=297 -'REFRESH'=298 -'REINDEX'=299 -'RELATIVE'=300 -'RELEASE'=301 -'RENAME'=302 -'REPEATABLE'=303 -'REPLACE'=304 -'REPLICA'=305 -'RESET'=306 -'RESTART'=307 -'RESTRICT'=308 -'RETURNS'=309 -'REVOKE'=310 -'ROLE'=311 -'ROLLBACK'=312 -'ROWS'=313 -'RULE'=314 -'SAVEPOINT'=315 -'SCHEMA'=316 -'SCROLL'=317 -'SEARCH'=318 -'SECOND'=319 -'SECURITY'=320 -'SEQUENCE'=321 -'SEQUENCES'=322 -'SERIALIZABLE'=323 -'SERVER'=324 -'SESSION'=325 -'SET'=326 -'SHARE'=327 -'SHOW'=328 -'SIMPLE'=329 -'SNAPSHOT'=330 -'STABLE'=331 -'STANDALONE'=332 -'START'=333 -'STATEMENT'=334 -'STATISTICS'=335 -'STDIN'=336 -'STDOUT'=337 -'STORAGE'=338 -'STRICT'=339 -'STRIP'=340 -'SYSID'=341 -'SYSTEM'=342 -'TABLES'=343 -'TABLESPACE'=344 -'TEMP'=345 -'TEMPLATE'=346 -'TEMPORARY'=347 -'TEXT'=348 -'TRANSACTION'=349 -'TRIGGER'=350 -'TRUNCATE'=351 -'TRUSTED'=352 -'TYPE'=353 -'TYPES'=354 -'UNBOUNDED'=355 -'UNCOMMITTED'=356 -'UNENCRYPTED'=357 -'UNKNOWN'=358 -'UNLISTEN'=359 -'UNLOGGED'=360 -'UNTIL'=361 -'UPDATE'=362 -'VACUUM'=363 -'VALID'=364 -'VALIDATE'=365 -'VALIDATOR'=366 -'VARYING'=367 -'VERSION'=368 -'VIEW'=369 -'VOLATILE'=370 -'WHITESPACE'=371 -'WITHOUT'=372 -'WORK'=373 -'WRAPPER'=374 -'WRITE'=375 -'XML'=376 -'YEAR'=377 -'YES'=378 -'ZONE'=379 -'BETWEEN'=380 -'BIGINT'=381 -'BIT'=382 -'BOOLEAN'=383 -'CHAR'=384 -'CHARACTER'=385 -'COALESCE'=386 -'DEC'=387 -'DECIMAL'=388 -'EXISTS'=389 -'EXTRACT'=390 -'FLOAT'=391 -'GREATEST'=392 -'INOUT'=393 -'INT'=394 -'INTEGER'=395 -'INTERVAL'=396 -'LEAST'=397 -'NATIONAL'=398 -'NCHAR'=399 -'NONE'=400 -'NULLIF'=401 -'NUMERIC'=402 -'OVERLAY'=403 -'POSITION'=404 -'PRECISION'=405 -'REAL'=406 -'ROW'=407 -'SETOF'=408 -'SMALLINT'=409 -'SUBSTRING'=410 -'TIME'=411 -'TIMESTAMP'=412 -'TREAT'=413 -'TRIM'=414 -'VALUES'=415 -'VARCHAR'=416 -'XMLATTRIBUTES'=417 -'XMLCOMMENT'=418 -'XMLAGG'=419 -'XML_IS_WELL_FORMED'=420 -'XML_IS_WELL_FORMED_DOCUMENT'=421 -'XML_IS_WELL_FORMED_CONTENT'=422 -'XPATH'=423 -'XPATH_EXISTS'=424 -'XMLCONCAT'=425 -'XMLELEMENT'=426 -'XMLEXISTS'=427 -'XMLFOREST'=428 -'XMLPARSE'=429 -'XMLPI'=430 -'XMLROOT'=431 -'XMLSERIALIZE'=432 -'CALL'=433 -'CURRENT'=434 -'ATTACH'=435 -'DETACH'=436 -'EXPRESSION'=437 -'GENERATED'=438 -'LOGGED'=439 -'STORED'=440 -'INCLUDE'=441 -'ROUTINE'=442 -'TRANSFORM'=443 -'IMPORT'=444 -'POLICY'=445 -'METHOD'=446 -'REFERENCING'=447 -'NEW'=448 -'OLD'=449 -'VALUE'=450 -'SUBSCRIPTION'=451 -'PUBLICATION'=452 -'OUT'=453 -'END'=454 -'ROUTINES'=455 -'SCHEMAS'=456 -'PROCEDURES'=457 -'INPUT'=458 -'SUPPORT'=459 -'PARALLEL'=460 -'SQL'=461 -'DEPENDS'=462 -'OVERRIDING'=463 -'CONFLICT'=464 -'SKIP'=465 -'LOCKED'=466 -'TIES'=467 -'ROLLUP'=468 -'CUBE'=469 -'GROUPING'=470 -'SETS'=471 -'TABLESAMPLE'=472 -'ORDINALITY'=473 -'XMLTABLE'=474 -'COLUMNS'=475 -'XMLNAMESPACES'=476 -'ROWTYPE'=477 -'NORMALIZED'=478 -'WITHIN'=479 -'FILTER'=480 -'GROUPS'=481 -'OTHERS'=482 -'NFC'=483 -'NFD'=484 -'NFKC'=485 -'NFKD'=486 -'UESCAPE'=487 -'VIEWS'=488 -'NORMALIZE'=489 -'DUMP'=490 -'PRINT_STRICT_PARAMS'=491 -'VARIABLE_CONFLICT'=492 -'ERROR'=493 -'USE_VARIABLE'=494 -'USE_COLUMN'=495 -'ALIAS'=496 -'CONSTANT'=497 -'PERFORM'=498 -'GET'=499 -'DIAGNOSTICS'=500 -'STACKED'=501 -'ELSIF'=502 -'WHILE'=503 -'REVERSE'=504 -'FOREACH'=505 -'SLICE'=506 -'EXIT'=507 -'RETURN'=508 -'QUERY'=509 -'RAISE'=510 -'SQLSTATE'=511 -'DEBUG'=512 -'LOG'=513 -'INFO'=514 -'NOTICE'=515 -'WARNING'=516 -'EXCEPTION'=517 -'ASSERT'=518 -'LOOP'=519 -'OPEN'=520 -'ABS'=521 -'CBRT'=522 -'CEIL'=523 -'CEILING'=524 -'DEGREES'=525 -'DIV'=526 -'EXP'=527 -'FACTORIAL'=528 -'FLOOR'=529 -'GCD'=530 -'LCM'=531 -'LN'=532 -'LOG10'=533 -'MIN_SCALE'=534 -'MOD'=535 -'PI'=536 -'POWER'=537 -'RADIANS'=538 -'ROUND'=539 -'SCALE'=540 -'SIGN'=541 -'SQRT'=542 -'TRIM_SCALE'=543 -'TRUNC'=544 -'WIDTH_BUCKET'=545 -'RANDOM'=546 -'SETSEED'=547 -'ACOS'=548 -'ACOSD'=549 -'ASIN'=550 -'ASIND'=551 -'ATAN'=552 -'ATAND'=553 -'ATAN2'=554 -'ATAN2D'=555 -'COS'=556 -'COSD'=557 -'COT'=558 -'COTD'=559 -'SIN'=560 -'SIND'=561 -'TAN'=562 -'TAND'=563 -'SINH'=564 -'COSH'=565 -'TANH'=566 -'ASINH'=567 -'ACOSH'=568 -'ATANH'=569 -'BIT_LENGTH'=570 -'CHAR_LENGTH'=571 -'CHARACTER_LENGTH'=572 -'LOWER'=573 -'OCTET_LENGTH'=574 -'UPPER'=575 -'ASCII'=576 -'BTRIM'=577 -'CHR'=578 -'CONCAT'=579 -'CONCAT_WS'=580 -'FORMAT'=581 -'INITCAP'=582 -'LENGTH'=583 -'LPAD'=584 -'LTRIM'=585 -'MD5'=586 -'PARSE_IDENT'=587 -'PG_CLIENT_ENCODING'=588 -'QUOTE_IDENT'=589 -'QUOTE_LITERAL'=590 -'QUOTE_NULLABLE'=591 -'REGEXP_COUNT'=592 -'REGEXP_INSTR'=593 -'REGEXP_LIKE'=594 -'REGEXP_MATCH'=595 -'REGEXP_MATCHES'=596 -'REGEXP_REPLACE'=597 -'REGEXP_SPLIT_TO_ARRAY'=598 -'REGEXP_SPLIT_TO_TABLE'=599 -'REGEXP_SUBSTR'=600 -'REPEAT'=601 -'RPAD'=602 -'RTRIM'=603 -'SPLIT_PART'=604 -'STARTS_WITH'=605 -'STRING_TO_ARRAY'=606 -'STRING_TO_TABLE'=607 -'STRPOS'=608 -'SUBSTR'=609 -'TO_ASCII'=610 -'TO_HEX'=611 -'TRANSLATE'=612 -'UNISTR'=613 -'AGE'=614 -'CLOCK_TIMESTAMP'=615 -'DATE_BIN'=616 -'DATE_PART'=617 -'DATE_TRUNC'=618 -'ISFINITE'=619 -'JUSTIFY_DAYS'=620 -'JUSTIFY_HOURS'=621 -'JUSTIFY_INTERVAL'=622 -'MAKE_DATE'=623 -'MAKE_INTERVAL'=624 -'MAKE_TIME'=625 -'MAKE_TIMESTAMP'=626 -'MAKE_TIMESTAMPTZ'=627 -'NOW'=628 -'STATEMENT_TIMESTAMP'=629 -'TIMEOFDAY'=630 -'TRANSACTION_TIMESTAMP'=631 -'TO_TIMESTAMP'=632 -'TO_CHAR'=633 -'TO_DATE'=634 -'TO_NUMBER'=635 -'\\\\'=669 -'\''=679 +Dollar=1 +OPEN_PAREN=2 +CLOSE_PAREN=3 +OPEN_BRACKET=4 +CLOSE_BRACKET=5 +COMMA=6 +SEMI=7 +COLON=8 +STAR=9 +EQUAL=10 +DOT=11 +PLUS=12 +MINUS=13 +SLASH=14 +CARET=15 +LT=16 +GT=17 +LESS_LESS=18 +GREATER_GREATER=19 +COLON_EQUALS=20 +LESS_EQUALS=21 +EQUALS_GREATER=22 +GREATER_EQUALS=23 +DOT_DOT=24 +NOT_EQUALS=25 +TYPECAST=26 +PERCENT=27 +PARAM=28 +Operator=29 +ALL=30 +ANALYSE=31 +ANALYZE=32 +AND=33 +ANY=34 +ARRAY=35 +AS=36 +ASC=37 +ASYMMETRIC=38 +BOTH=39 +CASE=40 +CAST=41 +CHECK=42 +COLLATE=43 +COLUMN=44 +CONSTRAINT=45 +CREATE=46 +CURRENT_CATALOG=47 +CURRENT_DATE=48 +CURRENT_ROLE=49 +CURRENT_TIME=50 +CURRENT_TIMESTAMP=51 +CURRENT_USER=52 +DEFAULT=53 +DEFERRABLE=54 +DESC=55 +DISTINCT=56 +DO=57 +ELSE=58 +EXCEPT=59 +FALSE_P=60 +FETCH=61 +FOR=62 +FOREIGN=63 +FROM=64 +GRANT=65 +GROUP_P=66 +HAVING=67 +IN_P=68 +INITIALLY=69 +INTERSECT=70 +INTO=71 +LATERAL_P=72 +LEADING=73 +LIMIT=74 +LOCALTIME=75 +LOCALTIMESTAMP=76 +NOT=77 +NULL_P=78 +OFFSET=79 +ON=80 +ONLY=81 +OR=82 +ORDER=83 +PLACING=84 +PRIMARY=85 +REFERENCES=86 +RETURNING=87 +SELECT=88 +SESSION_USER=89 +SOME=90 +SYMMETRIC=91 +TABLE=92 +THEN=93 +TO=94 +TRAILING=95 +TRUE_P=96 +UNION=97 +UNIQUE=98 +USER=99 +USING=100 +VARIADIC=101 +WHEN=102 +WHERE=103 +WINDOW=104 +WITH=105 +AUTHORIZATION=106 +BINARY=107 +COLLATION=108 +CONCURRENTLY=109 +CROSS=110 +CURRENT_SCHEMA=111 +FREEZE=112 +FULL=113 +ILIKE=114 +INNER_P=115 +IS=116 +ISNULL=117 +JOIN=118 +LEFT=119 +LIKE=120 +NATURAL=121 +NOTNULL=122 +OUTER_P=123 +OVER=124 +OVERLAPS=125 +RIGHT=126 +SIMILAR=127 +VERBOSE=128 +ABORT_P=129 +ABSOLUTE_P=130 +ACCESS=131 +ACTION=132 +ADD_P=133 +ADMIN=134 +AFTER=135 +AGGREGATE=136 +ALSO=137 +ALTER=138 +ALWAYS=139 +ASSERTION=140 +ASSIGNMENT=141 +AT=142 +ATTRIBUTE=143 +BACKWARD=144 +BEFORE=145 +BEGIN_P=146 +BY=147 +CACHE=148 +CALLED=149 +CASCADE=150 +CASCADED=151 +CATALOG=152 +CHAIN=153 +CHARACTERISTICS=154 +CHECKPOINT=155 +CLASS=156 +CLOSE=157 +CLUSTER=158 +COMMENT=159 +COMMENTS=160 +COMMIT=161 +COMMITTED=162 +CONFIGURATION=163 +CONNECTION=164 +CONSTRAINTS=165 +CONTENT_P=166 +CONTINUE_P=167 +CONVERSION_P=168 +COPY=169 +COST=170 +CSV=171 +CURSOR=172 +CYCLE=173 +DATA_P=174 +DATABASE=175 +DAY_P=176 +DEALLOCATE=177 +DECLARE=178 +DEFAULTS=179 +DEFERRED=180 +DEFINER=181 +DELETE_P=182 +DELIMITER=183 +DELIMITERS=184 +DICTIONARY=185 +DISABLE_P=186 +DISCARD=187 +DOCUMENT_P=188 +DOMAIN_P=189 +DOUBLE_P=190 +DROP=191 +EACH=192 +ENABLE_P=193 +ENCODING=194 +ENCRYPTED=195 +ENUM_P=196 +ESCAPE=197 +EVENT=198 +EXCLUDE=199 +EXCLUDING=200 +EXCLUSIVE=201 +EXECUTE=202 +EXPLAIN=203 +EXTENSION=204 +EXTERNAL=205 +FAMILY=206 +FIRST_P=207 +FOLLOWING=208 +FORCE=209 +FORWARD=210 +FUNCTION=211 +FUNCTIONS=212 +GLOBAL=213 +GRANTED=214 +HANDLER=215 +HEADER_P=216 +HOLD=217 +HOUR_P=218 +IDENTITY_P=219 +IF_P=220 +IMMEDIATE=221 +IMMUTABLE=222 +IMPLICIT_P=223 +INCLUDING=224 +INCREMENT=225 +INDEX=226 +INDEXES=227 +INHERIT=228 +INHERITS=229 +INLINE_P=230 +INSENSITIVE=231 +INSERT=232 +INSTEAD=233 +INVOKER=234 +ISOLATION=235 +KEY=236 +LABEL=237 +LANGUAGE=238 +LARGE_P=239 +LAST_P=240 +LEAKPROOF=241 +LEVEL=242 +LISTEN=243 +LOAD=244 +LOCAL=245 +LOCATION=246 +LOCK_P=247 +MAPPING=248 +MATCH=249 +MATCHED=250 +MATERIALIZED=251 +MAXVALUE=252 +MERGE=253 +MINUTE_P=254 +MINVALUE=255 +MODE=256 +MONTH_P=257 +MOVE=258 +NAME_P=259 +NAMES=260 +NEXT=261 +NO=262 +NOTHING=263 +NOTIFY=264 +NOWAIT=265 +NULLS_P=266 +OBJECT_P=267 +OF=268 +OFF=269 +OIDS=270 +OPERATOR=271 +OPTION=272 +OPTIONS=273 +OWNED=274 +OWNER=275 +PARSER=276 +PARTIAL=277 +PARTITION=278 +PASSING=279 +PASSWORD=280 +PLANS=281 +PRECEDING=282 +PREPARE=283 +PREPARED=284 +PRESERVE=285 +PRIOR=286 +PRIVILEGES=287 +PROCEDURAL=288 +PROCEDURE=289 +PROGRAM=290 +QUOTE=291 +RANGE=292 +READ=293 +REASSIGN=294 +RECHECK=295 +RECURSIVE=296 +REF=297 +REFRESH=298 +REINDEX=299 +RELATIVE_P=300 +RELEASE=301 +RENAME=302 +REPEATABLE=303 +REPLACE=304 +REPLICA=305 +RESET=306 +RESTART=307 +RESTRICT=308 +RETURNS=309 +REVOKE=310 +ROLE=311 +ROLLBACK=312 +ROWS=313 +RULE=314 +SAVEPOINT=315 +SCHEMA=316 +SCROLL=317 +SEARCH=318 +SECOND_P=319 +SECURITY=320 +SEQUENCE=321 +SEQUENCES=322 +SERIALIZABLE=323 +SERVER=324 +SESSION=325 +SET=326 +SHARE=327 +SHOW=328 +SIMPLE=329 +SNAPSHOT=330 +STABLE=331 +STANDALONE_P=332 +START=333 +STATEMENT=334 +STATISTICS=335 +STDIN=336 +STDOUT=337 +STORAGE=338 +STRICT_P=339 +STRIP_P=340 +SYSID=341 +SYSTEM_P=342 +TABLES=343 +TABLESPACE=344 +TEMP=345 +TEMPLATE=346 +TEMPORARY=347 +TEXT_P=348 +TRANSACTION=349 +TRIGGER=350 +TRUNCATE=351 +TRUSTED=352 +TYPE_P=353 +TYPES_P=354 +UNBOUNDED=355 +UNCOMMITTED=356 +UNENCRYPTED=357 +UNKNOWN=358 +UNLISTEN=359 +UNLOGGED=360 +UNTIL=361 +UPDATE=362 +VACUUM=363 +VALID=364 +VALIDATE=365 +VALIDATOR=366 +VARYING=367 +VERSION_P=368 +VIEW=369 +VOLATILE=370 +WHITESPACE_P=371 +WITHOUT=372 +WORK=373 +WRAPPER=374 +WRITE=375 +XML_P=376 +YEAR_P=377 +YES_P=378 +ZONE=379 +BETWEEN=380 +BIGINT=381 +BIT=382 +BOOLEAN_P=383 +CHAR_P=384 +CHARACTER=385 +COALESCE=386 +DEC=387 +DECIMAL_P=388 +EXISTS=389 +EXTRACT=390 +FLOAT_P=391 +GREATEST=392 +INOUT=393 +INT_P=394 +INTEGER=395 +INTERVAL=396 +LEAST=397 +NATIONAL=398 +NCHAR=399 +NONE=400 +NULLIF=401 +NUMERIC=402 +OVERLAY=403 +POSITION=404 +PRECISION=405 +REAL=406 +ROW=407 +SETOF=408 +SMALLINT=409 +SUBSTRING=410 +TIME=411 +TIMESTAMP=412 +TREAT=413 +TRIM=414 +VALUES=415 +VARCHAR=416 +XMLATTRIBUTES=417 +XMLCOMMENT=418 +XMLAGG=419 +XML_IS_WELL_FORMED=420 +XML_IS_WELL_FORMED_DOCUMENT=421 +XML_IS_WELL_FORMED_CONTENT=422 +XPATH=423 +XPATH_EXISTS=424 +XMLCONCAT=425 +XMLELEMENT=426 +XMLEXISTS=427 +XMLFOREST=428 +XMLPARSE=429 +XMLPI=430 +XMLROOT=431 +XMLSERIALIZE=432 +CALL=433 +CURRENT_P=434 +ATTACH=435 +DETACH=436 +EXPRESSION=437 +GENERATED=438 +LOGGED=439 +STORED=440 +INCLUDE=441 +ROUTINE=442 +TRANSFORM=443 +IMPORT_P=444 +POLICY=445 +METHOD=446 +REFERENCING=447 +NEW=448 +OLD=449 +VALUE_P=450 +SUBSCRIPTION=451 +PUBLICATION=452 +OUT_P=453 +END_P=454 +ROUTINES=455 +SCHEMAS=456 +PROCEDURES=457 +INPUT_P=458 +SUPPORT=459 +PARALLEL=460 +SQL_P=461 +DEPENDS=462 +OVERRIDING=463 +CONFLICT=464 +SKIP_P=465 +LOCKED=466 +TIES=467 +ROLLUP=468 +CUBE=469 +GROUPING=470 +SETS=471 +TABLESAMPLE=472 +ORDINALITY=473 +XMLTABLE=474 +COLUMNS=475 +XMLNAMESPACES=476 +ROWTYPE=477 +NORMALIZED=478 +WITHIN=479 +FILTER=480 +GROUPS=481 +OTHERS=482 +NFC=483 +NFD=484 +NFKC=485 +NFKD=486 +UESCAPE=487 +VIEWS=488 +NORMALIZE=489 +DUMP=490 +PRINT_STRICT_PARAMS=491 +VARIABLE_CONFLICT=492 +ERROR=493 +USE_VARIABLE=494 +USE_COLUMN=495 +ALIAS=496 +CONSTANT=497 +PERFORM=498 +GET=499 +DIAGNOSTICS=500 +STACKED=501 +ELSIF=502 +WHILE=503 +REVERSE=504 +FOREACH=505 +SLICE=506 +EXIT=507 +RETURN=508 +QUERY=509 +RAISE=510 +SQLSTATE=511 +DEBUG=512 +LOG=513 +INFO=514 +NOTICE=515 +WARNING=516 +EXCEPTION=517 +ASSERT=518 +LOOP=519 +OPEN=520 +ABS=521 +CBRT=522 +CEIL=523 +CEILING=524 +DEGREES=525 +DIV=526 +EXP=527 +FACTORIAL=528 +FLOOR=529 +GCD=530 +LCM=531 +LN=532 +LOG10=533 +MIN_SCALE=534 +MOD=535 +PI=536 +POWER=537 +RADIANS=538 +ROUND=539 +SCALE=540 +SIGN=541 +SQRT=542 +TRIM_SCALE=543 +TRUNC=544 +WIDTH_BUCKET=545 +RANDOM=546 +SETSEED=547 +ACOS=548 +ACOSD=549 +ASIN=550 +ASIND=551 +ATAN=552 +ATAND=553 +ATAN2=554 +ATAN2D=555 +COS=556 +COSD=557 +COT=558 +COTD=559 +SIN=560 +SIND=561 +TAN=562 +TAND=563 +SINH=564 +COSH=565 +TANH=566 +ASINH=567 +ACOSH=568 +ATANH=569 +BIT_LENGTH=570 +CHAR_LENGTH=571 +CHARACTER_LENGTH=572 +LOWER=573 +OCTET_LENGTH=574 +UPPER=575 +ASCII=576 +BTRIM=577 +CHR=578 +CONCAT=579 +CONCAT_WS=580 +FORMAT=581 +INITCAP=582 +LENGTH=583 +LPAD=584 +LTRIM=585 +MD5=586 +PARSE_IDENT=587 +PG_CLIENT_ENCODING=588 +QUOTE_IDENT=589 +QUOTE_LITERAL=590 +QUOTE_NULLABLE=591 +REGEXP_COUNT=592 +REGEXP_INSTR=593 +REGEXP_LIKE=594 +REGEXP_MATCH=595 +REGEXP_MATCHES=596 +REGEXP_REPLACE=597 +REGEXP_SPLIT_TO_ARRAY=598 +REGEXP_SPLIT_TO_TABLE=599 +REGEXP_SUBSTR=600 +REPEAT=601 +RPAD=602 +RTRIM=603 +SPLIT_PART=604 +STARTS_WITH=605 +STRING_TO_ARRAY=606 +STRING_TO_TABLE=607 +STRPOS=608 +SUBSTR=609 +TO_ASCII=610 +TO_HEX=611 +TRANSLATE=612 +UNISTR=613 +AGE=614 +CLOCK_TIMESTAMP=615 +DATE_BIN=616 +DATE_PART=617 +DATE_TRUNC=618 +ISFINITE=619 +JUSTIFY_DAYS=620 +JUSTIFY_HOURS=621 +JUSTIFY_INTERVAL=622 +MAKE_DATE=623 +MAKE_INTERVAL=624 +MAKE_TIME=625 +MAKE_TIMESTAMP=626 +MAKE_TIMESTAMPTZ=627 +NOW=628 +STATEMENT_TIMESTAMP=629 +TIMEOFDAY=630 +TRANSACTION_TIMESTAMP=631 +TO_TIMESTAMP=632 +TO_CHAR=633 +TO_DATE=634 +TO_NUMBER=635 +Identifier=636 +QuotedIdentifier=637 +UnterminatedQuotedIdentifier=638 +InvalidQuotedIdentifier=639 +InvalidUnterminatedQuotedIdentifier=640 +UnicodeQuotedIdentifier=641 +UnterminatedUnicodeQuotedIdentifier=642 +InvalidUnicodeQuotedIdentifier=643 +InvalidUnterminatedUnicodeQuotedIdentifier=644 +StringConstant=645 +UnterminatedStringConstant=646 +UnicodeEscapeStringConstant=647 +UnterminatedUnicodeEscapeStringConstant=648 +BeginDollarStringConstant=649 +BinaryStringConstant=650 +UnterminatedBinaryStringConstant=651 +InvalidBinaryStringConstant=652 +InvalidUnterminatedBinaryStringConstant=653 +HexadecimalStringConstant=654 +UnterminatedHexadecimalStringConstant=655 +InvalidHexadecimalStringConstant=656 +InvalidUnterminatedHexadecimalStringConstant=657 +Integral=658 +NumericFail=659 +Numeric=660 +PLSQLVARIABLENAME=661 +PLSQLIDENTIFIER=662 +Whitespace=663 +Newline=664 +LineComment=665 +BlockComment=666 +UnterminatedBlockComment=667 +MetaCommand=668 +EndMetaCommand=669 +ErrorCharacter=670 +EscapeStringConstant=671 +UnterminatedEscapeStringConstant=672 +InvalidEscapeStringConstant=673 +InvalidUnterminatedEscapeStringConstant=674 +AfterEscapeStringConstantMode_NotContinued=675 +AfterEscapeStringConstantWithNewlineMode_NotContinued=676 +DollarText=677 +EndDollarStringConstant=678 +AfterEscapeStringConstantWithNewlineMode_Continued=679 +'$'=1 +'('=2 +')'=3 +'['=4 +']'=5 +','=6 +';'=7 +':'=8 +'*'=9 +'='=10 +'.'=11 +'+'=12 +'-'=13 +'/'=14 +'^'=15 +'<'=16 +'>'=17 +'<<'=18 +'>>'=19 +':='=20 +'<='=21 +'=>'=22 +'>='=23 +'..'=24 +'<>'=25 +'::'=26 +'%'=27 +'ALL'=30 +'ANALYSE'=31 +'ANALYZE'=32 +'AND'=33 +'ANY'=34 +'ARRAY'=35 +'AS'=36 +'ASC'=37 +'ASYMMETRIC'=38 +'BOTH'=39 +'CASE'=40 +'CAST'=41 +'CHECK'=42 +'COLLATE'=43 +'COLUMN'=44 +'CONSTRAINT'=45 +'CREATE'=46 +'CURRENT_CATALOG'=47 +'CURRENT_DATE'=48 +'CURRENT_ROLE'=49 +'CURRENT_TIME'=50 +'CURRENT_TIMESTAMP'=51 +'CURRENT_USER'=52 +'DEFAULT'=53 +'DEFERRABLE'=54 +'DESC'=55 +'DISTINCT'=56 +'DO'=57 +'ELSE'=58 +'EXCEPT'=59 +'FALSE'=60 +'FETCH'=61 +'FOR'=62 +'FOREIGN'=63 +'FROM'=64 +'GRANT'=65 +'GROUP'=66 +'HAVING'=67 +'IN'=68 +'INITIALLY'=69 +'INTERSECT'=70 +'INTO'=71 +'LATERAL'=72 +'LEADING'=73 +'LIMIT'=74 +'LOCALTIME'=75 +'LOCALTIMESTAMP'=76 +'NOT'=77 +'NULL'=78 +'OFFSET'=79 +'ON'=80 +'ONLY'=81 +'OR'=82 +'ORDER'=83 +'PLACING'=84 +'PRIMARY'=85 +'REFERENCES'=86 +'RETURNING'=87 +'SELECT'=88 +'SESSION_USER'=89 +'SOME'=90 +'SYMMETRIC'=91 +'TABLE'=92 +'THEN'=93 +'TO'=94 +'TRAILING'=95 +'TRUE'=96 +'UNION'=97 +'UNIQUE'=98 +'USER'=99 +'USING'=100 +'VARIADIC'=101 +'WHEN'=102 +'WHERE'=103 +'WINDOW'=104 +'WITH'=105 +'AUTHORIZATION'=106 +'BINARY'=107 +'COLLATION'=108 +'CONCURRENTLY'=109 +'CROSS'=110 +'CURRENT_SCHEMA'=111 +'FREEZE'=112 +'FULL'=113 +'ILIKE'=114 +'INNER'=115 +'IS'=116 +'ISNULL'=117 +'JOIN'=118 +'LEFT'=119 +'LIKE'=120 +'NATURAL'=121 +'NOTNULL'=122 +'OUTER'=123 +'OVER'=124 +'OVERLAPS'=125 +'RIGHT'=126 +'SIMILAR'=127 +'VERBOSE'=128 +'ABORT'=129 +'ABSOLUTE'=130 +'ACCESS'=131 +'ACTION'=132 +'ADD'=133 +'ADMIN'=134 +'AFTER'=135 +'AGGREGATE'=136 +'ALSO'=137 +'ALTER'=138 +'ALWAYS'=139 +'ASSERTION'=140 +'ASSIGNMENT'=141 +'AT'=142 +'ATTRIBUTE'=143 +'BACKWARD'=144 +'BEFORE'=145 +'BEGIN'=146 +'BY'=147 +'CACHE'=148 +'CALLED'=149 +'CASCADE'=150 +'CASCADED'=151 +'CATALOG'=152 +'CHAIN'=153 +'CHARACTERISTICS'=154 +'CHECKPOINT'=155 +'CLASS'=156 +'CLOSE'=157 +'CLUSTER'=158 +'COMMENT'=159 +'COMMENTS'=160 +'COMMIT'=161 +'COMMITTED'=162 +'CONFIGURATION'=163 +'CONNECTION'=164 +'CONSTRAINTS'=165 +'CONTENT'=166 +'CONTINUE'=167 +'CONVERSION'=168 +'COPY'=169 +'COST'=170 +'CSV'=171 +'CURSOR'=172 +'CYCLE'=173 +'DATA'=174 +'DATABASE'=175 +'DAY'=176 +'DEALLOCATE'=177 +'DECLARE'=178 +'DEFAULTS'=179 +'DEFERRED'=180 +'DEFINER'=181 +'DELETE'=182 +'DELIMITER'=183 +'DELIMITERS'=184 +'DICTIONARY'=185 +'DISABLE'=186 +'DISCARD'=187 +'DOCUMENT'=188 +'DOMAIN'=189 +'DOUBLE'=190 +'DROP'=191 +'EACH'=192 +'ENABLE'=193 +'ENCODING'=194 +'ENCRYPTED'=195 +'ENUM'=196 +'ESCAPE'=197 +'EVENT'=198 +'EXCLUDE'=199 +'EXCLUDING'=200 +'EXCLUSIVE'=201 +'EXECUTE'=202 +'EXPLAIN'=203 +'EXTENSION'=204 +'EXTERNAL'=205 +'FAMILY'=206 +'FIRST'=207 +'FOLLOWING'=208 +'FORCE'=209 +'FORWARD'=210 +'FUNCTION'=211 +'FUNCTIONS'=212 +'GLOBAL'=213 +'GRANTED'=214 +'HANDLER'=215 +'HEADER'=216 +'HOLD'=217 +'HOUR'=218 +'IDENTITY'=219 +'IF'=220 +'IMMEDIATE'=221 +'IMMUTABLE'=222 +'IMPLICIT'=223 +'INCLUDING'=224 +'INCREMENT'=225 +'INDEX'=226 +'INDEXES'=227 +'INHERIT'=228 +'INHERITS'=229 +'INLINE'=230 +'INSENSITIVE'=231 +'INSERT'=232 +'INSTEAD'=233 +'INVOKER'=234 +'ISOLATION'=235 +'KEY'=236 +'LABEL'=237 +'LANGUAGE'=238 +'LARGE'=239 +'LAST'=240 +'LEAKPROOF'=241 +'LEVEL'=242 +'LISTEN'=243 +'LOAD'=244 +'LOCAL'=245 +'LOCATION'=246 +'LOCK'=247 +'MAPPING'=248 +'MATCH'=249 +'MATCHED'=250 +'MATERIALIZED'=251 +'MAXVALUE'=252 +'MERGE'=253 +'MINUTE'=254 +'MINVALUE'=255 +'MODE'=256 +'MONTH'=257 +'MOVE'=258 +'NAME'=259 +'NAMES'=260 +'NEXT'=261 +'NO'=262 +'NOTHING'=263 +'NOTIFY'=264 +'NOWAIT'=265 +'NULLS'=266 +'OBJECT'=267 +'OF'=268 +'OFF'=269 +'OIDS'=270 +'OPERATOR'=271 +'OPTION'=272 +'OPTIONS'=273 +'OWNED'=274 +'OWNER'=275 +'PARSER'=276 +'PARTIAL'=277 +'PARTITION'=278 +'PASSING'=279 +'PASSWORD'=280 +'PLANS'=281 +'PRECEDING'=282 +'PREPARE'=283 +'PREPARED'=284 +'PRESERVE'=285 +'PRIOR'=286 +'PRIVILEGES'=287 +'PROCEDURAL'=288 +'PROCEDURE'=289 +'PROGRAM'=290 +'QUOTE'=291 +'RANGE'=292 +'READ'=293 +'REASSIGN'=294 +'RECHECK'=295 +'RECURSIVE'=296 +'REF'=297 +'REFRESH'=298 +'REINDEX'=299 +'RELATIVE'=300 +'RELEASE'=301 +'RENAME'=302 +'REPEATABLE'=303 +'REPLACE'=304 +'REPLICA'=305 +'RESET'=306 +'RESTART'=307 +'RESTRICT'=308 +'RETURNS'=309 +'REVOKE'=310 +'ROLE'=311 +'ROLLBACK'=312 +'ROWS'=313 +'RULE'=314 +'SAVEPOINT'=315 +'SCHEMA'=316 +'SCROLL'=317 +'SEARCH'=318 +'SECOND'=319 +'SECURITY'=320 +'SEQUENCE'=321 +'SEQUENCES'=322 +'SERIALIZABLE'=323 +'SERVER'=324 +'SESSION'=325 +'SET'=326 +'SHARE'=327 +'SHOW'=328 +'SIMPLE'=329 +'SNAPSHOT'=330 +'STABLE'=331 +'STANDALONE'=332 +'START'=333 +'STATEMENT'=334 +'STATISTICS'=335 +'STDIN'=336 +'STDOUT'=337 +'STORAGE'=338 +'STRICT'=339 +'STRIP'=340 +'SYSID'=341 +'SYSTEM'=342 +'TABLES'=343 +'TABLESPACE'=344 +'TEMP'=345 +'TEMPLATE'=346 +'TEMPORARY'=347 +'TEXT'=348 +'TRANSACTION'=349 +'TRIGGER'=350 +'TRUNCATE'=351 +'TRUSTED'=352 +'TYPE'=353 +'TYPES'=354 +'UNBOUNDED'=355 +'UNCOMMITTED'=356 +'UNENCRYPTED'=357 +'UNKNOWN'=358 +'UNLISTEN'=359 +'UNLOGGED'=360 +'UNTIL'=361 +'UPDATE'=362 +'VACUUM'=363 +'VALID'=364 +'VALIDATE'=365 +'VALIDATOR'=366 +'VARYING'=367 +'VERSION'=368 +'VIEW'=369 +'VOLATILE'=370 +'WHITESPACE'=371 +'WITHOUT'=372 +'WORK'=373 +'WRAPPER'=374 +'WRITE'=375 +'XML'=376 +'YEAR'=377 +'YES'=378 +'ZONE'=379 +'BETWEEN'=380 +'BIGINT'=381 +'BIT'=382 +'BOOLEAN'=383 +'CHAR'=384 +'CHARACTER'=385 +'COALESCE'=386 +'DEC'=387 +'DECIMAL'=388 +'EXISTS'=389 +'EXTRACT'=390 +'FLOAT'=391 +'GREATEST'=392 +'INOUT'=393 +'INT'=394 +'INTEGER'=395 +'INTERVAL'=396 +'LEAST'=397 +'NATIONAL'=398 +'NCHAR'=399 +'NONE'=400 +'NULLIF'=401 +'NUMERIC'=402 +'OVERLAY'=403 +'POSITION'=404 +'PRECISION'=405 +'REAL'=406 +'ROW'=407 +'SETOF'=408 +'SMALLINT'=409 +'SUBSTRING'=410 +'TIME'=411 +'TIMESTAMP'=412 +'TREAT'=413 +'TRIM'=414 +'VALUES'=415 +'VARCHAR'=416 +'XMLATTRIBUTES'=417 +'XMLCOMMENT'=418 +'XMLAGG'=419 +'XML_IS_WELL_FORMED'=420 +'XML_IS_WELL_FORMED_DOCUMENT'=421 +'XML_IS_WELL_FORMED_CONTENT'=422 +'XPATH'=423 +'XPATH_EXISTS'=424 +'XMLCONCAT'=425 +'XMLELEMENT'=426 +'XMLEXISTS'=427 +'XMLFOREST'=428 +'XMLPARSE'=429 +'XMLPI'=430 +'XMLROOT'=431 +'XMLSERIALIZE'=432 +'CALL'=433 +'CURRENT'=434 +'ATTACH'=435 +'DETACH'=436 +'EXPRESSION'=437 +'GENERATED'=438 +'LOGGED'=439 +'STORED'=440 +'INCLUDE'=441 +'ROUTINE'=442 +'TRANSFORM'=443 +'IMPORT'=444 +'POLICY'=445 +'METHOD'=446 +'REFERENCING'=447 +'NEW'=448 +'OLD'=449 +'VALUE'=450 +'SUBSCRIPTION'=451 +'PUBLICATION'=452 +'OUT'=453 +'END'=454 +'ROUTINES'=455 +'SCHEMAS'=456 +'PROCEDURES'=457 +'INPUT'=458 +'SUPPORT'=459 +'PARALLEL'=460 +'SQL'=461 +'DEPENDS'=462 +'OVERRIDING'=463 +'CONFLICT'=464 +'SKIP'=465 +'LOCKED'=466 +'TIES'=467 +'ROLLUP'=468 +'CUBE'=469 +'GROUPING'=470 +'SETS'=471 +'TABLESAMPLE'=472 +'ORDINALITY'=473 +'XMLTABLE'=474 +'COLUMNS'=475 +'XMLNAMESPACES'=476 +'ROWTYPE'=477 +'NORMALIZED'=478 +'WITHIN'=479 +'FILTER'=480 +'GROUPS'=481 +'OTHERS'=482 +'NFC'=483 +'NFD'=484 +'NFKC'=485 +'NFKD'=486 +'UESCAPE'=487 +'VIEWS'=488 +'NORMALIZE'=489 +'DUMP'=490 +'PRINT_STRICT_PARAMS'=491 +'VARIABLE_CONFLICT'=492 +'ERROR'=493 +'USE_VARIABLE'=494 +'USE_COLUMN'=495 +'ALIAS'=496 +'CONSTANT'=497 +'PERFORM'=498 +'GET'=499 +'DIAGNOSTICS'=500 +'STACKED'=501 +'ELSIF'=502 +'WHILE'=503 +'REVERSE'=504 +'FOREACH'=505 +'SLICE'=506 +'EXIT'=507 +'RETURN'=508 +'QUERY'=509 +'RAISE'=510 +'SQLSTATE'=511 +'DEBUG'=512 +'LOG'=513 +'INFO'=514 +'NOTICE'=515 +'WARNING'=516 +'EXCEPTION'=517 +'ASSERT'=518 +'LOOP'=519 +'OPEN'=520 +'ABS'=521 +'CBRT'=522 +'CEIL'=523 +'CEILING'=524 +'DEGREES'=525 +'DIV'=526 +'EXP'=527 +'FACTORIAL'=528 +'FLOOR'=529 +'GCD'=530 +'LCM'=531 +'LN'=532 +'LOG10'=533 +'MIN_SCALE'=534 +'MOD'=535 +'PI'=536 +'POWER'=537 +'RADIANS'=538 +'ROUND'=539 +'SCALE'=540 +'SIGN'=541 +'SQRT'=542 +'TRIM_SCALE'=543 +'TRUNC'=544 +'WIDTH_BUCKET'=545 +'RANDOM'=546 +'SETSEED'=547 +'ACOS'=548 +'ACOSD'=549 +'ASIN'=550 +'ASIND'=551 +'ATAN'=552 +'ATAND'=553 +'ATAN2'=554 +'ATAN2D'=555 +'COS'=556 +'COSD'=557 +'COT'=558 +'COTD'=559 +'SIN'=560 +'SIND'=561 +'TAN'=562 +'TAND'=563 +'SINH'=564 +'COSH'=565 +'TANH'=566 +'ASINH'=567 +'ACOSH'=568 +'ATANH'=569 +'BIT_LENGTH'=570 +'CHAR_LENGTH'=571 +'CHARACTER_LENGTH'=572 +'LOWER'=573 +'OCTET_LENGTH'=574 +'UPPER'=575 +'ASCII'=576 +'BTRIM'=577 +'CHR'=578 +'CONCAT'=579 +'CONCAT_WS'=580 +'FORMAT'=581 +'INITCAP'=582 +'LENGTH'=583 +'LPAD'=584 +'LTRIM'=585 +'MD5'=586 +'PARSE_IDENT'=587 +'PG_CLIENT_ENCODING'=588 +'QUOTE_IDENT'=589 +'QUOTE_LITERAL'=590 +'QUOTE_NULLABLE'=591 +'REGEXP_COUNT'=592 +'REGEXP_INSTR'=593 +'REGEXP_LIKE'=594 +'REGEXP_MATCH'=595 +'REGEXP_MATCHES'=596 +'REGEXP_REPLACE'=597 +'REGEXP_SPLIT_TO_ARRAY'=598 +'REGEXP_SPLIT_TO_TABLE'=599 +'REGEXP_SUBSTR'=600 +'REPEAT'=601 +'RPAD'=602 +'RTRIM'=603 +'SPLIT_PART'=604 +'STARTS_WITH'=605 +'STRING_TO_ARRAY'=606 +'STRING_TO_TABLE'=607 +'STRPOS'=608 +'SUBSTR'=609 +'TO_ASCII'=610 +'TO_HEX'=611 +'TRANSLATE'=612 +'UNISTR'=613 +'AGE'=614 +'CLOCK_TIMESTAMP'=615 +'DATE_BIN'=616 +'DATE_PART'=617 +'DATE_TRUNC'=618 +'ISFINITE'=619 +'JUSTIFY_DAYS'=620 +'JUSTIFY_HOURS'=621 +'JUSTIFY_INTERVAL'=622 +'MAKE_DATE'=623 +'MAKE_INTERVAL'=624 +'MAKE_TIME'=625 +'MAKE_TIMESTAMP'=626 +'MAKE_TIMESTAMPTZ'=627 +'NOW'=628 +'STATEMENT_TIMESTAMP'=629 +'TIMEOFDAY'=630 +'TRANSACTION_TIMESTAMP'=631 +'TO_TIMESTAMP'=632 +'TO_CHAR'=633 +'TO_DATE'=634 +'TO_NUMBER'=635 +'\\\\'=669 +'\''=679 diff --git a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParserVisitor.js b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParserVisitor.js index 27b9092e7..63b1b865d 100644 --- a/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParserVisitor.js +++ b/packages/dbml-core/src/parse/ANTLR/parsers/postgresql/PostgreSQLParserVisitor.js @@ -1,4924 +1,4924 @@ -// Generated from .\src\parse\ANTLR\postgresql\PostgreSQLParser.g4 by ANTLR 4.13.0 -// jshint ignore: start -import antlr4 from 'antlr4'; - -// This class defines a complete generic visitor for a parse tree produced by PostgreSQLParser. - -export default class PostgreSQLParserVisitor extends antlr4.tree.ParseTreeVisitor { - - // Visit a parse tree produced by PostgreSQLParser#root. - visitRoot(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#plsqlroot. - visitPlsqlroot(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmtblock. - visitStmtblock(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmtmulti. - visitStmtmulti(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt. - visitStmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#plsqlconsolecommand. - visitPlsqlconsolecommand(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#callstmt. - visitCallstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createrolestmt. - visitCreaterolestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_with. - visitOpt_with(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optrolelist. - visitOptrolelist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alteroptrolelist. - visitAlteroptrolelist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alteroptroleelem. - visitAlteroptroleelem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createoptroleelem. - visitCreateoptroleelem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createuserstmt. - visitCreateuserstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterrolestmt. - visitAlterrolestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_in_database. - visitOpt_in_database(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterrolesetstmt. - visitAlterrolesetstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#droprolestmt. - visitDroprolestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#creategroupstmt. - visitCreategroupstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altergroupstmt. - visitAltergroupstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#add_drop. - visitAdd_drop(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createschemastmt. - visitCreateschemastmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optschemaname. - visitOptschemaname(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optschemaeltlist. - visitOptschemaeltlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#schema_stmt. - visitSchema_stmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#variablesetstmt. - visitVariablesetstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#set_rest. - visitSet_rest(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generic_set. - visitGeneric_set(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#set_rest_more. - visitSet_rest_more(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#var_name. - visitVar_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#var_list. - visitVar_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#var_value. - visitVar_value(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#iso_level. - visitIso_level(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_boolean_or_string. - visitOpt_boolean_or_string(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#zone_value. - visitZone_value(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_encoding. - visitOpt_encoding(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#nonreservedword_or_sconst. - visitNonreservedword_or_sconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#variableresetstmt. - visitVariableresetstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reset_rest. - visitReset_rest(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generic_reset. - visitGeneric_reset(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#setresetclause. - visitSetresetclause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#functionsetresetclause. - visitFunctionsetresetclause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#variableshowstmt. - visitVariableshowstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constraintssetstmt. - visitConstraintssetstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constraints_set_list. - visitConstraints_set_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constraints_set_mode. - visitConstraints_set_mode(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#checkpointstmt. - visitCheckpointstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#discardstmt. - visitDiscardstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altertablestmt. - visitAltertablestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_table_cmds. - visitAlter_table_cmds(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#partition_cmd. - visitPartition_cmd(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#index_partition_cmd. - visitIndex_partition_cmd(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_table_cmd. - visitAlter_table_cmd(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_column_default. - visitAlter_column_default(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_drop_behavior. - visitOpt_drop_behavior(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_collate_clause. - visitOpt_collate_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_using. - visitAlter_using(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#replica_identity. - visitReplica_identity(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reloptions. - visitReloptions(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_reloptions. - visitOpt_reloptions(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reloption_list. - visitReloption_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reloption_elem. - visitReloption_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_identity_column_option_list. - visitAlter_identity_column_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_identity_column_option. - visitAlter_identity_column_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#partitionboundspec. - visitPartitionboundspec(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#hash_partbound_elem. - visitHash_partbound_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#hash_partbound. - visitHash_partbound(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altercompositetypestmt. - visitAltercompositetypestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_type_cmds. - visitAlter_type_cmds(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_type_cmd. - visitAlter_type_cmd(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#closeportalstmt. - visitCloseportalstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copystmt. - visitCopystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_from. - visitCopy_from(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_program. - visitOpt_program(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_file_name. - visitCopy_file_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_options. - visitCopy_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_opt_list. - visitCopy_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_opt_item. - visitCopy_opt_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_binary. - visitOpt_binary(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_delimiter. - visitCopy_delimiter(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_using. - visitOpt_using(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_list. - visitCopy_generic_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_elem. - visitCopy_generic_opt_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_arg. - visitCopy_generic_opt_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_arg_list. - visitCopy_generic_opt_arg_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_arg_list_item. - visitCopy_generic_opt_arg_list_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createstmt. - visitCreatestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opttemp. - visitOpttemp(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opttableelementlist. - visitOpttableelementlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opttypedtableelementlist. - visitOpttypedtableelementlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tableelementlist. - visitTableelementlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#typedtableelementlist. - visitTypedtableelementlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tableelement. - visitTableelement(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#typedtableelement. - visitTypedtableelement(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#columnDef. - visitColumnDef(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#columnOptions. - visitColumnOptions(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#colquallist. - visitColquallist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#colconstraint. - visitColconstraint(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#colconstraintelem. - visitColconstraintelem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generated_when. - visitGenerated_when(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constraintattr. - visitConstraintattr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tablelikeclause. - visitTablelikeclause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tablelikeoptionlist. - visitTablelikeoptionlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tablelikeoption. - visitTablelikeoption(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tableconstraint. - visitTableconstraint(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constraintelem. - visitConstraintelem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_no_inherit. - visitOpt_no_inherit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_column_list. - visitOpt_column_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#columnlist. - visitColumnlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#columnElem. - visitColumnElem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_c_include. - visitOpt_c_include(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#key_match. - visitKey_match(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#exclusionconstraintlist. - visitExclusionconstraintlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#exclusionconstraintelem. - visitExclusionconstraintelem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#exclusionwhereclause. - visitExclusionwhereclause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#key_actions. - visitKey_actions(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#key_update. - visitKey_update(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#key_delete. - visitKey_delete(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#key_action. - visitKey_action(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optinherit. - visitOptinherit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optpartitionspec. - visitOptpartitionspec(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#partitionspec. - visitPartitionspec(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#part_params. - visitPart_params(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#part_elem. - visitPart_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#table_access_method_clause. - visitTable_access_method_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optwith. - visitOptwith(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#oncommitoption. - visitOncommitoption(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opttablespace. - visitOpttablespace(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optconstablespace. - visitOptconstablespace(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#existingindex. - visitExistingindex(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createstatsstmt. - visitCreatestatsstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterstatsstmt. - visitAlterstatsstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createasstmt. - visitCreateasstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#create_as_target. - visitCreate_as_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_with_data. - visitOpt_with_data(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#creatematviewstmt. - visitCreatematviewstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#create_mv_target. - visitCreate_mv_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optnolog. - visitOptnolog(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#refreshmatviewstmt. - visitRefreshmatviewstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createseqstmt. - visitCreateseqstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterseqstmt. - visitAlterseqstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optseqoptlist. - visitOptseqoptlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optparenthesizedseqoptlist. - visitOptparenthesizedseqoptlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#seqoptlist. - visitSeqoptlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#seqoptelem. - visitSeqoptelem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_by. - visitOpt_by(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#numericonly. - visitNumericonly(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#numericonly_list. - visitNumericonly_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createplangstmt. - visitCreateplangstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_trusted. - visitOpt_trusted(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#handler_name. - visitHandler_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_inline_handler. - visitOpt_inline_handler(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#validator_clause. - visitValidator_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_validator. - visitOpt_validator(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_procedural. - visitOpt_procedural(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createtablespacestmt. - visitCreatetablespacestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opttablespaceowner. - visitOpttablespaceowner(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#droptablespacestmt. - visitDroptablespacestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createextensionstmt. - visitCreateextensionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#create_extension_opt_list. - visitCreate_extension_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#create_extension_opt_item. - visitCreate_extension_opt_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterextensionstmt. - visitAlterextensionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_extension_opt_list. - visitAlter_extension_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_extension_opt_item. - visitAlter_extension_opt_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterextensioncontentsstmt. - visitAlterextensioncontentsstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createfdwstmt. - visitCreatefdwstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#fdw_option. - visitFdw_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#fdw_options. - visitFdw_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_fdw_options. - visitOpt_fdw_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterfdwstmt. - visitAlterfdwstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#create_generic_options. - visitCreate_generic_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generic_option_list. - visitGeneric_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_generic_options. - visitAlter_generic_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_generic_option_list. - visitAlter_generic_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alter_generic_option_elem. - visitAlter_generic_option_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generic_option_elem. - visitGeneric_option_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generic_option_name. - visitGeneric_option_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generic_option_arg. - visitGeneric_option_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createforeignserverstmt. - visitCreateforeignserverstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_type. - visitOpt_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#foreign_server_version. - visitForeign_server_version(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_foreign_server_version. - visitOpt_foreign_server_version(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterforeignserverstmt. - visitAlterforeignserverstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createforeigntablestmt. - visitCreateforeigntablestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#importforeignschemastmt. - visitImportforeignschemastmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#import_qualification_type. - visitImport_qualification_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#import_qualification. - visitImport_qualification(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createusermappingstmt. - visitCreateusermappingstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#auth_ident. - visitAuth_ident(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropusermappingstmt. - visitDropusermappingstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterusermappingstmt. - visitAlterusermappingstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createpolicystmt. - visitCreatepolicystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterpolicystmt. - visitAlterpolicystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsecurityoptionalexpr. - visitRowsecurityoptionalexpr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsecurityoptionalwithcheck. - visitRowsecurityoptionalwithcheck(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsecuritydefaulttorole. - visitRowsecuritydefaulttorole(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsecurityoptionaltorole. - visitRowsecurityoptionaltorole(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsecuritydefaultpermissive. - visitRowsecuritydefaultpermissive(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsecuritydefaultforcmd. - visitRowsecuritydefaultforcmd(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#row_security_cmd. - visitRow_security_cmd(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createamstmt. - visitCreateamstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#am_type. - visitAm_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createtrigstmt. - visitCreatetrigstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggeractiontime. - visitTriggeractiontime(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerevents. - visitTriggerevents(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggeroneevent. - visitTriggeroneevent(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerreferencing. - visitTriggerreferencing(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggertransitions. - visitTriggertransitions(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggertransition. - visitTriggertransition(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transitionoldornew. - visitTransitionoldornew(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transitionrowortable. - visitTransitionrowortable(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transitionrelname. - visitTransitionrelname(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerforspec. - visitTriggerforspec(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerforopteach. - visitTriggerforopteach(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerfortype. - visitTriggerfortype(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerwhen. - visitTriggerwhen(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#function_or_procedure. - visitFunction_or_procedure(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerfuncargs. - visitTriggerfuncargs(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#triggerfuncarg. - visitTriggerfuncarg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#optconstrfromtable. - visitOptconstrfromtable(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constraintattributespec. - visitConstraintattributespec(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constraintattributeElem. - visitConstraintattributeElem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createeventtrigstmt. - visitCreateeventtrigstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#event_trigger_when_list. - visitEvent_trigger_when_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#event_trigger_when_item. - visitEvent_trigger_when_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#event_trigger_value_list. - visitEvent_trigger_value_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altereventtrigstmt. - visitAltereventtrigstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#enable_trigger. - visitEnable_trigger(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createassertionstmt. - visitCreateassertionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#definestmt. - visitDefinestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#definition. - visitDefinition(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#def_list. - visitDef_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#def_elem. - visitDef_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#def_arg. - visitDef_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#old_aggr_definition. - visitOld_aggr_definition(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#old_aggr_list. - visitOld_aggr_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#old_aggr_elem. - visitOld_aggr_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_enum_val_list. - visitOpt_enum_val_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#enum_val_list. - visitEnum_val_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterenumstmt. - visitAlterenumstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_if_not_exists. - visitOpt_if_not_exists(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createopclassstmt. - visitCreateopclassstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opclass_item_list. - visitOpclass_item_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opclass_item. - visitOpclass_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_default. - visitOpt_default(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_opfamily. - visitOpt_opfamily(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opclass_purpose. - visitOpclass_purpose(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_recheck. - visitOpt_recheck(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createopfamilystmt. - visitCreateopfamilystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alteropfamilystmt. - visitAlteropfamilystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opclass_drop_list. - visitOpclass_drop_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opclass_drop. - visitOpclass_drop(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropopclassstmt. - visitDropopclassstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropopfamilystmt. - visitDropopfamilystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropownedstmt. - visitDropownedstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reassignownedstmt. - visitReassignownedstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropstmt. - visitDropstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#object_type_any_name. - visitObject_type_any_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#object_type_name. - visitObject_type_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#drop_type_name. - visitDrop_type_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#object_type_name_on_any_name. - visitObject_type_name_on_any_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#any_name_list. - visitAny_name_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#any_name. - visitAny_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#attrs. - visitAttrs(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#type_name_list. - visitType_name_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#truncatestmt. - visitTruncatestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_restart_seqs. - visitOpt_restart_seqs(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#commentstmt. - visitCommentstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#comment_text. - visitComment_text(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#seclabelstmt. - visitSeclabelstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_provider. - visitOpt_provider(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#security_label. - visitSecurity_label(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#fetchstmt. - visitFetchstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#fetch_args. - visitFetch_args(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#from_in. - visitFrom_in(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_from_in. - visitOpt_from_in(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#grantstmt. - visitGrantstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#revokestmt. - visitRevokestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#privileges. - visitPrivileges(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#privilege_list. - visitPrivilege_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#privilege. - visitPrivilege(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#privilege_target. - visitPrivilege_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#grantee_list. - visitGrantee_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#grantee. - visitGrantee(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_grant_grant_option. - visitOpt_grant_grant_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#grantrolestmt. - visitGrantrolestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#revokerolestmt. - visitRevokerolestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_grant_admin_option. - visitOpt_grant_admin_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_granted_by. - visitOpt_granted_by(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterdefaultprivilegesstmt. - visitAlterdefaultprivilegesstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#defacloptionlist. - visitDefacloptionlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#defacloption. - visitDefacloption(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#defaclaction. - visitDefaclaction(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#defacl_privilege_target. - visitDefacl_privilege_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#indexstmt. - visitIndexstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_unique. - visitOpt_unique(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_concurrently. - visitOpt_concurrently(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_index_name. - visitOpt_index_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#access_method_clause. - visitAccess_method_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#index_params. - visitIndex_params(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#index_elem_options. - visitIndex_elem_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#index_elem. - visitIndex_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_include. - visitOpt_include(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#index_including_params. - visitIndex_including_params(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_collate. - visitOpt_collate(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_class. - visitOpt_class(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_asc_desc. - visitOpt_asc_desc(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_nulls_order. - visitOpt_nulls_order(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createfunctionstmt. - visitCreatefunctionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_or_replace. - visitOpt_or_replace(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_args. - visitFunc_args(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_args_list. - visitFunc_args_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#function_with_argtypes_list. - visitFunction_with_argtypes_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#function_with_argtypes. - visitFunction_with_argtypes(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_args_with_defaults. - visitFunc_args_with_defaults(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_args_with_defaults_list. - visitFunc_args_with_defaults_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_arg. - visitFunc_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#arg_class. - visitArg_class(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#param_name. - visitParam_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_return. - visitFunc_return(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_type. - visitFunc_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_arg_with_default. - visitFunc_arg_with_default(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#aggr_arg. - visitAggr_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#aggr_args. - visitAggr_args(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#aggr_args_list. - visitAggr_args_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#aggregate_with_argtypes. - visitAggregate_with_argtypes(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#aggregate_with_argtypes_list. - visitAggregate_with_argtypes_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createfunc_opt_list. - visitCreatefunc_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#common_func_opt_item. - visitCommon_func_opt_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createfunc_opt_item. - visitCreatefunc_opt_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_as. - visitFunc_as(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transform_type_list. - visitTransform_type_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_definition. - visitOpt_definition(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#table_func_column. - visitTable_func_column(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#table_func_column_list. - visitTable_func_column_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterfunctionstmt. - visitAlterfunctionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterfunc_opt_list. - visitAlterfunc_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_restrict. - visitOpt_restrict(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#removefuncstmt. - visitRemovefuncstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#removeaggrstmt. - visitRemoveaggrstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#removeoperstmt. - visitRemoveoperstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#oper_argtypes. - visitOper_argtypes(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#any_operator. - visitAny_operator(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#operator_with_argtypes_list. - visitOperator_with_argtypes_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#operator_with_argtypes. - visitOperator_with_argtypes(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dostmt. - visitDostmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dostmt_opt_list. - visitDostmt_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dostmt_opt_item. - visitDostmt_opt_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createcaststmt. - visitCreatecaststmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#cast_context. - visitCast_context(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropcaststmt. - visitDropcaststmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_if_exists. - visitOpt_if_exists(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createtransformstmt. - visitCreatetransformstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transform_element_list. - visitTransform_element_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#droptransformstmt. - visitDroptransformstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reindexstmt. - visitReindexstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reindex_target_type. - visitReindex_target_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reindex_target_multitable. - visitReindex_target_multitable(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reindex_option_list. - visitReindex_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reindex_option_elem. - visitReindex_option_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altertblspcstmt. - visitAltertblspcstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#renamestmt. - visitRenamestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_column. - visitOpt_column(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_set_data. - visitOpt_set_data(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterobjectdependsstmt. - visitAlterobjectdependsstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_no. - visitOpt_no(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterobjectschemastmt. - visitAlterobjectschemastmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alteroperatorstmt. - visitAlteroperatorstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#operator_def_list. - visitOperator_def_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#operator_def_elem. - visitOperator_def_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#operator_def_arg. - visitOperator_def_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altertypestmt. - visitAltertypestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterownerstmt. - visitAlterownerstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createpublicationstmt. - visitCreatepublicationstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_publication_for_tables. - visitOpt_publication_for_tables(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#publication_for_tables. - visitPublication_for_tables(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterpublicationstmt. - visitAlterpublicationstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createsubscriptionstmt. - visitCreatesubscriptionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#publication_name_list. - visitPublication_name_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#publication_name_item. - visitPublication_name_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altersubscriptionstmt. - visitAltersubscriptionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropsubscriptionstmt. - visitDropsubscriptionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rulestmt. - visitRulestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#ruleactionlist. - visitRuleactionlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#ruleactionmulti. - visitRuleactionmulti(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#ruleactionstmt. - visitRuleactionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#ruleactionstmtOrEmpty. - visitRuleactionstmtOrEmpty(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#event. - visitEvent(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_instead. - visitOpt_instead(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#notifystmt. - visitNotifystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#notify_payload. - visitNotify_payload(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#listenstmt. - visitListenstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#unlistenstmt. - visitUnlistenstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transactionstmt. - visitTransactionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_transaction. - visitOpt_transaction(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transaction_mode_item. - visitTransaction_mode_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transaction_mode_list. - visitTransaction_mode_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#transaction_mode_list_or_empty. - visitTransaction_mode_list_or_empty(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_transaction_chain. - visitOpt_transaction_chain(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#viewstmt. - visitViewstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_check_option. - visitOpt_check_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#loadstmt. - visitLoadstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createdbstmt. - visitCreatedbstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createdb_opt_list. - visitCreatedb_opt_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createdb_opt_items. - visitCreatedb_opt_items(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createdb_opt_item. - visitCreatedb_opt_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createdb_opt_name. - visitCreatedb_opt_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_equal. - visitOpt_equal(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterdatabasestmt. - visitAlterdatabasestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterdatabasesetstmt. - visitAlterdatabasesetstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#dropdbstmt. - visitDropdbstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#drop_option_list. - visitDrop_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#drop_option. - visitDrop_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altercollationstmt. - visitAltercollationstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altersystemstmt. - visitAltersystemstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createdomainstmt. - visitCreatedomainstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alterdomainstmt. - visitAlterdomainstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_as. - visitOpt_as(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altertsdictionarystmt. - visitAltertsdictionarystmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#altertsconfigurationstmt. - visitAltertsconfigurationstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#any_with. - visitAny_with(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#createconversionstmt. - visitCreateconversionstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#clusterstmt. - visitClusterstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#cluster_index_specification. - visitCluster_index_specification(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#vacuumstmt. - visitVacuumstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#analyzestmt. - visitAnalyzestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_list. - visitVac_analyze_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#analyze_keyword. - visitAnalyze_keyword(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_elem. - visitVac_analyze_option_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_name. - visitVac_analyze_option_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_arg. - visitVac_analyze_option_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_analyze. - visitOpt_analyze(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_verbose. - visitOpt_verbose(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_full. - visitOpt_full(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_freeze. - visitOpt_freeze(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_name_list. - visitOpt_name_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#vacuum_relation. - visitVacuum_relation(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#vacuum_relation_list. - visitVacuum_relation_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_vacuum_relation_list. - visitOpt_vacuum_relation_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#explainstmt. - visitExplainstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#explainablestmt. - visitExplainablestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#explain_option_list. - visitExplain_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#explain_option_elem. - visitExplain_option_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#explain_option_name. - visitExplain_option_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#explain_option_arg. - visitExplain_option_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#preparestmt. - visitPreparestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#prep_type_clause. - visitPrep_type_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#preparablestmt. - visitPreparablestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#executestmt. - visitExecutestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#execute_param_clause. - visitExecute_param_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#deallocatestmt. - visitDeallocatestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#insertstmt. - visitInsertstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#insert_target. - visitInsert_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#insert_rest. - visitInsert_rest(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#override_kind. - visitOverride_kind(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#insert_column_list. - visitInsert_column_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#insert_column_item. - visitInsert_column_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_on_conflict. - visitOpt_on_conflict(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_conf_expr. - visitOpt_conf_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#returning_clause. - visitReturning_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#mergestmt. - visitMergestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#merge_insert_clause. - visitMerge_insert_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#merge_update_clause. - visitMerge_update_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#merge_delete_clause. - visitMerge_delete_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#deletestmt. - visitDeletestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#using_clause. - visitUsing_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#lockstmt. - visitLockstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_lock. - visitOpt_lock(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#lock_type. - visitLock_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_nowait. - visitOpt_nowait(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_nowait_or_skip. - visitOpt_nowait_or_skip(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#updatestmt. - visitUpdatestmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#set_clause_list. - visitSet_clause_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#set_clause. - visitSet_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#set_target. - visitSet_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#set_target_list. - visitSet_target_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#declarecursorstmt. - visitDeclarecursorstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#cursor_name. - visitCursor_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#cursor_options. - visitCursor_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_hold. - visitOpt_hold(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#selectstmt. - visitSelectstmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#select_with_parens. - visitSelect_with_parens(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#select_no_parens. - visitSelect_no_parens(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#select_clause. - visitSelect_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#simple_select. - visitSimple_select(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#union. - visitUnion(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#intersect. - visitIntersect(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#except. - visitExcept(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#set_operator_with_all_or_distinct. - visitSet_operator_with_all_or_distinct(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#with_clause. - visitWith_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#cte_list. - visitCte_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#common_table_expr. - visitCommon_table_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_materialized. - visitOpt_materialized(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_with_clause. - visitOpt_with_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#into_clause. - visitInto_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_strict. - visitOpt_strict(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opttempTableName. - visitOpttempTableName(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_table. - visitOpt_table(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#all_or_distinct. - visitAll_or_distinct(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#distinct_clause. - visitDistinct_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_all_clause. - visitOpt_all_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_sort_clause. - visitOpt_sort_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#sort_clause. - visitSort_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#sortby_list. - visitSortby_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#sortby. - visitSortby(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#select_limit. - visitSelect_limit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_select_limit. - visitOpt_select_limit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#limit_clause. - visitLimit_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#offset_clause. - visitOffset_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#select_limit_value. - visitSelect_limit_value(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#select_offset_value. - visitSelect_offset_value(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#select_fetch_first_value. - visitSelect_fetch_first_value(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#i_or_f_const. - visitI_or_f_const(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#row_or_rows. - visitRow_or_rows(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#first_or_next. - visitFirst_or_next(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#group_clause. - visitGroup_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#group_by_list. - visitGroup_by_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#group_by_item. - visitGroup_by_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#empty_grouping_set. - visitEmpty_grouping_set(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rollup_clause. - visitRollup_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#cube_clause. - visitCube_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#grouping_sets_clause. - visitGrouping_sets_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#having_clause. - visitHaving_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#for_locking_clause. - visitFor_locking_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_for_locking_clause. - visitOpt_for_locking_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#for_locking_items. - visitFor_locking_items(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#for_locking_item. - visitFor_locking_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#for_locking_strength. - visitFor_locking_strength(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#locked_rels_list. - visitLocked_rels_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#values_clause. - visitValues_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#from_clause. - visitFrom_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#from_list. - visitFrom_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#non_ansi_join. - visitNon_ansi_join(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#table_ref. - visitTable_ref(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#alias_clause. - visitAlias_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_alias_clause. - visitOpt_alias_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#table_alias_clause. - visitTable_alias_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_alias_clause. - visitFunc_alias_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#join_type. - visitJoin_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#join_qual. - visitJoin_qual(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#relation_expr. - visitRelation_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#relation_expr_list. - visitRelation_expr_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#relation_expr_opt_alias. - visitRelation_expr_opt_alias(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tablesample_clause. - visitTablesample_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_repeatable_clause. - visitOpt_repeatable_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_table. - visitFunc_table(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsfrom_item. - visitRowsfrom_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rowsfrom_list. - visitRowsfrom_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_col_def_list. - visitOpt_col_def_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_ordinality. - visitOpt_ordinality(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#where_clause. - visitWhere_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#where_or_current_clause. - visitWhere_or_current_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opttablefuncelementlist. - visitOpttablefuncelementlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tablefuncelementlist. - visitTablefuncelementlist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#tablefuncelement. - visitTablefuncelement(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xmltable. - visitXmltable(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xmltable_column_list. - visitXmltable_column_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xmltable_column_el. - visitXmltable_column_el(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xmltable_column_option_list. - visitXmltable_column_option_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xmltable_column_option_el. - visitXmltable_column_option_el(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_namespace_list. - visitXml_namespace_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_namespace_el. - visitXml_namespace_el(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#typename. - visitTypename(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_array_bounds. - visitOpt_array_bounds(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#simpletypename. - visitSimpletypename(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#consttypename. - visitConsttypename(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#generictype. - visitGenerictype(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_type_modifiers. - visitOpt_type_modifiers(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#numeric. - visitNumeric(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_float. - visitOpt_float(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#bit. - visitBit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constbit. - visitConstbit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#bitwithlength. - visitBitwithlength(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#bitwithoutlength. - visitBitwithoutlength(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#character. - visitCharacter(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constcharacter. - visitConstcharacter(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#character_c. - visitCharacter_c(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_varying. - visitOpt_varying(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constdatetime. - visitConstdatetime(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#constinterval. - visitConstinterval(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_timezone. - visitOpt_timezone(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_interval. - visitOpt_interval(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#interval_second. - visitInterval_second(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_escape. - visitOpt_escape(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr. - visitA_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_qual. - visitA_expr_qual(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_lessless. - visitA_expr_lessless(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_or. - visitA_expr_or(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_and. - visitA_expr_and(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_between. - visitA_expr_between(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_in. - visitA_expr_in(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_unary_not. - visitA_expr_unary_not(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_isnull. - visitA_expr_isnull(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_is_not. - visitA_expr_is_not(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_compare. - visitA_expr_compare(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_like. - visitA_expr_like(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_qual_op. - visitA_expr_qual_op(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_unary_qualop. - visitA_expr_unary_qualop(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_add. - visitA_expr_add(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_mul. - visitA_expr_mul(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_caret. - visitA_expr_caret(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_unary_sign. - visitA_expr_unary_sign(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_at_time_zone. - visitA_expr_at_time_zone(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_collate. - visitA_expr_collate(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#a_expr_typecast. - visitA_expr_typecast(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#b_expr. - visitB_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#c_expr_exists. - visitC_expr_exists(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#c_expr_expr. - visitC_expr_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#c_expr_case. - visitC_expr_case(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#plsqlvariablename. - visitPlsqlvariablename(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_application. - visitFunc_application(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_expr. - visitFunc_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_expr_windowless. - visitFunc_expr_windowless(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_expr_common_subexpr. - visitFunc_expr_common_subexpr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_root_version. - visitXml_root_version(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_xml_root_standalone. - visitOpt_xml_root_standalone(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_attributes. - visitXml_attributes(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_attribute_list. - visitXml_attribute_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_attribute_el. - visitXml_attribute_el(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#document_or_content. - visitDocument_or_content(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_whitespace_option. - visitXml_whitespace_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xmlexists_argument. - visitXmlexists_argument(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xml_passing_mech. - visitXml_passing_mech(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#within_group_clause. - visitWithin_group_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#filter_clause. - visitFilter_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#window_clause. - visitWindow_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#window_definition_list. - visitWindow_definition_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#window_definition. - visitWindow_definition(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#over_clause. - visitOver_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#window_specification. - visitWindow_specification(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_existing_window_name. - visitOpt_existing_window_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_partition_clause. - visitOpt_partition_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_frame_clause. - visitOpt_frame_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#frame_extent. - visitFrame_extent(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#frame_bound. - visitFrame_bound(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_window_exclusion_clause. - visitOpt_window_exclusion_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#row. - visitRow(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#explicit_row. - visitExplicit_row(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#implicit_row. - visitImplicit_row(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#sub_type. - visitSub_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#all_op. - visitAll_op(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#mathop. - visitMathop(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#qual_op. - visitQual_op(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#qual_all_op. - visitQual_all_op(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#subquery_Op. - visitSubquery_Op(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#expr_list. - visitExpr_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_arg_list. - visitFunc_arg_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_arg_expr. - visitFunc_arg_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#type_list. - visitType_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#array_expr. - visitArray_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#array_expr_list. - visitArray_expr_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#extract_list. - visitExtract_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#extract_arg. - visitExtract_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#unicode_normal_form. - visitUnicode_normal_form(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#overlay_list. - visitOverlay_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#position_list. - visitPosition_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#substr_list. - visitSubstr_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#trim_list. - visitTrim_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#in_expr_select. - visitIn_expr_select(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#in_expr_list. - visitIn_expr_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#case_expr. - visitCase_expr(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#when_clause_list. - visitWhen_clause_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#when_clause. - visitWhen_clause(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#case_default. - visitCase_default(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#case_arg. - visitCase_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#columnref. - visitColumnref(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#indirection_el. - visitIndirection_el(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_slice_bound. - visitOpt_slice_bound(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#indirection. - visitIndirection(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_indirection. - visitOpt_indirection(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_target_list. - visitOpt_target_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#target_list. - visitTarget_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#target_label. - visitTarget_label(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#target_star. - visitTarget_star(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#qualified_name_list. - visitQualified_name_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#qualified_name. - visitQualified_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#name_list. - visitName_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#name. - visitName(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#attr_name. - visitAttr_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#file_name. - visitFile_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#func_name. - visitFunc_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#aexprconst. - visitAexprconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#xconst. - visitXconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#bconst. - visitBconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#fconst. - visitFconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#iconst. - visitIconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#sconst. - visitSconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#anysconst. - visitAnysconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_uescape. - visitOpt_uescape(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#signediconst. - visitSignediconst(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#roleid. - visitRoleid(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#rolespec. - visitRolespec(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#role_list. - visitRole_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#colid. - visitColid(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#table_alias. - visitTable_alias(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#type_function_name. - visitType_function_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#nonreservedword. - visitNonreservedword(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#collabel. - visitCollabel(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#identifier. - visitIdentifier(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#plsqlidentifier. - visitPlsqlidentifier(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#unreserved_keyword. - visitUnreserved_keyword(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#col_name_keyword. - visitCol_name_keyword(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#type_func_name_keyword. - visitType_func_name_keyword(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#reserved_keyword. - visitReserved_keyword(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#builtin_function_name. - visitBuiltin_function_name(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#pl_function. - visitPl_function(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#comp_options. - visitComp_options(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#comp_option. - visitComp_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#sharp. - visitSharp(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#option_value. - visitOption_value(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_semi. - visitOpt_semi(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#pl_block. - visitPl_block(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_sect. - visitDecl_sect(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_start. - visitDecl_start(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_stmts. - visitDecl_stmts(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#label_decl. - visitLabel_decl(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_stmt. - visitDecl_stmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_statement. - visitDecl_statement(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_scrollable. - visitOpt_scrollable(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_cursor_query. - visitDecl_cursor_query(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_cursor_args. - visitDecl_cursor_args(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_cursor_arglist. - visitDecl_cursor_arglist(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_cursor_arg. - visitDecl_cursor_arg(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_is_for. - visitDecl_is_for(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_aliasitem. - visitDecl_aliasitem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_varname. - visitDecl_varname(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_const. - visitDecl_const(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_datatype. - visitDecl_datatype(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_collate. - visitDecl_collate(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_notnull. - visitDecl_notnull(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_defval. - visitDecl_defval(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#decl_defkey. - visitDecl_defkey(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#assign_operator. - visitAssign_operator(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#proc_sect. - visitProc_sect(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#proc_stmt. - visitProc_stmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_perform. - visitStmt_perform(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_call. - visitStmt_call(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_expr_list. - visitOpt_expr_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_assign. - visitStmt_assign(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_getdiag. - visitStmt_getdiag(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#getdiag_area_opt. - visitGetdiag_area_opt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#getdiag_list. - visitGetdiag_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#getdiag_list_item. - visitGetdiag_list_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#getdiag_item. - visitGetdiag_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#getdiag_target. - visitGetdiag_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#assign_var. - visitAssign_var(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_if. - visitStmt_if(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_elsifs. - visitStmt_elsifs(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_else. - visitStmt_else(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_case. - visitStmt_case(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_expr_until_when. - visitOpt_expr_until_when(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#case_when_list. - visitCase_when_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#case_when. - visitCase_when(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_case_else. - visitOpt_case_else(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_loop. - visitStmt_loop(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_while. - visitStmt_while(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_for. - visitStmt_for(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#for_control. - visitFor_control(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_for_using_expression. - visitOpt_for_using_expression(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_cursor_parameters. - visitOpt_cursor_parameters(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_reverse. - visitOpt_reverse(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_by_expression. - visitOpt_by_expression(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#for_variable. - visitFor_variable(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_foreach_a. - visitStmt_foreach_a(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#foreach_slice. - visitForeach_slice(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_exit. - visitStmt_exit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#exit_type. - visitExit_type(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_return. - visitStmt_return(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_return_result. - visitOpt_return_result(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_raise. - visitStmt_raise(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_stmt_raise_level. - visitOpt_stmt_raise_level(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_raise_list. - visitOpt_raise_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_raise_using. - visitOpt_raise_using(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_raise_using_elem. - visitOpt_raise_using_elem(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_raise_using_elem_list. - visitOpt_raise_using_elem_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_assert. - visitStmt_assert(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_stmt_assert_message. - visitOpt_stmt_assert_message(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#loop_body. - visitLoop_body(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_execsql. - visitStmt_execsql(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_dynexecute. - visitStmt_dynexecute(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_execute_using. - visitOpt_execute_using(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_execute_using_list. - visitOpt_execute_using_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_execute_into. - visitOpt_execute_into(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_open. - visitStmt_open(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_open_bound_list_item. - visitOpt_open_bound_list_item(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_open_bound_list. - visitOpt_open_bound_list(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_open_using. - visitOpt_open_using(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_scroll_option. - visitOpt_scroll_option(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_scroll_option_no. - visitOpt_scroll_option_no(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_fetch. - visitStmt_fetch(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#into_target. - visitInto_target(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_cursor_from. - visitOpt_cursor_from(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_fetch_direction. - visitOpt_fetch_direction(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_move. - visitStmt_move(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_close. - visitStmt_close(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_null. - visitStmt_null(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_commit. - visitStmt_commit(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_rollback. - visitStmt_rollback(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#plsql_opt_transaction_chain. - visitPlsql_opt_transaction_chain(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#stmt_set. - visitStmt_set(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#cursor_variable. - visitCursor_variable(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#exception_sect. - visitException_sect(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#proc_exceptions. - visitProc_exceptions(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#proc_exception. - visitProc_exception(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#proc_conditions. - visitProc_conditions(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#proc_condition. - visitProc_condition(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_block_label. - visitOpt_block_label(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_loop_label. - visitOpt_loop_label(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_label. - visitOpt_label(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_exitcond. - visitOpt_exitcond(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#any_identifier. - visitAny_identifier(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#plsql_unreserved_keyword. - visitPlsql_unreserved_keyword(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#sql_expression. - visitSql_expression(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#expr_until_then. - visitExpr_until_then(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#expr_until_semi. - visitExpr_until_semi(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#expr_until_rightbracket. - visitExpr_until_rightbracket(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#expr_until_loop. - visitExpr_until_loop(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#make_execsql_stmt. - visitMake_execsql_stmt(ctx) { - return this.visitChildren(ctx); - } - - - // Visit a parse tree produced by PostgreSQLParser#opt_returning_clause_into. - visitOpt_returning_clause_into(ctx) { - return this.visitChildren(ctx); - } - - - +// Generated from PostgreSQLParser.g4 by ANTLR 4.13.2 +// jshint ignore: start +import antlr4 from 'antlr4'; + +// This class defines a complete generic visitor for a parse tree produced by PostgreSQLParser. + +export default class PostgreSQLParserVisitor extends antlr4.tree.ParseTreeVisitor { + + // Visit a parse tree produced by PostgreSQLParser#root. + visitRoot(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#plsqlroot. + visitPlsqlroot(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmtblock. + visitStmtblock(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmtmulti. + visitStmtmulti(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt. + visitStmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#plsqlconsolecommand. + visitPlsqlconsolecommand(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#callstmt. + visitCallstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createrolestmt. + visitCreaterolestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_with. + visitOpt_with(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optrolelist. + visitOptrolelist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alteroptrolelist. + visitAlteroptrolelist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alteroptroleelem. + visitAlteroptroleelem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createoptroleelem. + visitCreateoptroleelem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createuserstmt. + visitCreateuserstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterrolestmt. + visitAlterrolestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_in_database. + visitOpt_in_database(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterrolesetstmt. + visitAlterrolesetstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#droprolestmt. + visitDroprolestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#creategroupstmt. + visitCreategroupstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altergroupstmt. + visitAltergroupstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#add_drop. + visitAdd_drop(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createschemastmt. + visitCreateschemastmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optschemaname. + visitOptschemaname(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optschemaeltlist. + visitOptschemaeltlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#schema_stmt. + visitSchema_stmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#variablesetstmt. + visitVariablesetstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#set_rest. + visitSet_rest(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generic_set. + visitGeneric_set(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#set_rest_more. + visitSet_rest_more(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#var_name. + visitVar_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#var_list. + visitVar_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#var_value. + visitVar_value(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#iso_level. + visitIso_level(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_boolean_or_string. + visitOpt_boolean_or_string(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#zone_value. + visitZone_value(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_encoding. + visitOpt_encoding(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#nonreservedword_or_sconst. + visitNonreservedword_or_sconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#variableresetstmt. + visitVariableresetstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reset_rest. + visitReset_rest(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generic_reset. + visitGeneric_reset(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#setresetclause. + visitSetresetclause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#functionsetresetclause. + visitFunctionsetresetclause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#variableshowstmt. + visitVariableshowstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constraintssetstmt. + visitConstraintssetstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constraints_set_list. + visitConstraints_set_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constraints_set_mode. + visitConstraints_set_mode(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#checkpointstmt. + visitCheckpointstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#discardstmt. + visitDiscardstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altertablestmt. + visitAltertablestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_table_cmds. + visitAlter_table_cmds(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#partition_cmd. + visitPartition_cmd(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#index_partition_cmd. + visitIndex_partition_cmd(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_table_cmd. + visitAlter_table_cmd(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_column_default. + visitAlter_column_default(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_drop_behavior. + visitOpt_drop_behavior(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_collate_clause. + visitOpt_collate_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_using. + visitAlter_using(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#replica_identity. + visitReplica_identity(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reloptions. + visitReloptions(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_reloptions. + visitOpt_reloptions(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reloption_list. + visitReloption_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reloption_elem. + visitReloption_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_identity_column_option_list. + visitAlter_identity_column_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_identity_column_option. + visitAlter_identity_column_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#partitionboundspec. + visitPartitionboundspec(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#hash_partbound_elem. + visitHash_partbound_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#hash_partbound. + visitHash_partbound(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altercompositetypestmt. + visitAltercompositetypestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_type_cmds. + visitAlter_type_cmds(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_type_cmd. + visitAlter_type_cmd(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#closeportalstmt. + visitCloseportalstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copystmt. + visitCopystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_from. + visitCopy_from(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_program. + visitOpt_program(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_file_name. + visitCopy_file_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_options. + visitCopy_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_opt_list. + visitCopy_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_opt_item. + visitCopy_opt_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_binary. + visitOpt_binary(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_delimiter. + visitCopy_delimiter(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_using. + visitOpt_using(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_list. + visitCopy_generic_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_elem. + visitCopy_generic_opt_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_arg. + visitCopy_generic_opt_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_arg_list. + visitCopy_generic_opt_arg_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#copy_generic_opt_arg_list_item. + visitCopy_generic_opt_arg_list_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createstmt. + visitCreatestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opttemp. + visitOpttemp(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opttableelementlist. + visitOpttableelementlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opttypedtableelementlist. + visitOpttypedtableelementlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tableelementlist. + visitTableelementlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#typedtableelementlist. + visitTypedtableelementlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tableelement. + visitTableelement(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#typedtableelement. + visitTypedtableelement(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#columnDef. + visitColumnDef(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#columnOptions. + visitColumnOptions(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#colquallist. + visitColquallist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#colconstraint. + visitColconstraint(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#colconstraintelem. + visitColconstraintelem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generated_when. + visitGenerated_when(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constraintattr. + visitConstraintattr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tablelikeclause. + visitTablelikeclause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tablelikeoptionlist. + visitTablelikeoptionlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tablelikeoption. + visitTablelikeoption(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tableconstraint. + visitTableconstraint(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constraintelem. + visitConstraintelem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_no_inherit. + visitOpt_no_inherit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_column_list. + visitOpt_column_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#columnlist. + visitColumnlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#columnElem. + visitColumnElem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_c_include. + visitOpt_c_include(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#key_match. + visitKey_match(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#exclusionconstraintlist. + visitExclusionconstraintlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#exclusionconstraintelem. + visitExclusionconstraintelem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#exclusionwhereclause. + visitExclusionwhereclause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#key_actions. + visitKey_actions(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#key_update. + visitKey_update(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#key_delete. + visitKey_delete(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#key_action. + visitKey_action(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optinherit. + visitOptinherit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optpartitionspec. + visitOptpartitionspec(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#partitionspec. + visitPartitionspec(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#part_params. + visitPart_params(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#part_elem. + visitPart_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#table_access_method_clause. + visitTable_access_method_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optwith. + visitOptwith(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#oncommitoption. + visitOncommitoption(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opttablespace. + visitOpttablespace(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optconstablespace. + visitOptconstablespace(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#existingindex. + visitExistingindex(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createstatsstmt. + visitCreatestatsstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterstatsstmt. + visitAlterstatsstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createasstmt. + visitCreateasstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#create_as_target. + visitCreate_as_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_with_data. + visitOpt_with_data(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#creatematviewstmt. + visitCreatematviewstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#create_mv_target. + visitCreate_mv_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optnolog. + visitOptnolog(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#refreshmatviewstmt. + visitRefreshmatviewstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createseqstmt. + visitCreateseqstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterseqstmt. + visitAlterseqstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optseqoptlist. + visitOptseqoptlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optparenthesizedseqoptlist. + visitOptparenthesizedseqoptlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#seqoptlist. + visitSeqoptlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#seqoptelem. + visitSeqoptelem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_by. + visitOpt_by(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#numericonly. + visitNumericonly(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#numericonly_list. + visitNumericonly_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createplangstmt. + visitCreateplangstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_trusted. + visitOpt_trusted(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#handler_name. + visitHandler_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_inline_handler. + visitOpt_inline_handler(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#validator_clause. + visitValidator_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_validator. + visitOpt_validator(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_procedural. + visitOpt_procedural(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createtablespacestmt. + visitCreatetablespacestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opttablespaceowner. + visitOpttablespaceowner(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#droptablespacestmt. + visitDroptablespacestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createextensionstmt. + visitCreateextensionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#create_extension_opt_list. + visitCreate_extension_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#create_extension_opt_item. + visitCreate_extension_opt_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterextensionstmt. + visitAlterextensionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_extension_opt_list. + visitAlter_extension_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_extension_opt_item. + visitAlter_extension_opt_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterextensioncontentsstmt. + visitAlterextensioncontentsstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createfdwstmt. + visitCreatefdwstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#fdw_option. + visitFdw_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#fdw_options. + visitFdw_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_fdw_options. + visitOpt_fdw_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterfdwstmt. + visitAlterfdwstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#create_generic_options. + visitCreate_generic_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generic_option_list. + visitGeneric_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_generic_options. + visitAlter_generic_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_generic_option_list. + visitAlter_generic_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alter_generic_option_elem. + visitAlter_generic_option_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generic_option_elem. + visitGeneric_option_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generic_option_name. + visitGeneric_option_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generic_option_arg. + visitGeneric_option_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createforeignserverstmt. + visitCreateforeignserverstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_type. + visitOpt_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#foreign_server_version. + visitForeign_server_version(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_foreign_server_version. + visitOpt_foreign_server_version(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterforeignserverstmt. + visitAlterforeignserverstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createforeigntablestmt. + visitCreateforeigntablestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#importforeignschemastmt. + visitImportforeignschemastmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#import_qualification_type. + visitImport_qualification_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#import_qualification. + visitImport_qualification(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createusermappingstmt. + visitCreateusermappingstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#auth_ident. + visitAuth_ident(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropusermappingstmt. + visitDropusermappingstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterusermappingstmt. + visitAlterusermappingstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createpolicystmt. + visitCreatepolicystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterpolicystmt. + visitAlterpolicystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsecurityoptionalexpr. + visitRowsecurityoptionalexpr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsecurityoptionalwithcheck. + visitRowsecurityoptionalwithcheck(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsecuritydefaulttorole. + visitRowsecuritydefaulttorole(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsecurityoptionaltorole. + visitRowsecurityoptionaltorole(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsecuritydefaultpermissive. + visitRowsecuritydefaultpermissive(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsecuritydefaultforcmd. + visitRowsecuritydefaultforcmd(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#row_security_cmd. + visitRow_security_cmd(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createamstmt. + visitCreateamstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#am_type. + visitAm_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createtrigstmt. + visitCreatetrigstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggeractiontime. + visitTriggeractiontime(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerevents. + visitTriggerevents(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggeroneevent. + visitTriggeroneevent(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerreferencing. + visitTriggerreferencing(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggertransitions. + visitTriggertransitions(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggertransition. + visitTriggertransition(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transitionoldornew. + visitTransitionoldornew(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transitionrowortable. + visitTransitionrowortable(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transitionrelname. + visitTransitionrelname(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerforspec. + visitTriggerforspec(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerforopteach. + visitTriggerforopteach(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerfortype. + visitTriggerfortype(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerwhen. + visitTriggerwhen(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#function_or_procedure. + visitFunction_or_procedure(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerfuncargs. + visitTriggerfuncargs(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#triggerfuncarg. + visitTriggerfuncarg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#optconstrfromtable. + visitOptconstrfromtable(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constraintattributespec. + visitConstraintattributespec(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constraintattributeElem. + visitConstraintattributeElem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createeventtrigstmt. + visitCreateeventtrigstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#event_trigger_when_list. + visitEvent_trigger_when_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#event_trigger_when_item. + visitEvent_trigger_when_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#event_trigger_value_list. + visitEvent_trigger_value_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altereventtrigstmt. + visitAltereventtrigstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#enable_trigger. + visitEnable_trigger(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createassertionstmt. + visitCreateassertionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#definestmt. + visitDefinestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#definition. + visitDefinition(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#def_list. + visitDef_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#def_elem. + visitDef_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#def_arg. + visitDef_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#old_aggr_definition. + visitOld_aggr_definition(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#old_aggr_list. + visitOld_aggr_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#old_aggr_elem. + visitOld_aggr_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_enum_val_list. + visitOpt_enum_val_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#enum_val_list. + visitEnum_val_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterenumstmt. + visitAlterenumstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_if_not_exists. + visitOpt_if_not_exists(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createopclassstmt. + visitCreateopclassstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opclass_item_list. + visitOpclass_item_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opclass_item. + visitOpclass_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_default. + visitOpt_default(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_opfamily. + visitOpt_opfamily(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opclass_purpose. + visitOpclass_purpose(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_recheck. + visitOpt_recheck(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createopfamilystmt. + visitCreateopfamilystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alteropfamilystmt. + visitAlteropfamilystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opclass_drop_list. + visitOpclass_drop_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opclass_drop. + visitOpclass_drop(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropopclassstmt. + visitDropopclassstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropopfamilystmt. + visitDropopfamilystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropownedstmt. + visitDropownedstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reassignownedstmt. + visitReassignownedstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropstmt. + visitDropstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#object_type_any_name. + visitObject_type_any_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#object_type_name. + visitObject_type_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#drop_type_name. + visitDrop_type_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#object_type_name_on_any_name. + visitObject_type_name_on_any_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#any_name_list. + visitAny_name_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#any_name. + visitAny_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#attrs. + visitAttrs(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#type_name_list. + visitType_name_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#truncatestmt. + visitTruncatestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_restart_seqs. + visitOpt_restart_seqs(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#commentstmt. + visitCommentstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#comment_text. + visitComment_text(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#seclabelstmt. + visitSeclabelstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_provider. + visitOpt_provider(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#security_label. + visitSecurity_label(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#fetchstmt. + visitFetchstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#fetch_args. + visitFetch_args(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#from_in. + visitFrom_in(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_from_in. + visitOpt_from_in(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#grantstmt. + visitGrantstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#revokestmt. + visitRevokestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#privileges. + visitPrivileges(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#privilege_list. + visitPrivilege_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#privilege. + visitPrivilege(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#privilege_target. + visitPrivilege_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#grantee_list. + visitGrantee_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#grantee. + visitGrantee(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_grant_grant_option. + visitOpt_grant_grant_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#grantrolestmt. + visitGrantrolestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#revokerolestmt. + visitRevokerolestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_grant_admin_option. + visitOpt_grant_admin_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_granted_by. + visitOpt_granted_by(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterdefaultprivilegesstmt. + visitAlterdefaultprivilegesstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#defacloptionlist. + visitDefacloptionlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#defacloption. + visitDefacloption(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#defaclaction. + visitDefaclaction(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#defacl_privilege_target. + visitDefacl_privilege_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#indexstmt. + visitIndexstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_unique. + visitOpt_unique(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_concurrently. + visitOpt_concurrently(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_index_name. + visitOpt_index_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#access_method_clause. + visitAccess_method_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#index_params. + visitIndex_params(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#index_elem_options. + visitIndex_elem_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#index_elem. + visitIndex_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_include. + visitOpt_include(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#index_including_params. + visitIndex_including_params(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_collate. + visitOpt_collate(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_class. + visitOpt_class(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_asc_desc. + visitOpt_asc_desc(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_nulls_order. + visitOpt_nulls_order(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createfunctionstmt. + visitCreatefunctionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_or_replace. + visitOpt_or_replace(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_args. + visitFunc_args(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_args_list. + visitFunc_args_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#function_with_argtypes_list. + visitFunction_with_argtypes_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#function_with_argtypes. + visitFunction_with_argtypes(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_args_with_defaults. + visitFunc_args_with_defaults(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_args_with_defaults_list. + visitFunc_args_with_defaults_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_arg. + visitFunc_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#arg_class. + visitArg_class(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#param_name. + visitParam_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_return. + visitFunc_return(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_type. + visitFunc_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_arg_with_default. + visitFunc_arg_with_default(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#aggr_arg. + visitAggr_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#aggr_args. + visitAggr_args(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#aggr_args_list. + visitAggr_args_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#aggregate_with_argtypes. + visitAggregate_with_argtypes(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#aggregate_with_argtypes_list. + visitAggregate_with_argtypes_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createfunc_opt_list. + visitCreatefunc_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#common_func_opt_item. + visitCommon_func_opt_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createfunc_opt_item. + visitCreatefunc_opt_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_as. + visitFunc_as(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transform_type_list. + visitTransform_type_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_definition. + visitOpt_definition(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#table_func_column. + visitTable_func_column(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#table_func_column_list. + visitTable_func_column_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterfunctionstmt. + visitAlterfunctionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterfunc_opt_list. + visitAlterfunc_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_restrict. + visitOpt_restrict(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#removefuncstmt. + visitRemovefuncstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#removeaggrstmt. + visitRemoveaggrstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#removeoperstmt. + visitRemoveoperstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#oper_argtypes. + visitOper_argtypes(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#any_operator. + visitAny_operator(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#operator_with_argtypes_list. + visitOperator_with_argtypes_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#operator_with_argtypes. + visitOperator_with_argtypes(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dostmt. + visitDostmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dostmt_opt_list. + visitDostmt_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dostmt_opt_item. + visitDostmt_opt_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createcaststmt. + visitCreatecaststmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#cast_context. + visitCast_context(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropcaststmt. + visitDropcaststmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_if_exists. + visitOpt_if_exists(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createtransformstmt. + visitCreatetransformstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transform_element_list. + visitTransform_element_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#droptransformstmt. + visitDroptransformstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reindexstmt. + visitReindexstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reindex_target_type. + visitReindex_target_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reindex_target_multitable. + visitReindex_target_multitable(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reindex_option_list. + visitReindex_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reindex_option_elem. + visitReindex_option_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altertblspcstmt. + visitAltertblspcstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#renamestmt. + visitRenamestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_column. + visitOpt_column(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_set_data. + visitOpt_set_data(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterobjectdependsstmt. + visitAlterobjectdependsstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_no. + visitOpt_no(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterobjectschemastmt. + visitAlterobjectschemastmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alteroperatorstmt. + visitAlteroperatorstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#operator_def_list. + visitOperator_def_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#operator_def_elem. + visitOperator_def_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#operator_def_arg. + visitOperator_def_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altertypestmt. + visitAltertypestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterownerstmt. + visitAlterownerstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createpublicationstmt. + visitCreatepublicationstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_publication_for_tables. + visitOpt_publication_for_tables(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#publication_for_tables. + visitPublication_for_tables(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterpublicationstmt. + visitAlterpublicationstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createsubscriptionstmt. + visitCreatesubscriptionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#publication_name_list. + visitPublication_name_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#publication_name_item. + visitPublication_name_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altersubscriptionstmt. + visitAltersubscriptionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropsubscriptionstmt. + visitDropsubscriptionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rulestmt. + visitRulestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#ruleactionlist. + visitRuleactionlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#ruleactionmulti. + visitRuleactionmulti(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#ruleactionstmt. + visitRuleactionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#ruleactionstmtOrEmpty. + visitRuleactionstmtOrEmpty(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#event. + visitEvent(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_instead. + visitOpt_instead(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#notifystmt. + visitNotifystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#notify_payload. + visitNotify_payload(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#listenstmt. + visitListenstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#unlistenstmt. + visitUnlistenstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transactionstmt. + visitTransactionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_transaction. + visitOpt_transaction(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transaction_mode_item. + visitTransaction_mode_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transaction_mode_list. + visitTransaction_mode_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#transaction_mode_list_or_empty. + visitTransaction_mode_list_or_empty(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_transaction_chain. + visitOpt_transaction_chain(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#viewstmt. + visitViewstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_check_option. + visitOpt_check_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#loadstmt. + visitLoadstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createdbstmt. + visitCreatedbstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createdb_opt_list. + visitCreatedb_opt_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createdb_opt_items. + visitCreatedb_opt_items(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createdb_opt_item. + visitCreatedb_opt_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createdb_opt_name. + visitCreatedb_opt_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_equal. + visitOpt_equal(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterdatabasestmt. + visitAlterdatabasestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterdatabasesetstmt. + visitAlterdatabasesetstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#dropdbstmt. + visitDropdbstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#drop_option_list. + visitDrop_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#drop_option. + visitDrop_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altercollationstmt. + visitAltercollationstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altersystemstmt. + visitAltersystemstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createdomainstmt. + visitCreatedomainstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alterdomainstmt. + visitAlterdomainstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_as. + visitOpt_as(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altertsdictionarystmt. + visitAltertsdictionarystmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#altertsconfigurationstmt. + visitAltertsconfigurationstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#any_with. + visitAny_with(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#createconversionstmt. + visitCreateconversionstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#clusterstmt. + visitClusterstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#cluster_index_specification. + visitCluster_index_specification(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#vacuumstmt. + visitVacuumstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#analyzestmt. + visitAnalyzestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_list. + visitVac_analyze_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#analyze_keyword. + visitAnalyze_keyword(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_elem. + visitVac_analyze_option_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_name. + visitVac_analyze_option_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#vac_analyze_option_arg. + visitVac_analyze_option_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_analyze. + visitOpt_analyze(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_verbose. + visitOpt_verbose(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_full. + visitOpt_full(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_freeze. + visitOpt_freeze(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_name_list. + visitOpt_name_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#vacuum_relation. + visitVacuum_relation(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#vacuum_relation_list. + visitVacuum_relation_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_vacuum_relation_list. + visitOpt_vacuum_relation_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#explainstmt. + visitExplainstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#explainablestmt. + visitExplainablestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#explain_option_list. + visitExplain_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#explain_option_elem. + visitExplain_option_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#explain_option_name. + visitExplain_option_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#explain_option_arg. + visitExplain_option_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#preparestmt. + visitPreparestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#prep_type_clause. + visitPrep_type_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#preparablestmt. + visitPreparablestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#executestmt. + visitExecutestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#execute_param_clause. + visitExecute_param_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#deallocatestmt. + visitDeallocatestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#insertstmt. + visitInsertstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#insert_target. + visitInsert_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#insert_rest. + visitInsert_rest(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#override_kind. + visitOverride_kind(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#insert_column_list. + visitInsert_column_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#insert_column_item. + visitInsert_column_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_on_conflict. + visitOpt_on_conflict(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_conf_expr. + visitOpt_conf_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#returning_clause. + visitReturning_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#mergestmt. + visitMergestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#merge_insert_clause. + visitMerge_insert_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#merge_update_clause. + visitMerge_update_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#merge_delete_clause. + visitMerge_delete_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#deletestmt. + visitDeletestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#using_clause. + visitUsing_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#lockstmt. + visitLockstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_lock. + visitOpt_lock(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#lock_type. + visitLock_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_nowait. + visitOpt_nowait(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_nowait_or_skip. + visitOpt_nowait_or_skip(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#updatestmt. + visitUpdatestmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#set_clause_list. + visitSet_clause_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#set_clause. + visitSet_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#set_target. + visitSet_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#set_target_list. + visitSet_target_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#declarecursorstmt. + visitDeclarecursorstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#cursor_name. + visitCursor_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#cursor_options. + visitCursor_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_hold. + visitOpt_hold(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#selectstmt. + visitSelectstmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#select_with_parens. + visitSelect_with_parens(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#select_no_parens. + visitSelect_no_parens(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#select_clause. + visitSelect_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#simple_select. + visitSimple_select(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#union. + visitUnion(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#intersect. + visitIntersect(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#except. + visitExcept(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#set_operator_with_all_or_distinct. + visitSet_operator_with_all_or_distinct(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#with_clause. + visitWith_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#cte_list. + visitCte_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#common_table_expr. + visitCommon_table_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_materialized. + visitOpt_materialized(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_with_clause. + visitOpt_with_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#into_clause. + visitInto_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_strict. + visitOpt_strict(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opttempTableName. + visitOpttempTableName(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_table. + visitOpt_table(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#all_or_distinct. + visitAll_or_distinct(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#distinct_clause. + visitDistinct_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_all_clause. + visitOpt_all_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_sort_clause. + visitOpt_sort_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#sort_clause. + visitSort_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#sortby_list. + visitSortby_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#sortby. + visitSortby(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#select_limit. + visitSelect_limit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_select_limit. + visitOpt_select_limit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#limit_clause. + visitLimit_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#offset_clause. + visitOffset_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#select_limit_value. + visitSelect_limit_value(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#select_offset_value. + visitSelect_offset_value(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#select_fetch_first_value. + visitSelect_fetch_first_value(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#i_or_f_const. + visitI_or_f_const(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#row_or_rows. + visitRow_or_rows(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#first_or_next. + visitFirst_or_next(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#group_clause. + visitGroup_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#group_by_list. + visitGroup_by_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#group_by_item. + visitGroup_by_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#empty_grouping_set. + visitEmpty_grouping_set(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rollup_clause. + visitRollup_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#cube_clause. + visitCube_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#grouping_sets_clause. + visitGrouping_sets_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#having_clause. + visitHaving_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#for_locking_clause. + visitFor_locking_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_for_locking_clause. + visitOpt_for_locking_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#for_locking_items. + visitFor_locking_items(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#for_locking_item. + visitFor_locking_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#for_locking_strength. + visitFor_locking_strength(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#locked_rels_list. + visitLocked_rels_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#values_clause. + visitValues_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#from_clause. + visitFrom_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#from_list. + visitFrom_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#non_ansi_join. + visitNon_ansi_join(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#table_ref. + visitTable_ref(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#alias_clause. + visitAlias_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_alias_clause. + visitOpt_alias_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#table_alias_clause. + visitTable_alias_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_alias_clause. + visitFunc_alias_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#join_type. + visitJoin_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#join_qual. + visitJoin_qual(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#relation_expr. + visitRelation_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#relation_expr_list. + visitRelation_expr_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#relation_expr_opt_alias. + visitRelation_expr_opt_alias(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tablesample_clause. + visitTablesample_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_repeatable_clause. + visitOpt_repeatable_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_table. + visitFunc_table(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsfrom_item. + visitRowsfrom_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rowsfrom_list. + visitRowsfrom_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_col_def_list. + visitOpt_col_def_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_ordinality. + visitOpt_ordinality(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#where_clause. + visitWhere_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#where_or_current_clause. + visitWhere_or_current_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opttablefuncelementlist. + visitOpttablefuncelementlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tablefuncelementlist. + visitTablefuncelementlist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#tablefuncelement. + visitTablefuncelement(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xmltable. + visitXmltable(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xmltable_column_list. + visitXmltable_column_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xmltable_column_el. + visitXmltable_column_el(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xmltable_column_option_list. + visitXmltable_column_option_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xmltable_column_option_el. + visitXmltable_column_option_el(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_namespace_list. + visitXml_namespace_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_namespace_el. + visitXml_namespace_el(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#typename. + visitTypename(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_array_bounds. + visitOpt_array_bounds(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#simpletypename. + visitSimpletypename(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#consttypename. + visitConsttypename(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#generictype. + visitGenerictype(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_type_modifiers. + visitOpt_type_modifiers(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#numeric. + visitNumeric(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_float. + visitOpt_float(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#bit. + visitBit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constbit. + visitConstbit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#bitwithlength. + visitBitwithlength(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#bitwithoutlength. + visitBitwithoutlength(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#character. + visitCharacter(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constcharacter. + visitConstcharacter(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#character_c. + visitCharacter_c(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_varying. + visitOpt_varying(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constdatetime. + visitConstdatetime(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#constinterval. + visitConstinterval(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_timezone. + visitOpt_timezone(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_interval. + visitOpt_interval(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#interval_second. + visitInterval_second(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_escape. + visitOpt_escape(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr. + visitA_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_qual. + visitA_expr_qual(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_lessless. + visitA_expr_lessless(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_or. + visitA_expr_or(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_and. + visitA_expr_and(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_between. + visitA_expr_between(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_in. + visitA_expr_in(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_unary_not. + visitA_expr_unary_not(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_isnull. + visitA_expr_isnull(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_is_not. + visitA_expr_is_not(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_compare. + visitA_expr_compare(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_like. + visitA_expr_like(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_qual_op. + visitA_expr_qual_op(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_unary_qualop. + visitA_expr_unary_qualop(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_add. + visitA_expr_add(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_mul. + visitA_expr_mul(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_caret. + visitA_expr_caret(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_unary_sign. + visitA_expr_unary_sign(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_at_time_zone. + visitA_expr_at_time_zone(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_collate. + visitA_expr_collate(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#a_expr_typecast. + visitA_expr_typecast(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#b_expr. + visitB_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#c_expr_exists. + visitC_expr_exists(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#c_expr_expr. + visitC_expr_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#c_expr_case. + visitC_expr_case(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#plsqlvariablename. + visitPlsqlvariablename(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_application. + visitFunc_application(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_expr. + visitFunc_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_expr_windowless. + visitFunc_expr_windowless(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_expr_common_subexpr. + visitFunc_expr_common_subexpr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_root_version. + visitXml_root_version(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_xml_root_standalone. + visitOpt_xml_root_standalone(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_attributes. + visitXml_attributes(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_attribute_list. + visitXml_attribute_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_attribute_el. + visitXml_attribute_el(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#document_or_content. + visitDocument_or_content(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_whitespace_option. + visitXml_whitespace_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xmlexists_argument. + visitXmlexists_argument(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xml_passing_mech. + visitXml_passing_mech(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#within_group_clause. + visitWithin_group_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#filter_clause. + visitFilter_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#window_clause. + visitWindow_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#window_definition_list. + visitWindow_definition_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#window_definition. + visitWindow_definition(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#over_clause. + visitOver_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#window_specification. + visitWindow_specification(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_existing_window_name. + visitOpt_existing_window_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_partition_clause. + visitOpt_partition_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_frame_clause. + visitOpt_frame_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#frame_extent. + visitFrame_extent(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#frame_bound. + visitFrame_bound(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_window_exclusion_clause. + visitOpt_window_exclusion_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#row. + visitRow(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#explicit_row. + visitExplicit_row(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#implicit_row. + visitImplicit_row(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#sub_type. + visitSub_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#all_op. + visitAll_op(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#mathop. + visitMathop(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#qual_op. + visitQual_op(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#qual_all_op. + visitQual_all_op(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#subquery_Op. + visitSubquery_Op(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#expr_list. + visitExpr_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_arg_list. + visitFunc_arg_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_arg_expr. + visitFunc_arg_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#type_list. + visitType_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#array_expr. + visitArray_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#array_expr_list. + visitArray_expr_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#extract_list. + visitExtract_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#extract_arg. + visitExtract_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#unicode_normal_form. + visitUnicode_normal_form(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#overlay_list. + visitOverlay_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#position_list. + visitPosition_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#substr_list. + visitSubstr_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#trim_list. + visitTrim_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#in_expr_select. + visitIn_expr_select(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#in_expr_list. + visitIn_expr_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#case_expr. + visitCase_expr(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#when_clause_list. + visitWhen_clause_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#when_clause. + visitWhen_clause(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#case_default. + visitCase_default(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#case_arg. + visitCase_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#columnref. + visitColumnref(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#indirection_el. + visitIndirection_el(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_slice_bound. + visitOpt_slice_bound(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#indirection. + visitIndirection(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_indirection. + visitOpt_indirection(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_target_list. + visitOpt_target_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#target_list. + visitTarget_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#target_label. + visitTarget_label(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#target_star. + visitTarget_star(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#qualified_name_list. + visitQualified_name_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#qualified_name. + visitQualified_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#name_list. + visitName_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#name. + visitName(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#attr_name. + visitAttr_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#file_name. + visitFile_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#func_name. + visitFunc_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#aexprconst. + visitAexprconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#xconst. + visitXconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#bconst. + visitBconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#fconst. + visitFconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#iconst. + visitIconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#sconst. + visitSconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#anysconst. + visitAnysconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_uescape. + visitOpt_uescape(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#signediconst. + visitSignediconst(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#roleid. + visitRoleid(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#rolespec. + visitRolespec(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#role_list. + visitRole_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#colid. + visitColid(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#table_alias. + visitTable_alias(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#type_function_name. + visitType_function_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#nonreservedword. + visitNonreservedword(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#collabel. + visitCollabel(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#identifier. + visitIdentifier(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#plsqlidentifier. + visitPlsqlidentifier(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#unreserved_keyword. + visitUnreserved_keyword(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#col_name_keyword. + visitCol_name_keyword(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#type_func_name_keyword. + visitType_func_name_keyword(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#reserved_keyword. + visitReserved_keyword(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#builtin_function_name. + visitBuiltin_function_name(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#pl_function. + visitPl_function(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#comp_options. + visitComp_options(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#comp_option. + visitComp_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#sharp. + visitSharp(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#option_value. + visitOption_value(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_semi. + visitOpt_semi(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#pl_block. + visitPl_block(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_sect. + visitDecl_sect(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_start. + visitDecl_start(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_stmts. + visitDecl_stmts(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#label_decl. + visitLabel_decl(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_stmt. + visitDecl_stmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_statement. + visitDecl_statement(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_scrollable. + visitOpt_scrollable(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_cursor_query. + visitDecl_cursor_query(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_cursor_args. + visitDecl_cursor_args(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_cursor_arglist. + visitDecl_cursor_arglist(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_cursor_arg. + visitDecl_cursor_arg(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_is_for. + visitDecl_is_for(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_aliasitem. + visitDecl_aliasitem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_varname. + visitDecl_varname(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_const. + visitDecl_const(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_datatype. + visitDecl_datatype(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_collate. + visitDecl_collate(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_notnull. + visitDecl_notnull(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_defval. + visitDecl_defval(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#decl_defkey. + visitDecl_defkey(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#assign_operator. + visitAssign_operator(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#proc_sect. + visitProc_sect(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#proc_stmt. + visitProc_stmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_perform. + visitStmt_perform(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_call. + visitStmt_call(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_expr_list. + visitOpt_expr_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_assign. + visitStmt_assign(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_getdiag. + visitStmt_getdiag(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#getdiag_area_opt. + visitGetdiag_area_opt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#getdiag_list. + visitGetdiag_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#getdiag_list_item. + visitGetdiag_list_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#getdiag_item. + visitGetdiag_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#getdiag_target. + visitGetdiag_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#assign_var. + visitAssign_var(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_if. + visitStmt_if(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_elsifs. + visitStmt_elsifs(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_else. + visitStmt_else(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_case. + visitStmt_case(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_expr_until_when. + visitOpt_expr_until_when(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#case_when_list. + visitCase_when_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#case_when. + visitCase_when(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_case_else. + visitOpt_case_else(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_loop. + visitStmt_loop(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_while. + visitStmt_while(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_for. + visitStmt_for(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#for_control. + visitFor_control(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_for_using_expression. + visitOpt_for_using_expression(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_cursor_parameters. + visitOpt_cursor_parameters(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_reverse. + visitOpt_reverse(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_by_expression. + visitOpt_by_expression(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#for_variable. + visitFor_variable(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_foreach_a. + visitStmt_foreach_a(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#foreach_slice. + visitForeach_slice(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_exit. + visitStmt_exit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#exit_type. + visitExit_type(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_return. + visitStmt_return(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_return_result. + visitOpt_return_result(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_raise. + visitStmt_raise(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_stmt_raise_level. + visitOpt_stmt_raise_level(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_raise_list. + visitOpt_raise_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_raise_using. + visitOpt_raise_using(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_raise_using_elem. + visitOpt_raise_using_elem(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_raise_using_elem_list. + visitOpt_raise_using_elem_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_assert. + visitStmt_assert(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_stmt_assert_message. + visitOpt_stmt_assert_message(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#loop_body. + visitLoop_body(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_execsql. + visitStmt_execsql(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_dynexecute. + visitStmt_dynexecute(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_execute_using. + visitOpt_execute_using(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_execute_using_list. + visitOpt_execute_using_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_execute_into. + visitOpt_execute_into(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_open. + visitStmt_open(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_open_bound_list_item. + visitOpt_open_bound_list_item(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_open_bound_list. + visitOpt_open_bound_list(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_open_using. + visitOpt_open_using(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_scroll_option. + visitOpt_scroll_option(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_scroll_option_no. + visitOpt_scroll_option_no(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_fetch. + visitStmt_fetch(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#into_target. + visitInto_target(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_cursor_from. + visitOpt_cursor_from(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_fetch_direction. + visitOpt_fetch_direction(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_move. + visitStmt_move(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_close. + visitStmt_close(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_null. + visitStmt_null(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_commit. + visitStmt_commit(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_rollback. + visitStmt_rollback(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#plsql_opt_transaction_chain. + visitPlsql_opt_transaction_chain(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#stmt_set. + visitStmt_set(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#cursor_variable. + visitCursor_variable(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#exception_sect. + visitException_sect(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#proc_exceptions. + visitProc_exceptions(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#proc_exception. + visitProc_exception(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#proc_conditions. + visitProc_conditions(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#proc_condition. + visitProc_condition(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_block_label. + visitOpt_block_label(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_loop_label. + visitOpt_loop_label(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_label. + visitOpt_label(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_exitcond. + visitOpt_exitcond(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#any_identifier. + visitAny_identifier(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#plsql_unreserved_keyword. + visitPlsql_unreserved_keyword(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#sql_expression. + visitSql_expression(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#expr_until_then. + visitExpr_until_then(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#expr_until_semi. + visitExpr_until_semi(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#expr_until_rightbracket. + visitExpr_until_rightbracket(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#expr_until_loop. + visitExpr_until_loop(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#make_execsql_stmt. + visitMake_execsql_stmt(ctx) { + return this.visitChildren(ctx); + } + + + // Visit a parse tree produced by PostgreSQLParser#opt_returning_clause_into. + visitOpt_returning_clause_into(ctx) { + return this.visitChildren(ctx); + } + + + } \ No newline at end of file diff --git a/packages/dbml-core/src/parse/schemarb/parser.pegjs b/packages/dbml-core/src/parse/schemarb/parser.pegjs index 7940b12fc..963a4e929 100644 --- a/packages/dbml-core/src/parse/schemarb/parser.pegjs +++ b/packages/dbml-core/src/parse/schemarb/parser.pegjs @@ -22,6 +22,21 @@ } } + function addCheckConstraintToTable(tableName, expression, name) { + const table = data.tables.find(t => t.name === tableName); + if (!table) { + error("Table ${tableName} not found"); + } + if (!table.constraints) { + table.constraints = []; + } + const constraint = { expression }; + if (name) { + constraint.name = name; + } + table.constraints.push(constraint); + } + function addPrimaryKey(fields = [], props = []) { const primaryKey = props.find(prop => prop.name === 'primary_key'); if (!primaryKey) return fields; @@ -264,8 +279,15 @@ rule = tableData:create_table_syntax { / r:add_foreign_key_syntax { pushRef(r); } +/ add_check_constraint_syntax / other_class_prop +add_check_constraint_syntax + = sp* add_check_constraint sp* tableName:(symbol / name) "," sp* expression:name props:check_constraint_props* { + const constraintName = props.find(p => p.name)?.name; + addCheckConstraintToTable(tableName, expression, constraintName); + } + add_foreign_key_syntax = sp* add_foreign_key sp* fromTable:name","sp* toTable:name props:add_foreign_key_props_syntax* { const foreign = refactorForeign(createForeign(fromTable, toTable, props)); @@ -297,6 +319,9 @@ create_table_syntax fields: addPrimaryKey(body.fields), // index: _.union(...body.index) }) + if (body.constraints && body.constraints.length > 0) { + table.constraints = body.constraints; + } return { table, refs: createRefFromTableWithReference(table, body.references) @@ -308,6 +333,7 @@ table_body = fields:field* { fields: fields.filter(field => field.isField).map(field => field.field), index: fields.filter(field => field.isIndex).map(field => field.index), references: fields.filter(field => field.isReferences).map(field => field.reference), + constraints: fields.filter(field => field.isConstraint).map(field => field.constraint), }); } @@ -316,12 +342,22 @@ field = whitespace* field:table_field_syntax whatever* endline { return field } table_field_syntax = field_index_syntax / reference: field_reference_syntax { return ({ reference, isReferences: true })} + / constraint: field_check_constraint_syntax { return ({ constraint, isConstraint: true })} / field:field_type_syntax { return ({ field, isField: true }) } field_index_syntax = index sp+ whateters field_reference_syntax = references sp+ reference:reference_value { return reference; } +field_check_constraint_syntax = check_constraint sp+ expression:name props:check_constraint_props* { + const constraint = { expression }; + for (let i = 0; i < props.length; i++) { + if (props[i].name) { + constraint.name = props[i].name; + } + } + return constraint; + } field_type_syntax = type:field_type sp+ name:name { return ({ name: name, @@ -332,6 +368,9 @@ field_type_syntax = type:field_type sp+ name:name { reference_value = ":"reference:variable { return reference } / reference:name { return reference } +check_constraint_props + = "," sp* "name"i":" sp* constraintName:name { return ({ name: constraintName }) } + referential_actions = "on_delete"i / "on_update"i // Keywords @@ -341,6 +380,8 @@ create_table "create table" = "create_table"i end_create_table "do |t|" = do sp+ abs character abs endline index "index" = character ".index" references "references" = character ".references" +check_constraint "check constraint" = character ".check_constraint" +add_check_constraint "add check constraint" = "add_check_constraint"i add_foreign_key "add foreign key" = "add_foreign_key"i column "column" = "column" primary_key "primary key" = "primary_key" diff --git a/packages/dbml-core/src/parse/schemarbParser.js b/packages/dbml-core/src/parse/schemarbParser.js index d734a2a02..485ae8e92 100644 --- a/packages/dbml-core/src/parse/schemarbParser.js +++ b/packages/dbml-core/src/parse/schemarbParser.js @@ -156,15 +156,19 @@ function peg$parse(input, options) { }, peg$c3 = ",", peg$c4 = peg$literalExpectation(",", false), - peg$c5 = function(fromTable, toTable, props) { + peg$c5 = function(tableName, expression, props) { + const constraintName = props.find(p => p.name)?.name; + addCheckConstraintToTable(tableName, expression, constraintName); + }, + peg$c6 = function(fromTable, toTable, props) { const foreign = refactorForeign(createForeign(fromTable, toTable, props)); return foreign; }, - peg$c6 = ":", - peg$c7 = peg$literalExpectation(":", false), - peg$c8 = function(columnName) { return ({ columnName }) }, - peg$c9 = function(primaryKey) { return ({ primaryKey }) }, - peg$c10 = function(r, value) { + peg$c7 = ":", + peg$c8 = peg$literalExpectation(":", false), + peg$c9 = function(columnName) { return ({ columnName }) }, + peg$c10 = function(primaryKey) { return ({ primaryKey }) }, + peg$c11 = function(r, value) { switch (r.toLowerCase()) { case 'on_delete': return { @@ -176,118 +180,141 @@ function peg$parse(input, options) { } } }, - peg$c11 = function(name, body) { + peg$c12 = function(name, body) { const table = ({ name, fields: addPrimaryKey(body.fields), // index: _.union(...body.index) }) + if (body.constraints && body.constraints.length > 0) { + table.constraints = body.constraints; + } return { table, refs: createRefFromTableWithReference(table, body.references) }; }, - peg$c12 = function(fields) { + peg$c13 = function(fields) { return ({ fields: fields.filter(field => field.isField).map(field => field.field), index: fields.filter(field => field.isIndex).map(field => field.index), references: fields.filter(field => field.isReferences).map(field => field.reference), + constraints: fields.filter(field => field.isConstraint).map(field => field.constraint), }); }, - peg$c13 = function(field) { return field }, - peg$c14 = function(reference) { return ({ reference, isReferences: true })}, - peg$c15 = function(field) { return ({ field, isField: true }) }, - peg$c16 = function(reference) { + peg$c14 = function(field) { return field }, + peg$c15 = function(reference) { return ({ reference, isReferences: true })}, + peg$c16 = function(constraint) { return ({ constraint, isConstraint: true })}, + peg$c17 = function(field) { return ({ field, isField: true }) }, + peg$c18 = function(reference) { return reference; }, - peg$c17 = function(type, name) { + peg$c19 = function(expression, props) { + const constraint = { expression }; + for (let i = 0; i < props.length; i++) { + if (props[i].name) { + constraint.name = props[i].name; + } + } + return constraint; + }, + peg$c20 = function(type, name) { return ({ name: name, type: {type_name: type}, }) }, - peg$c18 = function(reference) { return reference }, - peg$c19 = "on_delete", - peg$c20 = peg$literalExpectation("on_delete", true), - peg$c21 = "on_update", - peg$c22 = peg$literalExpectation("on_update", true), - peg$c23 = peg$otherExpectation("add index"), - peg$c24 = "add_index", - peg$c25 = peg$literalExpectation("add_index", false), - peg$c26 = peg$otherExpectation("schema define"), - peg$c27 = "ActiveRecord::Schema.define", - peg$c28 = peg$literalExpectation("ActiveRecord::Schema.define", false), - peg$c29 = peg$otherExpectation("create table"), - peg$c30 = "create_table", - peg$c31 = peg$literalExpectation("create_table", true), - peg$c32 = peg$otherExpectation("do |t|"), - peg$c33 = peg$otherExpectation("index"), - peg$c34 = ".index", - peg$c35 = peg$literalExpectation(".index", false), - peg$c36 = peg$otherExpectation("references"), - peg$c37 = ".references", - peg$c38 = peg$literalExpectation(".references", false), - peg$c39 = peg$otherExpectation("add foreign key"), - peg$c40 = "add_foreign_key", - peg$c41 = peg$literalExpectation("add_foreign_key", true), - peg$c42 = peg$otherExpectation("column"), - peg$c43 = "column", - peg$c44 = peg$literalExpectation("column", false), - peg$c45 = peg$otherExpectation("primary key"), - peg$c46 = "primary_key", - peg$c47 = peg$literalExpectation("primary_key", false), - peg$c48 = "version", - peg$c49 = peg$literalExpectation("version", false), - peg$c50 = "do", - peg$c51 = peg$literalExpectation("do", false), - peg$c52 = "end", - peg$c53 = peg$literalExpectation("end", false), - peg$c54 = peg$otherExpectation("lambda function"), - peg$c55 = "=>", - peg$c56 = peg$literalExpectation("=>", false), - peg$c57 = "->", - peg$c58 = peg$literalExpectation("->", false), - peg$c59 = /^[^"\n]/, - peg$c60 = peg$classExpectation(["\"", "\n"], true, false), - peg$c61 = function(c) { return c.join("") }, - peg$c62 = /^[^'\n]/, - peg$c63 = peg$classExpectation(["'", "\n"], true, false), - peg$c64 = ".", - peg$c65 = peg$literalExpectation(".", false), - peg$c66 = peg$anyExpectation(), - peg$c67 = function() {return text()}, - peg$c68 = /^[0-9]/i, - peg$c69 = peg$classExpectation([["0", "9"]], false, true), - peg$c70 = peg$otherExpectation("letter, number or underscore"), - peg$c71 = /^[a-z0-9_.]/i, - peg$c72 = peg$classExpectation([["a", "z"], ["0", "9"], "_", "."], false, true), - peg$c73 = peg$otherExpectation("comment line"), - peg$c74 = "#", - peg$c75 = peg$literalExpectation("#", false), - peg$c76 = peg$otherExpectation("whatever"), - peg$c77 = /^[^\t\r\n]/, - peg$c78 = peg$classExpectation(["\t", "\r", "\n"], true, false), - peg$c79 = "'", - peg$c80 = peg$literalExpectation("'", false), - peg$c81 = "\"", - peg$c82 = peg$literalExpectation("\"", false), - peg$c83 = "|", - peg$c84 = peg$literalExpectation("|", false), - peg$c85 = peg$otherExpectation("comment"), - peg$c86 = "//", - peg$c87 = peg$literalExpectation("//", false), - peg$c88 = /^[^\n]/, - peg$c89 = peg$classExpectation(["\n"], true, false), - peg$c90 = peg$otherExpectation("newline"), - peg$c91 = "\r\n", - peg$c92 = peg$literalExpectation("\r\n", false), - peg$c93 = "\n", - peg$c94 = peg$literalExpectation("\n", false), - peg$c95 = peg$otherExpectation("whitespace"), - peg$c96 = /^[ \t\r\n\r]/, - peg$c97 = peg$classExpectation([" ", "\t", "\r", "\n", "\r"], false, false), - peg$c98 = " ", - peg$c99 = peg$literalExpectation(" ", false), + peg$c21 = function(reference) { return reference }, + peg$c22 = "name", + peg$c23 = peg$literalExpectation("name", true), + peg$c24 = function(constraintName) { return ({ name: constraintName }) }, + peg$c25 = "on_delete", + peg$c26 = peg$literalExpectation("on_delete", true), + peg$c27 = "on_update", + peg$c28 = peg$literalExpectation("on_update", true), + peg$c29 = peg$otherExpectation("add index"), + peg$c30 = "add_index", + peg$c31 = peg$literalExpectation("add_index", false), + peg$c32 = peg$otherExpectation("schema define"), + peg$c33 = "ActiveRecord::Schema.define", + peg$c34 = peg$literalExpectation("ActiveRecord::Schema.define", false), + peg$c35 = peg$otherExpectation("create table"), + peg$c36 = "create_table", + peg$c37 = peg$literalExpectation("create_table", true), + peg$c38 = peg$otherExpectation("do |t|"), + peg$c39 = peg$otherExpectation("index"), + peg$c40 = ".index", + peg$c41 = peg$literalExpectation(".index", false), + peg$c42 = peg$otherExpectation("references"), + peg$c43 = ".references", + peg$c44 = peg$literalExpectation(".references", false), + peg$c45 = peg$otherExpectation("check constraint"), + peg$c46 = ".check_constraint", + peg$c47 = peg$literalExpectation(".check_constraint", false), + peg$c48 = peg$otherExpectation("add check constraint"), + peg$c49 = "add_check_constraint", + peg$c50 = peg$literalExpectation("add_check_constraint", true), + peg$c51 = peg$otherExpectation("add foreign key"), + peg$c52 = "add_foreign_key", + peg$c53 = peg$literalExpectation("add_foreign_key", true), + peg$c54 = peg$otherExpectation("column"), + peg$c55 = "column", + peg$c56 = peg$literalExpectation("column", false), + peg$c57 = peg$otherExpectation("primary key"), + peg$c58 = "primary_key", + peg$c59 = peg$literalExpectation("primary_key", false), + peg$c60 = "version", + peg$c61 = peg$literalExpectation("version", false), + peg$c62 = "do", + peg$c63 = peg$literalExpectation("do", false), + peg$c64 = "end", + peg$c65 = peg$literalExpectation("end", false), + peg$c66 = peg$otherExpectation("lambda function"), + peg$c67 = "=>", + peg$c68 = peg$literalExpectation("=>", false), + peg$c69 = "->", + peg$c70 = peg$literalExpectation("->", false), + peg$c71 = /^[^"\n]/, + peg$c72 = peg$classExpectation(["\"", "\n"], true, false), + peg$c73 = function(c) { return c.join("") }, + peg$c74 = /^[^'\n]/, + peg$c75 = peg$classExpectation(["'", "\n"], true, false), + peg$c76 = ".", + peg$c77 = peg$literalExpectation(".", false), + peg$c78 = peg$anyExpectation(), + peg$c79 = function() {return text()}, + peg$c80 = /^[0-9]/i, + peg$c81 = peg$classExpectation([["0", "9"]], false, true), + peg$c82 = peg$otherExpectation("letter, number or underscore"), + peg$c83 = /^[a-z0-9_.]/i, + peg$c84 = peg$classExpectation([["a", "z"], ["0", "9"], "_", "."], false, true), + peg$c85 = peg$otherExpectation("comment line"), + peg$c86 = "#", + peg$c87 = peg$literalExpectation("#", false), + peg$c88 = peg$otherExpectation("whatever"), + peg$c89 = /^[^\t\r\n]/, + peg$c90 = peg$classExpectation(["\t", "\r", "\n"], true, false), + peg$c91 = "'", + peg$c92 = peg$literalExpectation("'", false), + peg$c93 = "\"", + peg$c94 = peg$literalExpectation("\"", false), + peg$c95 = "|", + peg$c96 = peg$literalExpectation("|", false), + peg$c97 = peg$otherExpectation("comment"), + peg$c98 = "//", + peg$c99 = peg$literalExpectation("//", false), + peg$c100 = /^[^\n]/, + peg$c101 = peg$classExpectation(["\n"], true, false), + peg$c102 = peg$otherExpectation("newline"), + peg$c103 = "\r\n", + peg$c104 = peg$literalExpectation("\r\n", false), + peg$c105 = "\n", + peg$c106 = peg$literalExpectation("\n", false), + peg$c107 = peg$otherExpectation("whitespace"), + peg$c108 = /^[ \t\r\n\r]/, + peg$c109 = peg$classExpectation([" ", "\t", "\r", "\n", "\r"], false, false), + peg$c110 = " ", + peg$c111 = peg$literalExpectation(" ", false), peg$currPos = 0, peg$savedPos = 0, @@ -499,8 +526,99 @@ function peg$parse(input, options) { } s0 = s1; if (s0 === peg$FAILED) { - s0 = peg$parseother_class_prop(); + s0 = peg$parseadd_check_constraint_syntax(); + if (s0 === peg$FAILED) { + s0 = peg$parseother_class_prop(); + } + } + } + + return s0; + } + + function peg$parseadd_check_constraint_syntax() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = []; + s2 = peg$parsesp(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parsesp(); + } + if (s1 !== peg$FAILED) { + s2 = peg$parseadd_check_constraint(); + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parsesp(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parsesp(); + } + if (s3 !== peg$FAILED) { + s4 = peg$parsesymbol(); + if (s4 === peg$FAILED) { + s4 = peg$parsename(); + } + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c3; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s5 !== peg$FAILED) { + s6 = []; + s7 = peg$parsesp(); + while (s7 !== peg$FAILED) { + s6.push(s7); + s7 = peg$parsesp(); + } + if (s6 !== peg$FAILED) { + s7 = peg$parsename(); + if (s7 !== peg$FAILED) { + s8 = []; + s9 = peg$parsecheck_constraint_props(); + while (s9 !== peg$FAILED) { + s8.push(s9); + s9 = peg$parsecheck_constraint_props(); + } + if (s8 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c5(s4, s7, s8); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; } + } else { + peg$currPos = s0; + s0 = peg$FAILED; } return s0; @@ -553,7 +671,7 @@ function peg$parse(input, options) { } if (s8 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c5(s4, s7, s8); + s1 = peg$c6(s4, s7, s8); s0 = s1; } else { peg$currPos = s0; @@ -613,11 +731,11 @@ function peg$parse(input, options) { s3 = peg$parsecolumn(); if (s3 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 58) { - s4 = peg$c6; + s4 = peg$c7; peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c7); } + if (peg$silentFails === 0) { peg$fail(peg$c8); } } if (s4 !== peg$FAILED) { s5 = []; @@ -630,7 +748,7 @@ function peg$parse(input, options) { s6 = peg$parsename(); if (s6 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c8(s6); + s1 = peg$c9(s6); s0 = s1; } else { peg$currPos = s0; @@ -676,11 +794,11 @@ function peg$parse(input, options) { s3 = peg$parseprimary_key(); if (s3 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 58) { - s4 = peg$c6; + s4 = peg$c7; peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c7); } + if (peg$silentFails === 0) { peg$fail(peg$c8); } } if (s4 !== peg$FAILED) { s5 = []; @@ -693,7 +811,7 @@ function peg$parse(input, options) { s6 = peg$parsename(); if (s6 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c9(s6); + s1 = peg$c10(s6); s0 = s1; } else { peg$currPos = s0; @@ -739,11 +857,11 @@ function peg$parse(input, options) { s3 = peg$parsereferential_actions(); if (s3 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 58) { - s4 = peg$c6; + s4 = peg$c7; peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c7); } + if (peg$silentFails === 0) { peg$fail(peg$c8); } } if (s4 !== peg$FAILED) { s5 = []; @@ -756,7 +874,7 @@ function peg$parse(input, options) { s6 = peg$parsesymbol(); if (s6 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c10(s3, s6); + s1 = peg$c11(s3, s6); s0 = s1; } else { peg$currPos = s0; @@ -812,7 +930,7 @@ function peg$parse(input, options) { s7 = peg$parseend_line(); if (s7 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c11(s3, s6); + s1 = peg$c12(s3, s6); s0 = s1; } else { peg$currPos = s0; @@ -858,7 +976,7 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c12(s1); + s1 = peg$c13(s1); } s0 = s1; @@ -888,7 +1006,7 @@ function peg$parse(input, options) { s4 = peg$parseendline(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c13(s2); + s1 = peg$c14(s2); s0 = s1; } else { peg$currPos = s0; @@ -919,17 +1037,26 @@ function peg$parse(input, options) { s1 = peg$parsefield_reference_syntax(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c14(s1); + s1 = peg$c15(s1); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - s1 = peg$parsefield_type_syntax(); + s1 = peg$parsefield_check_constraint_syntax(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c15(s1); + s1 = peg$c16(s1); } s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsefield_type_syntax(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c17(s1); + } + s0 = s1; + } } } @@ -993,7 +1120,7 @@ function peg$parse(input, options) { s3 = peg$parsereference_value(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c16(s3); + s1 = peg$c18(s3); s0 = s1; } else { peg$currPos = s0; @@ -1011,6 +1138,55 @@ function peg$parse(input, options) { return s0; } + function peg$parsefield_check_constraint_syntax() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parsecheck_constraint(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsesp(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsesp(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parsename(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$parsecheck_constraint_props(); + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parsecheck_constraint_props(); + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c19(s3, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + function peg$parsefield_type_syntax() { var s0, s1, s2, s3; @@ -1031,7 +1207,7 @@ function peg$parse(input, options) { s3 = peg$parsename(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c17(s1, s3); + s1 = peg$c20(s1, s3); s0 = s1; } else { peg$currPos = s0; @@ -1054,17 +1230,17 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 58) { - s1 = peg$c6; + s1 = peg$c7; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c7); } + if (peg$silentFails === 0) { peg$fail(peg$c8); } } if (s1 !== peg$FAILED) { s2 = peg$parsevariable(); if (s2 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c18(s2); + s1 = peg$c21(s2); s0 = s1; } else { peg$currPos = s0; @@ -1079,7 +1255,7 @@ function peg$parse(input, options) { s1 = peg$parsename(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c18(s1); + s1 = peg$c21(s1); } s0 = s1; } @@ -1087,23 +1263,98 @@ function peg$parse(input, options) { return s0; } + function peg$parsecheck_constraint_props() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 44) { + s1 = peg$c3; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsesp(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsesp(); + } + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c22) { + s3 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c23); } + } + if (s3 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s4 = peg$c7; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c8); } + } + if (s4 !== peg$FAILED) { + s5 = []; + s6 = peg$parsesp(); + while (s6 !== peg$FAILED) { + s5.push(s6); + s6 = peg$parsesp(); + } + if (s5 !== peg$FAILED) { + s6 = peg$parsename(); + if (s6 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c24(s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + function peg$parsereferential_actions() { var s0; - if (input.substr(peg$currPos, 9).toLowerCase() === peg$c19) { + if (input.substr(peg$currPos, 9).toLowerCase() === peg$c25) { s0 = input.substr(peg$currPos, 9); peg$currPos += 9; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c20); } + if (peg$silentFails === 0) { peg$fail(peg$c26); } } if (s0 === peg$FAILED) { - if (input.substr(peg$currPos, 9).toLowerCase() === peg$c21) { + if (input.substr(peg$currPos, 9).toLowerCase() === peg$c27) { s0 = input.substr(peg$currPos, 9); peg$currPos += 9; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c22); } + if (peg$silentFails === 0) { peg$fail(peg$c28); } } } @@ -1114,17 +1365,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 9) === peg$c24) { - s0 = peg$c24; + if (input.substr(peg$currPos, 9) === peg$c30) { + s0 = peg$c30; peg$currPos += 9; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c25); } + if (peg$silentFails === 0) { peg$fail(peg$c31); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c23); } + if (peg$silentFails === 0) { peg$fail(peg$c29); } } return s0; @@ -1134,17 +1385,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 27) === peg$c27) { - s0 = peg$c27; + if (input.substr(peg$currPos, 27) === peg$c33) { + s0 = peg$c33; peg$currPos += 27; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c28); } + if (peg$silentFails === 0) { peg$fail(peg$c34); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c26); } + if (peg$silentFails === 0) { peg$fail(peg$c32); } } return s0; @@ -1154,17 +1405,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 12).toLowerCase() === peg$c30) { + if (input.substr(peg$currPos, 12).toLowerCase() === peg$c36) { s0 = input.substr(peg$currPos, 12); peg$currPos += 12; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c31); } + if (peg$silentFails === 0) { peg$fail(peg$c37); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c29); } + if (peg$silentFails === 0) { peg$fail(peg$c35); } } return s0; @@ -1225,7 +1476,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c32); } + if (peg$silentFails === 0) { peg$fail(peg$c38); } } return s0; @@ -1238,12 +1489,12 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parsecharacter(); if (s1 !== peg$FAILED) { - if (input.substr(peg$currPos, 6) === peg$c34) { - s2 = peg$c34; + if (input.substr(peg$currPos, 6) === peg$c40) { + s2 = peg$c40; peg$currPos += 6; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c35); } + if (peg$silentFails === 0) { peg$fail(peg$c41); } } if (s2 !== peg$FAILED) { s1 = [s1, s2]; @@ -1259,7 +1510,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c33); } + if (peg$silentFails === 0) { peg$fail(peg$c39); } } return s0; @@ -1272,12 +1523,12 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parsecharacter(); if (s1 !== peg$FAILED) { - if (input.substr(peg$currPos, 11) === peg$c37) { - s2 = peg$c37; + if (input.substr(peg$currPos, 11) === peg$c43) { + s2 = peg$c43; peg$currPos += 11; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c38); } + if (peg$silentFails === 0) { peg$fail(peg$c44); } } if (s2 !== peg$FAILED) { s1 = [s1, s2]; @@ -1293,7 +1544,61 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c36); } + if (peg$silentFails === 0) { peg$fail(peg$c42); } + } + + return s0; + } + + function peg$parsecheck_constraint() { + var s0, s1, s2; + + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parsecharacter(); + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 17) === peg$c46) { + s2 = peg$c46; + peg$currPos += 17; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c47); } + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c45); } + } + + return s0; + } + + function peg$parseadd_check_constraint() { + var s0, s1; + + peg$silentFails++; + if (input.substr(peg$currPos, 20).toLowerCase() === peg$c49) { + s0 = input.substr(peg$currPos, 20); + peg$currPos += 20; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c50); } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c48); } } return s0; @@ -1303,17 +1608,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 15).toLowerCase() === peg$c40) { + if (input.substr(peg$currPos, 15).toLowerCase() === peg$c52) { s0 = input.substr(peg$currPos, 15); peg$currPos += 15; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c41); } + if (peg$silentFails === 0) { peg$fail(peg$c53); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c39); } + if (peg$silentFails === 0) { peg$fail(peg$c51); } } return s0; @@ -1323,17 +1628,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 6) === peg$c43) { - s0 = peg$c43; + if (input.substr(peg$currPos, 6) === peg$c55) { + s0 = peg$c55; peg$currPos += 6; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c44); } + if (peg$silentFails === 0) { peg$fail(peg$c56); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c42); } + if (peg$silentFails === 0) { peg$fail(peg$c54); } } return s0; @@ -1343,17 +1648,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 11) === peg$c46) { - s0 = peg$c46; + if (input.substr(peg$currPos, 11) === peg$c58) { + s0 = peg$c58; peg$currPos += 11; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c47); } + if (peg$silentFails === 0) { peg$fail(peg$c59); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c45); } + if (peg$silentFails === 0) { peg$fail(peg$c57); } } return s0; @@ -1362,12 +1667,12 @@ function peg$parse(input, options) { function peg$parseversion() { var s0; - if (input.substr(peg$currPos, 7) === peg$c48) { - s0 = peg$c48; + if (input.substr(peg$currPos, 7) === peg$c60) { + s0 = peg$c60; peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c49); } + if (peg$silentFails === 0) { peg$fail(peg$c61); } } return s0; @@ -1376,12 +1681,12 @@ function peg$parse(input, options) { function peg$parsedo() { var s0; - if (input.substr(peg$currPos, 2) === peg$c50) { - s0 = peg$c50; + if (input.substr(peg$currPos, 2) === peg$c62) { + s0 = peg$c62; peg$currPos += 2; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c51); } + if (peg$silentFails === 0) { peg$fail(peg$c63); } } return s0; @@ -1390,12 +1695,12 @@ function peg$parse(input, options) { function peg$parseend() { var s0; - if (input.substr(peg$currPos, 3) === peg$c52) { - s0 = peg$c52; + if (input.substr(peg$currPos, 3) === peg$c64) { + s0 = peg$c64; peg$currPos += 3; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c53); } + if (peg$silentFails === 0) { peg$fail(peg$c65); } } return s0; @@ -1405,26 +1710,26 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 2) === peg$c55) { - s0 = peg$c55; + if (input.substr(peg$currPos, 2) === peg$c67) { + s0 = peg$c67; peg$currPos += 2; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c56); } + if (peg$silentFails === 0) { peg$fail(peg$c68); } } if (s0 === peg$FAILED) { - if (input.substr(peg$currPos, 2) === peg$c57) { - s0 = peg$c57; + if (input.substr(peg$currPos, 2) === peg$c69) { + s0 = peg$c69; peg$currPos += 2; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c58); } + if (peg$silentFails === 0) { peg$fail(peg$c70); } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c54); } + if (peg$silentFails === 0) { peg$fail(peg$c66); } } return s0; @@ -1479,28 +1784,28 @@ function peg$parse(input, options) { s1 = peg$parsedouble_quote(); if (s1 !== peg$FAILED) { s2 = []; - if (peg$c59.test(input.charAt(peg$currPos))) { + if (peg$c71.test(input.charAt(peg$currPos))) { s3 = input.charAt(peg$currPos); peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c60); } + if (peg$silentFails === 0) { peg$fail(peg$c72); } } while (s3 !== peg$FAILED) { s2.push(s3); - if (peg$c59.test(input.charAt(peg$currPos))) { + if (peg$c71.test(input.charAt(peg$currPos))) { s3 = input.charAt(peg$currPos); peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c60); } + if (peg$silentFails === 0) { peg$fail(peg$c72); } } } if (s2 !== peg$FAILED) { s3 = peg$parsedouble_quote(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c61(s2); + s1 = peg$c73(s2); s0 = s1; } else { peg$currPos = s0; @@ -1525,28 +1830,28 @@ function peg$parse(input, options) { s1 = peg$parsesingle_quote(); if (s1 !== peg$FAILED) { s2 = []; - if (peg$c62.test(input.charAt(peg$currPos))) { + if (peg$c74.test(input.charAt(peg$currPos))) { s3 = input.charAt(peg$currPos); peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c63); } + if (peg$silentFails === 0) { peg$fail(peg$c75); } } while (s3 !== peg$FAILED) { s2.push(s3); - if (peg$c62.test(input.charAt(peg$currPos))) { + if (peg$c74.test(input.charAt(peg$currPos))) { s3 = input.charAt(peg$currPos); peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c63); } + if (peg$silentFails === 0) { peg$fail(peg$c75); } } } if (s2 !== peg$FAILED) { s3 = peg$parsesingle_quote(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c61(s2); + s1 = peg$c73(s2); s0 = s1; } else { peg$currPos = s0; @@ -1569,11 +1874,11 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 58) { - s1 = peg$c6; + s1 = peg$c7; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c7); } + if (peg$silentFails === 0) { peg$fail(peg$c8); } } if (s1 !== peg$FAILED) { s2 = []; @@ -1584,7 +1889,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c61(s2); + s1 = peg$c73(s2); s0 = s1; } else { peg$currPos = s0; @@ -1614,7 +1919,7 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c61(s1); + s1 = peg$c73(s1); } s0 = s1; @@ -1628,11 +1933,11 @@ function peg$parse(input, options) { s1 = peg$parsecharacter(); if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 46) { - s2 = peg$c64; + s2 = peg$c76; peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c65); } + if (peg$silentFails === 0) { peg$fail(peg$c77); } } if (s2 !== peg$FAILED) { s3 = []; @@ -1647,7 +1952,7 @@ function peg$parse(input, options) { } if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c61(s3); + s1 = peg$c73(s3); s0 = s1; } else { peg$currPos = s0; @@ -1685,11 +1990,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c66); } + if (peg$silentFails === 0) { peg$fail(peg$c78); } } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c67(); + s1 = peg$c79(); s0 = s1; } else { peg$currPos = s0; @@ -1706,12 +2011,12 @@ function peg$parse(input, options) { function peg$parsenumber() { var s0; - if (peg$c68.test(input.charAt(peg$currPos))) { + if (peg$c80.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c69); } + if (peg$silentFails === 0) { peg$fail(peg$c81); } } return s0; @@ -1721,17 +2026,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (peg$c71.test(input.charAt(peg$currPos))) { + if (peg$c83.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c72); } + if (peg$silentFails === 0) { peg$fail(peg$c84); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c70); } + if (peg$silentFails === 0) { peg$fail(peg$c82); } } return s0; @@ -1845,11 +2150,11 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 35) { - s2 = peg$c74; + s2 = peg$c86; peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c75); } + if (peg$silentFails === 0) { peg$fail(peg$c87); } } if (s2 !== peg$FAILED) { s3 = peg$parsewhateters(); @@ -1880,7 +2185,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c73); } + if (peg$silentFails === 0) { peg$fail(peg$c85); } } return s0; @@ -1891,27 +2196,27 @@ function peg$parse(input, options) { peg$silentFails++; s0 = []; - if (peg$c77.test(input.charAt(peg$currPos))) { + if (peg$c89.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c78); } + if (peg$silentFails === 0) { peg$fail(peg$c90); } } while (s1 !== peg$FAILED) { s0.push(s1); - if (peg$c77.test(input.charAt(peg$currPos))) { + if (peg$c89.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c78); } + if (peg$silentFails === 0) { peg$fail(peg$c90); } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c76); } + if (peg$silentFails === 0) { peg$fail(peg$c88); } } return s0; @@ -1920,12 +2225,12 @@ function peg$parse(input, options) { function peg$parsewhatever() { var s0; - if (peg$c77.test(input.charAt(peg$currPos))) { + if (peg$c89.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c78); } + if (peg$silentFails === 0) { peg$fail(peg$c90); } } return s0; @@ -1935,11 +2240,11 @@ function peg$parse(input, options) { var s0; if (input.charCodeAt(peg$currPos) === 39) { - s0 = peg$c79; + s0 = peg$c91; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c80); } + if (peg$silentFails === 0) { peg$fail(peg$c92); } } return s0; @@ -1949,11 +2254,11 @@ function peg$parse(input, options) { var s0; if (input.charCodeAt(peg$currPos) === 34) { - s0 = peg$c81; + s0 = peg$c93; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c82); } + if (peg$silentFails === 0) { peg$fail(peg$c94); } } return s0; @@ -2005,11 +2310,11 @@ function peg$parse(input, options) { var s0; if (input.charCodeAt(peg$currPos) === 124) { - s0 = peg$c83; + s0 = peg$c95; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c84); } + if (peg$silentFails === 0) { peg$fail(peg$c96); } } return s0; @@ -2047,20 +2352,20 @@ function peg$parse(input, options) { peg$silentFails++; s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c86) { - s1 = peg$c86; + if (input.substr(peg$currPos, 2) === peg$c98) { + s1 = peg$c98; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c87); } + if (peg$silentFails === 0) { peg$fail(peg$c99); } } if (s1 !== peg$FAILED) { - if (peg$c88.test(input.charAt(peg$currPos))) { + if (peg$c100.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c89); } + if (peg$silentFails === 0) { peg$fail(peg$c101); } } if (s2 === peg$FAILED) { s2 = null; @@ -2079,7 +2384,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c85); } + if (peg$silentFails === 0) { peg$fail(peg$c97); } } return s0; @@ -2089,26 +2394,26 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (input.substr(peg$currPos, 2) === peg$c91) { - s0 = peg$c91; + if (input.substr(peg$currPos, 2) === peg$c103) { + s0 = peg$c103; peg$currPos += 2; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c92); } + if (peg$silentFails === 0) { peg$fail(peg$c104); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 10) { - s0 = peg$c93; + s0 = peg$c105; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c94); } + if (peg$silentFails === 0) { peg$fail(peg$c106); } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c90); } + if (peg$silentFails === 0) { peg$fail(peg$c102); } } return s0; @@ -2118,17 +2423,17 @@ function peg$parse(input, options) { var s0, s1; peg$silentFails++; - if (peg$c96.test(input.charAt(peg$currPos))) { + if (peg$c108.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c97); } + if (peg$silentFails === 0) { peg$fail(peg$c109); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c95); } + if (peg$silentFails === 0) { peg$fail(peg$c107); } } return s0; @@ -2138,11 +2443,11 @@ function peg$parse(input, options) { var s0; if (input.charCodeAt(peg$currPos) === 32) { - s0 = peg$c98; + s0 = peg$c110; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c99); } + if (peg$silentFails === 0) { peg$fail(peg$c111); } } return s0; @@ -2173,6 +2478,21 @@ function peg$parse(input, options) { } } + function addCheckConstraintToTable(tableName, expression, name) { + const table = data.tables.find(t => t.name === tableName); + if (!table) { + error("Table ${tableName} not found"); + } + if (!table.constraints) { + table.constraints = []; + } + const constraint = { expression }; + if (name) { + constraint.name = name; + } + table.constraints.push(constraint); + } + function addPrimaryKey(fields = [], props = []) { const primaryKey = props.find(prop => prop.name === 'primary_key'); if (!primaryKey) return fields; diff --git a/packages/dbml-core/types/model_structure/constraint.d.ts b/packages/dbml-core/types/model_structure/constraint.d.ts new file mode 100644 index 000000000..27ac44c6c --- /dev/null +++ b/packages/dbml-core/types/model_structure/constraint.d.ts @@ -0,0 +1,52 @@ +import { NormalizedDatabase } from './database'; +import Element, { Token } from './element'; +import Field from './field'; +import Table from './table'; +import TablePartial from './tablePartial'; + +interface RawConstraint { + token: Token; + name: string; + expression: string; + table: Table; + column?: Field | null; + injectedPartial?: TablePartial | null; +} + +declare class Constraint extends Element { + name: string; + expression: string; + table: Table; + column: Field | null; + injectedPartial: TablePartial | null; + + constructor({ token, name, expression, table, column, injectedPartial }: RawConstraint); + generateId(): void; + export(): { + name: string; + expression: string; + }; + exportParentIds(): { + tableId: number; + columnId: number | null; + injectedPartialId: number | null; + }; + shallowExport(): { + name: string; + expression: string; + }; + normalize(model: NormalizedDatabase): void; +} + +export interface NormalizedConstraint { + [_id: number]: { + id: number; + name: string; + expression: string; + tableId: number; + columnId: number | null; + injectedPartialId: number | null; + }; +} + +export default Constraint; diff --git a/packages/dbml-core/types/model_structure/database.d.ts b/packages/dbml-core/types/model_structure/database.d.ts index 97086c447..e8b454e5d 100644 --- a/packages/dbml-core/types/model_structure/database.d.ts +++ b/packages/dbml-core/types/model_structure/database.d.ts @@ -11,6 +11,7 @@ import { NormalizedEnumValue } from './enumValue'; import { NormalizedField } from './field'; import { NormalizedIndexColumn } from './indexColumn'; import { NormalizedIndex } from './indexes'; +import { NormalizedConstraint } from './constraint'; import TablePartial, { NormalizedTablePartial } from './tablePartial'; export interface Project { note: RawNote; @@ -299,6 +300,7 @@ export interface NormalizedDatabase { enumValues: NormalizedEnumValue; indexes: NormalizedIndex; indexColumns: NormalizedIndexColumn; + constraints: NormalizedConstraint; fields: NormalizedField; records: NormalizedRecords; tablePartials: NormalizedTablePartial; diff --git a/packages/dbml-core/types/model_structure/field.d.ts b/packages/dbml-core/types/model_structure/field.d.ts index 8aa58e7bd..95d342eba 100644 --- a/packages/dbml-core/types/model_structure/field.d.ts +++ b/packages/dbml-core/types/model_structure/field.d.ts @@ -5,6 +5,7 @@ import Endpoint from './endpoint'; import Enum from './enum'; import Table from './table'; import TablePartial from './tablePartial'; +import Constraint from './constraint'; interface RawField { name: string; type: any; @@ -15,6 +16,7 @@ interface RawField { note: RawNote; dbdefault: any; increment: boolean; + constraints?: any[]; table: Table; } declare class Field extends Element { @@ -28,14 +30,16 @@ declare class Field extends Element { noteToken: Token; dbdefault: any; increment: boolean; + constraints: Constraint[]; table: Table; endpoints: Endpoint[]; _enum: Enum; injectedPartial?: TablePartial; injectedToken: Token; - constructor({ name, type, unique, pk, token, not_null, note, dbdefault, increment, table }: RawField); + constructor({ name, type, unique, pk, token, not_null, note, dbdefault, increment, constraints, table }: RawField); generateId(): void; pushEndpoint(endpoint: any): void; + processConstraints(constraints: any[]): void; export(): { name: string; type: any; @@ -64,6 +68,7 @@ declare class Field extends Element { dbdefault: any; increment: boolean; injectedPartialId?: number; + constraintIds: number[]; }; normalize(model: NormalizedDatabase): void; } @@ -82,6 +87,7 @@ export interface NormalizedField { endpointIds: number[]; enumId: number; injectedPartialId?: number; + constraintIds: number[]; }; } export default Field; diff --git a/packages/dbml-core/types/model_structure/table.d.ts b/packages/dbml-core/types/model_structure/table.d.ts index aa60201ab..7cf39e56d 100644 --- a/packages/dbml-core/types/model_structure/table.d.ts +++ b/packages/dbml-core/types/model_structure/table.d.ts @@ -1,6 +1,7 @@ import Element, { RawNote, Token } from './element'; import Field from './field'; import Index from './indexes'; +import Constraint from './constraint'; import Schema from './schema'; import DbState from './dbState'; import TableGroup from './tableGroup'; @@ -13,6 +14,7 @@ interface RawTable { note: RawNote; fields: Field[]; indexes: Index[]; + constraints?: any[]; schema: Schema; token: Token; headerColor: string; @@ -26,6 +28,7 @@ declare class Table extends Element { noteToken: Token; fields: Field[]; indexes: Index[]; + constraints: Constraint[]; schema: Schema; headerColor: string; dbState: DbState; @@ -33,7 +36,7 @@ declare class Table extends Element { group: TableGroup; partials: TablePartial[]; - constructor({ name, alias, note, fields, indexes, schema, token, headerColor }: RawTable); + constructor({ name, alias, note, fields, indexes, constraints, schema, token, headerColor }: RawTable); generateId(): void; processFields(rawFields: any): void; pushField(field: any): void; @@ -41,6 +44,8 @@ declare class Table extends Element { processIndexes(rawIndexes: any): void; pushIndex(index: any): void; checkIndex(index: any): void; + processConstraints(constraints: any[]): void; + pushConstraint(constraint: any): void; findField(fieldName: any): Field; checkSameId(table: any): boolean; processPartials(): void; @@ -98,6 +103,7 @@ declare class Table extends Element { exportChildIds(): { fieldIds: number[]; indexIds: number[]; + constraintIds: number[]; }; exportParentIds(): { schemaId: number; @@ -122,6 +128,7 @@ export interface NormalizedTable { headerColor: string; fieldIds: number[]; indexIds: number[]; + constraintIds: number[]; schemaId: number; groupId: number; partials: TablePartial[]; diff --git a/packages/dbml-core/types/model_structure/tablePartial.d.ts b/packages/dbml-core/types/model_structure/tablePartial.d.ts index fe42a6524..250e6fa73 100644 --- a/packages/dbml-core/types/model_structure/tablePartial.d.ts +++ b/packages/dbml-core/types/model_structure/tablePartial.d.ts @@ -1,6 +1,7 @@ import Element, { RawNote, Token } from './element'; import Field from './field'; import Index from './indexes'; +import Constraint from './constraint'; import DbState from './dbState'; import { NormalizedDatabase } from './database'; @@ -9,6 +10,7 @@ interface RawTablePartial { note: RawNote; fields: Field[]; indexes: Index[]; + constraints?: any[]; token: Token; headerColor: string; dbState: DbState; @@ -20,11 +22,12 @@ declare class TablePartial extends Element { noteToken: Token; fields: Field[]; indexes: Index[]; + constraints: Constraint[]; headerColor: string; dbState: DbState; id: number; - constructor({ name, note, fields, indexes, token, headerColor, dbState }: RawTablePartial); + constructor({ name, note, fields, indexes, constraints, token, headerColor, dbState }: RawTablePartial); generateId(): void; export(): { name: string; diff --git a/packages/dbml-parse/package.json b/packages/dbml-parse/package.json index 2a6b89088..f3ad6052b 100644 --- a/packages/dbml-parse/package.json +++ b/packages/dbml-parse/package.json @@ -29,7 +29,8 @@ "test:watch": "vitest tests", "coverage": "vitest run --coverage", "prepublish": "npm run build", - "prepare": "npm run build" + "prepare": "npm run build", + "lint": "eslint ." }, "devDependencies": { "@types/lodash": "^4.14.200", diff --git a/packages/dbml-parse/src/compiler.ts b/packages/dbml-parse/src/compiler.ts index 9d9f2895d..729dd9e46 100644 --- a/packages/dbml-parse/src/compiler.ts +++ b/packages/dbml-parse/src/compiler.ts @@ -62,6 +62,7 @@ export const enum ScopeKind { CUSTOM, TOPLEVEL, TABLEPARTIAL, + CONSTRAINTS, } export default class Compiler { @@ -340,6 +341,8 @@ export default class Compiler { return ScopeKind.PROJECT; case 'tablepartial': return ScopeKind.TABLEPARTIAL; + case 'constraints': + return ScopeKind.CONSTRAINTS; default: return ScopeKind.CUSTOM; } diff --git a/packages/dbml-parse/src/lib/analyzer/binder/elementBinder/constraints.ts b/packages/dbml-parse/src/lib/analyzer/binder/elementBinder/constraints.ts new file mode 100644 index 000000000..c0d6db7e3 --- /dev/null +++ b/packages/dbml-parse/src/lib/analyzer/binder/elementBinder/constraints.ts @@ -0,0 +1,15 @@ +import ElementBinder from './elementBinder'; + +export default class ConstraintsBinder extends ElementBinder { + protected subfield = { + arg: { + argBinderRules: [ + { + shouldBind: false as const, + }, + ], + }, + settingList: {}, + }; + protected settingList = {}; +} diff --git a/packages/dbml-parse/src/lib/analyzer/binder/elementBinder/table.ts b/packages/dbml-parse/src/lib/analyzer/binder/elementBinder/table.ts index 345f7e776..f618235c9 100644 --- a/packages/dbml-parse/src/lib/analyzer/binder/elementBinder/table.ts +++ b/packages/dbml-parse/src/lib/analyzer/binder/elementBinder/table.ts @@ -24,6 +24,9 @@ export default class TableBinder extends ElementBinder { default: { shouldBind: false as const, }, + constraint: { + shouldBind: false as const, + } }, }; protected settingList = {}; diff --git a/packages/dbml-parse/src/lib/analyzer/types.ts b/packages/dbml-parse/src/lib/analyzer/types.ts index e62dca63c..eb49324a2 100644 --- a/packages/dbml-parse/src/lib/analyzer/types.ts +++ b/packages/dbml-parse/src/lib/analyzer/types.ts @@ -7,6 +7,7 @@ export enum ElementKind { Indexes = 'indexes', TableGroup = 'tablegroup', TablePartial = 'tablepartial', + Constraints = 'constraints' } export enum SettingName { @@ -15,7 +16,7 @@ export enum SettingName { Note = 'note', PK = 'pk', - PKey = 'primary key', + PrimaryKey = 'primary key', Unique = 'unique', Ref = 'ref', NotNull = 'not null', @@ -24,6 +25,7 @@ export enum SettingName { Default = 'default', Name = 'name', Type = 'type', + Constraint = 'constraint', Update = 'update', Delete = 'delete', diff --git a/packages/dbml-parse/src/lib/analyzer/utils.ts b/packages/dbml-parse/src/lib/analyzer/utils.ts index b755c79e1..d586dd966 100644 --- a/packages/dbml-parse/src/lib/analyzer/utils.ts +++ b/packages/dbml-parse/src/lib/analyzer/utils.ts @@ -33,6 +33,7 @@ export function getElementKind(node?: ElementDeclarationNode): Option e instanceof FunctionApplicationNode); + return [...this.validateFields(fields as FunctionApplicationNode[]), ...this.validateSubElements(subs as ElementDeclarationNode[])] + } + + private validateFields(fields: FunctionApplicationNode[]): CompileError[] { + return fields.flatMap((field) => { + if (!field.callee) { + return []; + } + + const errors: CompileError[] = []; + const args = [field.callee, ...field.args]; + if (last(args) instanceof ListExpressionNode) { + errors.push(...this.validateFieldSetting(args.pop() as ListExpressionNode)); + } + + if (args.length > 1 || !(args[0] instanceof FunctionExpressionNode)) { + errors.push(new CompileError(CompileErrorCode.INVALID_CONSTRAINTS_FIELD, 'A constraint field must be a function expression', field)); + } + + return errors; + }) + } + + private validateFieldSetting(settings: ListExpressionNode): CompileError[] { + const aggReport = aggregateSettingList(settings); + const errors = aggReport.getErrors(); + const settingMap = aggReport.getValue(); + + for (const name in settingMap) { + const attrs = settingMap[name]; + switch (name) { + case 'name': + if (attrs.length > 1) { + attrs.forEach((attr) => errors.push(new CompileError(CompileErrorCode.DUPLICATE_CONSTRAINT_SETTING, `\'${name}\' can only appear once`, attr))); + } + attrs.forEach((attr) => { + if (!isExpressionAQuotedString(attr.value)) { + errors.push(new CompileError(CompileErrorCode.INVALID_CONSTRAINT_SETTING_VALUE, `\'${name}\' must be a string`, attr)); + } + }); + break; + default: + attrs.forEach((attr) => errors.push(new CompileError(CompileErrorCode.UNKNOWN_CONSTRAINT_SETTING, `Unknown constraint setting \'${name}\'`, attr))); + } + } + return errors; + } + + private validateSubElements(subs: ElementDeclarationNode[]): CompileError[] { + return subs.flatMap((sub) => { + sub.parent = this.declarationNode; + if (!sub.type) { + return []; + } + const _Validator = pickValidator(sub as ElementDeclarationNode & { type: SyntaxToken }); + const validator = new _Validator(sub as ElementDeclarationNode & { type: SyntaxToken }, this.publicSymbolTable, this.symbolFactory); + return validator.validate(); + }); + } +} diff --git a/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/table.ts b/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/table.ts index f3121c4b2..45d3d5579 100644 --- a/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/table.ts +++ b/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/table.ts @@ -9,6 +9,7 @@ import { ElementDeclarationNode, ExpressionNode, FunctionApplicationNode, + FunctionExpressionNode, ListExpressionNode, PartialInjectionNode, PrimaryExpressionNode, @@ -41,11 +42,11 @@ import SymbolTable from '../../symbol/symbolTable'; import { SettingName } from '../../types'; export default class TableValidator implements ElementValidator { - private declarationNode: ElementDeclarationNode & { type: SyntaxToken}; + private declarationNode: ElementDeclarationNode & { type: SyntaxToken }; private symbolFactory: SymbolFactory; private publicSymbolTable: SymbolTable; - constructor ( + constructor( declarationNode: ElementDeclarationNode & { type: SyntaxToken }, publicSymbolTable: SymbolTable, symbolFactory: SymbolFactory, @@ -55,7 +56,7 @@ export default class TableValidator implements ElementValidator { this.publicSymbolTable = publicSymbolTable; } - validate (): CompileError[] { + validate(): CompileError[] { return [ ...this.validateContext(), ...this.validateName(this.declarationNode.name), @@ -66,14 +67,14 @@ export default class TableValidator implements ElementValidator { ]; } - private validateContext (): CompileError[] { + private validateContext(): CompileError[] { if (this.declarationNode.parent instanceof ElementDeclarationNode) { return [new CompileError(CompileErrorCode.INVALID_TABLE_CONTEXT, 'Table must appear top-level', this.declarationNode)]; } return []; } - private validateName (nameNode?: SyntaxNode): CompileError[] { + private validateName(nameNode?: SyntaxNode): CompileError[] { if (!nameNode) { return [new CompileError(CompileErrorCode.NAME_NOT_FOUND, 'A Table must have a name', this.declarationNode)]; } @@ -87,7 +88,7 @@ export default class TableValidator implements ElementValidator { return []; } - private validateAlias (aliasNode?: SyntaxNode): CompileError[] { + private validateAlias(aliasNode?: SyntaxNode): CompileError[] { if (!aliasNode) { return []; } @@ -99,7 +100,7 @@ export default class TableValidator implements ElementValidator { return []; } - private validateSettingList (settingList?: ListExpressionNode): CompileError[] { + private validateSettingList(settingList?: ListExpressionNode): CompileError[] { const aggReport = aggregateSettingList(settingList); const errors = aggReport.getErrors(); const settingMap = aggReport.getValue(); @@ -112,7 +113,7 @@ export default class TableValidator implements ElementValidator { } attrs.forEach((attr) => { if (!isValidColor(attr.value)) { - errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_SETTING, '\'headercolor\' must be a color literal', attr.value || attr.name!)); + errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_SETTING_VALUE, '\'headercolor\' must be a color literal', attr.value || attr.name!)); } }); break; @@ -122,18 +123,18 @@ export default class TableValidator implements ElementValidator { } attrs.forEach((attr) => { if (!isExpressionAQuotedString(attr.value)) { - errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_SETTING, '\'note\' must be a string literal', attr.value || attr.name!)); + errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_SETTING_VALUE, '\'note\' must be a string literal', attr.value || attr.name!)); } }); break; default: - errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.INVALID_TABLE_SETTING, `Unknown '${name}' setting`, attr))); + errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.UNKNOWN_TABLE_SETTING, `Unknown '${name}' setting`, attr))); } }); return errors; } - registerElement (): CompileError[] { + registerElement(): CompileError[] { const errors: CompileError[] = []; this.declarationNode.symbol = this.symbolFactory.create(TableSymbol, { declaration: this.declarationNode, symbolTable: new SymbolTable() }); @@ -167,7 +168,7 @@ export default class TableValidator implements ElementValidator { return errors; } - validateBody (body?: FunctionApplicationNode | BlockExpressionNode): CompileError[] { + validateBody(body?: FunctionApplicationNode | BlockExpressionNode): CompileError[] { if (!body) { return []; } @@ -189,11 +190,11 @@ export default class TableValidator implements ElementValidator { ]; } - validateInjections (injections: PartialInjectionNode[]) { + validateInjections(injections: PartialInjectionNode[]) { return injections.flatMap((injection) => this.registerInjection(injection)); } - registerInjection (injection: PartialInjectionNode) { + registerInjection(injection: PartialInjectionNode) { if (!injection.partial?.variable?.value) return []; const injectionName = injection.partial.variable?.value; @@ -214,7 +215,7 @@ export default class TableValidator implements ElementValidator { return []; } - validateFields (fields: FunctionApplicationNode[]): CompileError[] { + validateFields(fields: FunctionApplicationNode[]): CompileError[] { return fields.flatMap((field) => { if (!field.callee) { return []; @@ -243,7 +244,7 @@ export default class TableValidator implements ElementValidator { }); } - registerField (field: FunctionApplicationNode): CompileError[] { + registerField(field: FunctionApplicationNode): CompileError[] { if (field.callee && isExpressionAVariableNode(field.callee)) { const columnName = extractVarNameFromPrimaryVariable(field.callee).unwrap(); const columnId = createColumnSymbolIndex(columnName); @@ -265,7 +266,7 @@ export default class TableValidator implements ElementValidator { } // This is needed to support legacy inline settings - validateFieldSetting (parts: ExpressionNode[]): CompileError[] { + validateFieldSetting(parts: ExpressionNode[]): CompileError[] { if (!parts.slice(0, -1).every(isExpressionAnIdentifierNode) || !parts.slice(-1).every((p) => isExpressionAnIdentifierNode(p) || p instanceof ListExpressionNode)) { return [...parts.map((part) => new CompileError(CompileErrorCode.INVALID_COLUMN, 'These fields must be some inline settings optionally ended with a setting list', part))]; } @@ -302,7 +303,7 @@ export default class TableValidator implements ElementValidator { }); const pkAttrs = settingMap[SettingName.PK] || []; - const pkeyAttrs = settingMap[SettingName.PKey] || []; + const pkeyAttrs = settingMap[SettingName.PrimaryKey] || []; if (pkAttrs.length >= 1 && pkeyAttrs.length >= 1) { errors.push( ...[...pkAttrs, ...pkeyAttrs] @@ -329,7 +330,7 @@ export default class TableValidator implements ElementValidator { } }); break; - case SettingName.PKey: + case SettingName.PrimaryKey: if (attrs.length > 1) { errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.DUPLICATE_COLUMN_SETTING, 'primary key can only appear once', attr))); } @@ -399,18 +400,26 @@ export default class TableValidator implements ElementValidator { break; case SettingName.Default: if (attrs.length > 1) { - errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.DUPLICATE_TABLE_SETTING, '\'default\' can only appear once', attr))); + errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.DUPLICATE_COLUMN_SETTING, '\'default\' can only appear once', attr))); } attrs.forEach((attr) => { if (!isValidDefaultValue(attr.value)) { errors.push(new CompileError( - CompileErrorCode.INVALID_TABLE_SETTING, + CompileErrorCode.INVALID_COLUMN_SETTING_VALUE, '\'default\' must be a string literal, number literal, function expression, true, false or null', attr.value || attr.name!, )); } }); break; + case SettingName.Constraint: + attrs.forEach((attr) => { + if (!(attr.value instanceof FunctionExpressionNode)) { + errors.push(new CompileError(CompileErrorCode.INVALID_COLUMN_SETTING_VALUE, '\'constraint\' must be a function expression', attr.value || attr.name!)); + } + }); + break; + default: attrs.forEach((attr) => errors.push(new CompileError(CompileErrorCode.UNKNOWN_COLUMN_SETTING, `Unknown column setting '${name}'`, attr))); } @@ -418,7 +427,7 @@ export default class TableValidator implements ElementValidator { return errors; } - private validateSubElements (subs: ElementDeclarationNode[]): CompileError[] { + private validateSubElements(subs: ElementDeclarationNode[]): CompileError[] { const errors = subs.flatMap((sub) => { sub.parent = this.declarationNode; if (!sub.type) { diff --git a/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tableGroup.ts b/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tableGroup.ts index 41f7bd994..d529c999a 100644 --- a/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tableGroup.ts +++ b/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tableGroup.ts @@ -115,7 +115,7 @@ export default class TableGroupValidator implements ElementValidator { attrs.forEach((attr) => { if (!isValidColor(attr.value)) { errors.push(new CompileError( - CompileErrorCode.INVALID_TABLE_SETTING, + CompileErrorCode.INVALID_TABLE_SETTING_VALUE, '\'color\' must be a color literal', attr.value || attr.name!, )); @@ -134,7 +134,7 @@ export default class TableGroupValidator implements ElementValidator { .filter((attr) => !isExpressionAQuotedString(attr.value)) .forEach((attr) => { errors.push(new CompileError( - CompileErrorCode.INVALID_TABLE_SETTING, + CompileErrorCode.INVALID_TABLE_SETTING_VALUE, '\'note\' must be a string literal', attr.value || attr.name!, )); @@ -142,7 +142,7 @@ export default class TableGroupValidator implements ElementValidator { break; default: errors.push(...attrs.map((attr) => new CompileError( - CompileErrorCode.INVALID_TABLE_SETTING, + CompileErrorCode.UNKNOWN_TABLE_SETTING, `Unknown '${name}' setting`, attr, ))); diff --git a/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tablePartial.ts b/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tablePartial.ts index ca89fe659..7b80db426 100644 --- a/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tablePartial.ts +++ b/packages/dbml-parse/src/lib/analyzer/validator/elementValidators/tablePartial.ts @@ -8,6 +8,7 @@ import { ElementDeclarationNode, ExpressionNode, FunctionApplicationNode, + FunctionExpressionNode, ListExpressionNode, PrimaryExpressionNode, SyntaxNode, @@ -37,13 +38,13 @@ import SymbolTable from '../../symbol/symbolTable'; import { ElementKind, SettingName } from '../../types'; export default class TablePartialValidator implements ElementValidator { - private declarationNode: ElementDeclarationNode & { type: SyntaxToken}; + private declarationNode: ElementDeclarationNode & { type: SyntaxToken }; private symbolFactory: SymbolFactory; private publicSymbolTable: SymbolTable; - constructor ( + constructor( declarationNode: ElementDeclarationNode & { type: SyntaxToken }, publicSymbolTable: SymbolTable, symbolFactory: SymbolFactory, @@ -53,7 +54,7 @@ export default class TablePartialValidator implements ElementValidator { this.publicSymbolTable = publicSymbolTable; } - validate (): CompileError[] { + validate(): CompileError[] { return [ ...this.validateContext(), ...this.validateName(this.declarationNode.name), @@ -64,7 +65,7 @@ export default class TablePartialValidator implements ElementValidator { ]; } - private validateContext (): CompileError[] { + private validateContext(): CompileError[] { if (this.declarationNode.parent instanceof ElementDeclarationNode) { return [new CompileError( CompileErrorCode.INVALID_TABLE_PARTIAL_CONTEXT, @@ -75,7 +76,7 @@ export default class TablePartialValidator implements ElementValidator { return []; } - private validateName (nameNode?: SyntaxNode): CompileError[] { + private validateName(nameNode?: SyntaxNode): CompileError[] { if (!nameNode) { return [new CompileError( CompileErrorCode.NAME_NOT_FOUND, @@ -94,7 +95,7 @@ export default class TablePartialValidator implements ElementValidator { return []; } - private validateAlias (aliasNode?: SyntaxNode): CompileError[] { + private validateAlias(aliasNode?: SyntaxNode): CompileError[] { if (aliasNode) { return [new CompileError( CompileErrorCode.UNEXPECTED_ALIAS, @@ -106,7 +107,7 @@ export default class TablePartialValidator implements ElementValidator { return []; } - private validateSettingList (settingList?: ListExpressionNode): CompileError[] { + private validateSettingList(settingList?: ListExpressionNode): CompileError[] { const aggReport = aggregateSettingList(settingList); const errors = aggReport.getErrors(); const settingMap = aggReport.getValue(); @@ -119,7 +120,7 @@ export default class TablePartialValidator implements ElementValidator { } attrs.forEach((attr) => { if (!isValidColor(attr.value)) { - errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_PARTIAL_SETTING, `'${name}' must be a color literal`, attr.value || attr.name!)); + errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_PARTIAL_SETTING_VALUE, `'${name}' must be a color literal`, attr.value || attr.name!)); } }); break; @@ -129,18 +130,18 @@ export default class TablePartialValidator implements ElementValidator { } attrs.forEach((attr) => { if (!isExpressionAQuotedString(attr.value)) { - errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_PARTIAL_SETTING, `'${name}' must be a string literal`, attr.value || attr.name!)); + errors.push(new CompileError(CompileErrorCode.INVALID_TABLE_PARTIAL_SETTING_VALUE, `'${name}' must be a string literal`, attr.value || attr.name!)); } }); break; default: - errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.INVALID_TABLE_SETTING, `Unknown '${name}' setting`, attr))); + errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.UNKNOWN_TABLE_PARTIAL_SETTING, `Unknown '${name}' setting`, attr))); } }); return errors; } - registerElement (): CompileError[] { + registerElement(): CompileError[] { const { name } = this.declarationNode; this.declarationNode.symbol = this.symbolFactory.create(TablePartialSymbol, { declaration: this.declarationNode, symbolTable: new SymbolTable() }); const maybeNamePartials = destructureComplexVariable(name); @@ -158,7 +159,7 @@ export default class TablePartialValidator implements ElementValidator { return []; } - validateBody (body?: FunctionApplicationNode | BlockExpressionNode): CompileError[] { + validateBody(body?: FunctionApplicationNode | BlockExpressionNode): CompileError[] { if (!body) return []; if (body instanceof FunctionApplicationNode) { @@ -172,7 +173,7 @@ export default class TablePartialValidator implements ElementValidator { ]; } - validateFields (fields: FunctionApplicationNode[]): CompileError[] { + validateFields(fields: FunctionApplicationNode[]): CompileError[] { return fields.flatMap((field) => { if (!field.callee) return []; @@ -199,7 +200,7 @@ export default class TablePartialValidator implements ElementValidator { }); } - registerField (field: FunctionApplicationNode): CompileError[] { + registerField(field: FunctionApplicationNode): CompileError[] { if (!field.callee || !isExpressionAVariableNode(field.callee)) return []; const columnName = extractVarNameFromPrimaryVariable(field.callee).unwrap(); @@ -221,7 +222,7 @@ export default class TablePartialValidator implements ElementValidator { } // This is needed to support legacy inline settings - validateFieldSetting (parts: ExpressionNode[]): CompileError[] { + validateFieldSetting(parts: ExpressionNode[]): CompileError[] { const lastPart = last(parts); if ( !parts.slice(0, -1).every(isExpressionAnIdentifierNode) @@ -260,7 +261,7 @@ export default class TablePartialValidator implements ElementValidator { }); const pkAttrs = settingMap[SettingName.PK] || []; - const pkeyAttrs = settingMap[SettingName.PKey] || []; + const pkeyAttrs = settingMap[SettingName.PrimaryKey] || []; if (pkAttrs.length >= 1 && pkeyAttrs.length >= 1) { errors.push(...[...pkAttrs, ...pkeyAttrs].map((attr) => new CompileError( CompileErrorCode.DUPLICATE_COLUMN_SETTING, @@ -290,7 +291,7 @@ export default class TablePartialValidator implements ElementValidator { }); break; - case SettingName.PKey: + case SettingName.PrimaryKey: if (attrs.length > 1) { errors.push(...attrs.map((attr) => new CompileError(CompileErrorCode.DUPLICATE_COLUMN_SETTING, `'${name}' can only appear once`, attr))); } @@ -380,6 +381,14 @@ export default class TablePartialValidator implements ElementValidator { }); break; + case SettingName.Constraint: + attrs.forEach((attr) => { + if (!(attr.value instanceof FunctionExpressionNode)) { + errors.push(new CompileError(CompileErrorCode.INVALID_COLUMN_SETTING_VALUE, '\'constraint\' must be a function expression', attr.value || attr.name!)); + } + }); + break; + default: attrs.forEach((attr) => errors.push(new CompileError(CompileErrorCode.UNKNOWN_COLUMN_SETTING, `Unknown column setting '${name}'`, attr))); } @@ -387,7 +396,7 @@ export default class TablePartialValidator implements ElementValidator { return errors; } - private validateSubElements (subs: ElementDeclarationNode[]): CompileError[] { + private validateSubElements(subs: ElementDeclarationNode[]): CompileError[] { const errors = subs.flatMap((sub) => { sub.parent = this.declarationNode; if (!sub.type) { diff --git a/packages/dbml-parse/src/lib/analyzer/validator/utils.ts b/packages/dbml-parse/src/lib/analyzer/validator/utils.ts index 01ebd61f0..233629cf2 100644 --- a/packages/dbml-parse/src/lib/analyzer/validator/utils.ts +++ b/packages/dbml-parse/src/lib/analyzer/validator/utils.ts @@ -34,6 +34,7 @@ import Report from '../../report'; import { CompileError, CompileErrorCode } from '../../errors'; import { ElementKind } from '../types'; import TablePartialValidator from './elementValidators/tablePartial'; +import ConstraintsValidator from './elementValidators/constraints'; export function pickValidator(element: ElementDeclarationNode & { type: SyntaxToken }) { switch (element.type.value.toLowerCase() as ElementKind) { @@ -53,6 +54,8 @@ export function pickValidator(element: ElementDeclarationNode & { type: SyntaxTo return IndexesValidator; case ElementKind.TablePartial: return TablePartialValidator; + case ElementKind.Constraints: + return ConstraintsValidator; default: return CustomValidator; } @@ -199,7 +202,7 @@ export function isValidDefaultValue(value?: SyntaxNode): boolean { return false; } -export function isExpressionANumber (value?: SyntaxNode): boolean { +export function isExpressionANumber(value?: SyntaxNode): boolean { if (value instanceof PrefixExpressionNode) { if (value.op?.value !== '-' && value.op?.value !== '+') return false; return isExpressionANumber(value.expression); @@ -231,7 +234,7 @@ export function isTupleOfVariables(value?: SyntaxNode): value is TupleExpression return value instanceof TupleExpressionNode && value.elementList.every(isExpressionAVariableNode); } -export function isValidColumnType (type: SyntaxNode): boolean { +export function isValidColumnType(type: SyntaxNode): boolean { if ( !( type instanceof CallExpressionNode diff --git a/packages/dbml-parse/src/lib/errors.ts b/packages/dbml-parse/src/lib/errors.ts index f148c3477..477f566ef 100644 --- a/packages/dbml-parse/src/lib/errors.ts +++ b/packages/dbml-parse/src/lib/errors.ts @@ -29,7 +29,7 @@ export enum CompileErrorCode { UNEXPECTED_COMPLEX_BODY, INVALID_TABLE_CONTEXT, - INVALID_TABLE_SETTING, + UNKNOWN_TABLE_SETTING, DUPLICATE_TABLE_SETTING, INVALID_TABLEGROUP_CONTEXT, @@ -90,7 +90,7 @@ export enum CompileErrorCode { INVALID_TABLE_PARTIAL_CONTEXT, INVALID_TABLE_PARTIAL_ELEMENT_NAME, - INVALID_TABLE_PARTIAL_SETTING, + INVALID_TABLE_PARTIAL_SETTING_VALUE, DUPLICATE_TABLE_PARTIAL_ELEMENT_NAME, DUPLICATE_TABLE_PARTIAL_SETTING, @@ -98,6 +98,16 @@ export enum CompileErrorCode { INVALID_TABLE_PARTIAL_INJECTION_OP, INVALID_TABLE_PARTIAL_INJECTION_NAME, DUPLICATE_TABLE_PARTIAL_INJECTION_NAME, + UNKNOWN_TABLE_PARTIAL_SETTING, + + INVALID_TABLE_SETTING_VALUE, + + INVALID_CONSTRAINTS_CONTEXT, + INVALID_CONSTRAINTS_FIELD, + INVALID_CONSTRAINT, + UNKNOWN_CONSTRAINT_SETTING, + DUPLICATE_CONSTRAINT_SETTING, + INVALID_CONSTRAINT_SETTING_VALUE, BINDING_ERROR = 4000, @@ -120,7 +130,7 @@ export class CompileError extends Error { end: Readonly; - constructor (code: number, message: string, nodeOrToken: SyntaxNode | SyntaxToken) { + constructor(code: number, message: string, nodeOrToken: SyntaxNode | SyntaxToken) { super(message); this.code = code; this.diagnostic = message; diff --git a/packages/dbml-parse/src/lib/interpreter/elementInterpreter/table.ts b/packages/dbml-parse/src/lib/interpreter/elementInterpreter/table.ts index 6c10daf06..bb2a9be87 100644 --- a/packages/dbml-parse/src/lib/interpreter/elementInterpreter/table.ts +++ b/packages/dbml-parse/src/lib/interpreter/elementInterpreter/table.ts @@ -1,11 +1,11 @@ import { partition, last } from 'lodash'; import { - Column, ElementInterpreter, Index, InlineRef, + Column, Constraint, ElementInterpreter, Index, InlineRef, InterpreterDatabase, Table, TablePartialInjection, } from '../types'; import { AttributeNode, BlockExpressionNode, CallExpressionNode, ElementDeclarationNode, - FunctionApplicationNode, ListExpressionNode, PartialInjectionNode, PrefixExpressionNode, + FunctionApplicationNode, FunctionExpressionNode, ListExpressionNode, PartialInjectionNode, PrefixExpressionNode, SyntaxNode, } from '../../parser/nodes'; import { @@ -29,7 +29,7 @@ export class TableInterpreter implements ElementInterpreter { private table: Partial; private pkColumns: Column[]; - constructor (declarationNode: ElementDeclarationNode, env: InterpreterDatabase) { + constructor(declarationNode: ElementDeclarationNode, env: InterpreterDatabase) { this.declarationNode = declarationNode; this.env = env; this.table = { @@ -40,11 +40,12 @@ export class TableInterpreter implements ElementInterpreter { token: undefined, indexes: [], partials: [], + constraints: [], }; this.pkColumns = []; } - interpret (): CompileError[] { + interpret(): CompileError[] { this.table.token = getTokenPosition(this.declarationNode); this.env.tables.set(this.declarationNode, this.table as Table); @@ -73,7 +74,7 @@ export class TableInterpreter implements ElementInterpreter { return errors; } - private interpretName (nameNode: SyntaxNode): CompileError[] { + private interpretName(nameNode: SyntaxNode): CompileError[] { const { name, schemaName } = extractElementName(nameNode); if (schemaName.length > 1) { @@ -88,7 +89,7 @@ export class TableInterpreter implements ElementInterpreter { return []; } - private interpretAlias (aliasNode?: SyntaxNode): CompileError[] { + private interpretAlias(aliasNode?: SyntaxNode): CompileError[] { if (!aliasNode) { return []; } @@ -109,7 +110,7 @@ export class TableInterpreter implements ElementInterpreter { return []; } - private interpretSettingList (settings?: ListExpressionNode): CompileError[] { + private interpretSettingList(settings?: ListExpressionNode): CompileError[] { const settingMap = aggregateSettingList(settings).getValue(); this.table.headerColor = settingMap[SettingName.HeaderColor]?.length @@ -125,7 +126,7 @@ export class TableInterpreter implements ElementInterpreter { return []; } - private interpretBody (body: BlockExpressionNode): CompileError[] { + private interpretBody(body: BlockExpressionNode): CompileError[] { const [fields, subs] = partition(body.body, (e) => e instanceof FunctionApplicationNode || e instanceof PartialInjectionNode); return [ ...this.interpretFields(fields as (FunctionApplicationNode | PartialInjectionNode)[]), @@ -133,7 +134,7 @@ export class TableInterpreter implements ElementInterpreter { ]; } - private interpretSubElements (subs: ElementDeclarationNode[]): CompileError[] { + private interpretSubElements(subs: ElementDeclarationNode[]): CompileError[] { return subs.flatMap((sub) => { switch (sub.type?.value.toLowerCase()) { case ElementKind.Note: @@ -150,20 +151,23 @@ export class TableInterpreter implements ElementInterpreter { case ElementKind.Indexes: return this.interpretIndexes(sub); + case ElementKind.Constraints: + return this.interpretConstraints(sub); + default: return []; } }); } - private interpretInjection (injection: PartialInjectionNode, order: number) { + private interpretInjection(injection: PartialInjectionNode, order: number) { const partial: Partial = { order, token: getTokenPosition(injection) }; partial.name = injection.partial!.variable!.value; this.table.partials!.push(partial as TablePartialInjection); return []; } - private interpretFields (fields: (FunctionApplicationNode | PartialInjectionNode)[]): CompileError[] { + private interpretFields(fields: (FunctionApplicationNode | PartialInjectionNode)[]): CompileError[] { const symbolTableEntries = this.declarationNode.symbol?.symbolTable ? [...this.declarationNode.symbol.symbolTable.entries()] : []; @@ -188,7 +192,7 @@ export class TableInterpreter implements ElementInterpreter { ]; } - private interpretColumn (field: FunctionApplicationNode): CompileError[] { + private interpretColumn(field: FunctionApplicationNode): CompileError[] { const errors: CompileError[] = []; const column: Partial = {}; @@ -205,7 +209,8 @@ export class TableInterpreter implements ElementInterpreter { const settings = field.args.slice(1); if (last(settings) instanceof ListExpressionNode) { const settingMap = aggregateSettingList(settings.pop() as ListExpressionNode).getValue(); - column.pk = !!settingMap[SettingName.PK]?.length || !!settingMap[SettingName.PKey]?.length; + + column.pk = !!settingMap[SettingName.PK]?.length || !!settingMap[SettingName.PrimaryKey]?.length; column.increment = !!settingMap[SettingName.Increment]?.length; column.unique = !!settingMap[SettingName.Unique]?.length; // eslint-disable-next-line no-nested-ternary @@ -215,11 +220,13 @@ export class TableInterpreter implements ElementInterpreter { ? false : undefined; column.dbdefault = processDefaultValue(settingMap[SettingName.Default]?.at(0)?.value); + const noteNode = settingMap[SettingName.Note]?.at(0); column.note = noteNode && { value: extractQuotedStringToken(noteNode.value).map(normalizeNoteContent).unwrap(), token: getTokenPosition(noteNode), }; + const refs = settingMap[SettingName.Ref] || []; column.inline_refs = refs.flatMap((ref) => { const [referredSymbol] = getColumnSymbolsOfRefOperand((ref.value as PrefixExpressionNode).expression!); @@ -280,6 +287,16 @@ export class TableInterpreter implements ElementInterpreter { return errs.length === 0 ? inlineRef : []; }); + + const constraintNodes = settingMap[SettingName.Constraint] || []; + column.constraints = constraintNodes.map((constraintNode) => { + const token = getTokenPosition(constraintNode); + const expression = (constraintNode.value as FunctionExpressionNode).value?.value!; + return { + token, + expression, + }; + }); } column.pk ||= settings.some((setting) => extractVariableFromExpression(setting).unwrap().toLowerCase() === 'pk'); @@ -292,7 +309,7 @@ export class TableInterpreter implements ElementInterpreter { return errors; } - private interpretIndexes (indexes: ElementDeclarationNode): CompileError[] { + private interpretIndexes(indexes: ElementDeclarationNode): CompileError[] { this.table.indexes!.push(...(indexes.body as BlockExpressionNode).body.map((_indexField) => { const index: Partial = { columns: [] }; @@ -349,7 +366,26 @@ export class TableInterpreter implements ElementInterpreter { return []; } - private registerInlineRefToEnv (column: FunctionApplicationNode, referredSymbol: ColumnSymbol, inlineRef: InlineRef, ref: AttributeNode): CompileError[] { + private interpretConstraints(constraints: ElementDeclarationNode): CompileError[] { + this.table.constraints!.push(...(constraints.body as BlockExpressionNode).body.map((_constraintField) => { + const constraint: Partial = {}; + const constraintField = _constraintField as FunctionApplicationNode; + constraint.token = getTokenPosition(constraintField); + + if (constraintField.args[0] instanceof ListExpressionNode) { + const settingMap = aggregateSettingList(constraintField.args[0] as ListExpressionNode).getValue(); + constraint.name = extractQuotedStringToken(settingMap[SettingName.Name]?.at(0)?.value).unwrap_or(undefined); + } + + constraint.expression = (constraintField.callee as FunctionExpressionNode).value?.value!; + + return constraint as Constraint; + })); + + return []; + } + + private registerInlineRefToEnv(column: FunctionApplicationNode, referredSymbol: ColumnSymbol, inlineRef: InlineRef, ref: AttributeNode): CompileError[] { const refId = getRefId(column.symbol as ColumnSymbol, referredSymbol); if (this.env.refIds[refId]) { return [ diff --git a/packages/dbml-parse/src/lib/interpreter/elementInterpreter/tablePartial.ts b/packages/dbml-parse/src/lib/interpreter/elementInterpreter/tablePartial.ts index 63810b50d..8fe71bdd9 100644 --- a/packages/dbml-parse/src/lib/interpreter/elementInterpreter/tablePartial.ts +++ b/packages/dbml-parse/src/lib/interpreter/elementInterpreter/tablePartial.ts @@ -1,10 +1,11 @@ import { last, head, partition } from 'lodash'; import { - Column, ElementInterpreter, Index, InlineRef, + Column, Constraint, ElementInterpreter, Index, InlineRef, InterpreterDatabase, TablePartial, } from '../types'; import { BlockExpressionNode, CallExpressionNode, ElementDeclarationNode, FunctionApplicationNode, + FunctionExpressionNode, ListExpressionNode, PrefixExpressionNode, SyntaxNode, } from '../../parser/nodes'; import { @@ -26,16 +27,16 @@ export class TablePartialInterpreter implements ElementInterpreter { private tablePartial: Partial; private pkColumns: Column[]; - constructor (declarationNode: ElementDeclarationNode, env: InterpreterDatabase) { + constructor(declarationNode: ElementDeclarationNode, env: InterpreterDatabase) { this.declarationNode = declarationNode; this.env = env; this.tablePartial = { - name: undefined, fields: [], token: undefined, indexes: [], + name: undefined, fields: [], token: undefined, indexes: [], constraints: [], }; this.pkColumns = []; } - interpret (): CompileError[] { + interpret(): CompileError[] { this.tablePartial.token = getTokenPosition(this.declarationNode); this.env.tablePartials.set(this.declarationNode, this.tablePartial as TablePartial); @@ -63,7 +64,7 @@ export class TablePartialInterpreter implements ElementInterpreter { return errors; } - private interpretName (nameNode: SyntaxNode): CompileError[] { + private interpretName(nameNode: SyntaxNode): CompileError[] { const { name } = extractElementName(nameNode); this.tablePartial.name = name; @@ -71,7 +72,7 @@ export class TablePartialInterpreter implements ElementInterpreter { return []; } - private interpretSettingList (settings?: ListExpressionNode): CompileError[] { + private interpretSettingList(settings?: ListExpressionNode): CompileError[] { const settingMap = aggregateSettingList(settings).getValue(); const firstHeaderColor = head(settingMap[SettingName.HeaderColor]); @@ -88,7 +89,7 @@ export class TablePartialInterpreter implements ElementInterpreter { return []; } - private interpretBody (body: BlockExpressionNode): CompileError[] { + private interpretBody(body: BlockExpressionNode): CompileError[] { const [fields, subs] = partition(body.body, (e) => e instanceof FunctionApplicationNode); return [ ...this.interpretFields(fields as FunctionApplicationNode[]), @@ -96,7 +97,7 @@ export class TablePartialInterpreter implements ElementInterpreter { ]; } - private interpretSubElements (subs: ElementDeclarationNode[]): CompileError[] { + private interpretSubElements(subs: ElementDeclarationNode[]): CompileError[] { return subs.flatMap((sub) => { switch (sub.type?.value.toLowerCase()) { case ElementKind.Note: @@ -113,17 +114,20 @@ export class TablePartialInterpreter implements ElementInterpreter { case ElementKind.Indexes: return this.interpretIndexes(sub); + case ElementKind.Constraints: + return this.interpretConstraints(sub); + default: return []; } }); } - private interpretFields (fields: FunctionApplicationNode[]): CompileError[] { + private interpretFields(fields: FunctionApplicationNode[]): CompileError[] { return fields.flatMap((field) => this.interpretColumn(field)); } - private interpretColumn (field: FunctionApplicationNode): CompileError[] { + private interpretColumn(field: FunctionApplicationNode): CompileError[] { const errors: CompileError[] = []; const column: Partial = {}; @@ -140,7 +144,8 @@ export class TablePartialInterpreter implements ElementInterpreter { const settings = field.args.slice(1); if (last(settings) instanceof ListExpressionNode) { const settingMap = aggregateSettingList(settings.pop() as ListExpressionNode).getValue(); - column.pk = !!settingMap[SettingName.PK]?.length || !!settingMap[SettingName.PKey]?.length; + + column.pk = !!settingMap[SettingName.PK]?.length || !!settingMap[SettingName.PrimaryKey]?.length; column.increment = !!settingMap[SettingName.Increment]?.length; column.unique = !!settingMap[SettingName.Unique]?.length; // eslint-disable-next-line no-nested-ternary @@ -152,11 +157,13 @@ export class TablePartialInterpreter implements ElementInterpreter { : undefined ); column.dbdefault = processDefaultValue(settingMap[SettingName.Default]?.at(0)?.value); + const noteNode = settingMap[SettingName.Note]?.at(0); column.note = noteNode && { value: extractQuotedStringToken(noteNode.value).map(normalizeNoteContent).unwrap(), token: getTokenPosition(noteNode), }; + const refs = settingMap[SettingName.Ref] || []; column.inline_refs = refs.flatMap((ref) => { const [referredSymbol] = getColumnSymbolsOfRefOperand((ref.value as PrefixExpressionNode).expression!); @@ -204,6 +211,16 @@ export class TablePartialInterpreter implements ElementInterpreter { return inlineRef; }); + + const constraintNodes = settingMap[SettingName.Constraint] || []; + column.constraints = constraintNodes.map((constraintNode) => { + const token = getTokenPosition(constraintNode); + const expression = (constraintNode.value as FunctionExpressionNode).value?.value!; + return { + token, + expression, + }; + }); } column.pk ||= settings.some((setting) => extractVariableFromExpression(setting).unwrap().toLowerCase() === 'pk'); @@ -216,7 +233,7 @@ export class TablePartialInterpreter implements ElementInterpreter { return errors; } - private interpretIndexes (indexes: ElementDeclarationNode): CompileError[] { + private interpretIndexes(indexes: ElementDeclarationNode): CompileError[] { this.tablePartial.indexes!.push(...(indexes.body as BlockExpressionNode).body.map((_indexField) => { const index: Partial = { columns: [] }; @@ -272,4 +289,23 @@ export class TablePartialInterpreter implements ElementInterpreter { return []; } + + private interpretConstraints(constraints: ElementDeclarationNode): CompileError[] { + this.tablePartial.constraints!.push(...(constraints.body as BlockExpressionNode).body.map((_constraintField) => { + const constraint: Partial = {}; + const constraintField = _constraintField as FunctionApplicationNode; + constraint.token = getTokenPosition(constraintField); + + if (constraintField.args[0] instanceof ListExpressionNode) { + const settingMap = aggregateSettingList(constraintField.args[0] as ListExpressionNode).getValue(); + constraint.name = extractQuotedStringToken(settingMap[SettingName.Name]?.at(0)?.value).unwrap_or(undefined); + } + + constraint.expression = (constraintField.callee as FunctionExpressionNode).value?.value!; + + return constraint as Constraint; + })); + + return []; + } } diff --git a/packages/dbml-parse/src/lib/interpreter/types.ts b/packages/dbml-parse/src/lib/interpreter/types.ts index 1feb6d77a..98a4df8c5 100644 --- a/packages/dbml-parse/src/lib/interpreter/types.ts +++ b/packages/dbml-parse/src/lib/interpreter/types.ts @@ -46,6 +46,7 @@ export interface Table { schemaName: null | string; alias: string | null; fields: Column[]; + constraints: Constraint[]; partials: TablePartialInjection[]; token: TokenPosition; indexes: Index[]; @@ -74,6 +75,7 @@ export interface Column { type: ColumnType; token: TokenPosition; inline_refs: InlineRef[]; + constraints: Constraint[]; pk?: boolean; dbdefault?: { type: 'number' | 'string' | 'boolean' | 'expression'; @@ -105,6 +107,12 @@ export interface Index { type?: string; } +export interface Constraint { + token: TokenPosition; + expression: string; + name?: string; +} + export interface InlineRef { schemaName: string | null; tableName: string; @@ -183,6 +191,7 @@ export interface TablePartial { token: TokenPosition; indexes: Index[]; headerColor?: string; + constraints: Constraint[]; note?: { value: string; token: TokenPosition; @@ -198,18 +207,18 @@ export interface TablePartialInjection { export type Project = | Record | { - name: string | null; - tables: Table[]; - refs: Ref[]; - enums: Enum[]; - tableGroups: TableGroup[]; - tablePartials: TablePartial[]; - note?: { - value: string; - token: TokenPosition; - }; + name: string | null; + tables: Table[]; + refs: Ref[]; + enums: Enum[]; + tableGroups: TableGroup[]; + tablePartials: TablePartial[]; + note?: { + value: string; token: TokenPosition; - [ - index: string & Omit - ]: string; }; + token: TokenPosition; + [ + index: string & Omit + ]: string; + }; diff --git a/packages/dbml-parse/src/lib/lexer/lexer.ts b/packages/dbml-parse/src/lib/lexer/lexer.ts index c389ccfb9..f053c0a9e 100644 --- a/packages/dbml-parse/src/lib/lexer/lexer.ts +++ b/packages/dbml-parse/src/lib/lexer/lexer.ts @@ -330,7 +330,7 @@ export default class Lexer { functionExpression() { this.consumeUntil(SyntaxTokenKind.FUNCTION_EXPRESSION, '`', { - allowNewline: false, + allowNewline: true, allowEof: false, raw: true, }); @@ -478,6 +478,8 @@ export default class Lexer { return "'"; case '"': return '"'; + case '`': + return '`'; case '0': return '\0'; case 'b': diff --git a/packages/dbml-parse/src/lib/parser/nodes.ts b/packages/dbml-parse/src/lib/parser/nodes.ts index 64efcf89d..888320df6 100644 --- a/packages/dbml-parse/src/lib/parser/nodes.ts +++ b/packages/dbml-parse/src/lib/parser/nodes.ts @@ -220,7 +220,7 @@ export class AttributeNode extends SyntaxNode { } } -// A normal form expression is the regular expression we encounter in most programming languages +// A normal expression is the regular expression we encounter in most programming languages // ex. 1 + 2, 1 * 2, (1 / 3) - 4, a.b // Function application and literal element expressions are not considered one export type NormalExpressionNode = diff --git a/packages/dbml-parse/src/services/suggestions/provider.ts b/packages/dbml-parse/src/services/suggestions/provider.ts index 9e4de3ba5..ad36a4576 100644 --- a/packages/dbml-parse/src/services/suggestions/provider.ts +++ b/packages/dbml-parse/src/services/suggestions/provider.ts @@ -317,7 +317,7 @@ function suggestAttributeName (compiler: Compiler, offset: number): CompletionLi suggestions: [ ...[ SettingName.PK, - SettingName.PKey, + SettingName.PrimaryKey, SettingName.Null, SettingName.NotNull, SettingName.Increment, @@ -329,7 +329,7 @@ function suggestAttributeName (compiler: Compiler, offset: number): CompletionLi insertTextRules: CompletionItemInsertTextRule.KeepWhitespace, range: undefined as any, })), - ...[SettingName.Ref, SettingName.Default, SettingName.Note].map((name) => ({ + ...[SettingName.Ref, SettingName.Default, SettingName.Note, SettingName.Constraint].map((name) => ({ label: name, insertText: `${name}: `, kind: CompletionItemKind.Property, @@ -383,6 +383,18 @@ function suggestAttributeName (compiler: Compiler, offset: number): CompletionLi range: undefined as any, })), }; + case ScopeKind.CONSTRAINTS: + return { + suggestions: [ + SettingName.Name, + ].map((name) => ({ + label: name, + insertText: `${name}: `, + kind: CompletionItemKind.Property, + insertTextRules: CompletionItemInsertTextRule.KeepWhitespace, + range: undefined as any, + })), + }; default: break; } @@ -522,7 +534,7 @@ function suggestInColumn ( offset: number, container?: FunctionApplicationNode, ): CompletionList { - const elements = ['Note', 'indexes']; + const elements = ['Note', 'indexes', 'constraints']; if (!container?.callee) { return { suggestions: elements.map((name) => ({ diff --git a/packages/dbml-parse/tests/interpreter/input/constraints.in.dbml b/packages/dbml-parse/tests/interpreter/input/constraints.in.dbml new file mode 100644 index 000000000..3706b5de6 --- /dev/null +++ b/packages/dbml-parse/tests/interpreter/input/constraints.in.dbml @@ -0,0 +1,29 @@ +TablePartial WithMoney { + balance int [constraint: `balance > 0`] + + constraints { + `balance < 10000000` [name: 'not_too_much_money'] + } +} + +Table User { + ~WithMoney + + name TEXT [constraint: `LEN(name) > 0`] + email TEXT + + constraints { + `LEN(name) < 256` [name: 'name_not_too_long'] + `REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$')` + } +} + +Table User2 { + ~WithMoney + + balance int +} + +Table User3 { + balance int [constraint: `balance > 0`, constraint: `balance < 10000000`] +} diff --git a/packages/dbml-parse/tests/interpreter/output/array_type.out.json b/packages/dbml-parse/tests/interpreter/output/array_type.out.json index cffd8afd7..0ce7a8fdc 100644 --- a/packages/dbml-parse/tests/interpreter/output/array_type.out.json +++ b/packages/dbml-parse/tests/interpreter/output/array_type.out.json @@ -52,7 +52,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "schedule", @@ -77,7 +78,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": false + "not_null": false, + "constraints": [] } ], "token": { @@ -93,7 +95,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "tictactoe", @@ -137,7 +140,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/column_caller_type.out.json b/packages/dbml-parse/tests/interpreter/output/column_caller_type.out.json index ab631ef2a..348885956 100644 --- a/packages/dbml-parse/tests/interpreter/output/column_caller_type.out.json +++ b/packages/dbml-parse/tests/interpreter/output/column_caller_type.out.json @@ -135,7 +135,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/comment.out.json b/packages/dbml-parse/tests/interpreter/output/comment.out.json index 1bd37621d..4cfa5d311 100644 --- a/packages/dbml-parse/tests/interpreter/output/comment.out.json +++ b/packages/dbml-parse/tests/interpreter/output/comment.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "user_id", @@ -53,7 +54,8 @@ "pk": false, "increment": false, "unique": true, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "status", @@ -92,7 +94,8 @@ "column": 45 } } - } + }, + "constraints": [] }, { "name": "created_at", @@ -131,7 +134,8 @@ "column": 49 } } - } + }, + "constraints": [] } ], "token": { @@ -215,7 +219,8 @@ } } ], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/constraints.out.json b/packages/dbml-parse/tests/interpreter/output/constraints.out.json new file mode 100644 index 000000000..757d26d09 --- /dev/null +++ b/packages/dbml-parse/tests/interpreter/output/constraints.out.json @@ -0,0 +1,365 @@ +{ + "schemas": [], + "tables": [ + { + "name": "User", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "name", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 174, + "line": 12, + "column": 3 + }, + "end": { + "offset": 213, + "line": 12, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 185, + "line": 12, + "column": 14 + }, + "end": { + "offset": 212, + "line": 12, + "column": 41 + } + }, + "expression": "LEN(name) > 0" + } + ] + }, + { + "name": "email", + "type": { + "schemaName": null, + "type_name": "TEXT", + "args": null + }, + "token": { + "start": { + "offset": 216, + "line": 13, + "column": 3 + }, + "end": { + "offset": 226, + "line": 13, + "column": 13 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 145, + "line": 9, + "column": 1 + }, + "end": { + "offset": 377, + "line": 19, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 160, + "line": 10, + "column": 3 + }, + "end": { + "offset": 170, + "line": 10, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [ + { + "token": { + "start": { + "offset": 248, + "line": 16, + "column": 5 + }, + "end": { + "offset": 293, + "line": 16, + "column": 50 + } + }, + "name": "name_not_too_long", + "expression": "LEN(name) < 256" + }, + { + "token": { + "start": { + "offset": 298, + "line": 17, + "column": 5 + }, + "end": { + "offset": 371, + "line": 17, + "column": 78 + } + }, + "expression": "REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$')" + } + ] + }, + { + "name": "User2", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 411, + "line": 24, + "column": 3 + }, + "end": { + "offset": 422, + "line": 24, + "column": 14 + } + }, + "inline_refs": [], + "pk": false, + "unique": false + } + ], + "token": { + "start": { + "offset": 379, + "line": 21, + "column": 1 + }, + "end": { + "offset": 424, + "line": 25, + "column": 2 + } + }, + "indexes": [], + "partials": [ + { + "order": 0, + "token": { + "start": { + "offset": 395, + "line": 22, + "column": 3 + }, + "end": { + "offset": 405, + "line": 22, + "column": 13 + } + }, + "name": "WithMoney" + } + ], + "constraints": [] + }, + { + "name": "User3", + "schemaName": null, + "alias": null, + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 442, + "line": 28, + "column": 3 + }, + "end": { + "offset": 515, + "line": 28, + "column": 76 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 455, + "line": 28, + "column": 16 + }, + "end": { + "offset": 480, + "line": 28, + "column": 41 + } + }, + "expression": "balance > 0" + }, + { + "token": { + "start": { + "offset": 482, + "line": 28, + "column": 43 + }, + "end": { + "offset": 514, + "line": 28, + "column": 75 + } + }, + "expression": "balance < 10000000" + } + ] + } + ], + "token": { + "start": { + "offset": 426, + "line": 27, + "column": 1 + }, + "end": { + "offset": 517, + "line": 29, + "column": 2 + } + }, + "indexes": [], + "partials": [], + "constraints": [] + } + ], + "notes": [], + "refs": [], + "enums": [], + "tableGroups": [], + "aliases": [], + "project": {}, + "tablePartials": [ + { + "name": "WithMoney", + "fields": [ + { + "name": "balance", + "type": { + "schemaName": null, + "type_name": "int", + "args": null + }, + "token": { + "start": { + "offset": 27, + "line": 2, + "column": 3 + }, + "end": { + "offset": 66, + "line": 2, + "column": 42 + } + }, + "inline_refs": [], + "pk": false, + "increment": false, + "unique": false, + "constraints": [ + { + "token": { + "start": { + "offset": 40, + "line": 2, + "column": 16 + }, + "end": { + "offset": 65, + "line": 2, + "column": 41 + } + }, + "expression": "balance > 0" + } + ] + } + ], + "token": { + "start": { + "offset": 0, + "line": 1, + "column": 1 + }, + "end": { + "offset": 143, + "line": 7, + "column": 2 + } + }, + "indexes": [], + "constraints": [ + { + "token": { + "start": { + "offset": 88, + "line": 5, + "column": 5 + }, + "end": { + "offset": 137, + "line": 5, + "column": 54 + } + }, + "name": "not_too_much_money", + "expression": "balance < 10000000" + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/dbml-parse/tests/interpreter/output/default_tables.out.json b/packages/dbml-parse/tests/interpreter/output/default_tables.out.json index f030e3e67..fc3a9b7c6 100644 --- a/packages/dbml-parse/tests/interpreter/output/default_tables.out.json +++ b/packages/dbml-parse/tests/interpreter/output/default_tables.out.json @@ -32,7 +32,8 @@ "dbdefault": { "type": "number", "value": 123 - } + }, + "constraints": [] }, { "name": "user_id", @@ -57,7 +58,8 @@ "pk": false, "increment": false, "unique": true, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "status", @@ -85,7 +87,8 @@ "dbdefault": { "value": "Completed", "type": "string" - } + }, + "constraints": [] }, { "name": "created_at", @@ -113,7 +116,8 @@ "dbdefault": { "value": "now()", "type": "expression" - } + }, + "constraints": [] } ], "token": { @@ -129,7 +133,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "order_items", @@ -219,7 +224,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "products", @@ -248,7 +254,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -276,7 +283,8 @@ "dbdefault": { "value": "null", "type": "boolean" - } + }, + "constraints": [] }, { "name": "merchant_id", @@ -305,7 +313,8 @@ "dbdefault": { "type": "number", "value": -1 - } + }, + "constraints": [] }, { "name": "price", @@ -333,7 +342,8 @@ "dbdefault": { "type": "number", "value": -123.12 - } + }, + "constraints": [] }, { "name": "stock", @@ -361,7 +371,8 @@ "dbdefault": { "value": "true", "type": "boolean" - } + }, + "constraints": [] }, { "name": "expiration", @@ -389,7 +400,8 @@ "dbdefault": { "value": "current_date + interval 1 year", "type": "expression" - } + }, + "constraints": [] } ], "token": { @@ -405,7 +417,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/enum_tables.out.json b/packages/dbml-parse/tests/interpreter/output/enum_tables.out.json index 8dae1f856..7f7a96ddb 100644 --- a/packages/dbml-parse/tests/interpreter/output/enum_tables.out.json +++ b/packages/dbml-parse/tests/interpreter/output/enum_tables.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "status", @@ -67,7 +68,8 @@ "column": 51 } } - } + }, + "constraints": [] } ], "token": { @@ -83,7 +85,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "orders", @@ -173,7 +176,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/general_schema.out.json b/packages/dbml-parse/tests/interpreter/output/general_schema.out.json index 1747bd132..6cc34e44d 100644 --- a/packages/dbml-parse/tests/interpreter/output/general_schema.out.json +++ b/packages/dbml-parse/tests/interpreter/output/general_schema.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": true, - "unique": false + "unique": false, + "constraints": [] }, { "name": "user_id", @@ -53,7 +54,8 @@ "pk": false, "increment": false, "unique": true, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "status", @@ -116,6 +118,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#fff" }, { @@ -195,7 +198,8 @@ "dbdefault": { "type": "number", "value": 1 - } + }, + "constraints": [] } ], "token": { @@ -211,7 +215,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "products", @@ -240,7 +245,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -288,7 +294,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "price", @@ -362,7 +369,8 @@ "dbdefault": { "value": "now()", "type": "expression" - } + }, + "constraints": [] } ], "token": { @@ -465,7 +473,8 @@ "type": "hash" } ], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "users", @@ -494,7 +503,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "full_name", @@ -541,7 +551,8 @@ "inline_refs": [], "pk": false, "increment": false, - "unique": true + "unique": true, + "constraints": [] }, { "name": "gender", @@ -649,7 +660,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "merchants", @@ -678,7 +690,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "merchant_name", @@ -786,7 +799,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "countries", @@ -815,7 +829,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -877,7 +892,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/header_color_tables.out.json b/packages/dbml-parse/tests/interpreter/output/header_color_tables.out.json index 562dbded5..7af4a1aa9 100644 --- a/packages/dbml-parse/tests/interpreter/output/header_color_tables.out.json +++ b/packages/dbml-parse/tests/interpreter/output/header_color_tables.out.json @@ -113,6 +113,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#0065ab" } ], diff --git a/packages/dbml-parse/tests/interpreter/output/index_table_partial.out.json b/packages/dbml-parse/tests/interpreter/output/index_table_partial.out.json index 592163386..dd618cb2c 100644 --- a/packages/dbml-parse/tests/interpreter/output/index_table_partial.out.json +++ b/packages/dbml-parse/tests/interpreter/output/index_table_partial.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -61,7 +62,8 @@ }, "name": "user_partial" } - ] + ], + "constraints": [] } ], "notes": [], @@ -119,7 +121,8 @@ "inline_refs": [], "pk": false, "increment": false, - "unique": true + "unique": true, + "constraints": [] }, { "name": "gender", @@ -236,7 +239,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -547,7 +551,8 @@ } } } - ] + ], + "constraints": [] } ] } \ No newline at end of file diff --git a/packages/dbml-parse/tests/interpreter/output/index_tables.out.json b/packages/dbml-parse/tests/interpreter/output/index_tables.out.json index dec030755..ffcbb251c 100644 --- a/packages/dbml-parse/tests/interpreter/output/index_tables.out.json +++ b/packages/dbml-parse/tests/interpreter/output/index_tables.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "full_name", @@ -75,7 +76,8 @@ "inline_refs": [], "pk": false, "increment": false, - "unique": true + "unique": true, + "constraints": [] }, { "name": "gender", @@ -192,7 +194,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -504,7 +507,8 @@ } } ], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/multi_notes.out.json b/packages/dbml-parse/tests/interpreter/output/multi_notes.out.json index 3268db171..8bbcf0cc1 100644 --- a/packages/dbml-parse/tests/interpreter/output/multi_notes.out.json +++ b/packages/dbml-parse/tests/interpreter/output/multi_notes.out.json @@ -43,7 +43,8 @@ "column": 40 } } - } + }, + "constraints": [] }, { "name": "status", @@ -106,6 +107,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "Note on table orders", "token": { @@ -579,7 +581,8 @@ } } ], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/multiline_string.out.json b/packages/dbml-parse/tests/interpreter/output/multiline_string.out.json index e10d77d69..223ecdece 100644 --- a/packages/dbml-parse/tests/interpreter/output/multiline_string.out.json +++ b/packages/dbml-parse/tests/interpreter/output/multiline_string.out.json @@ -43,7 +43,8 @@ "column": 6 } } - } + }, + "constraints": [] } ], "token": { @@ -59,7 +60,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/negative_number.out.json b/packages/dbml-parse/tests/interpreter/output/negative_number.out.json index 4087b2cd2..3ac2028d1 100644 --- a/packages/dbml-parse/tests/interpreter/output/negative_number.out.json +++ b/packages/dbml-parse/tests/interpreter/output/negative_number.out.json @@ -32,7 +32,8 @@ "dbdefault": { "type": "number", "value": -2 - } + }, + "constraints": [] }, { "name": "id2", @@ -60,7 +61,8 @@ "dbdefault": { "type": "number", "value": -2 - } + }, + "constraints": [] }, { "name": "id3", @@ -88,7 +90,8 @@ "dbdefault": { "type": "number", "value": 7.2225 - } + }, + "constraints": [] } ], "token": { @@ -104,7 +107,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "b", @@ -165,7 +169,8 @@ }, "name": "P1" } - ] + ], + "constraints": [] } ], "notes": [], @@ -204,7 +209,8 @@ "dbdefault": { "type": "number", "value": -2 - } + }, + "constraints": [] }, { "name": "id2", @@ -232,7 +238,8 @@ "dbdefault": { "type": "number", "value": -2 - } + }, + "constraints": [] }, { "name": "id3", @@ -260,7 +267,8 @@ "dbdefault": { "type": "number", "value": -7.2225 - } + }, + "constraints": [] } ], "token": { @@ -275,7 +283,8 @@ "column": 2 } }, - "indexes": [] + "indexes": [], + "constraints": [] } ] } \ No newline at end of file diff --git a/packages/dbml-parse/tests/interpreter/output/note_normalize.out.json b/packages/dbml-parse/tests/interpreter/output/note_normalize.out.json index 38936c9e8..e5546af5a 100644 --- a/packages/dbml-parse/tests/interpreter/output/note_normalize.out.json +++ b/packages/dbml-parse/tests/interpreter/output/note_normalize.out.json @@ -90,6 +90,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "# Heading 1\n code block\n# Heading 2\n * 1\n * 1\n", "token": { @@ -133,7 +134,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "username", @@ -219,6 +221,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "# Heading 1\n code block\n# Heading 2\n * 1\n * 2\n", "token": { @@ -262,7 +265,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "title", @@ -324,7 +328,8 @@ "column": 6 } } - } + }, + "constraints": [] }, { "name": "user_id", @@ -410,6 +415,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "# Heading 1\n code block\n# Heading 2\n * 1\n * 1.1\n * 1.2\n * 2\n", "token": { diff --git a/packages/dbml-parse/tests/interpreter/output/note_normalize_with_top_empty_lines.out.json b/packages/dbml-parse/tests/interpreter/output/note_normalize_with_top_empty_lines.out.json index ebc7946af..96f49032f 100644 --- a/packages/dbml-parse/tests/interpreter/output/note_normalize_with_top_empty_lines.out.json +++ b/packages/dbml-parse/tests/interpreter/output/note_normalize_with_top_empty_lines.out.json @@ -90,6 +90,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "# Heading 1\n code block\n# Heading 2\n * 1\n * 1\n", "token": { @@ -133,7 +134,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "username", @@ -219,6 +221,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "# Heading 1\n code block\n# Heading 2\n * 1\n * 2\n", "token": { @@ -262,7 +265,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "title", @@ -324,7 +328,8 @@ "column": 6 } } - } + }, + "constraints": [] }, { "name": "user_id", @@ -410,6 +415,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "# Heading 1\n code block\n# Heading 2\n * 1\n * 1.1\n * 1.2\n * 2\n", "token": { diff --git a/packages/dbml-parse/tests/interpreter/output/old_undocumented_syntax.out.json b/packages/dbml-parse/tests/interpreter/output/old_undocumented_syntax.out.json index 9e4f000f4..17f7b4b14 100644 --- a/packages/dbml-parse/tests/interpreter/output/old_undocumented_syntax.out.json +++ b/packages/dbml-parse/tests/interpreter/output/old_undocumented_syntax.out.json @@ -29,7 +29,8 @@ "pk": true, "increment": true, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "store_id", @@ -54,7 +55,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "first_name", @@ -79,7 +81,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "last_name", @@ -108,7 +111,8 @@ "dbdefault": { "value": "false", "type": "boolean" - } + }, + "constraints": [] }, { "name": "email", @@ -136,7 +140,8 @@ "dbdefault": { "value": "null", "type": "boolean" - } + }, + "constraints": [] }, { "name": "address_id", @@ -161,7 +166,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "active", @@ -190,7 +196,8 @@ "dbdefault": { "value": "true", "type": "boolean" - } + }, + "constraints": [] }, { "name": "create_date", @@ -215,7 +222,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "last_update", @@ -243,7 +251,8 @@ "dbdefault": { "value": "CURRENT_TIMESTAMP", "type": "expression" - } + }, + "constraints": [] } ], "token": { @@ -259,7 +268,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "cities", @@ -288,7 +298,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -316,7 +327,8 @@ "dbdefault": { "value": "hello", "type": "string" - } + }, + "constraints": [] }, { "name": "country_id", @@ -356,6 +368,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "sasasa", "token": { @@ -437,7 +450,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "citites", @@ -553,7 +567,8 @@ } } ], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/primary_key.out.json b/packages/dbml-parse/tests/interpreter/output/primary_key.out.json index 4ceef5e07..6b4bf2b69 100644 --- a/packages/dbml-parse/tests/interpreter/output/primary_key.out.json +++ b/packages/dbml-parse/tests/interpreter/output/primary_key.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -44,7 +45,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/project.out.json b/packages/dbml-parse/tests/interpreter/output/project.out.json index b01854dce..b4444017b 100644 --- a/packages/dbml-parse/tests/interpreter/output/project.out.json +++ b/packages/dbml-parse/tests/interpreter/output/project.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": true, - "unique": false + "unique": false, + "constraints": [] }, { "name": "user_id", @@ -53,7 +54,8 @@ "pk": false, "increment": false, "unique": true, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "status", @@ -116,6 +118,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#fff" }, { @@ -195,7 +198,8 @@ "dbdefault": { "type": "number", "value": 1 - } + }, + "constraints": [] } ], "token": { @@ -211,7 +215,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "products", @@ -240,7 +245,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -288,7 +294,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "price", @@ -362,7 +369,8 @@ "dbdefault": { "value": "now()", "type": "expression" - } + }, + "constraints": [] } ], "token": { @@ -465,7 +473,8 @@ "type": "hash" } ], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "users", @@ -494,7 +503,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "full_name", @@ -541,7 +551,8 @@ "inline_refs": [], "pk": false, "increment": false, - "unique": true + "unique": true, + "constraints": [] }, { "name": "gender", @@ -649,7 +660,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "merchants", @@ -678,7 +690,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "merchant_name", @@ -786,7 +799,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "countries", @@ -815,7 +829,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -877,7 +892,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/ref_name_and_color_setting.out.json b/packages/dbml-parse/tests/interpreter/output/ref_name_and_color_setting.out.json index cee190a09..11ae543c5 100644 --- a/packages/dbml-parse/tests/interpreter/output/ref_name_and_color_setting.out.json +++ b/packages/dbml-parse/tests/interpreter/output/ref_name_and_color_setting.out.json @@ -67,6 +67,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#aaaaaa" }, { @@ -134,7 +135,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/ref_settings.out.json b/packages/dbml-parse/tests/interpreter/output/ref_settings.out.json index 08c162425..3180c93ed 100644 --- a/packages/dbml-parse/tests/interpreter/output/ref_settings.out.json +++ b/packages/dbml-parse/tests/interpreter/output/ref_settings.out.json @@ -66,7 +66,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "B", @@ -133,7 +134,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/referential_actions.out.json b/packages/dbml-parse/tests/interpreter/output/referential_actions.out.json index e26ec0a8b..0ca5af460 100644 --- a/packages/dbml-parse/tests/interpreter/output/referential_actions.out.json +++ b/packages/dbml-parse/tests/interpreter/output/referential_actions.out.json @@ -29,7 +29,8 @@ "pk": false, "increment": false, "unique": true, - "not_null": true + "not_null": true, + "constraints": [] }, { "name": "status", @@ -108,7 +109,8 @@ }, "name": "increment_id" } - ] + ], + "constraints": [] }, { "name": "order_items", @@ -210,7 +212,8 @@ "dbdefault": { "type": "number", "value": 1 - } + }, + "constraints": [] } ], "token": { @@ -226,7 +229,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "products", @@ -305,7 +309,8 @@ "dbdefault": { "value": "now()", "type": "expression" - } + }, + "constraints": [] } ], "token": { @@ -389,7 +394,8 @@ }, "name": "name" } - ] + ], + "constraints": [] }, { "name": "users", @@ -418,7 +424,8 @@ "inline_refs": [], "pk": false, "increment": false, - "unique": true + "unique": true, + "constraints": [] }, { "name": "date_of_birth", @@ -469,7 +476,8 @@ "dbdefault": { "value": "now()", "type": "expression" - } + }, + "constraints": [] }, { "name": "country_code", @@ -494,7 +502,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -543,7 +552,8 @@ }, "name": "name" } - ] + ], + "constraints": [] }, { "name": "countries", @@ -572,7 +582,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "continent_name", @@ -628,7 +639,8 @@ }, "name": "name" } - ] + ], + "constraints": [] } ], "notes": [], @@ -902,7 +914,8 @@ "inline_refs": [], "pk": true, "increment": true, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -917,7 +930,8 @@ "column": 2 } }, - "indexes": [] + "indexes": [], + "constraints": [] }, { "name": "name", @@ -958,7 +972,8 @@ "column": 2 } }, - "indexes": [] + "indexes": [], + "constraints": [] } ] } \ No newline at end of file diff --git a/packages/dbml-parse/tests/interpreter/output/sticky_notes.out.json b/packages/dbml-parse/tests/interpreter/output/sticky_notes.out.json index 3658d07f2..393daad54 100644 --- a/packages/dbml-parse/tests/interpreter/output/sticky_notes.out.json +++ b/packages/dbml-parse/tests/interpreter/output/sticky_notes.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "username", @@ -53,7 +54,8 @@ "pk": false, "increment": false, "unique": true, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -70,6 +72,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#3498DB" } ], diff --git a/packages/dbml-parse/tests/interpreter/output/table_group.out.json b/packages/dbml-parse/tests/interpreter/output/table_group.out.json index 38ce919c9..328367615 100644 --- a/packages/dbml-parse/tests/interpreter/output/table_group.out.json +++ b/packages/dbml-parse/tests/interpreter/output/table_group.out.json @@ -112,7 +112,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "merchants", @@ -254,7 +255,8 @@ ], "pk": false, "increment": false, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -270,7 +272,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/table_group_element.out.json b/packages/dbml-parse/tests/interpreter/output/table_group_element.out.json index c380bb6f2..f3be10809 100644 --- a/packages/dbml-parse/tests/interpreter/output/table_group_element.out.json +++ b/packages/dbml-parse/tests/interpreter/output/table_group_element.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -44,7 +45,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] }, { "name": "table2", @@ -73,7 +75,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -89,7 +92,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/table_group_settings.out.json b/packages/dbml-parse/tests/interpreter/output/table_group_settings.out.json index 4f983c4e2..382518d07 100644 --- a/packages/dbml-parse/tests/interpreter/output/table_group_settings.out.json +++ b/packages/dbml-parse/tests/interpreter/output/table_group_settings.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -44,7 +45,8 @@ } }, "indexes": [], - "partials": [] + "partials": [], + "constraints": [] } ], "notes": [], diff --git a/packages/dbml-parse/tests/interpreter/output/table_partial.out.json b/packages/dbml-parse/tests/interpreter/output/table_partial.out.json index 160dcaca4..8cc72b1c6 100644 --- a/packages/dbml-parse/tests/interpreter/output/table_partial.out.json +++ b/packages/dbml-parse/tests/interpreter/output/table_partial.out.json @@ -142,7 +142,8 @@ }, "name": "sameHeaderColor" } - ] + ], + "constraints": [] }, { "name": "country", @@ -172,7 +173,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -222,6 +224,7 @@ "name": "sameHeaderColor" } ], + "constraints": [], "note": { "value": "name is required", "token": { @@ -289,7 +292,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -339,6 +343,7 @@ "name": "sameHeaderColor" } ], + "constraints": [], "headerColor": "#17DACC", "note": { "value": "product must have price", @@ -478,6 +483,7 @@ "name": "sameHeaderColor" } ], + "constraints": [], "headerColor": "#08DAFF", "note": { "value": "merchants sell a lot", @@ -558,7 +564,8 @@ "column": 111 } } - } + }, + "constraints": [] } ], "token": { @@ -575,6 +582,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "a customer is a user?", "token": { @@ -799,7 +807,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "to_table_ref", @@ -844,7 +853,8 @@ ], "pk": false, "increment": false, - "unique": false + "unique": false, + "constraints": [] } ], "token": { @@ -910,6 +920,7 @@ } } ], + "constraints": [], "note": { "value": "this table is injected with TablePartial \"id\"", "token": { @@ -942,6 +953,7 @@ } }, "indexes": [], + "constraints": [], "headerColor": "#ccc", "note": { "value": "This TablePartial only used to inject headerColor for some tables", @@ -998,7 +1010,8 @@ "column": 2 } }, - "indexes": [] + "indexes": [], + "constraints": [] } ] } \ No newline at end of file diff --git a/packages/dbml-parse/tests/interpreter/output/table_settings.out.json b/packages/dbml-parse/tests/interpreter/output/table_settings.out.json index 67d10ce4c..b67b562f3 100644 --- a/packages/dbml-parse/tests/interpreter/output/table_settings.out.json +++ b/packages/dbml-parse/tests/interpreter/output/table_settings.out.json @@ -28,7 +28,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -68,6 +69,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#555" }, { @@ -97,7 +99,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -122,7 +125,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -139,6 +143,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "note": { "value": "name is required", "token": { @@ -182,7 +187,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "name", @@ -230,7 +236,8 @@ "pk": false, "increment": false, "unique": false, - "not_null": true + "not_null": true, + "constraints": [] } ], "token": { @@ -247,6 +254,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#17DACC", "note": { "value": "product must have price", @@ -291,7 +299,8 @@ "inline_refs": [], "pk": true, "increment": false, - "unique": false + "unique": false, + "constraints": [] }, { "name": "user_id", @@ -377,6 +386,7 @@ }, "indexes": [], "partials": [], + "constraints": [], "headerColor": "#08DAFF", "note": { "value": "merchants sell a lot", diff --git a/packages/dbml-parse/tests/lexer/input/function_expression.in.dbml b/packages/dbml-parse/tests/lexer/input/function_expression.in.dbml index fb62221ed..f8e95ca8d 100644 --- a/packages/dbml-parse/tests/lexer/input/function_expression.in.dbml +++ b/packages/dbml-parse/tests/lexer/input/function_expression.in.dbml @@ -2,4 +2,6 @@ ` id * 3 -` \ No newline at end of file +` + +`no escaped supported! this is an error! \`` diff --git a/packages/dbml-parse/tests/lexer/input/valid_escape_sequence.in.dbml b/packages/dbml-parse/tests/lexer/input/valid_escape_sequence.in.dbml index d45f3153c..b6d70a220 100644 --- a/packages/dbml-parse/tests/lexer/input/valid_escape_sequence.in.dbml +++ b/packages/dbml-parse/tests/lexer/input/valid_escape_sequence.in.dbml @@ -12,4 +12,7 @@ here!''' '''This is not a single line \ !''' '''This is also not a single line \ as there are spaces after \\''' +`This is single line + +` diff --git a/packages/dbml-parse/tests/lexer/output/function_expression.out.json b/packages/dbml-parse/tests/lexer/output/function_expression.out.json index 75a958ac6..b45cabd9d 100644 --- a/packages/dbml-parse/tests/lexer/output/function_expression.out.json +++ b/packages/dbml-parse/tests/lexer/output/function_expression.out.json @@ -102,273 +102,100 @@ } ], "leadingInvalid": [], - "trailingInvalid": [ - { - "kind": "", - "startPos": { - "offset": 18, - "line": 2, - "column": 0 - }, - "endPos": { - "offset": 20, - "line": 2, - "column": 2 - }, - "value": "`\r", - "leadingTrivia": [ - { - "kind": "", - "startPos": { - "offset": 17, - "line": 1, - "column": 1 - }, - "endPos": { - "offset": 18, - "line": 2, - "column": 0 - }, - "value": "\n", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 17, - "end": 18 - } - ], - "trailingTrivia": [ - { - "kind": "", - "startPos": { - "offset": 20, - "line": 2, - "column": 2 - }, - "endPos": { - "offset": 21, - "line": 3, - "column": 0 - }, - "value": "\n", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 20, - "end": 21 - } - ], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": true, - "start": 18, - "end": 20 - } - ], + "trailingInvalid": [], "isInvalid": false, "start": 9, "end": 13 }, { - "kind": "", + "kind": "", "startPos": { - "offset": 25, - "line": 3, - "column": 4 + "offset": 18, + "line": 2, + "column": 0 }, "endPos": { - "offset": 27, - "line": 3, - "column": 6 + "offset": 34, + "line": 4, + "column": 1 }, - "value": "id", + "value": "\r\n id * 3\r\n", "leadingTrivia": [ { - "kind": "", - "startPos": { - "offset": 21, - "line": 3, - "column": 0 - }, - "endPos": { - "offset": 22, - "line": 3, - "column": 1 - }, - "value": " ", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 21, - "end": 22 - }, - { - "kind": "", + "kind": "", "startPos": { - "offset": 22, - "line": 3, + "offset": 17, + "line": 1, "column": 1 }, "endPos": { - "offset": 23, - "line": 3, - "column": 2 - }, - "value": " ", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 22, - "end": 23 - }, - { - "kind": "", - "startPos": { - "offset": 23, - "line": 3, - "column": 2 - }, - "endPos": { - "offset": 24, - "line": 3, - "column": 3 - }, - "value": " ", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 23, - "end": 24 - }, - { - "kind": "", - "startPos": { - "offset": 24, - "line": 3, - "column": 3 - }, - "endPos": { - "offset": 25, - "line": 3, - "column": 4 - }, - "value": " ", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 24, - "end": 25 - } - ], - "trailingTrivia": [ - { - "kind": "", - "startPos": { - "offset": 27, - "line": 3, - "column": 6 - }, - "endPos": { - "offset": 28, - "line": 3, - "column": 7 + "offset": 18, + "line": 2, + "column": 0 }, - "value": " ", + "value": "\n", "leadingTrivia": [], "trailingTrivia": [], "leadingInvalid": [], "trailingInvalid": [], "isInvalid": false, - "start": 27, - "end": 28 + "start": 17, + "end": 18 } ], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 25, - "end": 27 - }, - { - "kind": "", - "startPos": { - "offset": 28, - "line": 3, - "column": 7 - }, - "endPos": { - "offset": 29, - "line": 3, - "column": 8 - }, - "value": "*", - "leadingTrivia": [], "trailingTrivia": [ { - "kind": "", + "kind": "", "startPos": { - "offset": 29, - "line": 3, - "column": 8 + "offset": 35, + "line": 4, + "column": 2 }, "endPos": { - "offset": 30, - "line": 3, - "column": 9 + "offset": 36, + "line": 5, + "column": 0 }, - "value": " ", + "value": "\n", "leadingTrivia": [], "trailingTrivia": [], "leadingInvalid": [], "trailingInvalid": [], "isInvalid": false, - "start": 29, - "end": 30 + "start": 35, + "end": 36 } ], "leadingInvalid": [], "trailingInvalid": [], "isInvalid": false, - "start": 28, - "end": 29 + "start": 18, + "end": 34 }, { - "kind": "", + "kind": "", "startPos": { - "offset": 30, - "line": 3, - "column": 9 + "offset": 38, + "line": 6, + "column": 0 }, "endPos": { - "offset": 31, - "line": 3, - "column": 10 + "offset": 81, + "line": 6, + "column": 43 }, - "value": "3", - "leadingTrivia": [], - "trailingTrivia": [ + "value": "no escaped supported! this is an error! \\", + "leadingTrivia": [ { "kind": "", "startPos": { - "offset": 32, - "line": 3, - "column": 11 + "offset": 37, + "line": 5, + "column": 1 }, "endPos": { - "offset": 33, - "line": 4, + "offset": 38, + "line": 6, "column": 0 }, "value": "\n", @@ -377,49 +204,50 @@ "leadingInvalid": [], "trailingInvalid": [], "isInvalid": false, - "start": 32, - "end": 33 + "start": 37, + "end": 38 } ], + "trailingTrivia": [], "leadingInvalid": [], "trailingInvalid": [ { "kind": "", "startPos": { - "offset": 33, - "line": 4, - "column": 0 + "offset": 81, + "line": 6, + "column": 43 }, "endPos": { - "offset": 34, - "line": 4, - "column": 1 + "offset": 84, + "line": 7, + "column": 0 }, - "value": "`", + "value": "`\r\n", "leadingTrivia": [], "trailingTrivia": [], "leadingInvalid": [], "trailingInvalid": [], "isInvalid": true, - "start": 33, - "end": 34 + "start": 81, + "end": 84 } ], "isInvalid": false, - "start": 30, - "end": 31 + "start": 38, + "end": 81 }, { "kind": "", "startPos": { - "offset": 34, - "line": 4, - "column": 1 + "offset": 84, + "line": 7, + "column": 0 }, "endPos": { - "offset": 34, - "line": 4, - "column": 1 + "offset": 84, + "line": 7, + "column": 0 }, "value": "", "leadingTrivia": [], @@ -427,109 +255,37 @@ "leadingInvalid": [], "trailingInvalid": [], "isInvalid": false, - "start": 34, - "end": 34 + "start": 84, + "end": 84 } ], "errors": [ - { - "code": 1003, - "diagnostic": "Invalid newline encountered while parsing", - "nodeOrToken": { - "kind": "", - "startPos": { - "offset": 18, - "line": 2, - "column": 0 - }, - "endPos": { - "offset": 20, - "line": 2, - "column": 2 - }, - "value": "`\r", - "leadingTrivia": [ - { - "kind": "", - "startPos": { - "offset": 17, - "line": 1, - "column": 1 - }, - "endPos": { - "offset": 18, - "line": 2, - "column": 0 - }, - "value": "\n", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 17, - "end": 18 - } - ], - "trailingTrivia": [ - { - "kind": "", - "startPos": { - "offset": 20, - "line": 2, - "column": 2 - }, - "endPos": { - "offset": 21, - "line": 3, - "column": 0 - }, - "value": "\n", - "leadingTrivia": [], - "trailingTrivia": [], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": false, - "start": 20, - "end": 21 - } - ], - "leadingInvalid": [], - "trailingInvalid": [], - "isInvalid": true, - "start": 18, - "end": 20 - }, - "start": 18, - "end": 20, - "name": "CompileError" - }, { "code": 1002, "diagnostic": "EOF reached while parsing", "nodeOrToken": { "kind": "", "startPos": { - "offset": 33, - "line": 4, - "column": 0 + "offset": 81, + "line": 6, + "column": 43 }, "endPos": { - "offset": 34, - "line": 4, - "column": 1 + "offset": 84, + "line": 7, + "column": 0 }, - "value": "`", + "value": "`\r\n", "leadingTrivia": [], "trailingTrivia": [], "leadingInvalid": [], "trailingInvalid": [], "isInvalid": true, - "start": 33, - "end": 34 + "start": 81, + "end": 84 }, - "start": 33, - "end": 34, + "start": 81, + "end": 84, "name": "CompileError" } ] diff --git a/packages/dbml-parse/tests/lexer/output/valid_escape_sequence.out.json b/packages/dbml-parse/tests/lexer/output/valid_escape_sequence.out.json index 230513ae5..7a9abda5d 100644 --- a/packages/dbml-parse/tests/lexer/output/valid_escape_sequence.out.json +++ b/packages/dbml-parse/tests/lexer/output/valid_escape_sequence.out.json @@ -496,29 +496,30 @@ "end": 225 }, { - "kind": "", + "kind": "", "startPos": { - "offset": 227, - "line": 15, + "offset": 226, + "line": 14, "column": 0 }, "endPos": { - "offset": 227, - "line": 15, - "column": 0 + "offset": 250, + "line": 17, + "column": 1 }, - "value": "", - "leadingTrivia": [ + "value": "This is single line\n\n\n", + "leadingTrivia": [], + "trailingTrivia": [ { "kind": "", "startPos": { - "offset": 226, - "line": 14, - "column": 0 + "offset": 250, + "line": 17, + "column": 1 }, "endPos": { - "offset": 227, - "line": 15, + "offset": 251, + "line": 18, "column": 0 }, "value": "\n", @@ -527,16 +528,36 @@ "leadingInvalid": [], "trailingInvalid": [], "isInvalid": false, - "start": 226, - "end": 227 + "start": 250, + "end": 251 } ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 226, + "end": 250 + }, + { + "kind": "", + "startPos": { + "offset": 251, + "line": 18, + "column": 0 + }, + "endPos": { + "offset": 251, + "line": 18, + "column": 0 + }, + "value": "", + "leadingTrivia": [], "trailingTrivia": [], "leadingInvalid": [], "trailingInvalid": [], "isInvalid": false, - "start": 227, - "end": 227 + "start": 251, + "end": 251 } ], "errors": [] diff --git a/packages/dbml-parse/tests/validator/input/constraints.in.dbml b/packages/dbml-parse/tests/validator/input/constraints.in.dbml new file mode 100644 index 000000000..83d487560 --- /dev/null +++ b/packages/dbml-parse/tests/validator/input/constraints.in.dbml @@ -0,0 +1,24 @@ +constraints {} + +Table Users { + balance int + + + constraints { + `balance > 0` [name: 'positive_balance'] + + `duplicate name` [name: 'dup', name: 'dup'] + `invalid setting` [invalid] + } +} + +TablePartial Users { + balance int + + constraints { + `balance > 0` [name: 'positive_balance'] + + `duplicate name` [name: 'dup', name: 'dup'] + `invalid setting` [invalid] + } +} diff --git a/packages/dbml-parse/tests/validator/input/table_partial_constraint.in.dbml b/packages/dbml-parse/tests/validator/input/table_partial_constraint.in.dbml new file mode 100644 index 000000000..2e14f79bd --- /dev/null +++ b/packages/dbml-parse/tests/validator/input/table_partial_constraint.in.dbml @@ -0,0 +1,10 @@ +TablePartial Users { + balance int [constraint: `balance > 0`] + dependents int [constraint: `dependents >= 0`, constraint: `dependents < 10`] + + invalid_col invalid_type [constraint: "invalid constraint 1", + constraint: 'invalid constraint 2', + constraint: 3, + constraint: false, + constraint: null] +} diff --git a/packages/dbml-parse/tests/validator/input/table_partial_settings.in.dbml b/packages/dbml-parse/tests/validator/input/table_partial_settings_general.in.dbml similarity index 100% rename from packages/dbml-parse/tests/validator/input/table_partial_settings.in.dbml rename to packages/dbml-parse/tests/validator/input/table_partial_settings_general.in.dbml diff --git a/packages/dbml-parse/tests/validator/input/table_settings_constraint.in.dbml b/packages/dbml-parse/tests/validator/input/table_settings_constraint.in.dbml new file mode 100644 index 000000000..bcfe69cff --- /dev/null +++ b/packages/dbml-parse/tests/validator/input/table_settings_constraint.in.dbml @@ -0,0 +1,10 @@ +Table Users { + balance int [constraint: `balance > 0`] + dependents int [constraint: `dependents >= 0`, constraint: `dependents < 10`] + + invalid_col invalid_type [constraint: "invalid constraint 1", + constraint: 'invalid constraint 2', + constraint: 3, + constraint: false, + constraint: null] +} diff --git a/packages/dbml-parse/tests/validator/input/table_settings.in.dbml b/packages/dbml-parse/tests/validator/input/table_settings_general.in.dbml similarity index 100% rename from packages/dbml-parse/tests/validator/input/table_settings.in.dbml rename to packages/dbml-parse/tests/validator/input/table_settings_general.in.dbml diff --git a/packages/dbml-parse/tests/validator/output/complex_names.out.json b/packages/dbml-parse/tests/validator/output/complex_names.out.json index 76b1714cf..ae378b94e 100644 --- a/packages/dbml-parse/tests/validator/output/complex_names.out.json +++ b/packages/dbml-parse/tests/validator/output/complex_names.out.json @@ -5348,7 +5348,7 @@ "name": "CompileError" }, { - "code": 3011, + "code": 3025, "diagnostic": "'default' must be a string literal, number literal, function expression, true, false or null", "nodeOrToken": { "id": 27, diff --git a/packages/dbml-parse/tests/validator/output/constraints.out.json b/packages/dbml-parse/tests/validator/output/constraints.out.json new file mode 100644 index 000000000..cc2ce4460 --- /dev/null +++ b/packages/dbml-parse/tests/validator/output/constraints.out.json @@ -0,0 +1,5599 @@ +{ + "value": { + "id": 76, + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "fullStart": 0, + "endPos": { + "offset": 387, + "line": 24, + "column": 0 + }, + "fullEnd": 387, + "start": 0, + "end": 387, + "body": [ + { + "id": 1, + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "fullStart": 0, + "endPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "fullEnd": 15, + "start": 0, + "end": 14, + "type": { + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "endPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "value": "constraints", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "endPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 11, + "end": 12 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 0, + "end": 11 + }, + "body": { + "id": 0, + "kind": "", + "startPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "fullStart": 12, + "endPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "fullEnd": 15, + "start": 12, + "end": 14, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "endPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 12, + "end": 13 + }, + "body": [], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "endPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "value": "}", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "endPos": { + "offset": 15, + "line": 1, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 14, + "end": 15 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 13, + "end": 14 + } + }, + "parent": 76 + }, + { + "id": 38, + "kind": "", + "startPos": { + "offset": 16, + "line": 2, + "column": 0 + }, + "fullStart": 15, + "endPos": { + "offset": 197, + "line": 12, + "column": 1 + }, + "fullEnd": 198, + "start": 16, + "end": 197, + "type": { + "kind": "", + "startPos": { + "offset": 16, + "line": 2, + "column": 0 + }, + "endPos": { + "offset": 21, + "line": 2, + "column": 5 + }, + "value": "Table", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 15, + "line": 1, + "column": 0 + }, + "endPos": { + "offset": 16, + "line": 2, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 15, + "end": 16 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 21, + "line": 2, + "column": 5 + }, + "endPos": { + "offset": 22, + "line": 2, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 21, + "end": 22 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 16, + "end": 21 + }, + "name": { + "id": 3, + "kind": "", + "startPos": { + "offset": 22, + "line": 2, + "column": 6 + }, + "fullStart": 22, + "endPos": { + "offset": 27, + "line": 2, + "column": 11 + }, + "fullEnd": 28, + "start": 22, + "end": 27, + "expression": { + "id": 2, + "kind": "", + "startPos": { + "offset": 22, + "line": 2, + "column": 6 + }, + "fullStart": 22, + "endPos": { + "offset": 27, + "line": 2, + "column": 11 + }, + "fullEnd": 28, + "start": 22, + "end": 27, + "variable": { + "kind": "", + "startPos": { + "offset": 22, + "line": 2, + "column": 6 + }, + "endPos": { + "offset": 27, + "line": 2, + "column": 11 + }, + "value": "Users", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 27, + "line": 2, + "column": 11 + }, + "endPos": { + "offset": 28, + "line": 2, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 27, + "end": 28 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 22, + "end": 27 + } + } + }, + "body": { + "id": 37, + "kind": "", + "startPos": { + "offset": 28, + "line": 2, + "column": 12 + }, + "fullStart": 28, + "endPos": { + "offset": 197, + "line": 12, + "column": 1 + }, + "fullEnd": 198, + "start": 28, + "end": 197, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 28, + "line": 2, + "column": 12 + }, + "endPos": { + "offset": 29, + "line": 2, + "column": 13 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 29, + "line": 2, + "column": 13 + }, + "endPos": { + "offset": 30, + "line": 3, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 29, + "end": 30 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 28, + "end": 29 + }, + "body": [ + { + "id": 8, + "kind": "", + "startPos": { + "offset": 32, + "line": 3, + "column": 2 + }, + "fullStart": 30, + "endPos": { + "offset": 43, + "line": 3, + "column": 13 + }, + "fullEnd": 44, + "start": 32, + "end": 43, + "callee": { + "id": 5, + "kind": "", + "startPos": { + "offset": 32, + "line": 3, + "column": 2 + }, + "fullStart": 30, + "endPos": { + "offset": 39, + "line": 3, + "column": 9 + }, + "fullEnd": 40, + "start": 32, + "end": 39, + "expression": { + "id": 4, + "kind": "", + "startPos": { + "offset": 32, + "line": 3, + "column": 2 + }, + "fullStart": 30, + "endPos": { + "offset": 39, + "line": 3, + "column": 9 + }, + "fullEnd": 40, + "start": 32, + "end": 39, + "variable": { + "kind": "", + "startPos": { + "offset": 32, + "line": 3, + "column": 2 + }, + "endPos": { + "offset": 39, + "line": 3, + "column": 9 + }, + "value": "balance", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 30, + "line": 3, + "column": 0 + }, + "endPos": { + "offset": 31, + "line": 3, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 30, + "end": 31 + }, + { + "kind": "", + "startPos": { + "offset": 31, + "line": 3, + "column": 1 + }, + "endPos": { + "offset": 32, + "line": 3, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 31, + "end": 32 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 39, + "line": 3, + "column": 9 + }, + "endPos": { + "offset": 40, + "line": 3, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 39, + "end": 40 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 32, + "end": 39 + } + } + }, + "args": [ + { + "id": 7, + "kind": "", + "startPos": { + "offset": 40, + "line": 3, + "column": 10 + }, + "fullStart": 40, + "endPos": { + "offset": 43, + "line": 3, + "column": 13 + }, + "fullEnd": 44, + "start": 40, + "end": 43, + "expression": { + "id": 6, + "kind": "", + "startPos": { + "offset": 40, + "line": 3, + "column": 10 + }, + "fullStart": 40, + "endPos": { + "offset": 43, + "line": 3, + "column": 13 + }, + "fullEnd": 44, + "start": 40, + "end": 43, + "variable": { + "kind": "", + "startPos": { + "offset": 40, + "line": 3, + "column": 10 + }, + "endPos": { + "offset": 43, + "line": 3, + "column": 13 + }, + "value": "int", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 43, + "line": 3, + "column": 13 + }, + "endPos": { + "offset": 44, + "line": 4, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 43, + "end": 44 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 40, + "end": 43 + } + } + } + ], + "symbol": 2 + }, + { + "id": 35, + "kind": "", + "startPos": { + "offset": 48, + "line": 6, + "column": 2 + }, + "fullStart": 44, + "endPos": { + "offset": 195, + "line": 11, + "column": 3 + }, + "fullEnd": 196, + "start": 48, + "end": 195, + "type": { + "kind": "", + "startPos": { + "offset": 48, + "line": 6, + "column": 2 + }, + "endPos": { + "offset": 59, + "line": 6, + "column": 13 + }, + "value": "constraints", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 44, + "line": 4, + "column": 0 + }, + "endPos": { + "offset": 45, + "line": 5, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 44, + "end": 45 + }, + { + "kind": "", + "startPos": { + "offset": 45, + "line": 5, + "column": 0 + }, + "endPos": { + "offset": 46, + "line": 6, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 45, + "end": 46 + }, + { + "kind": "", + "startPos": { + "offset": 46, + "line": 6, + "column": 0 + }, + "endPos": { + "offset": 47, + "line": 6, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 46, + "end": 47 + }, + { + "kind": "", + "startPos": { + "offset": 47, + "line": 6, + "column": 1 + }, + "endPos": { + "offset": 48, + "line": 6, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 47, + "end": 48 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 59, + "line": 6, + "column": 13 + }, + "endPos": { + "offset": 60, + "line": 6, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 59, + "end": 60 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 48, + "end": 59 + }, + "body": { + "id": 34, + "kind": "", + "startPos": { + "offset": 60, + "line": 6, + "column": 14 + }, + "fullStart": 60, + "endPos": { + "offset": 195, + "line": 11, + "column": 3 + }, + "fullEnd": 196, + "start": 60, + "end": 195, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 60, + "line": 6, + "column": 14 + }, + "endPos": { + "offset": 61, + "line": 6, + "column": 15 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 61, + "line": 6, + "column": 15 + }, + "endPos": { + "offset": 62, + "line": 7, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 61, + "end": 62 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 60, + "end": 61 + }, + "body": [ + { + "id": 17, + "kind": "", + "startPos": { + "offset": 66, + "line": 7, + "column": 4 + }, + "fullStart": 62, + "endPos": { + "offset": 106, + "line": 7, + "column": 44 + }, + "fullEnd": 107, + "start": 66, + "end": 106, + "callee": { + "id": 11, + "kind": "", + "startPos": { + "offset": 66, + "line": 7, + "column": 4 + }, + "fullStart": 62, + "endPos": { + "offset": 79, + "line": 7, + "column": 17 + }, + "fullEnd": 80, + "start": 66, + "end": 79, + "value": { + "kind": "", + "startPos": { + "offset": 66, + "line": 7, + "column": 4 + }, + "endPos": { + "offset": 79, + "line": 7, + "column": 17 + }, + "value": "balance > 0", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 62, + "line": 7, + "column": 0 + }, + "endPos": { + "offset": 63, + "line": 7, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 62, + "end": 63 + }, + { + "kind": "", + "startPos": { + "offset": 63, + "line": 7, + "column": 1 + }, + "endPos": { + "offset": 64, + "line": 7, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 63, + "end": 64 + }, + { + "kind": "", + "startPos": { + "offset": 64, + "line": 7, + "column": 2 + }, + "endPos": { + "offset": 65, + "line": 7, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 64, + "end": 65 + }, + { + "kind": "", + "startPos": { + "offset": 65, + "line": 7, + "column": 3 + }, + "endPos": { + "offset": 66, + "line": 7, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 65, + "end": 66 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 79, + "line": 7, + "column": 17 + }, + "endPos": { + "offset": 80, + "line": 7, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 79, + "end": 80 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 66, + "end": 79 + } + }, + "args": [ + { + "id": 16, + "kind": "", + "startPos": { + "offset": 80, + "line": 7, + "column": 18 + }, + "fullStart": 80, + "endPos": { + "offset": 106, + "line": 7, + "column": 44 + }, + "fullEnd": 107, + "start": 80, + "end": 106, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 80, + "line": 7, + "column": 18 + }, + "endPos": { + "offset": 81, + "line": 7, + "column": 19 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 80, + "end": 81 + }, + "elementList": [ + { + "id": 15, + "kind": "", + "startPos": { + "offset": 81, + "line": 7, + "column": 19 + }, + "fullStart": 81, + "endPos": { + "offset": 105, + "line": 7, + "column": 43 + }, + "fullEnd": 105, + "start": 81, + "end": 105, + "name": { + "id": 12, + "kind": "", + "startPos": { + "offset": 81, + "line": 7, + "column": 19 + }, + "fullStart": 81, + "endPos": { + "offset": 85, + "line": 7, + "column": 23 + }, + "fullEnd": 85, + "start": 81, + "end": 85, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 81, + "line": 7, + "column": 19 + }, + "endPos": { + "offset": 85, + "line": 7, + "column": 23 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 81, + "end": 85 + } + ] + }, + "value": { + "id": 14, + "kind": "", + "startPos": { + "offset": 87, + "line": 7, + "column": 25 + }, + "fullStart": 87, + "endPos": { + "offset": 105, + "line": 7, + "column": 43 + }, + "fullEnd": 105, + "start": 87, + "end": 105, + "expression": { + "id": 13, + "kind": "", + "startPos": { + "offset": 87, + "line": 7, + "column": 25 + }, + "fullStart": 87, + "endPos": { + "offset": 105, + "line": 7, + "column": 43 + }, + "fullEnd": 105, + "start": 87, + "end": 105, + "literal": { + "kind": "", + "startPos": { + "offset": 87, + "line": 7, + "column": 25 + }, + "endPos": { + "offset": 105, + "line": 7, + "column": 43 + }, + "value": "positive_balance", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 87, + "end": 105 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 85, + "line": 7, + "column": 23 + }, + "endPos": { + "offset": 86, + "line": 7, + "column": 24 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 86, + "line": 7, + "column": 24 + }, + "endPos": { + "offset": 87, + "line": 7, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 86, + "end": 87 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 85, + "end": 86 + } + } + ], + "commaList": [], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 105, + "line": 7, + "column": 43 + }, + "endPos": { + "offset": 106, + "line": 7, + "column": 44 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 106, + "line": 7, + "column": 44 + }, + "endPos": { + "offset": 107, + "line": 8, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 106, + "end": 107 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 105, + "end": 106 + } + } + ] + }, + { + "id": 28, + "kind": "", + "startPos": { + "offset": 116, + "line": 9, + "column": 4 + }, + "fullStart": 107, + "endPos": { + "offset": 159, + "line": 9, + "column": 47 + }, + "fullEnd": 160, + "start": 116, + "end": 159, + "callee": { + "id": 18, + "kind": "", + "startPos": { + "offset": 116, + "line": 9, + "column": 4 + }, + "fullStart": 107, + "endPos": { + "offset": 132, + "line": 9, + "column": 20 + }, + "fullEnd": 133, + "start": 116, + "end": 132, + "value": { + "kind": "", + "startPos": { + "offset": 116, + "line": 9, + "column": 4 + }, + "endPos": { + "offset": 132, + "line": 9, + "column": 20 + }, + "value": "duplicate name", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 107, + "line": 8, + "column": 0 + }, + "endPos": { + "offset": 108, + "line": 8, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 107, + "end": 108 + }, + { + "kind": "", + "startPos": { + "offset": 108, + "line": 8, + "column": 1 + }, + "endPos": { + "offset": 109, + "line": 8, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 108, + "end": 109 + }, + { + "kind": "", + "startPos": { + "offset": 109, + "line": 8, + "column": 2 + }, + "endPos": { + "offset": 110, + "line": 8, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 109, + "end": 110 + }, + { + "kind": "", + "startPos": { + "offset": 110, + "line": 8, + "column": 3 + }, + "endPos": { + "offset": 111, + "line": 8, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 110, + "end": 111 + }, + { + "kind": "", + "startPos": { + "offset": 111, + "line": 8, + "column": 4 + }, + "endPos": { + "offset": 112, + "line": 9, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 111, + "end": 112 + }, + { + "kind": "", + "startPos": { + "offset": 112, + "line": 9, + "column": 0 + }, + "endPos": { + "offset": 113, + "line": 9, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 112, + "end": 113 + }, + { + "kind": "", + "startPos": { + "offset": 113, + "line": 9, + "column": 1 + }, + "endPos": { + "offset": 114, + "line": 9, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 113, + "end": 114 + }, + { + "kind": "", + "startPos": { + "offset": 114, + "line": 9, + "column": 2 + }, + "endPos": { + "offset": 115, + "line": 9, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 114, + "end": 115 + }, + { + "kind": "", + "startPos": { + "offset": 115, + "line": 9, + "column": 3 + }, + "endPos": { + "offset": 116, + "line": 9, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 115, + "end": 116 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 132, + "line": 9, + "column": 20 + }, + "endPos": { + "offset": 133, + "line": 9, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 132, + "end": 133 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 116, + "end": 132 + } + }, + "args": [ + { + "id": 27, + "kind": "", + "startPos": { + "offset": 133, + "line": 9, + "column": 21 + }, + "fullStart": 133, + "endPos": { + "offset": 159, + "line": 9, + "column": 47 + }, + "fullEnd": 160, + "start": 133, + "end": 159, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 133, + "line": 9, + "column": 21 + }, + "endPos": { + "offset": 134, + "line": 9, + "column": 22 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 133, + "end": 134 + }, + "elementList": [ + { + "id": 22, + "kind": "", + "startPos": { + "offset": 134, + "line": 9, + "column": 22 + }, + "fullStart": 134, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "fullEnd": 145, + "start": 134, + "end": 145, + "name": { + "id": 19, + "kind": "", + "startPos": { + "offset": 134, + "line": 9, + "column": 22 + }, + "fullStart": 134, + "endPos": { + "offset": 138, + "line": 9, + "column": 26 + }, + "fullEnd": 138, + "start": 134, + "end": 138, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 134, + "line": 9, + "column": 22 + }, + "endPos": { + "offset": 138, + "line": 9, + "column": 26 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 134, + "end": 138 + } + ] + }, + "value": { + "id": 21, + "kind": "", + "startPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "fullStart": 140, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "fullEnd": 145, + "start": 140, + "end": 145, + "expression": { + "id": 20, + "kind": "", + "startPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "fullStart": 140, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "fullEnd": 145, + "start": 140, + "end": 145, + "literal": { + "kind": "", + "startPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 140, + "end": 145 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 138, + "line": 9, + "column": 26 + }, + "endPos": { + "offset": 139, + "line": 9, + "column": 27 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 139, + "line": 9, + "column": 27 + }, + "endPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 139, + "end": 140 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 138, + "end": 139 + } + }, + { + "id": 26, + "kind": "", + "startPos": { + "offset": 147, + "line": 9, + "column": 35 + }, + "fullStart": 147, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "fullEnd": 158, + "start": 147, + "end": 158, + "name": { + "id": 23, + "kind": "", + "startPos": { + "offset": 147, + "line": 9, + "column": 35 + }, + "fullStart": 147, + "endPos": { + "offset": 151, + "line": 9, + "column": 39 + }, + "fullEnd": 151, + "start": 147, + "end": 151, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 147, + "line": 9, + "column": 35 + }, + "endPos": { + "offset": 151, + "line": 9, + "column": 39 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 147, + "end": 151 + } + ] + }, + "value": { + "id": 25, + "kind": "", + "startPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "fullStart": 153, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "fullEnd": 158, + "start": 153, + "end": 158, + "expression": { + "id": 24, + "kind": "", + "startPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "fullStart": 153, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "fullEnd": 158, + "start": 153, + "end": 158, + "literal": { + "kind": "", + "startPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 153, + "end": 158 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 151, + "line": 9, + "column": 39 + }, + "endPos": { + "offset": 152, + "line": 9, + "column": 40 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 152, + "line": 9, + "column": 40 + }, + "endPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 152, + "end": 153 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 151, + "end": 152 + } + } + ], + "commaList": [ + { + "kind": "", + "startPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "endPos": { + "offset": 146, + "line": 9, + "column": 34 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 146, + "line": 9, + "column": 34 + }, + "endPos": { + "offset": 147, + "line": 9, + "column": 35 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 146, + "end": 147 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 145, + "end": 146 + } + ], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "endPos": { + "offset": 159, + "line": 9, + "column": 47 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 159, + "line": 9, + "column": 47 + }, + "endPos": { + "offset": 160, + "line": 10, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 159, + "end": 160 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 158, + "end": 159 + } + } + ] + }, + { + "id": 33, + "kind": "", + "startPos": { + "offset": 164, + "line": 10, + "column": 4 + }, + "fullStart": 160, + "endPos": { + "offset": 191, + "line": 10, + "column": 31 + }, + "fullEnd": 192, + "start": 164, + "end": 191, + "callee": { + "id": 29, + "kind": "", + "startPos": { + "offset": 164, + "line": 10, + "column": 4 + }, + "fullStart": 160, + "endPos": { + "offset": 181, + "line": 10, + "column": 21 + }, + "fullEnd": 182, + "start": 164, + "end": 181, + "value": { + "kind": "", + "startPos": { + "offset": 164, + "line": 10, + "column": 4 + }, + "endPos": { + "offset": 181, + "line": 10, + "column": 21 + }, + "value": "invalid setting", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 160, + "line": 10, + "column": 0 + }, + "endPos": { + "offset": 161, + "line": 10, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 160, + "end": 161 + }, + { + "kind": "", + "startPos": { + "offset": 161, + "line": 10, + "column": 1 + }, + "endPos": { + "offset": 162, + "line": 10, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 161, + "end": 162 + }, + { + "kind": "", + "startPos": { + "offset": 162, + "line": 10, + "column": 2 + }, + "endPos": { + "offset": 163, + "line": 10, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 162, + "end": 163 + }, + { + "kind": "", + "startPos": { + "offset": 163, + "line": 10, + "column": 3 + }, + "endPos": { + "offset": 164, + "line": 10, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 163, + "end": 164 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 181, + "line": 10, + "column": 21 + }, + "endPos": { + "offset": 182, + "line": 10, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 181, + "end": 182 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 164, + "end": 181 + } + }, + "args": [ + { + "id": 32, + "kind": "", + "startPos": { + "offset": 182, + "line": 10, + "column": 22 + }, + "fullStart": 182, + "endPos": { + "offset": 191, + "line": 10, + "column": 31 + }, + "fullEnd": 192, + "start": 182, + "end": 191, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 182, + "line": 10, + "column": 22 + }, + "endPos": { + "offset": 183, + "line": 10, + "column": 23 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 182, + "end": 183 + }, + "elementList": [ + { + "id": 31, + "kind": "", + "startPos": { + "offset": 183, + "line": 10, + "column": 23 + }, + "fullStart": 183, + "endPos": { + "offset": 190, + "line": 10, + "column": 30 + }, + "fullEnd": 190, + "start": 183, + "end": 190, + "name": { + "id": 30, + "kind": "", + "startPos": { + "offset": 183, + "line": 10, + "column": 23 + }, + "fullStart": 183, + "endPos": { + "offset": 190, + "line": 10, + "column": 30 + }, + "fullEnd": 190, + "start": 183, + "end": 190, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 183, + "line": 10, + "column": 23 + }, + "endPos": { + "offset": 190, + "line": 10, + "column": 30 + }, + "value": "invalid", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 183, + "end": 190 + } + ] + } + } + ], + "commaList": [], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 190, + "line": 10, + "column": 30 + }, + "endPos": { + "offset": 191, + "line": 10, + "column": 31 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 191, + "line": 10, + "column": 31 + }, + "endPos": { + "offset": 192, + "line": 11, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 191, + "end": 192 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 190, + "end": 191 + } + } + ] + } + ], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 194, + "line": 11, + "column": 2 + }, + "endPos": { + "offset": 195, + "line": 11, + "column": 3 + }, + "value": "}", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 192, + "line": 11, + "column": 0 + }, + "endPos": { + "offset": 193, + "line": 11, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 192, + "end": 193 + }, + { + "kind": "", + "startPos": { + "offset": 193, + "line": 11, + "column": 1 + }, + "endPos": { + "offset": 194, + "line": 11, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 193, + "end": 194 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 195, + "line": 11, + "column": 3 + }, + "endPos": { + "offset": 196, + "line": 12, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 195, + "end": 196 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 194, + "end": 195 + } + }, + "parent": 38 + } + ], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 196, + "line": 12, + "column": 0 + }, + "endPos": { + "offset": 197, + "line": 12, + "column": 1 + }, + "value": "}", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 197, + "line": 12, + "column": 1 + }, + "endPos": { + "offset": 198, + "line": 13, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 197, + "end": 198 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 196, + "end": 197 + } + }, + "parent": 76, + "symbol": 1 + }, + { + "id": 75, + "kind": "", + "startPos": { + "offset": 199, + "line": 14, + "column": 0 + }, + "fullStart": 198, + "endPos": { + "offset": 386, + "line": 23, + "column": 1 + }, + "fullEnd": 387, + "start": 199, + "end": 386, + "type": { + "kind": "", + "startPos": { + "offset": 199, + "line": 14, + "column": 0 + }, + "endPos": { + "offset": 211, + "line": 14, + "column": 12 + }, + "value": "TablePartial", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 198, + "line": 13, + "column": 0 + }, + "endPos": { + "offset": 199, + "line": 14, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 198, + "end": 199 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 211, + "line": 14, + "column": 12 + }, + "endPos": { + "offset": 212, + "line": 14, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 211, + "end": 212 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 199, + "end": 211 + }, + "name": { + "id": 40, + "kind": "", + "startPos": { + "offset": 212, + "line": 14, + "column": 13 + }, + "fullStart": 212, + "endPos": { + "offset": 217, + "line": 14, + "column": 18 + }, + "fullEnd": 218, + "start": 212, + "end": 217, + "expression": { + "id": 39, + "kind": "", + "startPos": { + "offset": 212, + "line": 14, + "column": 13 + }, + "fullStart": 212, + "endPos": { + "offset": 217, + "line": 14, + "column": 18 + }, + "fullEnd": 218, + "start": 212, + "end": 217, + "variable": { + "kind": "", + "startPos": { + "offset": 212, + "line": 14, + "column": 13 + }, + "endPos": { + "offset": 217, + "line": 14, + "column": 18 + }, + "value": "Users", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 217, + "line": 14, + "column": 18 + }, + "endPos": { + "offset": 218, + "line": 14, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 217, + "end": 218 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 212, + "end": 217 + } + } + }, + "body": { + "id": 74, + "kind": "", + "startPos": { + "offset": 218, + "line": 14, + "column": 19 + }, + "fullStart": 218, + "endPos": { + "offset": 386, + "line": 23, + "column": 1 + }, + "fullEnd": 387, + "start": 218, + "end": 386, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 218, + "line": 14, + "column": 19 + }, + "endPos": { + "offset": 219, + "line": 14, + "column": 20 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 219, + "line": 14, + "column": 20 + }, + "endPos": { + "offset": 220, + "line": 15, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 219, + "end": 220 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 218, + "end": 219 + }, + "body": [ + { + "id": 45, + "kind": "", + "startPos": { + "offset": 222, + "line": 15, + "column": 2 + }, + "fullStart": 220, + "endPos": { + "offset": 233, + "line": 15, + "column": 13 + }, + "fullEnd": 234, + "start": 222, + "end": 233, + "callee": { + "id": 42, + "kind": "", + "startPos": { + "offset": 222, + "line": 15, + "column": 2 + }, + "fullStart": 220, + "endPos": { + "offset": 229, + "line": 15, + "column": 9 + }, + "fullEnd": 230, + "start": 222, + "end": 229, + "expression": { + "id": 41, + "kind": "", + "startPos": { + "offset": 222, + "line": 15, + "column": 2 + }, + "fullStart": 220, + "endPos": { + "offset": 229, + "line": 15, + "column": 9 + }, + "fullEnd": 230, + "start": 222, + "end": 229, + "variable": { + "kind": "", + "startPos": { + "offset": 222, + "line": 15, + "column": 2 + }, + "endPos": { + "offset": 229, + "line": 15, + "column": 9 + }, + "value": "balance", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 220, + "line": 15, + "column": 0 + }, + "endPos": { + "offset": 221, + "line": 15, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 220, + "end": 221 + }, + { + "kind": "", + "startPos": { + "offset": 221, + "line": 15, + "column": 1 + }, + "endPos": { + "offset": 222, + "line": 15, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 221, + "end": 222 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 229, + "line": 15, + "column": 9 + }, + "endPos": { + "offset": 230, + "line": 15, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 229, + "end": 230 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 222, + "end": 229 + } + } + }, + "args": [ + { + "id": 44, + "kind": "", + "startPos": { + "offset": 230, + "line": 15, + "column": 10 + }, + "fullStart": 230, + "endPos": { + "offset": 233, + "line": 15, + "column": 13 + }, + "fullEnd": 234, + "start": 230, + "end": 233, + "expression": { + "id": 43, + "kind": "", + "startPos": { + "offset": 230, + "line": 15, + "column": 10 + }, + "fullStart": 230, + "endPos": { + "offset": 233, + "line": 15, + "column": 13 + }, + "fullEnd": 234, + "start": 230, + "end": 233, + "variable": { + "kind": "", + "startPos": { + "offset": 230, + "line": 15, + "column": 10 + }, + "endPos": { + "offset": 233, + "line": 15, + "column": 13 + }, + "value": "int", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 233, + "line": 15, + "column": 13 + }, + "endPos": { + "offset": 234, + "line": 16, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 233, + "end": 234 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 230, + "end": 233 + } + } + } + ], + "symbol": 4 + }, + { + "id": 72, + "kind": "", + "startPos": { + "offset": 237, + "line": 17, + "column": 2 + }, + "fullStart": 234, + "endPos": { + "offset": 384, + "line": 22, + "column": 3 + }, + "fullEnd": 385, + "start": 237, + "end": 384, + "type": { + "kind": "", + "startPos": { + "offset": 237, + "line": 17, + "column": 2 + }, + "endPos": { + "offset": 248, + "line": 17, + "column": 13 + }, + "value": "constraints", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 234, + "line": 16, + "column": 0 + }, + "endPos": { + "offset": 235, + "line": 17, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 234, + "end": 235 + }, + { + "kind": "", + "startPos": { + "offset": 235, + "line": 17, + "column": 0 + }, + "endPos": { + "offset": 236, + "line": 17, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 235, + "end": 236 + }, + { + "kind": "", + "startPos": { + "offset": 236, + "line": 17, + "column": 1 + }, + "endPos": { + "offset": 237, + "line": 17, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 236, + "end": 237 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 248, + "line": 17, + "column": 13 + }, + "endPos": { + "offset": 249, + "line": 17, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 248, + "end": 249 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 237, + "end": 248 + }, + "body": { + "id": 71, + "kind": "", + "startPos": { + "offset": 249, + "line": 17, + "column": 14 + }, + "fullStart": 249, + "endPos": { + "offset": 384, + "line": 22, + "column": 3 + }, + "fullEnd": 385, + "start": 249, + "end": 384, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 249, + "line": 17, + "column": 14 + }, + "endPos": { + "offset": 250, + "line": 17, + "column": 15 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 250, + "line": 17, + "column": 15 + }, + "endPos": { + "offset": 251, + "line": 18, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 250, + "end": 251 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 249, + "end": 250 + }, + "body": [ + { + "id": 54, + "kind": "", + "startPos": { + "offset": 255, + "line": 18, + "column": 4 + }, + "fullStart": 251, + "endPos": { + "offset": 295, + "line": 18, + "column": 44 + }, + "fullEnd": 296, + "start": 255, + "end": 295, + "callee": { + "id": 48, + "kind": "", + "startPos": { + "offset": 255, + "line": 18, + "column": 4 + }, + "fullStart": 251, + "endPos": { + "offset": 268, + "line": 18, + "column": 17 + }, + "fullEnd": 269, + "start": 255, + "end": 268, + "value": { + "kind": "", + "startPos": { + "offset": 255, + "line": 18, + "column": 4 + }, + "endPos": { + "offset": 268, + "line": 18, + "column": 17 + }, + "value": "balance > 0", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 251, + "line": 18, + "column": 0 + }, + "endPos": { + "offset": 252, + "line": 18, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 251, + "end": 252 + }, + { + "kind": "", + "startPos": { + "offset": 252, + "line": 18, + "column": 1 + }, + "endPos": { + "offset": 253, + "line": 18, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 252, + "end": 253 + }, + { + "kind": "", + "startPos": { + "offset": 253, + "line": 18, + "column": 2 + }, + "endPos": { + "offset": 254, + "line": 18, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 253, + "end": 254 + }, + { + "kind": "", + "startPos": { + "offset": 254, + "line": 18, + "column": 3 + }, + "endPos": { + "offset": 255, + "line": 18, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 254, + "end": 255 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 268, + "line": 18, + "column": 17 + }, + "endPos": { + "offset": 269, + "line": 18, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 268, + "end": 269 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 255, + "end": 268 + } + }, + "args": [ + { + "id": 53, + "kind": "", + "startPos": { + "offset": 269, + "line": 18, + "column": 18 + }, + "fullStart": 269, + "endPos": { + "offset": 295, + "line": 18, + "column": 44 + }, + "fullEnd": 296, + "start": 269, + "end": 295, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 269, + "line": 18, + "column": 18 + }, + "endPos": { + "offset": 270, + "line": 18, + "column": 19 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 269, + "end": 270 + }, + "elementList": [ + { + "id": 52, + "kind": "", + "startPos": { + "offset": 270, + "line": 18, + "column": 19 + }, + "fullStart": 270, + "endPos": { + "offset": 294, + "line": 18, + "column": 43 + }, + "fullEnd": 294, + "start": 270, + "end": 294, + "name": { + "id": 49, + "kind": "", + "startPos": { + "offset": 270, + "line": 18, + "column": 19 + }, + "fullStart": 270, + "endPos": { + "offset": 274, + "line": 18, + "column": 23 + }, + "fullEnd": 274, + "start": 270, + "end": 274, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 270, + "line": 18, + "column": 19 + }, + "endPos": { + "offset": 274, + "line": 18, + "column": 23 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 270, + "end": 274 + } + ] + }, + "value": { + "id": 51, + "kind": "", + "startPos": { + "offset": 276, + "line": 18, + "column": 25 + }, + "fullStart": 276, + "endPos": { + "offset": 294, + "line": 18, + "column": 43 + }, + "fullEnd": 294, + "start": 276, + "end": 294, + "expression": { + "id": 50, + "kind": "", + "startPos": { + "offset": 276, + "line": 18, + "column": 25 + }, + "fullStart": 276, + "endPos": { + "offset": 294, + "line": 18, + "column": 43 + }, + "fullEnd": 294, + "start": 276, + "end": 294, + "literal": { + "kind": "", + "startPos": { + "offset": 276, + "line": 18, + "column": 25 + }, + "endPos": { + "offset": 294, + "line": 18, + "column": 43 + }, + "value": "positive_balance", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 276, + "end": 294 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 274, + "line": 18, + "column": 23 + }, + "endPos": { + "offset": 275, + "line": 18, + "column": 24 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 275, + "line": 18, + "column": 24 + }, + "endPos": { + "offset": 276, + "line": 18, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 275, + "end": 276 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 274, + "end": 275 + } + } + ], + "commaList": [], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 294, + "line": 18, + "column": 43 + }, + "endPos": { + "offset": 295, + "line": 18, + "column": 44 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 295, + "line": 18, + "column": 44 + }, + "endPos": { + "offset": 296, + "line": 19, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 295, + "end": 296 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 294, + "end": 295 + } + } + ] + }, + { + "id": 65, + "kind": "", + "startPos": { + "offset": 305, + "line": 20, + "column": 4 + }, + "fullStart": 296, + "endPos": { + "offset": 348, + "line": 20, + "column": 47 + }, + "fullEnd": 349, + "start": 305, + "end": 348, + "callee": { + "id": 55, + "kind": "", + "startPos": { + "offset": 305, + "line": 20, + "column": 4 + }, + "fullStart": 296, + "endPos": { + "offset": 321, + "line": 20, + "column": 20 + }, + "fullEnd": 322, + "start": 305, + "end": 321, + "value": { + "kind": "", + "startPos": { + "offset": 305, + "line": 20, + "column": 4 + }, + "endPos": { + "offset": 321, + "line": 20, + "column": 20 + }, + "value": "duplicate name", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 296, + "line": 19, + "column": 0 + }, + "endPos": { + "offset": 297, + "line": 19, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 296, + "end": 297 + }, + { + "kind": "", + "startPos": { + "offset": 297, + "line": 19, + "column": 1 + }, + "endPos": { + "offset": 298, + "line": 19, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 297, + "end": 298 + }, + { + "kind": "", + "startPos": { + "offset": 298, + "line": 19, + "column": 2 + }, + "endPos": { + "offset": 299, + "line": 19, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 298, + "end": 299 + }, + { + "kind": "", + "startPos": { + "offset": 299, + "line": 19, + "column": 3 + }, + "endPos": { + "offset": 300, + "line": 19, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 299, + "end": 300 + }, + { + "kind": "", + "startPos": { + "offset": 300, + "line": 19, + "column": 4 + }, + "endPos": { + "offset": 301, + "line": 20, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 300, + "end": 301 + }, + { + "kind": "", + "startPos": { + "offset": 301, + "line": 20, + "column": 0 + }, + "endPos": { + "offset": 302, + "line": 20, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 301, + "end": 302 + }, + { + "kind": "", + "startPos": { + "offset": 302, + "line": 20, + "column": 1 + }, + "endPos": { + "offset": 303, + "line": 20, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 302, + "end": 303 + }, + { + "kind": "", + "startPos": { + "offset": 303, + "line": 20, + "column": 2 + }, + "endPos": { + "offset": 304, + "line": 20, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 303, + "end": 304 + }, + { + "kind": "", + "startPos": { + "offset": 304, + "line": 20, + "column": 3 + }, + "endPos": { + "offset": 305, + "line": 20, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 304, + "end": 305 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 321, + "line": 20, + "column": 20 + }, + "endPos": { + "offset": 322, + "line": 20, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 321, + "end": 322 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 305, + "end": 321 + } + }, + "args": [ + { + "id": 64, + "kind": "", + "startPos": { + "offset": 322, + "line": 20, + "column": 21 + }, + "fullStart": 322, + "endPos": { + "offset": 348, + "line": 20, + "column": 47 + }, + "fullEnd": 349, + "start": 322, + "end": 348, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 322, + "line": 20, + "column": 21 + }, + "endPos": { + "offset": 323, + "line": 20, + "column": 22 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 322, + "end": 323 + }, + "elementList": [ + { + "id": 59, + "kind": "", + "startPos": { + "offset": 323, + "line": 20, + "column": 22 + }, + "fullStart": 323, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "fullEnd": 334, + "start": 323, + "end": 334, + "name": { + "id": 56, + "kind": "", + "startPos": { + "offset": 323, + "line": 20, + "column": 22 + }, + "fullStart": 323, + "endPos": { + "offset": 327, + "line": 20, + "column": 26 + }, + "fullEnd": 327, + "start": 323, + "end": 327, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 323, + "line": 20, + "column": 22 + }, + "endPos": { + "offset": 327, + "line": 20, + "column": 26 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 323, + "end": 327 + } + ] + }, + "value": { + "id": 58, + "kind": "", + "startPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "fullStart": 329, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "fullEnd": 334, + "start": 329, + "end": 334, + "expression": { + "id": 57, + "kind": "", + "startPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "fullStart": 329, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "fullEnd": 334, + "start": 329, + "end": 334, + "literal": { + "kind": "", + "startPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 329, + "end": 334 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 327, + "line": 20, + "column": 26 + }, + "endPos": { + "offset": 328, + "line": 20, + "column": 27 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 328, + "line": 20, + "column": 27 + }, + "endPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 328, + "end": 329 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 327, + "end": 328 + } + }, + { + "id": 63, + "kind": "", + "startPos": { + "offset": 336, + "line": 20, + "column": 35 + }, + "fullStart": 336, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "fullEnd": 347, + "start": 336, + "end": 347, + "name": { + "id": 60, + "kind": "", + "startPos": { + "offset": 336, + "line": 20, + "column": 35 + }, + "fullStart": 336, + "endPos": { + "offset": 340, + "line": 20, + "column": 39 + }, + "fullEnd": 340, + "start": 336, + "end": 340, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 336, + "line": 20, + "column": 35 + }, + "endPos": { + "offset": 340, + "line": 20, + "column": 39 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 336, + "end": 340 + } + ] + }, + "value": { + "id": 62, + "kind": "", + "startPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "fullStart": 342, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "fullEnd": 347, + "start": 342, + "end": 347, + "expression": { + "id": 61, + "kind": "", + "startPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "fullStart": 342, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "fullEnd": 347, + "start": 342, + "end": 347, + "literal": { + "kind": "", + "startPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 342, + "end": 347 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 340, + "line": 20, + "column": 39 + }, + "endPos": { + "offset": 341, + "line": 20, + "column": 40 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 341, + "line": 20, + "column": 40 + }, + "endPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 341, + "end": 342 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 340, + "end": 341 + } + } + ], + "commaList": [ + { + "kind": "", + "startPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "endPos": { + "offset": 335, + "line": 20, + "column": 34 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 335, + "line": 20, + "column": 34 + }, + "endPos": { + "offset": 336, + "line": 20, + "column": 35 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 335, + "end": 336 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 334, + "end": 335 + } + ], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "endPos": { + "offset": 348, + "line": 20, + "column": 47 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 348, + "line": 20, + "column": 47 + }, + "endPos": { + "offset": 349, + "line": 21, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 348, + "end": 349 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 347, + "end": 348 + } + } + ] + }, + { + "id": 70, + "kind": "", + "startPos": { + "offset": 353, + "line": 21, + "column": 4 + }, + "fullStart": 349, + "endPos": { + "offset": 380, + "line": 21, + "column": 31 + }, + "fullEnd": 381, + "start": 353, + "end": 380, + "callee": { + "id": 66, + "kind": "", + "startPos": { + "offset": 353, + "line": 21, + "column": 4 + }, + "fullStart": 349, + "endPos": { + "offset": 370, + "line": 21, + "column": 21 + }, + "fullEnd": 371, + "start": 353, + "end": 370, + "value": { + "kind": "", + "startPos": { + "offset": 353, + "line": 21, + "column": 4 + }, + "endPos": { + "offset": 370, + "line": 21, + "column": 21 + }, + "value": "invalid setting", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 349, + "line": 21, + "column": 0 + }, + "endPos": { + "offset": 350, + "line": 21, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 349, + "end": 350 + }, + { + "kind": "", + "startPos": { + "offset": 350, + "line": 21, + "column": 1 + }, + "endPos": { + "offset": 351, + "line": 21, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 350, + "end": 351 + }, + { + "kind": "", + "startPos": { + "offset": 351, + "line": 21, + "column": 2 + }, + "endPos": { + "offset": 352, + "line": 21, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 351, + "end": 352 + }, + { + "kind": "", + "startPos": { + "offset": 352, + "line": 21, + "column": 3 + }, + "endPos": { + "offset": 353, + "line": 21, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 352, + "end": 353 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 370, + "line": 21, + "column": 21 + }, + "endPos": { + "offset": 371, + "line": 21, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 370, + "end": 371 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 353, + "end": 370 + } + }, + "args": [ + { + "id": 69, + "kind": "", + "startPos": { + "offset": 371, + "line": 21, + "column": 22 + }, + "fullStart": 371, + "endPos": { + "offset": 380, + "line": 21, + "column": 31 + }, + "fullEnd": 381, + "start": 371, + "end": 380, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 371, + "line": 21, + "column": 22 + }, + "endPos": { + "offset": 372, + "line": 21, + "column": 23 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 371, + "end": 372 + }, + "elementList": [ + { + "id": 68, + "kind": "", + "startPos": { + "offset": 372, + "line": 21, + "column": 23 + }, + "fullStart": 372, + "endPos": { + "offset": 379, + "line": 21, + "column": 30 + }, + "fullEnd": 379, + "start": 372, + "end": 379, + "name": { + "id": 67, + "kind": "", + "startPos": { + "offset": 372, + "line": 21, + "column": 23 + }, + "fullStart": 372, + "endPos": { + "offset": 379, + "line": 21, + "column": 30 + }, + "fullEnd": 379, + "start": 372, + "end": 379, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 372, + "line": 21, + "column": 23 + }, + "endPos": { + "offset": 379, + "line": 21, + "column": 30 + }, + "value": "invalid", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 372, + "end": 379 + } + ] + } + } + ], + "commaList": [], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 379, + "line": 21, + "column": 30 + }, + "endPos": { + "offset": 380, + "line": 21, + "column": 31 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 380, + "line": 21, + "column": 31 + }, + "endPos": { + "offset": 381, + "line": 22, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 380, + "end": 381 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 379, + "end": 380 + } + } + ] + } + ], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 383, + "line": 22, + "column": 2 + }, + "endPos": { + "offset": 384, + "line": 22, + "column": 3 + }, + "value": "}", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 381, + "line": 22, + "column": 0 + }, + "endPos": { + "offset": 382, + "line": 22, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 381, + "end": 382 + }, + { + "kind": "", + "startPos": { + "offset": 382, + "line": 22, + "column": 1 + }, + "endPos": { + "offset": 383, + "line": 22, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 382, + "end": 383 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 384, + "line": 22, + "column": 3 + }, + "endPos": { + "offset": 385, + "line": 23, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 384, + "end": 385 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 383, + "end": 384 + } + }, + "parent": 75 + } + ], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 385, + "line": 23, + "column": 0 + }, + "endPos": { + "offset": 386, + "line": 23, + "column": 1 + }, + "value": "}", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 386, + "line": 23, + "column": 1 + }, + "endPos": { + "offset": 387, + "line": 24, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 386, + "end": 387 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 385, + "end": 386 + } + }, + "parent": 76, + "symbol": 3 + } + ], + "eof": { + "kind": "", + "startPos": { + "offset": 387, + "line": 24, + "column": 0 + }, + "endPos": { + "offset": 387, + "line": 24, + "column": 0 + }, + "value": "", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 387, + "end": 387 + }, + "symbol": { + "symbolTable": { + "Table:Users": { + "references": [], + "id": 1, + "symbolTable": { + "Column:balance": { + "references": [], + "id": 2, + "declaration": 8 + } + }, + "declaration": 38 + }, + "TablePartial:Users": { + "references": [], + "id": 3, + "symbolTable": { + "Column:balance": { + "references": [], + "id": 4, + "declaration": 45 + } + }, + "declaration": 75 + } + }, + "id": 0, + "references": [] + } + }, + "errors": [ + { + "code": 3071, + "diagnostic": "A Constraints can only appear inside a Table or a TablePartial", + "nodeOrToken": { + "id": 1, + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "fullStart": 0, + "endPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "fullEnd": 15, + "start": 0, + "end": 14, + "type": { + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "endPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "value": "constraints", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "endPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 11, + "end": 12 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 0, + "end": 11 + }, + "body": { + "id": 0, + "kind": "", + "startPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "fullStart": 12, + "endPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "fullEnd": 15, + "start": 12, + "end": 14, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "endPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 12, + "end": 13 + }, + "body": [], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "endPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "value": "}", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 14, + "line": 0, + "column": 14 + }, + "endPos": { + "offset": 15, + "line": 1, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 14, + "end": 15 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 13, + "end": 14 + } + }, + "parent": 76 + }, + "start": 0, + "end": 14, + "name": "CompileError" + }, + { + "code": 3075, + "diagnostic": "'name' can only appear once", + "nodeOrToken": { + "id": 22, + "kind": "", + "startPos": { + "offset": 134, + "line": 9, + "column": 22 + }, + "fullStart": 134, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "fullEnd": 145, + "start": 134, + "end": 145, + "name": { + "id": 19, + "kind": "", + "startPos": { + "offset": 134, + "line": 9, + "column": 22 + }, + "fullStart": 134, + "endPos": { + "offset": 138, + "line": 9, + "column": 26 + }, + "fullEnd": 138, + "start": 134, + "end": 138, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 134, + "line": 9, + "column": 22 + }, + "endPos": { + "offset": 138, + "line": 9, + "column": 26 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 134, + "end": 138 + } + ] + }, + "value": { + "id": 21, + "kind": "", + "startPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "fullStart": 140, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "fullEnd": 145, + "start": 140, + "end": 145, + "expression": { + "id": 20, + "kind": "", + "startPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "fullStart": 140, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "fullEnd": 145, + "start": 140, + "end": 145, + "literal": { + "kind": "", + "startPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "endPos": { + "offset": 145, + "line": 9, + "column": 33 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 140, + "end": 145 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 138, + "line": 9, + "column": 26 + }, + "endPos": { + "offset": 139, + "line": 9, + "column": 27 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 139, + "line": 9, + "column": 27 + }, + "endPos": { + "offset": 140, + "line": 9, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 139, + "end": 140 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 138, + "end": 139 + } + }, + "start": 134, + "end": 145, + "name": "CompileError" + }, + { + "code": 3075, + "diagnostic": "'name' can only appear once", + "nodeOrToken": { + "id": 26, + "kind": "", + "startPos": { + "offset": 147, + "line": 9, + "column": 35 + }, + "fullStart": 147, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "fullEnd": 158, + "start": 147, + "end": 158, + "name": { + "id": 23, + "kind": "", + "startPos": { + "offset": 147, + "line": 9, + "column": 35 + }, + "fullStart": 147, + "endPos": { + "offset": 151, + "line": 9, + "column": 39 + }, + "fullEnd": 151, + "start": 147, + "end": 151, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 147, + "line": 9, + "column": 35 + }, + "endPos": { + "offset": 151, + "line": 9, + "column": 39 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 147, + "end": 151 + } + ] + }, + "value": { + "id": 25, + "kind": "", + "startPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "fullStart": 153, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "fullEnd": 158, + "start": 153, + "end": 158, + "expression": { + "id": 24, + "kind": "", + "startPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "fullStart": 153, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "fullEnd": 158, + "start": 153, + "end": 158, + "literal": { + "kind": "", + "startPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "endPos": { + "offset": 158, + "line": 9, + "column": 46 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 153, + "end": 158 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 151, + "line": 9, + "column": 39 + }, + "endPos": { + "offset": 152, + "line": 9, + "column": 40 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 152, + "line": 9, + "column": 40 + }, + "endPos": { + "offset": 153, + "line": 9, + "column": 41 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 152, + "end": 153 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 151, + "end": 152 + } + }, + "start": 147, + "end": 158, + "name": "CompileError" + }, + { + "code": 3074, + "diagnostic": "Unknown constraint setting 'invalid'", + "nodeOrToken": { + "id": 31, + "kind": "", + "startPos": { + "offset": 183, + "line": 10, + "column": 23 + }, + "fullStart": 183, + "endPos": { + "offset": 190, + "line": 10, + "column": 30 + }, + "fullEnd": 190, + "start": 183, + "end": 190, + "name": { + "id": 30, + "kind": "", + "startPos": { + "offset": 183, + "line": 10, + "column": 23 + }, + "fullStart": 183, + "endPos": { + "offset": 190, + "line": 10, + "column": 30 + }, + "fullEnd": 190, + "start": 183, + "end": 190, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 183, + "line": 10, + "column": 23 + }, + "endPos": { + "offset": 190, + "line": 10, + "column": 30 + }, + "value": "invalid", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 183, + "end": 190 + } + ] + } + }, + "start": 183, + "end": 190, + "name": "CompileError" + }, + { + "code": 3075, + "diagnostic": "'name' can only appear once", + "nodeOrToken": { + "id": 59, + "kind": "", + "startPos": { + "offset": 323, + "line": 20, + "column": 22 + }, + "fullStart": 323, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "fullEnd": 334, + "start": 323, + "end": 334, + "name": { + "id": 56, + "kind": "", + "startPos": { + "offset": 323, + "line": 20, + "column": 22 + }, + "fullStart": 323, + "endPos": { + "offset": 327, + "line": 20, + "column": 26 + }, + "fullEnd": 327, + "start": 323, + "end": 327, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 323, + "line": 20, + "column": 22 + }, + "endPos": { + "offset": 327, + "line": 20, + "column": 26 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 323, + "end": 327 + } + ] + }, + "value": { + "id": 58, + "kind": "", + "startPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "fullStart": 329, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "fullEnd": 334, + "start": 329, + "end": 334, + "expression": { + "id": 57, + "kind": "", + "startPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "fullStart": 329, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "fullEnd": 334, + "start": 329, + "end": 334, + "literal": { + "kind": "", + "startPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "endPos": { + "offset": 334, + "line": 20, + "column": 33 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 329, + "end": 334 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 327, + "line": 20, + "column": 26 + }, + "endPos": { + "offset": 328, + "line": 20, + "column": 27 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 328, + "line": 20, + "column": 27 + }, + "endPos": { + "offset": 329, + "line": 20, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 328, + "end": 329 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 327, + "end": 328 + } + }, + "start": 323, + "end": 334, + "name": "CompileError" + }, + { + "code": 3075, + "diagnostic": "'name' can only appear once", + "nodeOrToken": { + "id": 63, + "kind": "", + "startPos": { + "offset": 336, + "line": 20, + "column": 35 + }, + "fullStart": 336, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "fullEnd": 347, + "start": 336, + "end": 347, + "name": { + "id": 60, + "kind": "", + "startPos": { + "offset": 336, + "line": 20, + "column": 35 + }, + "fullStart": 336, + "endPos": { + "offset": 340, + "line": 20, + "column": 39 + }, + "fullEnd": 340, + "start": 336, + "end": 340, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 336, + "line": 20, + "column": 35 + }, + "endPos": { + "offset": 340, + "line": 20, + "column": 39 + }, + "value": "name", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 336, + "end": 340 + } + ] + }, + "value": { + "id": 62, + "kind": "", + "startPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "fullStart": 342, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "fullEnd": 347, + "start": 342, + "end": 347, + "expression": { + "id": 61, + "kind": "", + "startPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "fullStart": 342, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "fullEnd": 347, + "start": 342, + "end": 347, + "literal": { + "kind": "", + "startPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "endPos": { + "offset": 347, + "line": 20, + "column": 46 + }, + "value": "dup", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 342, + "end": 347 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 340, + "line": 20, + "column": 39 + }, + "endPos": { + "offset": 341, + "line": 20, + "column": 40 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 341, + "line": 20, + "column": 40 + }, + "endPos": { + "offset": 342, + "line": 20, + "column": 41 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 341, + "end": 342 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 340, + "end": 341 + } + }, + "start": 336, + "end": 347, + "name": "CompileError" + }, + { + "code": 3074, + "diagnostic": "Unknown constraint setting 'invalid'", + "nodeOrToken": { + "id": 68, + "kind": "", + "startPos": { + "offset": 372, + "line": 21, + "column": 23 + }, + "fullStart": 372, + "endPos": { + "offset": 379, + "line": 21, + "column": 30 + }, + "fullEnd": 379, + "start": 372, + "end": 379, + "name": { + "id": 67, + "kind": "", + "startPos": { + "offset": 372, + "line": 21, + "column": 23 + }, + "fullStart": 372, + "endPos": { + "offset": 379, + "line": 21, + "column": 30 + }, + "fullEnd": 379, + "start": 372, + "end": 379, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 372, + "line": 21, + "column": 23 + }, + "endPos": { + "offset": 379, + "line": 21, + "column": 30 + }, + "value": "invalid", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 372, + "end": 379 + } + ] + } + }, + "start": 372, + "end": 379, + "name": "CompileError" + } + ] +} \ No newline at end of file diff --git a/packages/dbml-parse/tests/validator/output/table_group_settings.out.json b/packages/dbml-parse/tests/validator/output/table_group_settings.out.json index ac31a93b1..4123db1b0 100644 --- a/packages/dbml-parse/tests/validator/output/table_group_settings.out.json +++ b/packages/dbml-parse/tests/validator/output/table_group_settings.out.json @@ -4451,7 +4451,7 @@ "name": "CompileError" }, { - "code": 3011, + "code": 3070, "diagnostic": "'color' must be a color literal", "nodeOrToken": { "id": 49, diff --git a/packages/dbml-parse/tests/validator/output/table_partial_constraint.out.json b/packages/dbml-parse/tests/validator/output/table_partial_constraint.out.json new file mode 100644 index 000000000..797814d66 --- /dev/null +++ b/packages/dbml-parse/tests/validator/output/table_partial_constraint.out.json @@ -0,0 +1,5416 @@ +{ + "value": { + "id": 51, + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "fullStart": 0, + "endPos": { + "offset": 412, + "line": 10, + "column": 0 + }, + "fullEnd": 412, + "start": 0, + "end": 412, + "body": [ + { + "id": 50, + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "fullStart": 0, + "endPos": { + "offset": 411, + "line": 9, + "column": 1 + }, + "fullEnd": 412, + "start": 0, + "end": 411, + "type": { + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "endPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "value": "TablePartial", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "endPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 12, + "end": 13 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 0, + "end": 12 + }, + "name": { + "id": 1, + "kind": "", + "startPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "fullStart": 13, + "endPos": { + "offset": 18, + "line": 0, + "column": 18 + }, + "fullEnd": 19, + "start": 13, + "end": 18, + "expression": { + "id": 0, + "kind": "", + "startPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "fullStart": 13, + "endPos": { + "offset": 18, + "line": 0, + "column": 18 + }, + "fullEnd": 19, + "start": 13, + "end": 18, + "variable": { + "kind": "", + "startPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "endPos": { + "offset": 18, + "line": 0, + "column": 18 + }, + "value": "Users", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 18, + "line": 0, + "column": 18 + }, + "endPos": { + "offset": 19, + "line": 0, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 18, + "end": 19 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 13, + "end": 18 + } + } + }, + "body": { + "id": 49, + "kind": "", + "startPos": { + "offset": 19, + "line": 0, + "column": 19 + }, + "fullStart": 19, + "endPos": { + "offset": 411, + "line": 9, + "column": 1 + }, + "fullEnd": 412, + "start": 19, + "end": 411, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 19, + "line": 0, + "column": 19 + }, + "endPos": { + "offset": 20, + "line": 0, + "column": 20 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 20, + "line": 0, + "column": 20 + }, + "endPos": { + "offset": 21, + "line": 1, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 20, + "end": 21 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 19, + "end": 20 + }, + "body": [ + { + "id": 10, + "kind": "", + "startPos": { + "offset": 23, + "line": 1, + "column": 2 + }, + "fullStart": 21, + "endPos": { + "offset": 62, + "line": 1, + "column": 41 + }, + "fullEnd": 63, + "start": 23, + "end": 62, + "callee": { + "id": 3, + "kind": "", + "startPos": { + "offset": 23, + "line": 1, + "column": 2 + }, + "fullStart": 21, + "endPos": { + "offset": 30, + "line": 1, + "column": 9 + }, + "fullEnd": 31, + "start": 23, + "end": 30, + "expression": { + "id": 2, + "kind": "", + "startPos": { + "offset": 23, + "line": 1, + "column": 2 + }, + "fullStart": 21, + "endPos": { + "offset": 30, + "line": 1, + "column": 9 + }, + "fullEnd": 31, + "start": 23, + "end": 30, + "variable": { + "kind": "", + "startPos": { + "offset": 23, + "line": 1, + "column": 2 + }, + "endPos": { + "offset": 30, + "line": 1, + "column": 9 + }, + "value": "balance", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 21, + "line": 1, + "column": 0 + }, + "endPos": { + "offset": 22, + "line": 1, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 21, + "end": 22 + }, + { + "kind": "", + "startPos": { + "offset": 22, + "line": 1, + "column": 1 + }, + "endPos": { + "offset": 23, + "line": 1, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 22, + "end": 23 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 30, + "line": 1, + "column": 9 + }, + "endPos": { + "offset": 31, + "line": 1, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 30, + "end": 31 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 23, + "end": 30 + } + } + }, + "args": [ + { + "id": 5, + "kind": "", + "startPos": { + "offset": 31, + "line": 1, + "column": 10 + }, + "fullStart": 31, + "endPos": { + "offset": 34, + "line": 1, + "column": 13 + }, + "fullEnd": 35, + "start": 31, + "end": 34, + "expression": { + "id": 4, + "kind": "", + "startPos": { + "offset": 31, + "line": 1, + "column": 10 + }, + "fullStart": 31, + "endPos": { + "offset": 34, + "line": 1, + "column": 13 + }, + "fullEnd": 35, + "start": 31, + "end": 34, + "variable": { + "kind": "", + "startPos": { + "offset": 31, + "line": 1, + "column": 10 + }, + "endPos": { + "offset": 34, + "line": 1, + "column": 13 + }, + "value": "int", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 34, + "line": 1, + "column": 13 + }, + "endPos": { + "offset": 35, + "line": 1, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 34, + "end": 35 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 31, + "end": 34 + } + } + }, + { + "id": 9, + "kind": "", + "startPos": { + "offset": 35, + "line": 1, + "column": 14 + }, + "fullStart": 35, + "endPos": { + "offset": 62, + "line": 1, + "column": 41 + }, + "fullEnd": 63, + "start": 35, + "end": 62, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 35, + "line": 1, + "column": 14 + }, + "endPos": { + "offset": 36, + "line": 1, + "column": 15 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 35, + "end": 36 + }, + "elementList": [ + { + "id": 8, + "kind": "", + "startPos": { + "offset": 36, + "line": 1, + "column": 15 + }, + "fullStart": 36, + "endPos": { + "offset": 61, + "line": 1, + "column": 40 + }, + "fullEnd": 61, + "start": 36, + "end": 61, + "name": { + "id": 6, + "kind": "", + "startPos": { + "offset": 36, + "line": 1, + "column": 15 + }, + "fullStart": 36, + "endPos": { + "offset": 46, + "line": 1, + "column": 25 + }, + "fullEnd": 46, + "start": 36, + "end": 46, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 36, + "line": 1, + "column": 15 + }, + "endPos": { + "offset": 46, + "line": 1, + "column": 25 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 36, + "end": 46 + } + ] + }, + "value": { + "id": 7, + "kind": "", + "startPos": { + "offset": 48, + "line": 1, + "column": 27 + }, + "fullStart": 48, + "endPos": { + "offset": 61, + "line": 1, + "column": 40 + }, + "fullEnd": 61, + "start": 48, + "end": 61, + "value": { + "kind": "", + "startPos": { + "offset": 48, + "line": 1, + "column": 27 + }, + "endPos": { + "offset": 61, + "line": 1, + "column": 40 + }, + "value": "balance > 0", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 48, + "end": 61 + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 46, + "line": 1, + "column": 25 + }, + "endPos": { + "offset": 47, + "line": 1, + "column": 26 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 47, + "line": 1, + "column": 26 + }, + "endPos": { + "offset": 48, + "line": 1, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 47, + "end": 48 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 46, + "end": 47 + } + } + ], + "commaList": [], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 61, + "line": 1, + "column": 40 + }, + "endPos": { + "offset": 62, + "line": 1, + "column": 41 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 62, + "line": 1, + "column": 41 + }, + "endPos": { + "offset": 63, + "line": 2, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 62, + "end": 63 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 61, + "end": 62 + } + } + ], + "symbol": 2 + }, + { + "id": 22, + "kind": "", + "startPos": { + "offset": 65, + "line": 2, + "column": 2 + }, + "fullStart": 63, + "endPos": { + "offset": 142, + "line": 2, + "column": 79 + }, + "fullEnd": 143, + "start": 65, + "end": 142, + "callee": { + "id": 12, + "kind": "", + "startPos": { + "offset": 65, + "line": 2, + "column": 2 + }, + "fullStart": 63, + "endPos": { + "offset": 75, + "line": 2, + "column": 12 + }, + "fullEnd": 76, + "start": 65, + "end": 75, + "expression": { + "id": 11, + "kind": "", + "startPos": { + "offset": 65, + "line": 2, + "column": 2 + }, + "fullStart": 63, + "endPos": { + "offset": 75, + "line": 2, + "column": 12 + }, + "fullEnd": 76, + "start": 65, + "end": 75, + "variable": { + "kind": "", + "startPos": { + "offset": 65, + "line": 2, + "column": 2 + }, + "endPos": { + "offset": 75, + "line": 2, + "column": 12 + }, + "value": "dependents", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 63, + "line": 2, + "column": 0 + }, + "endPos": { + "offset": 64, + "line": 2, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 63, + "end": 64 + }, + { + "kind": "", + "startPos": { + "offset": 64, + "line": 2, + "column": 1 + }, + "endPos": { + "offset": 65, + "line": 2, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 64, + "end": 65 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 75, + "line": 2, + "column": 12 + }, + "endPos": { + "offset": 76, + "line": 2, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 75, + "end": 76 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 65, + "end": 75 + } + } + }, + "args": [ + { + "id": 14, + "kind": "", + "startPos": { + "offset": 76, + "line": 2, + "column": 13 + }, + "fullStart": 76, + "endPos": { + "offset": 79, + "line": 2, + "column": 16 + }, + "fullEnd": 80, + "start": 76, + "end": 79, + "expression": { + "id": 13, + "kind": "", + "startPos": { + "offset": 76, + "line": 2, + "column": 13 + }, + "fullStart": 76, + "endPos": { + "offset": 79, + "line": 2, + "column": 16 + }, + "fullEnd": 80, + "start": 76, + "end": 79, + "variable": { + "kind": "", + "startPos": { + "offset": 76, + "line": 2, + "column": 13 + }, + "endPos": { + "offset": 79, + "line": 2, + "column": 16 + }, + "value": "int", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 79, + "line": 2, + "column": 16 + }, + "endPos": { + "offset": 80, + "line": 2, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 79, + "end": 80 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 76, + "end": 79 + } + } + }, + { + "id": 21, + "kind": "", + "startPos": { + "offset": 80, + "line": 2, + "column": 17 + }, + "fullStart": 80, + "endPos": { + "offset": 142, + "line": 2, + "column": 79 + }, + "fullEnd": 143, + "start": 80, + "end": 142, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 80, + "line": 2, + "column": 17 + }, + "endPos": { + "offset": 81, + "line": 2, + "column": 18 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 80, + "end": 81 + }, + "elementList": [ + { + "id": 17, + "kind": "", + "startPos": { + "offset": 81, + "line": 2, + "column": 18 + }, + "fullStart": 81, + "endPos": { + "offset": 110, + "line": 2, + "column": 47 + }, + "fullEnd": 110, + "start": 81, + "end": 110, + "name": { + "id": 15, + "kind": "", + "startPos": { + "offset": 81, + "line": 2, + "column": 18 + }, + "fullStart": 81, + "endPos": { + "offset": 91, + "line": 2, + "column": 28 + }, + "fullEnd": 91, + "start": 81, + "end": 91, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 81, + "line": 2, + "column": 18 + }, + "endPos": { + "offset": 91, + "line": 2, + "column": 28 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 81, + "end": 91 + } + ] + }, + "value": { + "id": 16, + "kind": "", + "startPos": { + "offset": 93, + "line": 2, + "column": 30 + }, + "fullStart": 93, + "endPos": { + "offset": 110, + "line": 2, + "column": 47 + }, + "fullEnd": 110, + "start": 93, + "end": 110, + "value": { + "kind": "", + "startPos": { + "offset": 93, + "line": 2, + "column": 30 + }, + "endPos": { + "offset": 110, + "line": 2, + "column": 47 + }, + "value": "dependents >= 0", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 93, + "end": 110 + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 91, + "line": 2, + "column": 28 + }, + "endPos": { + "offset": 92, + "line": 2, + "column": 29 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 92, + "line": 2, + "column": 29 + }, + "endPos": { + "offset": 93, + "line": 2, + "column": 30 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 92, + "end": 93 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 91, + "end": 92 + } + }, + { + "id": 20, + "kind": "", + "startPos": { + "offset": 112, + "line": 2, + "column": 49 + }, + "fullStart": 112, + "endPos": { + "offset": 141, + "line": 2, + "column": 78 + }, + "fullEnd": 141, + "start": 112, + "end": 141, + "name": { + "id": 18, + "kind": "", + "startPos": { + "offset": 112, + "line": 2, + "column": 49 + }, + "fullStart": 112, + "endPos": { + "offset": 122, + "line": 2, + "column": 59 + }, + "fullEnd": 122, + "start": 112, + "end": 122, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 112, + "line": 2, + "column": 49 + }, + "endPos": { + "offset": 122, + "line": 2, + "column": 59 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 112, + "end": 122 + } + ] + }, + "value": { + "id": 19, + "kind": "", + "startPos": { + "offset": 124, + "line": 2, + "column": 61 + }, + "fullStart": 124, + "endPos": { + "offset": 141, + "line": 2, + "column": 78 + }, + "fullEnd": 141, + "start": 124, + "end": 141, + "value": { + "kind": "", + "startPos": { + "offset": 124, + "line": 2, + "column": 61 + }, + "endPos": { + "offset": 141, + "line": 2, + "column": 78 + }, + "value": "dependents < 10", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 124, + "end": 141 + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 122, + "line": 2, + "column": 59 + }, + "endPos": { + "offset": 123, + "line": 2, + "column": 60 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 123, + "line": 2, + "column": 60 + }, + "endPos": { + "offset": 124, + "line": 2, + "column": 61 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 123, + "end": 124 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 122, + "end": 123 + } + } + ], + "commaList": [ + { + "kind": "", + "startPos": { + "offset": 110, + "line": 2, + "column": 47 + }, + "endPos": { + "offset": 111, + "line": 2, + "column": 48 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 111, + "line": 2, + "column": 48 + }, + "endPos": { + "offset": 112, + "line": 2, + "column": 49 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 111, + "end": 112 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 110, + "end": 111 + } + ], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 141, + "line": 2, + "column": 78 + }, + "endPos": { + "offset": 142, + "line": 2, + "column": 79 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 142, + "line": 2, + "column": 79 + }, + "endPos": { + "offset": 143, + "line": 3, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 142, + "end": 143 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 141, + "end": 142 + } + } + ], + "symbol": 3 + }, + { + "id": 48, + "kind": "", + "startPos": { + "offset": 148, + "line": 4, + "column": 2 + }, + "fullStart": 143, + "endPos": { + "offset": 409, + "line": 8, + "column": 45 + }, + "fullEnd": 410, + "start": 148, + "end": 409, + "callee": { + "id": 24, + "kind": "", + "startPos": { + "offset": 148, + "line": 4, + "column": 2 + }, + "fullStart": 143, + "endPos": { + "offset": 159, + "line": 4, + "column": 13 + }, + "fullEnd": 160, + "start": 148, + "end": 159, + "expression": { + "id": 23, + "kind": "", + "startPos": { + "offset": 148, + "line": 4, + "column": 2 + }, + "fullStart": 143, + "endPos": { + "offset": 159, + "line": 4, + "column": 13 + }, + "fullEnd": 160, + "start": 148, + "end": 159, + "variable": { + "kind": "", + "startPos": { + "offset": 148, + "line": 4, + "column": 2 + }, + "endPos": { + "offset": 159, + "line": 4, + "column": 13 + }, + "value": "invalid_col", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 143, + "line": 3, + "column": 0 + }, + "endPos": { + "offset": 144, + "line": 3, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 143, + "end": 144 + }, + { + "kind": "", + "startPos": { + "offset": 144, + "line": 3, + "column": 1 + }, + "endPos": { + "offset": 145, + "line": 3, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 144, + "end": 145 + }, + { + "kind": "", + "startPos": { + "offset": 145, + "line": 3, + "column": 2 + }, + "endPos": { + "offset": 146, + "line": 4, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 145, + "end": 146 + }, + { + "kind": "", + "startPos": { + "offset": 146, + "line": 4, + "column": 0 + }, + "endPos": { + "offset": 147, + "line": 4, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 146, + "end": 147 + }, + { + "kind": "", + "startPos": { + "offset": 147, + "line": 4, + "column": 1 + }, + "endPos": { + "offset": 148, + "line": 4, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 147, + "end": 148 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 159, + "line": 4, + "column": 13 + }, + "endPos": { + "offset": 160, + "line": 4, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 159, + "end": 160 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 148, + "end": 159 + } + } + }, + "args": [ + { + "id": 26, + "kind": "", + "startPos": { + "offset": 160, + "line": 4, + "column": 14 + }, + "fullStart": 160, + "endPos": { + "offset": 172, + "line": 4, + "column": 26 + }, + "fullEnd": 173, + "start": 160, + "end": 172, + "expression": { + "id": 25, + "kind": "", + "startPos": { + "offset": 160, + "line": 4, + "column": 14 + }, + "fullStart": 160, + "endPos": { + "offset": 172, + "line": 4, + "column": 26 + }, + "fullEnd": 173, + "start": 160, + "end": 172, + "variable": { + "kind": "", + "startPos": { + "offset": 160, + "line": 4, + "column": 14 + }, + "endPos": { + "offset": 172, + "line": 4, + "column": 26 + }, + "value": "invalid_type", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 172, + "line": 4, + "column": 26 + }, + "endPos": { + "offset": 173, + "line": 4, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 172, + "end": 173 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 160, + "end": 172 + } + } + }, + { + "id": 47, + "kind": "", + "startPos": { + "offset": 173, + "line": 4, + "column": 27 + }, + "fullStart": 173, + "endPos": { + "offset": 409, + "line": 8, + "column": 45 + }, + "fullEnd": 410, + "start": 173, + "end": 409, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 173, + "line": 4, + "column": 27 + }, + "endPos": { + "offset": 174, + "line": 4, + "column": 28 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 173, + "end": 174 + }, + "elementList": [ + { + "id": 30, + "kind": "", + "startPos": { + "offset": 174, + "line": 4, + "column": 28 + }, + "fullStart": 174, + "endPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "fullEnd": 208, + "start": 174, + "end": 208, + "name": { + "id": 27, + "kind": "", + "startPos": { + "offset": 174, + "line": 4, + "column": 28 + }, + "fullStart": 174, + "endPos": { + "offset": 184, + "line": 4, + "column": 38 + }, + "fullEnd": 184, + "start": 174, + "end": 184, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 174, + "line": 4, + "column": 28 + }, + "endPos": { + "offset": 184, + "line": 4, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 174, + "end": 184 + } + ] + }, + "value": { + "id": 29, + "kind": "", + "startPos": { + "offset": 186, + "line": 4, + "column": 40 + }, + "fullStart": 186, + "endPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "fullEnd": 208, + "start": 186, + "end": 208, + "expression": { + "id": 28, + "kind": "", + "startPos": { + "offset": 186, + "line": 4, + "column": 40 + }, + "fullStart": 186, + "endPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "fullEnd": 208, + "start": 186, + "end": 208, + "variable": { + "kind": "", + "startPos": { + "offset": 186, + "line": 4, + "column": 40 + }, + "endPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "value": "invalid constraint 1", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 186, + "end": 208 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 184, + "line": 4, + "column": 38 + }, + "endPos": { + "offset": 185, + "line": 4, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 185, + "line": 4, + "column": 39 + }, + "endPos": { + "offset": 186, + "line": 4, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 185, + "end": 186 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 184, + "end": 185 + } + }, + { + "id": 34, + "kind": "", + "startPos": { + "offset": 238, + "line": 5, + "column": 28 + }, + "fullStart": 210, + "endPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "fullEnd": 272, + "start": 238, + "end": 272, + "name": { + "id": 31, + "kind": "", + "startPos": { + "offset": 238, + "line": 5, + "column": 28 + }, + "fullStart": 210, + "endPos": { + "offset": 248, + "line": 5, + "column": 38 + }, + "fullEnd": 248, + "start": 238, + "end": 248, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 238, + "line": 5, + "column": 28 + }, + "endPos": { + "offset": 248, + "line": 5, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 210, + "line": 5, + "column": 0 + }, + "endPos": { + "offset": 211, + "line": 5, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 210, + "end": 211 + }, + { + "kind": "", + "startPos": { + "offset": 211, + "line": 5, + "column": 1 + }, + "endPos": { + "offset": 212, + "line": 5, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 211, + "end": 212 + }, + { + "kind": "", + "startPos": { + "offset": 212, + "line": 5, + "column": 2 + }, + "endPos": { + "offset": 213, + "line": 5, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 212, + "end": 213 + }, + { + "kind": "", + "startPos": { + "offset": 213, + "line": 5, + "column": 3 + }, + "endPos": { + "offset": 214, + "line": 5, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 213, + "end": 214 + }, + { + "kind": "", + "startPos": { + "offset": 214, + "line": 5, + "column": 4 + }, + "endPos": { + "offset": 215, + "line": 5, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 214, + "end": 215 + }, + { + "kind": "", + "startPos": { + "offset": 215, + "line": 5, + "column": 5 + }, + "endPos": { + "offset": 216, + "line": 5, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 215, + "end": 216 + }, + { + "kind": "", + "startPos": { + "offset": 216, + "line": 5, + "column": 6 + }, + "endPos": { + "offset": 217, + "line": 5, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 216, + "end": 217 + }, + { + "kind": "", + "startPos": { + "offset": 217, + "line": 5, + "column": 7 + }, + "endPos": { + "offset": 218, + "line": 5, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 217, + "end": 218 + }, + { + "kind": "", + "startPos": { + "offset": 218, + "line": 5, + "column": 8 + }, + "endPos": { + "offset": 219, + "line": 5, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 218, + "end": 219 + }, + { + "kind": "", + "startPos": { + "offset": 219, + "line": 5, + "column": 9 + }, + "endPos": { + "offset": 220, + "line": 5, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 219, + "end": 220 + }, + { + "kind": "", + "startPos": { + "offset": 220, + "line": 5, + "column": 10 + }, + "endPos": { + "offset": 221, + "line": 5, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 220, + "end": 221 + }, + { + "kind": "", + "startPos": { + "offset": 221, + "line": 5, + "column": 11 + }, + "endPos": { + "offset": 222, + "line": 5, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 221, + "end": 222 + }, + { + "kind": "", + "startPos": { + "offset": 222, + "line": 5, + "column": 12 + }, + "endPos": { + "offset": 223, + "line": 5, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 222, + "end": 223 + }, + { + "kind": "", + "startPos": { + "offset": 223, + "line": 5, + "column": 13 + }, + "endPos": { + "offset": 224, + "line": 5, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 223, + "end": 224 + }, + { + "kind": "", + "startPos": { + "offset": 224, + "line": 5, + "column": 14 + }, + "endPos": { + "offset": 225, + "line": 5, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 224, + "end": 225 + }, + { + "kind": "", + "startPos": { + "offset": 225, + "line": 5, + "column": 15 + }, + "endPos": { + "offset": 226, + "line": 5, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 225, + "end": 226 + }, + { + "kind": "", + "startPos": { + "offset": 226, + "line": 5, + "column": 16 + }, + "endPos": { + "offset": 227, + "line": 5, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 226, + "end": 227 + }, + { + "kind": "", + "startPos": { + "offset": 227, + "line": 5, + "column": 17 + }, + "endPos": { + "offset": 228, + "line": 5, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 227, + "end": 228 + }, + { + "kind": "", + "startPos": { + "offset": 228, + "line": 5, + "column": 18 + }, + "endPos": { + "offset": 229, + "line": 5, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 228, + "end": 229 + }, + { + "kind": "", + "startPos": { + "offset": 229, + "line": 5, + "column": 19 + }, + "endPos": { + "offset": 230, + "line": 5, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 229, + "end": 230 + }, + { + "kind": "", + "startPos": { + "offset": 230, + "line": 5, + "column": 20 + }, + "endPos": { + "offset": 231, + "line": 5, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 230, + "end": 231 + }, + { + "kind": "", + "startPos": { + "offset": 231, + "line": 5, + "column": 21 + }, + "endPos": { + "offset": 232, + "line": 5, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 231, + "end": 232 + }, + { + "kind": "", + "startPos": { + "offset": 232, + "line": 5, + "column": 22 + }, + "endPos": { + "offset": 233, + "line": 5, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 232, + "end": 233 + }, + { + "kind": "", + "startPos": { + "offset": 233, + "line": 5, + "column": 23 + }, + "endPos": { + "offset": 234, + "line": 5, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 233, + "end": 234 + }, + { + "kind": "", + "startPos": { + "offset": 234, + "line": 5, + "column": 24 + }, + "endPos": { + "offset": 235, + "line": 5, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 234, + "end": 235 + }, + { + "kind": "", + "startPos": { + "offset": 235, + "line": 5, + "column": 25 + }, + "endPos": { + "offset": 236, + "line": 5, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 235, + "end": 236 + }, + { + "kind": "", + "startPos": { + "offset": 236, + "line": 5, + "column": 26 + }, + "endPos": { + "offset": 237, + "line": 5, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 236, + "end": 237 + }, + { + "kind": "", + "startPos": { + "offset": 237, + "line": 5, + "column": 27 + }, + "endPos": { + "offset": 238, + "line": 5, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 237, + "end": 238 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 238, + "end": 248 + } + ] + }, + "value": { + "id": 33, + "kind": "", + "startPos": { + "offset": 250, + "line": 5, + "column": 40 + }, + "fullStart": 250, + "endPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "fullEnd": 272, + "start": 250, + "end": 272, + "expression": { + "id": 32, + "kind": "", + "startPos": { + "offset": 250, + "line": 5, + "column": 40 + }, + "fullStart": 250, + "endPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "fullEnd": 272, + "start": 250, + "end": 272, + "literal": { + "kind": "", + "startPos": { + "offset": 250, + "line": 5, + "column": 40 + }, + "endPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "value": "invalid constraint 2", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 250, + "end": 272 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 248, + "line": 5, + "column": 38 + }, + "endPos": { + "offset": 249, + "line": 5, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 249, + "line": 5, + "column": 39 + }, + "endPos": { + "offset": 250, + "line": 5, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 249, + "end": 250 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 248, + "end": 249 + } + }, + { + "id": 38, + "kind": "", + "startPos": { + "offset": 302, + "line": 6, + "column": 28 + }, + "fullStart": 274, + "endPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "fullEnd": 315, + "start": 302, + "end": 315, + "name": { + "id": 35, + "kind": "", + "startPos": { + "offset": 302, + "line": 6, + "column": 28 + }, + "fullStart": 274, + "endPos": { + "offset": 312, + "line": 6, + "column": 38 + }, + "fullEnd": 312, + "start": 302, + "end": 312, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 302, + "line": 6, + "column": 28 + }, + "endPos": { + "offset": 312, + "line": 6, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 274, + "line": 6, + "column": 0 + }, + "endPos": { + "offset": 275, + "line": 6, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 274, + "end": 275 + }, + { + "kind": "", + "startPos": { + "offset": 275, + "line": 6, + "column": 1 + }, + "endPos": { + "offset": 276, + "line": 6, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 275, + "end": 276 + }, + { + "kind": "", + "startPos": { + "offset": 276, + "line": 6, + "column": 2 + }, + "endPos": { + "offset": 277, + "line": 6, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 276, + "end": 277 + }, + { + "kind": "", + "startPos": { + "offset": 277, + "line": 6, + "column": 3 + }, + "endPos": { + "offset": 278, + "line": 6, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 277, + "end": 278 + }, + { + "kind": "", + "startPos": { + "offset": 278, + "line": 6, + "column": 4 + }, + "endPos": { + "offset": 279, + "line": 6, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 278, + "end": 279 + }, + { + "kind": "", + "startPos": { + "offset": 279, + "line": 6, + "column": 5 + }, + "endPos": { + "offset": 280, + "line": 6, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 279, + "end": 280 + }, + { + "kind": "", + "startPos": { + "offset": 280, + "line": 6, + "column": 6 + }, + "endPos": { + "offset": 281, + "line": 6, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 280, + "end": 281 + }, + { + "kind": "", + "startPos": { + "offset": 281, + "line": 6, + "column": 7 + }, + "endPos": { + "offset": 282, + "line": 6, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 281, + "end": 282 + }, + { + "kind": "", + "startPos": { + "offset": 282, + "line": 6, + "column": 8 + }, + "endPos": { + "offset": 283, + "line": 6, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 282, + "end": 283 + }, + { + "kind": "", + "startPos": { + "offset": 283, + "line": 6, + "column": 9 + }, + "endPos": { + "offset": 284, + "line": 6, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 283, + "end": 284 + }, + { + "kind": "", + "startPos": { + "offset": 284, + "line": 6, + "column": 10 + }, + "endPos": { + "offset": 285, + "line": 6, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 284, + "end": 285 + }, + { + "kind": "", + "startPos": { + "offset": 285, + "line": 6, + "column": 11 + }, + "endPos": { + "offset": 286, + "line": 6, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 285, + "end": 286 + }, + { + "kind": "", + "startPos": { + "offset": 286, + "line": 6, + "column": 12 + }, + "endPos": { + "offset": 287, + "line": 6, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 286, + "end": 287 + }, + { + "kind": "", + "startPos": { + "offset": 287, + "line": 6, + "column": 13 + }, + "endPos": { + "offset": 288, + "line": 6, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 287, + "end": 288 + }, + { + "kind": "", + "startPos": { + "offset": 288, + "line": 6, + "column": 14 + }, + "endPos": { + "offset": 289, + "line": 6, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 288, + "end": 289 + }, + { + "kind": "", + "startPos": { + "offset": 289, + "line": 6, + "column": 15 + }, + "endPos": { + "offset": 290, + "line": 6, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 289, + "end": 290 + }, + { + "kind": "", + "startPos": { + "offset": 290, + "line": 6, + "column": 16 + }, + "endPos": { + "offset": 291, + "line": 6, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 290, + "end": 291 + }, + { + "kind": "", + "startPos": { + "offset": 291, + "line": 6, + "column": 17 + }, + "endPos": { + "offset": 292, + "line": 6, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 291, + "end": 292 + }, + { + "kind": "", + "startPos": { + "offset": 292, + "line": 6, + "column": 18 + }, + "endPos": { + "offset": 293, + "line": 6, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 292, + "end": 293 + }, + { + "kind": "", + "startPos": { + "offset": 293, + "line": 6, + "column": 19 + }, + "endPos": { + "offset": 294, + "line": 6, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 293, + "end": 294 + }, + { + "kind": "", + "startPos": { + "offset": 294, + "line": 6, + "column": 20 + }, + "endPos": { + "offset": 295, + "line": 6, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 294, + "end": 295 + }, + { + "kind": "", + "startPos": { + "offset": 295, + "line": 6, + "column": 21 + }, + "endPos": { + "offset": 296, + "line": 6, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 295, + "end": 296 + }, + { + "kind": "", + "startPos": { + "offset": 296, + "line": 6, + "column": 22 + }, + "endPos": { + "offset": 297, + "line": 6, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 296, + "end": 297 + }, + { + "kind": "", + "startPos": { + "offset": 297, + "line": 6, + "column": 23 + }, + "endPos": { + "offset": 298, + "line": 6, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 297, + "end": 298 + }, + { + "kind": "", + "startPos": { + "offset": 298, + "line": 6, + "column": 24 + }, + "endPos": { + "offset": 299, + "line": 6, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 298, + "end": 299 + }, + { + "kind": "", + "startPos": { + "offset": 299, + "line": 6, + "column": 25 + }, + "endPos": { + "offset": 300, + "line": 6, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 299, + "end": 300 + }, + { + "kind": "", + "startPos": { + "offset": 300, + "line": 6, + "column": 26 + }, + "endPos": { + "offset": 301, + "line": 6, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 300, + "end": 301 + }, + { + "kind": "", + "startPos": { + "offset": 301, + "line": 6, + "column": 27 + }, + "endPos": { + "offset": 302, + "line": 6, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 301, + "end": 302 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 302, + "end": 312 + } + ] + }, + "value": { + "id": 37, + "kind": "", + "startPos": { + "offset": 314, + "line": 6, + "column": 40 + }, + "fullStart": 314, + "endPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "fullEnd": 315, + "start": 314, + "end": 315, + "expression": { + "id": 36, + "kind": "", + "startPos": { + "offset": 314, + "line": 6, + "column": 40 + }, + "fullStart": 314, + "endPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "fullEnd": 315, + "start": 314, + "end": 315, + "literal": { + "kind": "", + "startPos": { + "offset": 314, + "line": 6, + "column": 40 + }, + "endPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "value": "3", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 314, + "end": 315 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 312, + "line": 6, + "column": 38 + }, + "endPos": { + "offset": 313, + "line": 6, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 313, + "line": 6, + "column": 39 + }, + "endPos": { + "offset": 314, + "line": 6, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 313, + "end": 314 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 312, + "end": 313 + } + }, + { + "id": 42, + "kind": "", + "startPos": { + "offset": 345, + "line": 7, + "column": 28 + }, + "fullStart": 317, + "endPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "fullEnd": 362, + "start": 345, + "end": 362, + "name": { + "id": 39, + "kind": "", + "startPos": { + "offset": 345, + "line": 7, + "column": 28 + }, + "fullStart": 317, + "endPos": { + "offset": 355, + "line": 7, + "column": 38 + }, + "fullEnd": 355, + "start": 345, + "end": 355, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 345, + "line": 7, + "column": 28 + }, + "endPos": { + "offset": 355, + "line": 7, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 317, + "line": 7, + "column": 0 + }, + "endPos": { + "offset": 318, + "line": 7, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 317, + "end": 318 + }, + { + "kind": "", + "startPos": { + "offset": 318, + "line": 7, + "column": 1 + }, + "endPos": { + "offset": 319, + "line": 7, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 318, + "end": 319 + }, + { + "kind": "", + "startPos": { + "offset": 319, + "line": 7, + "column": 2 + }, + "endPos": { + "offset": 320, + "line": 7, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 319, + "end": 320 + }, + { + "kind": "", + "startPos": { + "offset": 320, + "line": 7, + "column": 3 + }, + "endPos": { + "offset": 321, + "line": 7, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 320, + "end": 321 + }, + { + "kind": "", + "startPos": { + "offset": 321, + "line": 7, + "column": 4 + }, + "endPos": { + "offset": 322, + "line": 7, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 321, + "end": 322 + }, + { + "kind": "", + "startPos": { + "offset": 322, + "line": 7, + "column": 5 + }, + "endPos": { + "offset": 323, + "line": 7, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 322, + "end": 323 + }, + { + "kind": "", + "startPos": { + "offset": 323, + "line": 7, + "column": 6 + }, + "endPos": { + "offset": 324, + "line": 7, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 323, + "end": 324 + }, + { + "kind": "", + "startPos": { + "offset": 324, + "line": 7, + "column": 7 + }, + "endPos": { + "offset": 325, + "line": 7, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 324, + "end": 325 + }, + { + "kind": "", + "startPos": { + "offset": 325, + "line": 7, + "column": 8 + }, + "endPos": { + "offset": 326, + "line": 7, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 325, + "end": 326 + }, + { + "kind": "", + "startPos": { + "offset": 326, + "line": 7, + "column": 9 + }, + "endPos": { + "offset": 327, + "line": 7, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 326, + "end": 327 + }, + { + "kind": "", + "startPos": { + "offset": 327, + "line": 7, + "column": 10 + }, + "endPos": { + "offset": 328, + "line": 7, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 327, + "end": 328 + }, + { + "kind": "", + "startPos": { + "offset": 328, + "line": 7, + "column": 11 + }, + "endPos": { + "offset": 329, + "line": 7, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 328, + "end": 329 + }, + { + "kind": "", + "startPos": { + "offset": 329, + "line": 7, + "column": 12 + }, + "endPos": { + "offset": 330, + "line": 7, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 329, + "end": 330 + }, + { + "kind": "", + "startPos": { + "offset": 330, + "line": 7, + "column": 13 + }, + "endPos": { + "offset": 331, + "line": 7, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 330, + "end": 331 + }, + { + "kind": "", + "startPos": { + "offset": 331, + "line": 7, + "column": 14 + }, + "endPos": { + "offset": 332, + "line": 7, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 331, + "end": 332 + }, + { + "kind": "", + "startPos": { + "offset": 332, + "line": 7, + "column": 15 + }, + "endPos": { + "offset": 333, + "line": 7, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 332, + "end": 333 + }, + { + "kind": "", + "startPos": { + "offset": 333, + "line": 7, + "column": 16 + }, + "endPos": { + "offset": 334, + "line": 7, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 333, + "end": 334 + }, + { + "kind": "", + "startPos": { + "offset": 334, + "line": 7, + "column": 17 + }, + "endPos": { + "offset": 335, + "line": 7, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 334, + "end": 335 + }, + { + "kind": "", + "startPos": { + "offset": 335, + "line": 7, + "column": 18 + }, + "endPos": { + "offset": 336, + "line": 7, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 335, + "end": 336 + }, + { + "kind": "", + "startPos": { + "offset": 336, + "line": 7, + "column": 19 + }, + "endPos": { + "offset": 337, + "line": 7, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 336, + "end": 337 + }, + { + "kind": "", + "startPos": { + "offset": 337, + "line": 7, + "column": 20 + }, + "endPos": { + "offset": 338, + "line": 7, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 337, + "end": 338 + }, + { + "kind": "", + "startPos": { + "offset": 338, + "line": 7, + "column": 21 + }, + "endPos": { + "offset": 339, + "line": 7, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 338, + "end": 339 + }, + { + "kind": "", + "startPos": { + "offset": 339, + "line": 7, + "column": 22 + }, + "endPos": { + "offset": 340, + "line": 7, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 339, + "end": 340 + }, + { + "kind": "", + "startPos": { + "offset": 340, + "line": 7, + "column": 23 + }, + "endPos": { + "offset": 341, + "line": 7, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 340, + "end": 341 + }, + { + "kind": "", + "startPos": { + "offset": 341, + "line": 7, + "column": 24 + }, + "endPos": { + "offset": 342, + "line": 7, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 341, + "end": 342 + }, + { + "kind": "", + "startPos": { + "offset": 342, + "line": 7, + "column": 25 + }, + "endPos": { + "offset": 343, + "line": 7, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 342, + "end": 343 + }, + { + "kind": "", + "startPos": { + "offset": 343, + "line": 7, + "column": 26 + }, + "endPos": { + "offset": 344, + "line": 7, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 343, + "end": 344 + }, + { + "kind": "", + "startPos": { + "offset": 344, + "line": 7, + "column": 27 + }, + "endPos": { + "offset": 345, + "line": 7, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 344, + "end": 345 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 345, + "end": 355 + } + ] + }, + "value": { + "id": 41, + "kind": "", + "startPos": { + "offset": 357, + "line": 7, + "column": 40 + }, + "fullStart": 357, + "endPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "fullEnd": 362, + "start": 357, + "end": 362, + "expression": { + "id": 40, + "kind": "", + "startPos": { + "offset": 357, + "line": 7, + "column": 40 + }, + "fullStart": 357, + "endPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "fullEnd": 362, + "start": 357, + "end": 362, + "variable": { + "kind": "", + "startPos": { + "offset": 357, + "line": 7, + "column": 40 + }, + "endPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "value": "false", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 357, + "end": 362 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 355, + "line": 7, + "column": 38 + }, + "endPos": { + "offset": 356, + "line": 7, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 356, + "line": 7, + "column": 39 + }, + "endPos": { + "offset": 357, + "line": 7, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 356, + "end": 357 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 355, + "end": 356 + } + }, + { + "id": 46, + "kind": "", + "startPos": { + "offset": 392, + "line": 8, + "column": 28 + }, + "fullStart": 364, + "endPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "fullEnd": 408, + "start": 392, + "end": 408, + "name": { + "id": 43, + "kind": "", + "startPos": { + "offset": 392, + "line": 8, + "column": 28 + }, + "fullStart": 364, + "endPos": { + "offset": 402, + "line": 8, + "column": 38 + }, + "fullEnd": 402, + "start": 392, + "end": 402, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 392, + "line": 8, + "column": 28 + }, + "endPos": { + "offset": 402, + "line": 8, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 364, + "line": 8, + "column": 0 + }, + "endPos": { + "offset": 365, + "line": 8, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 364, + "end": 365 + }, + { + "kind": "", + "startPos": { + "offset": 365, + "line": 8, + "column": 1 + }, + "endPos": { + "offset": 366, + "line": 8, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 365, + "end": 366 + }, + { + "kind": "", + "startPos": { + "offset": 366, + "line": 8, + "column": 2 + }, + "endPos": { + "offset": 367, + "line": 8, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 366, + "end": 367 + }, + { + "kind": "", + "startPos": { + "offset": 367, + "line": 8, + "column": 3 + }, + "endPos": { + "offset": 368, + "line": 8, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 367, + "end": 368 + }, + { + "kind": "", + "startPos": { + "offset": 368, + "line": 8, + "column": 4 + }, + "endPos": { + "offset": 369, + "line": 8, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 368, + "end": 369 + }, + { + "kind": "", + "startPos": { + "offset": 369, + "line": 8, + "column": 5 + }, + "endPos": { + "offset": 370, + "line": 8, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 369, + "end": 370 + }, + { + "kind": "", + "startPos": { + "offset": 370, + "line": 8, + "column": 6 + }, + "endPos": { + "offset": 371, + "line": 8, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 370, + "end": 371 + }, + { + "kind": "", + "startPos": { + "offset": 371, + "line": 8, + "column": 7 + }, + "endPos": { + "offset": 372, + "line": 8, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 371, + "end": 372 + }, + { + "kind": "", + "startPos": { + "offset": 372, + "line": 8, + "column": 8 + }, + "endPos": { + "offset": 373, + "line": 8, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 372, + "end": 373 + }, + { + "kind": "", + "startPos": { + "offset": 373, + "line": 8, + "column": 9 + }, + "endPos": { + "offset": 374, + "line": 8, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 373, + "end": 374 + }, + { + "kind": "", + "startPos": { + "offset": 374, + "line": 8, + "column": 10 + }, + "endPos": { + "offset": 375, + "line": 8, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 374, + "end": 375 + }, + { + "kind": "", + "startPos": { + "offset": 375, + "line": 8, + "column": 11 + }, + "endPos": { + "offset": 376, + "line": 8, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 375, + "end": 376 + }, + { + "kind": "", + "startPos": { + "offset": 376, + "line": 8, + "column": 12 + }, + "endPos": { + "offset": 377, + "line": 8, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 376, + "end": 377 + }, + { + "kind": "", + "startPos": { + "offset": 377, + "line": 8, + "column": 13 + }, + "endPos": { + "offset": 378, + "line": 8, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 377, + "end": 378 + }, + { + "kind": "", + "startPos": { + "offset": 378, + "line": 8, + "column": 14 + }, + "endPos": { + "offset": 379, + "line": 8, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 378, + "end": 379 + }, + { + "kind": "", + "startPos": { + "offset": 379, + "line": 8, + "column": 15 + }, + "endPos": { + "offset": 380, + "line": 8, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 379, + "end": 380 + }, + { + "kind": "", + "startPos": { + "offset": 380, + "line": 8, + "column": 16 + }, + "endPos": { + "offset": 381, + "line": 8, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 380, + "end": 381 + }, + { + "kind": "", + "startPos": { + "offset": 381, + "line": 8, + "column": 17 + }, + "endPos": { + "offset": 382, + "line": 8, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 381, + "end": 382 + }, + { + "kind": "", + "startPos": { + "offset": 382, + "line": 8, + "column": 18 + }, + "endPos": { + "offset": 383, + "line": 8, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 382, + "end": 383 + }, + { + "kind": "", + "startPos": { + "offset": 383, + "line": 8, + "column": 19 + }, + "endPos": { + "offset": 384, + "line": 8, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 383, + "end": 384 + }, + { + "kind": "", + "startPos": { + "offset": 384, + "line": 8, + "column": 20 + }, + "endPos": { + "offset": 385, + "line": 8, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 384, + "end": 385 + }, + { + "kind": "", + "startPos": { + "offset": 385, + "line": 8, + "column": 21 + }, + "endPos": { + "offset": 386, + "line": 8, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 385, + "end": 386 + }, + { + "kind": "", + "startPos": { + "offset": 386, + "line": 8, + "column": 22 + }, + "endPos": { + "offset": 387, + "line": 8, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 386, + "end": 387 + }, + { + "kind": "", + "startPos": { + "offset": 387, + "line": 8, + "column": 23 + }, + "endPos": { + "offset": 388, + "line": 8, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 387, + "end": 388 + }, + { + "kind": "", + "startPos": { + "offset": 388, + "line": 8, + "column": 24 + }, + "endPos": { + "offset": 389, + "line": 8, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 388, + "end": 389 + }, + { + "kind": "", + "startPos": { + "offset": 389, + "line": 8, + "column": 25 + }, + "endPos": { + "offset": 390, + "line": 8, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 389, + "end": 390 + }, + { + "kind": "", + "startPos": { + "offset": 390, + "line": 8, + "column": 26 + }, + "endPos": { + "offset": 391, + "line": 8, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 390, + "end": 391 + }, + { + "kind": "", + "startPos": { + "offset": 391, + "line": 8, + "column": 27 + }, + "endPos": { + "offset": 392, + "line": 8, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 391, + "end": 392 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 392, + "end": 402 + } + ] + }, + "value": { + "id": 45, + "kind": "", + "startPos": { + "offset": 404, + "line": 8, + "column": 40 + }, + "fullStart": 404, + "endPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "fullEnd": 408, + "start": 404, + "end": 408, + "expression": { + "id": 44, + "kind": "", + "startPos": { + "offset": 404, + "line": 8, + "column": 40 + }, + "fullStart": 404, + "endPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "fullEnd": 408, + "start": 404, + "end": 408, + "variable": { + "kind": "", + "startPos": { + "offset": 404, + "line": 8, + "column": 40 + }, + "endPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "value": "null", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 404, + "end": 408 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 402, + "line": 8, + "column": 38 + }, + "endPos": { + "offset": 403, + "line": 8, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 403, + "line": 8, + "column": 39 + }, + "endPos": { + "offset": 404, + "line": 8, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 403, + "end": 404 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 402, + "end": 403 + } + } + ], + "commaList": [ + { + "kind": "", + "startPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "endPos": { + "offset": 209, + "line": 4, + "column": 63 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 209, + "line": 4, + "column": 63 + }, + "endPos": { + "offset": 210, + "line": 5, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 209, + "end": 210 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 208, + "end": 209 + }, + { + "kind": "", + "startPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "endPos": { + "offset": 273, + "line": 5, + "column": 63 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 273, + "line": 5, + "column": 63 + }, + "endPos": { + "offset": 274, + "line": 6, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 273, + "end": 274 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 272, + "end": 273 + }, + { + "kind": "", + "startPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "endPos": { + "offset": 316, + "line": 6, + "column": 42 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 316, + "line": 6, + "column": 42 + }, + "endPos": { + "offset": 317, + "line": 7, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 316, + "end": 317 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 315, + "end": 316 + }, + { + "kind": "", + "startPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "endPos": { + "offset": 363, + "line": 7, + "column": 46 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 363, + "line": 7, + "column": 46 + }, + "endPos": { + "offset": 364, + "line": 8, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 363, + "end": 364 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 362, + "end": 363 + } + ], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "endPos": { + "offset": 409, + "line": 8, + "column": 45 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 409, + "line": 8, + "column": 45 + }, + "endPos": { + "offset": 410, + "line": 9, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 409, + "end": 410 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 408, + "end": 409 + } + } + ], + "symbol": 4 + } + ], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 410, + "line": 9, + "column": 0 + }, + "endPos": { + "offset": 411, + "line": 9, + "column": 1 + }, + "value": "}", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 411, + "line": 9, + "column": 1 + }, + "endPos": { + "offset": 412, + "line": 10, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 411, + "end": 412 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 410, + "end": 411 + } + }, + "parent": 51, + "symbol": 1 + } + ], + "eof": { + "kind": "", + "startPos": { + "offset": 412, + "line": 10, + "column": 0 + }, + "endPos": { + "offset": 412, + "line": 10, + "column": 0 + }, + "value": "", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 412, + "end": 412 + }, + "symbol": { + "symbolTable": { + "TablePartial:Users": { + "references": [], + "id": 1, + "symbolTable": { + "Column:balance": { + "references": [], + "id": 2, + "declaration": 10 + }, + "Column:dependents": { + "references": [], + "id": 3, + "declaration": 22 + }, + "Column:invalid_col": { + "references": [], + "id": 4, + "declaration": 48 + } + }, + "declaration": 50 + } + }, + "id": 0, + "references": [] + } + }, + "errors": [ + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 29, + "kind": "", + "startPos": { + "offset": 186, + "line": 4, + "column": 40 + }, + "fullStart": 186, + "endPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "fullEnd": 208, + "start": 186, + "end": 208, + "expression": { + "id": 28, + "kind": "", + "startPos": { + "offset": 186, + "line": 4, + "column": 40 + }, + "fullStart": 186, + "endPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "fullEnd": 208, + "start": 186, + "end": 208, + "variable": { + "kind": "", + "startPos": { + "offset": 186, + "line": 4, + "column": 40 + }, + "endPos": { + "offset": 208, + "line": 4, + "column": 62 + }, + "value": "invalid constraint 1", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 186, + "end": 208 + } + } + }, + "start": 186, + "end": 208, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 33, + "kind": "", + "startPos": { + "offset": 250, + "line": 5, + "column": 40 + }, + "fullStart": 250, + "endPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "fullEnd": 272, + "start": 250, + "end": 272, + "expression": { + "id": 32, + "kind": "", + "startPos": { + "offset": 250, + "line": 5, + "column": 40 + }, + "fullStart": 250, + "endPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "fullEnd": 272, + "start": 250, + "end": 272, + "literal": { + "kind": "", + "startPos": { + "offset": 250, + "line": 5, + "column": 40 + }, + "endPos": { + "offset": 272, + "line": 5, + "column": 62 + }, + "value": "invalid constraint 2", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 250, + "end": 272 + } + } + }, + "start": 250, + "end": 272, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 37, + "kind": "", + "startPos": { + "offset": 314, + "line": 6, + "column": 40 + }, + "fullStart": 314, + "endPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "fullEnd": 315, + "start": 314, + "end": 315, + "expression": { + "id": 36, + "kind": "", + "startPos": { + "offset": 314, + "line": 6, + "column": 40 + }, + "fullStart": 314, + "endPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "fullEnd": 315, + "start": 314, + "end": 315, + "literal": { + "kind": "", + "startPos": { + "offset": 314, + "line": 6, + "column": 40 + }, + "endPos": { + "offset": 315, + "line": 6, + "column": 41 + }, + "value": "3", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 314, + "end": 315 + } + } + }, + "start": 314, + "end": 315, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 41, + "kind": "", + "startPos": { + "offset": 357, + "line": 7, + "column": 40 + }, + "fullStart": 357, + "endPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "fullEnd": 362, + "start": 357, + "end": 362, + "expression": { + "id": 40, + "kind": "", + "startPos": { + "offset": 357, + "line": 7, + "column": 40 + }, + "fullStart": 357, + "endPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "fullEnd": 362, + "start": 357, + "end": 362, + "variable": { + "kind": "", + "startPos": { + "offset": 357, + "line": 7, + "column": 40 + }, + "endPos": { + "offset": 362, + "line": 7, + "column": 45 + }, + "value": "false", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 357, + "end": 362 + } + } + }, + "start": 357, + "end": 362, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 45, + "kind": "", + "startPos": { + "offset": 404, + "line": 8, + "column": 40 + }, + "fullStart": 404, + "endPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "fullEnd": 408, + "start": 404, + "end": 408, + "expression": { + "id": 44, + "kind": "", + "startPos": { + "offset": 404, + "line": 8, + "column": 40 + }, + "fullStart": 404, + "endPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "fullEnd": 408, + "start": 404, + "end": 408, + "variable": { + "kind": "", + "startPos": { + "offset": 404, + "line": 8, + "column": 40 + }, + "endPos": { + "offset": 408, + "line": 8, + "column": 44 + }, + "value": "null", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 404, + "end": 408 + } + } + }, + "start": 404, + "end": 408, + "name": "CompileError" + } + ] +} \ No newline at end of file diff --git a/packages/dbml-parse/tests/validator/output/table_partial_settings.out.json b/packages/dbml-parse/tests/validator/output/table_partial_settings_general.out.json similarity index 100% rename from packages/dbml-parse/tests/validator/output/table_partial_settings.out.json rename to packages/dbml-parse/tests/validator/output/table_partial_settings_general.out.json diff --git a/packages/dbml-parse/tests/validator/output/table_settings_constraint.out.json b/packages/dbml-parse/tests/validator/output/table_settings_constraint.out.json new file mode 100644 index 000000000..2ef940d64 --- /dev/null +++ b/packages/dbml-parse/tests/validator/output/table_settings_constraint.out.json @@ -0,0 +1,5416 @@ +{ + "value": { + "id": 51, + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "fullStart": 0, + "endPos": { + "offset": 405, + "line": 10, + "column": 0 + }, + "fullEnd": 405, + "start": 0, + "end": 405, + "body": [ + { + "id": 50, + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "fullStart": 0, + "endPos": { + "offset": 404, + "line": 9, + "column": 1 + }, + "fullEnd": 405, + "start": 0, + "end": 404, + "type": { + "kind": "", + "startPos": { + "offset": 0, + "line": 0, + "column": 0 + }, + "endPos": { + "offset": 5, + "line": 0, + "column": 5 + }, + "value": "Table", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 5, + "line": 0, + "column": 5 + }, + "endPos": { + "offset": 6, + "line": 0, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 5, + "end": 6 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 0, + "end": 5 + }, + "name": { + "id": 1, + "kind": "", + "startPos": { + "offset": 6, + "line": 0, + "column": 6 + }, + "fullStart": 6, + "endPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "fullEnd": 12, + "start": 6, + "end": 11, + "expression": { + "id": 0, + "kind": "", + "startPos": { + "offset": 6, + "line": 0, + "column": 6 + }, + "fullStart": 6, + "endPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "fullEnd": 12, + "start": 6, + "end": 11, + "variable": { + "kind": "", + "startPos": { + "offset": 6, + "line": 0, + "column": 6 + }, + "endPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "value": "Users", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 11, + "line": 0, + "column": 11 + }, + "endPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 11, + "end": 12 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 6, + "end": 11 + } + } + }, + "body": { + "id": 49, + "kind": "", + "startPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "fullStart": 12, + "endPos": { + "offset": 404, + "line": 9, + "column": 1 + }, + "fullEnd": 405, + "start": 12, + "end": 404, + "blockOpenBrace": { + "kind": "", + "startPos": { + "offset": 12, + "line": 0, + "column": 12 + }, + "endPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "value": "{", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 13, + "line": 0, + "column": 13 + }, + "endPos": { + "offset": 14, + "line": 1, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 13, + "end": 14 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 12, + "end": 13 + }, + "body": [ + { + "id": 10, + "kind": "", + "startPos": { + "offset": 16, + "line": 1, + "column": 2 + }, + "fullStart": 14, + "endPos": { + "offset": 55, + "line": 1, + "column": 41 + }, + "fullEnd": 56, + "start": 16, + "end": 55, + "callee": { + "id": 3, + "kind": "", + "startPos": { + "offset": 16, + "line": 1, + "column": 2 + }, + "fullStart": 14, + "endPos": { + "offset": 23, + "line": 1, + "column": 9 + }, + "fullEnd": 24, + "start": 16, + "end": 23, + "expression": { + "id": 2, + "kind": "", + "startPos": { + "offset": 16, + "line": 1, + "column": 2 + }, + "fullStart": 14, + "endPos": { + "offset": 23, + "line": 1, + "column": 9 + }, + "fullEnd": 24, + "start": 16, + "end": 23, + "variable": { + "kind": "", + "startPos": { + "offset": 16, + "line": 1, + "column": 2 + }, + "endPos": { + "offset": 23, + "line": 1, + "column": 9 + }, + "value": "balance", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 14, + "line": 1, + "column": 0 + }, + "endPos": { + "offset": 15, + "line": 1, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 14, + "end": 15 + }, + { + "kind": "", + "startPos": { + "offset": 15, + "line": 1, + "column": 1 + }, + "endPos": { + "offset": 16, + "line": 1, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 15, + "end": 16 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 23, + "line": 1, + "column": 9 + }, + "endPos": { + "offset": 24, + "line": 1, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 23, + "end": 24 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 16, + "end": 23 + } + } + }, + "args": [ + { + "id": 5, + "kind": "", + "startPos": { + "offset": 24, + "line": 1, + "column": 10 + }, + "fullStart": 24, + "endPos": { + "offset": 27, + "line": 1, + "column": 13 + }, + "fullEnd": 28, + "start": 24, + "end": 27, + "expression": { + "id": 4, + "kind": "", + "startPos": { + "offset": 24, + "line": 1, + "column": 10 + }, + "fullStart": 24, + "endPos": { + "offset": 27, + "line": 1, + "column": 13 + }, + "fullEnd": 28, + "start": 24, + "end": 27, + "variable": { + "kind": "", + "startPos": { + "offset": 24, + "line": 1, + "column": 10 + }, + "endPos": { + "offset": 27, + "line": 1, + "column": 13 + }, + "value": "int", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 27, + "line": 1, + "column": 13 + }, + "endPos": { + "offset": 28, + "line": 1, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 27, + "end": 28 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 24, + "end": 27 + } + } + }, + { + "id": 9, + "kind": "", + "startPos": { + "offset": 28, + "line": 1, + "column": 14 + }, + "fullStart": 28, + "endPos": { + "offset": 55, + "line": 1, + "column": 41 + }, + "fullEnd": 56, + "start": 28, + "end": 55, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 28, + "line": 1, + "column": 14 + }, + "endPos": { + "offset": 29, + "line": 1, + "column": 15 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 28, + "end": 29 + }, + "elementList": [ + { + "id": 8, + "kind": "", + "startPos": { + "offset": 29, + "line": 1, + "column": 15 + }, + "fullStart": 29, + "endPos": { + "offset": 54, + "line": 1, + "column": 40 + }, + "fullEnd": 54, + "start": 29, + "end": 54, + "name": { + "id": 6, + "kind": "", + "startPos": { + "offset": 29, + "line": 1, + "column": 15 + }, + "fullStart": 29, + "endPos": { + "offset": 39, + "line": 1, + "column": 25 + }, + "fullEnd": 39, + "start": 29, + "end": 39, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 29, + "line": 1, + "column": 15 + }, + "endPos": { + "offset": 39, + "line": 1, + "column": 25 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 29, + "end": 39 + } + ] + }, + "value": { + "id": 7, + "kind": "", + "startPos": { + "offset": 41, + "line": 1, + "column": 27 + }, + "fullStart": 41, + "endPos": { + "offset": 54, + "line": 1, + "column": 40 + }, + "fullEnd": 54, + "start": 41, + "end": 54, + "value": { + "kind": "", + "startPos": { + "offset": 41, + "line": 1, + "column": 27 + }, + "endPos": { + "offset": 54, + "line": 1, + "column": 40 + }, + "value": "balance > 0", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 41, + "end": 54 + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 39, + "line": 1, + "column": 25 + }, + "endPos": { + "offset": 40, + "line": 1, + "column": 26 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 40, + "line": 1, + "column": 26 + }, + "endPos": { + "offset": 41, + "line": 1, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 40, + "end": 41 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 39, + "end": 40 + } + } + ], + "commaList": [], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 54, + "line": 1, + "column": 40 + }, + "endPos": { + "offset": 55, + "line": 1, + "column": 41 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 55, + "line": 1, + "column": 41 + }, + "endPos": { + "offset": 56, + "line": 2, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 55, + "end": 56 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 54, + "end": 55 + } + } + ], + "symbol": 2 + }, + { + "id": 22, + "kind": "", + "startPos": { + "offset": 58, + "line": 2, + "column": 2 + }, + "fullStart": 56, + "endPos": { + "offset": 135, + "line": 2, + "column": 79 + }, + "fullEnd": 136, + "start": 58, + "end": 135, + "callee": { + "id": 12, + "kind": "", + "startPos": { + "offset": 58, + "line": 2, + "column": 2 + }, + "fullStart": 56, + "endPos": { + "offset": 68, + "line": 2, + "column": 12 + }, + "fullEnd": 69, + "start": 58, + "end": 68, + "expression": { + "id": 11, + "kind": "", + "startPos": { + "offset": 58, + "line": 2, + "column": 2 + }, + "fullStart": 56, + "endPos": { + "offset": 68, + "line": 2, + "column": 12 + }, + "fullEnd": 69, + "start": 58, + "end": 68, + "variable": { + "kind": "", + "startPos": { + "offset": 58, + "line": 2, + "column": 2 + }, + "endPos": { + "offset": 68, + "line": 2, + "column": 12 + }, + "value": "dependents", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 56, + "line": 2, + "column": 0 + }, + "endPos": { + "offset": 57, + "line": 2, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 56, + "end": 57 + }, + { + "kind": "", + "startPos": { + "offset": 57, + "line": 2, + "column": 1 + }, + "endPos": { + "offset": 58, + "line": 2, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 57, + "end": 58 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 68, + "line": 2, + "column": 12 + }, + "endPos": { + "offset": 69, + "line": 2, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 68, + "end": 69 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 58, + "end": 68 + } + } + }, + "args": [ + { + "id": 14, + "kind": "", + "startPos": { + "offset": 69, + "line": 2, + "column": 13 + }, + "fullStart": 69, + "endPos": { + "offset": 72, + "line": 2, + "column": 16 + }, + "fullEnd": 73, + "start": 69, + "end": 72, + "expression": { + "id": 13, + "kind": "", + "startPos": { + "offset": 69, + "line": 2, + "column": 13 + }, + "fullStart": 69, + "endPos": { + "offset": 72, + "line": 2, + "column": 16 + }, + "fullEnd": 73, + "start": 69, + "end": 72, + "variable": { + "kind": "", + "startPos": { + "offset": 69, + "line": 2, + "column": 13 + }, + "endPos": { + "offset": 72, + "line": 2, + "column": 16 + }, + "value": "int", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 72, + "line": 2, + "column": 16 + }, + "endPos": { + "offset": 73, + "line": 2, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 72, + "end": 73 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 69, + "end": 72 + } + } + }, + { + "id": 21, + "kind": "", + "startPos": { + "offset": 73, + "line": 2, + "column": 17 + }, + "fullStart": 73, + "endPos": { + "offset": 135, + "line": 2, + "column": 79 + }, + "fullEnd": 136, + "start": 73, + "end": 135, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 73, + "line": 2, + "column": 17 + }, + "endPos": { + "offset": 74, + "line": 2, + "column": 18 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 73, + "end": 74 + }, + "elementList": [ + { + "id": 17, + "kind": "", + "startPos": { + "offset": 74, + "line": 2, + "column": 18 + }, + "fullStart": 74, + "endPos": { + "offset": 103, + "line": 2, + "column": 47 + }, + "fullEnd": 103, + "start": 74, + "end": 103, + "name": { + "id": 15, + "kind": "", + "startPos": { + "offset": 74, + "line": 2, + "column": 18 + }, + "fullStart": 74, + "endPos": { + "offset": 84, + "line": 2, + "column": 28 + }, + "fullEnd": 84, + "start": 74, + "end": 84, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 74, + "line": 2, + "column": 18 + }, + "endPos": { + "offset": 84, + "line": 2, + "column": 28 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 74, + "end": 84 + } + ] + }, + "value": { + "id": 16, + "kind": "", + "startPos": { + "offset": 86, + "line": 2, + "column": 30 + }, + "fullStart": 86, + "endPos": { + "offset": 103, + "line": 2, + "column": 47 + }, + "fullEnd": 103, + "start": 86, + "end": 103, + "value": { + "kind": "", + "startPos": { + "offset": 86, + "line": 2, + "column": 30 + }, + "endPos": { + "offset": 103, + "line": 2, + "column": 47 + }, + "value": "dependents >= 0", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 86, + "end": 103 + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 84, + "line": 2, + "column": 28 + }, + "endPos": { + "offset": 85, + "line": 2, + "column": 29 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 85, + "line": 2, + "column": 29 + }, + "endPos": { + "offset": 86, + "line": 2, + "column": 30 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 85, + "end": 86 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 84, + "end": 85 + } + }, + { + "id": 20, + "kind": "", + "startPos": { + "offset": 105, + "line": 2, + "column": 49 + }, + "fullStart": 105, + "endPos": { + "offset": 134, + "line": 2, + "column": 78 + }, + "fullEnd": 134, + "start": 105, + "end": 134, + "name": { + "id": 18, + "kind": "", + "startPos": { + "offset": 105, + "line": 2, + "column": 49 + }, + "fullStart": 105, + "endPos": { + "offset": 115, + "line": 2, + "column": 59 + }, + "fullEnd": 115, + "start": 105, + "end": 115, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 105, + "line": 2, + "column": 49 + }, + "endPos": { + "offset": 115, + "line": 2, + "column": 59 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 105, + "end": 115 + } + ] + }, + "value": { + "id": 19, + "kind": "", + "startPos": { + "offset": 117, + "line": 2, + "column": 61 + }, + "fullStart": 117, + "endPos": { + "offset": 134, + "line": 2, + "column": 78 + }, + "fullEnd": 134, + "start": 117, + "end": 134, + "value": { + "kind": "", + "startPos": { + "offset": 117, + "line": 2, + "column": 61 + }, + "endPos": { + "offset": 134, + "line": 2, + "column": 78 + }, + "value": "dependents < 10", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 117, + "end": 134 + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 115, + "line": 2, + "column": 59 + }, + "endPos": { + "offset": 116, + "line": 2, + "column": 60 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 116, + "line": 2, + "column": 60 + }, + "endPos": { + "offset": 117, + "line": 2, + "column": 61 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 116, + "end": 117 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 115, + "end": 116 + } + } + ], + "commaList": [ + { + "kind": "", + "startPos": { + "offset": 103, + "line": 2, + "column": 47 + }, + "endPos": { + "offset": 104, + "line": 2, + "column": 48 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 104, + "line": 2, + "column": 48 + }, + "endPos": { + "offset": 105, + "line": 2, + "column": 49 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 104, + "end": 105 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 103, + "end": 104 + } + ], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 134, + "line": 2, + "column": 78 + }, + "endPos": { + "offset": 135, + "line": 2, + "column": 79 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 135, + "line": 2, + "column": 79 + }, + "endPos": { + "offset": 136, + "line": 3, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 135, + "end": 136 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 134, + "end": 135 + } + } + ], + "symbol": 3 + }, + { + "id": 48, + "kind": "", + "startPos": { + "offset": 141, + "line": 4, + "column": 2 + }, + "fullStart": 136, + "endPos": { + "offset": 402, + "line": 8, + "column": 45 + }, + "fullEnd": 403, + "start": 141, + "end": 402, + "callee": { + "id": 24, + "kind": "", + "startPos": { + "offset": 141, + "line": 4, + "column": 2 + }, + "fullStart": 136, + "endPos": { + "offset": 152, + "line": 4, + "column": 13 + }, + "fullEnd": 153, + "start": 141, + "end": 152, + "expression": { + "id": 23, + "kind": "", + "startPos": { + "offset": 141, + "line": 4, + "column": 2 + }, + "fullStart": 136, + "endPos": { + "offset": 152, + "line": 4, + "column": 13 + }, + "fullEnd": 153, + "start": 141, + "end": 152, + "variable": { + "kind": "", + "startPos": { + "offset": 141, + "line": 4, + "column": 2 + }, + "endPos": { + "offset": 152, + "line": 4, + "column": 13 + }, + "value": "invalid_col", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 136, + "line": 3, + "column": 0 + }, + "endPos": { + "offset": 137, + "line": 3, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 136, + "end": 137 + }, + { + "kind": "", + "startPos": { + "offset": 137, + "line": 3, + "column": 1 + }, + "endPos": { + "offset": 138, + "line": 3, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 137, + "end": 138 + }, + { + "kind": "", + "startPos": { + "offset": 138, + "line": 3, + "column": 2 + }, + "endPos": { + "offset": 139, + "line": 4, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 138, + "end": 139 + }, + { + "kind": "", + "startPos": { + "offset": 139, + "line": 4, + "column": 0 + }, + "endPos": { + "offset": 140, + "line": 4, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 139, + "end": 140 + }, + { + "kind": "", + "startPos": { + "offset": 140, + "line": 4, + "column": 1 + }, + "endPos": { + "offset": 141, + "line": 4, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 140, + "end": 141 + } + ], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 152, + "line": 4, + "column": 13 + }, + "endPos": { + "offset": 153, + "line": 4, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 152, + "end": 153 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 141, + "end": 152 + } + } + }, + "args": [ + { + "id": 26, + "kind": "", + "startPos": { + "offset": 153, + "line": 4, + "column": 14 + }, + "fullStart": 153, + "endPos": { + "offset": 165, + "line": 4, + "column": 26 + }, + "fullEnd": 166, + "start": 153, + "end": 165, + "expression": { + "id": 25, + "kind": "", + "startPos": { + "offset": 153, + "line": 4, + "column": 14 + }, + "fullStart": 153, + "endPos": { + "offset": 165, + "line": 4, + "column": 26 + }, + "fullEnd": 166, + "start": 153, + "end": 165, + "variable": { + "kind": "", + "startPos": { + "offset": 153, + "line": 4, + "column": 14 + }, + "endPos": { + "offset": 165, + "line": 4, + "column": 26 + }, + "value": "invalid_type", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 165, + "line": 4, + "column": 26 + }, + "endPos": { + "offset": 166, + "line": 4, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 165, + "end": 166 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 153, + "end": 165 + } + } + }, + { + "id": 47, + "kind": "", + "startPos": { + "offset": 166, + "line": 4, + "column": 27 + }, + "fullStart": 166, + "endPos": { + "offset": 402, + "line": 8, + "column": 45 + }, + "fullEnd": 403, + "start": 166, + "end": 402, + "listOpenBracket": { + "kind": "", + "startPos": { + "offset": 166, + "line": 4, + "column": 27 + }, + "endPos": { + "offset": 167, + "line": 4, + "column": 28 + }, + "value": "[", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 166, + "end": 167 + }, + "elementList": [ + { + "id": 30, + "kind": "", + "startPos": { + "offset": 167, + "line": 4, + "column": 28 + }, + "fullStart": 167, + "endPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "fullEnd": 201, + "start": 167, + "end": 201, + "name": { + "id": 27, + "kind": "", + "startPos": { + "offset": 167, + "line": 4, + "column": 28 + }, + "fullStart": 167, + "endPos": { + "offset": 177, + "line": 4, + "column": 38 + }, + "fullEnd": 177, + "start": 167, + "end": 177, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 167, + "line": 4, + "column": 28 + }, + "endPos": { + "offset": 177, + "line": 4, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 167, + "end": 177 + } + ] + }, + "value": { + "id": 29, + "kind": "", + "startPos": { + "offset": 179, + "line": 4, + "column": 40 + }, + "fullStart": 179, + "endPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "fullEnd": 201, + "start": 179, + "end": 201, + "expression": { + "id": 28, + "kind": "", + "startPos": { + "offset": 179, + "line": 4, + "column": 40 + }, + "fullStart": 179, + "endPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "fullEnd": 201, + "start": 179, + "end": 201, + "variable": { + "kind": "", + "startPos": { + "offset": 179, + "line": 4, + "column": 40 + }, + "endPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "value": "invalid constraint 1", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 179, + "end": 201 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 177, + "line": 4, + "column": 38 + }, + "endPos": { + "offset": 178, + "line": 4, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 178, + "line": 4, + "column": 39 + }, + "endPos": { + "offset": 179, + "line": 4, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 178, + "end": 179 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 177, + "end": 178 + } + }, + { + "id": 34, + "kind": "", + "startPos": { + "offset": 231, + "line": 5, + "column": 28 + }, + "fullStart": 203, + "endPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "fullEnd": 265, + "start": 231, + "end": 265, + "name": { + "id": 31, + "kind": "", + "startPos": { + "offset": 231, + "line": 5, + "column": 28 + }, + "fullStart": 203, + "endPos": { + "offset": 241, + "line": 5, + "column": 38 + }, + "fullEnd": 241, + "start": 231, + "end": 241, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 231, + "line": 5, + "column": 28 + }, + "endPos": { + "offset": 241, + "line": 5, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 203, + "line": 5, + "column": 0 + }, + "endPos": { + "offset": 204, + "line": 5, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 203, + "end": 204 + }, + { + "kind": "", + "startPos": { + "offset": 204, + "line": 5, + "column": 1 + }, + "endPos": { + "offset": 205, + "line": 5, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 204, + "end": 205 + }, + { + "kind": "", + "startPos": { + "offset": 205, + "line": 5, + "column": 2 + }, + "endPos": { + "offset": 206, + "line": 5, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 205, + "end": 206 + }, + { + "kind": "", + "startPos": { + "offset": 206, + "line": 5, + "column": 3 + }, + "endPos": { + "offset": 207, + "line": 5, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 206, + "end": 207 + }, + { + "kind": "", + "startPos": { + "offset": 207, + "line": 5, + "column": 4 + }, + "endPos": { + "offset": 208, + "line": 5, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 207, + "end": 208 + }, + { + "kind": "", + "startPos": { + "offset": 208, + "line": 5, + "column": 5 + }, + "endPos": { + "offset": 209, + "line": 5, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 208, + "end": 209 + }, + { + "kind": "", + "startPos": { + "offset": 209, + "line": 5, + "column": 6 + }, + "endPos": { + "offset": 210, + "line": 5, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 209, + "end": 210 + }, + { + "kind": "", + "startPos": { + "offset": 210, + "line": 5, + "column": 7 + }, + "endPos": { + "offset": 211, + "line": 5, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 210, + "end": 211 + }, + { + "kind": "", + "startPos": { + "offset": 211, + "line": 5, + "column": 8 + }, + "endPos": { + "offset": 212, + "line": 5, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 211, + "end": 212 + }, + { + "kind": "", + "startPos": { + "offset": 212, + "line": 5, + "column": 9 + }, + "endPos": { + "offset": 213, + "line": 5, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 212, + "end": 213 + }, + { + "kind": "", + "startPos": { + "offset": 213, + "line": 5, + "column": 10 + }, + "endPos": { + "offset": 214, + "line": 5, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 213, + "end": 214 + }, + { + "kind": "", + "startPos": { + "offset": 214, + "line": 5, + "column": 11 + }, + "endPos": { + "offset": 215, + "line": 5, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 214, + "end": 215 + }, + { + "kind": "", + "startPos": { + "offset": 215, + "line": 5, + "column": 12 + }, + "endPos": { + "offset": 216, + "line": 5, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 215, + "end": 216 + }, + { + "kind": "", + "startPos": { + "offset": 216, + "line": 5, + "column": 13 + }, + "endPos": { + "offset": 217, + "line": 5, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 216, + "end": 217 + }, + { + "kind": "", + "startPos": { + "offset": 217, + "line": 5, + "column": 14 + }, + "endPos": { + "offset": 218, + "line": 5, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 217, + "end": 218 + }, + { + "kind": "", + "startPos": { + "offset": 218, + "line": 5, + "column": 15 + }, + "endPos": { + "offset": 219, + "line": 5, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 218, + "end": 219 + }, + { + "kind": "", + "startPos": { + "offset": 219, + "line": 5, + "column": 16 + }, + "endPos": { + "offset": 220, + "line": 5, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 219, + "end": 220 + }, + { + "kind": "", + "startPos": { + "offset": 220, + "line": 5, + "column": 17 + }, + "endPos": { + "offset": 221, + "line": 5, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 220, + "end": 221 + }, + { + "kind": "", + "startPos": { + "offset": 221, + "line": 5, + "column": 18 + }, + "endPos": { + "offset": 222, + "line": 5, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 221, + "end": 222 + }, + { + "kind": "", + "startPos": { + "offset": 222, + "line": 5, + "column": 19 + }, + "endPos": { + "offset": 223, + "line": 5, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 222, + "end": 223 + }, + { + "kind": "", + "startPos": { + "offset": 223, + "line": 5, + "column": 20 + }, + "endPos": { + "offset": 224, + "line": 5, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 223, + "end": 224 + }, + { + "kind": "", + "startPos": { + "offset": 224, + "line": 5, + "column": 21 + }, + "endPos": { + "offset": 225, + "line": 5, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 224, + "end": 225 + }, + { + "kind": "", + "startPos": { + "offset": 225, + "line": 5, + "column": 22 + }, + "endPos": { + "offset": 226, + "line": 5, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 225, + "end": 226 + }, + { + "kind": "", + "startPos": { + "offset": 226, + "line": 5, + "column": 23 + }, + "endPos": { + "offset": 227, + "line": 5, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 226, + "end": 227 + }, + { + "kind": "", + "startPos": { + "offset": 227, + "line": 5, + "column": 24 + }, + "endPos": { + "offset": 228, + "line": 5, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 227, + "end": 228 + }, + { + "kind": "", + "startPos": { + "offset": 228, + "line": 5, + "column": 25 + }, + "endPos": { + "offset": 229, + "line": 5, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 228, + "end": 229 + }, + { + "kind": "", + "startPos": { + "offset": 229, + "line": 5, + "column": 26 + }, + "endPos": { + "offset": 230, + "line": 5, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 229, + "end": 230 + }, + { + "kind": "", + "startPos": { + "offset": 230, + "line": 5, + "column": 27 + }, + "endPos": { + "offset": 231, + "line": 5, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 230, + "end": 231 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 231, + "end": 241 + } + ] + }, + "value": { + "id": 33, + "kind": "", + "startPos": { + "offset": 243, + "line": 5, + "column": 40 + }, + "fullStart": 243, + "endPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "fullEnd": 265, + "start": 243, + "end": 265, + "expression": { + "id": 32, + "kind": "", + "startPos": { + "offset": 243, + "line": 5, + "column": 40 + }, + "fullStart": 243, + "endPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "fullEnd": 265, + "start": 243, + "end": 265, + "literal": { + "kind": "", + "startPos": { + "offset": 243, + "line": 5, + "column": 40 + }, + "endPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "value": "invalid constraint 2", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 243, + "end": 265 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 241, + "line": 5, + "column": 38 + }, + "endPos": { + "offset": 242, + "line": 5, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 242, + "line": 5, + "column": 39 + }, + "endPos": { + "offset": 243, + "line": 5, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 242, + "end": 243 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 241, + "end": 242 + } + }, + { + "id": 38, + "kind": "", + "startPos": { + "offset": 295, + "line": 6, + "column": 28 + }, + "fullStart": 267, + "endPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "fullEnd": 308, + "start": 295, + "end": 308, + "name": { + "id": 35, + "kind": "", + "startPos": { + "offset": 295, + "line": 6, + "column": 28 + }, + "fullStart": 267, + "endPos": { + "offset": 305, + "line": 6, + "column": 38 + }, + "fullEnd": 305, + "start": 295, + "end": 305, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 295, + "line": 6, + "column": 28 + }, + "endPos": { + "offset": 305, + "line": 6, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 267, + "line": 6, + "column": 0 + }, + "endPos": { + "offset": 268, + "line": 6, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 267, + "end": 268 + }, + { + "kind": "", + "startPos": { + "offset": 268, + "line": 6, + "column": 1 + }, + "endPos": { + "offset": 269, + "line": 6, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 268, + "end": 269 + }, + { + "kind": "", + "startPos": { + "offset": 269, + "line": 6, + "column": 2 + }, + "endPos": { + "offset": 270, + "line": 6, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 269, + "end": 270 + }, + { + "kind": "", + "startPos": { + "offset": 270, + "line": 6, + "column": 3 + }, + "endPos": { + "offset": 271, + "line": 6, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 270, + "end": 271 + }, + { + "kind": "", + "startPos": { + "offset": 271, + "line": 6, + "column": 4 + }, + "endPos": { + "offset": 272, + "line": 6, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 271, + "end": 272 + }, + { + "kind": "", + "startPos": { + "offset": 272, + "line": 6, + "column": 5 + }, + "endPos": { + "offset": 273, + "line": 6, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 272, + "end": 273 + }, + { + "kind": "", + "startPos": { + "offset": 273, + "line": 6, + "column": 6 + }, + "endPos": { + "offset": 274, + "line": 6, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 273, + "end": 274 + }, + { + "kind": "", + "startPos": { + "offset": 274, + "line": 6, + "column": 7 + }, + "endPos": { + "offset": 275, + "line": 6, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 274, + "end": 275 + }, + { + "kind": "", + "startPos": { + "offset": 275, + "line": 6, + "column": 8 + }, + "endPos": { + "offset": 276, + "line": 6, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 275, + "end": 276 + }, + { + "kind": "", + "startPos": { + "offset": 276, + "line": 6, + "column": 9 + }, + "endPos": { + "offset": 277, + "line": 6, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 276, + "end": 277 + }, + { + "kind": "", + "startPos": { + "offset": 277, + "line": 6, + "column": 10 + }, + "endPos": { + "offset": 278, + "line": 6, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 277, + "end": 278 + }, + { + "kind": "", + "startPos": { + "offset": 278, + "line": 6, + "column": 11 + }, + "endPos": { + "offset": 279, + "line": 6, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 278, + "end": 279 + }, + { + "kind": "", + "startPos": { + "offset": 279, + "line": 6, + "column": 12 + }, + "endPos": { + "offset": 280, + "line": 6, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 279, + "end": 280 + }, + { + "kind": "", + "startPos": { + "offset": 280, + "line": 6, + "column": 13 + }, + "endPos": { + "offset": 281, + "line": 6, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 280, + "end": 281 + }, + { + "kind": "", + "startPos": { + "offset": 281, + "line": 6, + "column": 14 + }, + "endPos": { + "offset": 282, + "line": 6, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 281, + "end": 282 + }, + { + "kind": "", + "startPos": { + "offset": 282, + "line": 6, + "column": 15 + }, + "endPos": { + "offset": 283, + "line": 6, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 282, + "end": 283 + }, + { + "kind": "", + "startPos": { + "offset": 283, + "line": 6, + "column": 16 + }, + "endPos": { + "offset": 284, + "line": 6, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 283, + "end": 284 + }, + { + "kind": "", + "startPos": { + "offset": 284, + "line": 6, + "column": 17 + }, + "endPos": { + "offset": 285, + "line": 6, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 284, + "end": 285 + }, + { + "kind": "", + "startPos": { + "offset": 285, + "line": 6, + "column": 18 + }, + "endPos": { + "offset": 286, + "line": 6, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 285, + "end": 286 + }, + { + "kind": "", + "startPos": { + "offset": 286, + "line": 6, + "column": 19 + }, + "endPos": { + "offset": 287, + "line": 6, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 286, + "end": 287 + }, + { + "kind": "", + "startPos": { + "offset": 287, + "line": 6, + "column": 20 + }, + "endPos": { + "offset": 288, + "line": 6, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 287, + "end": 288 + }, + { + "kind": "", + "startPos": { + "offset": 288, + "line": 6, + "column": 21 + }, + "endPos": { + "offset": 289, + "line": 6, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 288, + "end": 289 + }, + { + "kind": "", + "startPos": { + "offset": 289, + "line": 6, + "column": 22 + }, + "endPos": { + "offset": 290, + "line": 6, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 289, + "end": 290 + }, + { + "kind": "", + "startPos": { + "offset": 290, + "line": 6, + "column": 23 + }, + "endPos": { + "offset": 291, + "line": 6, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 290, + "end": 291 + }, + { + "kind": "", + "startPos": { + "offset": 291, + "line": 6, + "column": 24 + }, + "endPos": { + "offset": 292, + "line": 6, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 291, + "end": 292 + }, + { + "kind": "", + "startPos": { + "offset": 292, + "line": 6, + "column": 25 + }, + "endPos": { + "offset": 293, + "line": 6, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 292, + "end": 293 + }, + { + "kind": "", + "startPos": { + "offset": 293, + "line": 6, + "column": 26 + }, + "endPos": { + "offset": 294, + "line": 6, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 293, + "end": 294 + }, + { + "kind": "", + "startPos": { + "offset": 294, + "line": 6, + "column": 27 + }, + "endPos": { + "offset": 295, + "line": 6, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 294, + "end": 295 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 295, + "end": 305 + } + ] + }, + "value": { + "id": 37, + "kind": "", + "startPos": { + "offset": 307, + "line": 6, + "column": 40 + }, + "fullStart": 307, + "endPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "fullEnd": 308, + "start": 307, + "end": 308, + "expression": { + "id": 36, + "kind": "", + "startPos": { + "offset": 307, + "line": 6, + "column": 40 + }, + "fullStart": 307, + "endPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "fullEnd": 308, + "start": 307, + "end": 308, + "literal": { + "kind": "", + "startPos": { + "offset": 307, + "line": 6, + "column": 40 + }, + "endPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "value": "3", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 307, + "end": 308 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 305, + "line": 6, + "column": 38 + }, + "endPos": { + "offset": 306, + "line": 6, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 306, + "line": 6, + "column": 39 + }, + "endPos": { + "offset": 307, + "line": 6, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 306, + "end": 307 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 305, + "end": 306 + } + }, + { + "id": 42, + "kind": "", + "startPos": { + "offset": 338, + "line": 7, + "column": 28 + }, + "fullStart": 310, + "endPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "fullEnd": 355, + "start": 338, + "end": 355, + "name": { + "id": 39, + "kind": "", + "startPos": { + "offset": 338, + "line": 7, + "column": 28 + }, + "fullStart": 310, + "endPos": { + "offset": 348, + "line": 7, + "column": 38 + }, + "fullEnd": 348, + "start": 338, + "end": 348, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 338, + "line": 7, + "column": 28 + }, + "endPos": { + "offset": 348, + "line": 7, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 310, + "line": 7, + "column": 0 + }, + "endPos": { + "offset": 311, + "line": 7, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 310, + "end": 311 + }, + { + "kind": "", + "startPos": { + "offset": 311, + "line": 7, + "column": 1 + }, + "endPos": { + "offset": 312, + "line": 7, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 311, + "end": 312 + }, + { + "kind": "", + "startPos": { + "offset": 312, + "line": 7, + "column": 2 + }, + "endPos": { + "offset": 313, + "line": 7, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 312, + "end": 313 + }, + { + "kind": "", + "startPos": { + "offset": 313, + "line": 7, + "column": 3 + }, + "endPos": { + "offset": 314, + "line": 7, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 313, + "end": 314 + }, + { + "kind": "", + "startPos": { + "offset": 314, + "line": 7, + "column": 4 + }, + "endPos": { + "offset": 315, + "line": 7, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 314, + "end": 315 + }, + { + "kind": "", + "startPos": { + "offset": 315, + "line": 7, + "column": 5 + }, + "endPos": { + "offset": 316, + "line": 7, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 315, + "end": 316 + }, + { + "kind": "", + "startPos": { + "offset": 316, + "line": 7, + "column": 6 + }, + "endPos": { + "offset": 317, + "line": 7, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 316, + "end": 317 + }, + { + "kind": "", + "startPos": { + "offset": 317, + "line": 7, + "column": 7 + }, + "endPos": { + "offset": 318, + "line": 7, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 317, + "end": 318 + }, + { + "kind": "", + "startPos": { + "offset": 318, + "line": 7, + "column": 8 + }, + "endPos": { + "offset": 319, + "line": 7, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 318, + "end": 319 + }, + { + "kind": "", + "startPos": { + "offset": 319, + "line": 7, + "column": 9 + }, + "endPos": { + "offset": 320, + "line": 7, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 319, + "end": 320 + }, + { + "kind": "", + "startPos": { + "offset": 320, + "line": 7, + "column": 10 + }, + "endPos": { + "offset": 321, + "line": 7, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 320, + "end": 321 + }, + { + "kind": "", + "startPos": { + "offset": 321, + "line": 7, + "column": 11 + }, + "endPos": { + "offset": 322, + "line": 7, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 321, + "end": 322 + }, + { + "kind": "", + "startPos": { + "offset": 322, + "line": 7, + "column": 12 + }, + "endPos": { + "offset": 323, + "line": 7, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 322, + "end": 323 + }, + { + "kind": "", + "startPos": { + "offset": 323, + "line": 7, + "column": 13 + }, + "endPos": { + "offset": 324, + "line": 7, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 323, + "end": 324 + }, + { + "kind": "", + "startPos": { + "offset": 324, + "line": 7, + "column": 14 + }, + "endPos": { + "offset": 325, + "line": 7, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 324, + "end": 325 + }, + { + "kind": "", + "startPos": { + "offset": 325, + "line": 7, + "column": 15 + }, + "endPos": { + "offset": 326, + "line": 7, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 325, + "end": 326 + }, + { + "kind": "", + "startPos": { + "offset": 326, + "line": 7, + "column": 16 + }, + "endPos": { + "offset": 327, + "line": 7, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 326, + "end": 327 + }, + { + "kind": "", + "startPos": { + "offset": 327, + "line": 7, + "column": 17 + }, + "endPos": { + "offset": 328, + "line": 7, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 327, + "end": 328 + }, + { + "kind": "", + "startPos": { + "offset": 328, + "line": 7, + "column": 18 + }, + "endPos": { + "offset": 329, + "line": 7, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 328, + "end": 329 + }, + { + "kind": "", + "startPos": { + "offset": 329, + "line": 7, + "column": 19 + }, + "endPos": { + "offset": 330, + "line": 7, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 329, + "end": 330 + }, + { + "kind": "", + "startPos": { + "offset": 330, + "line": 7, + "column": 20 + }, + "endPos": { + "offset": 331, + "line": 7, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 330, + "end": 331 + }, + { + "kind": "", + "startPos": { + "offset": 331, + "line": 7, + "column": 21 + }, + "endPos": { + "offset": 332, + "line": 7, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 331, + "end": 332 + }, + { + "kind": "", + "startPos": { + "offset": 332, + "line": 7, + "column": 22 + }, + "endPos": { + "offset": 333, + "line": 7, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 332, + "end": 333 + }, + { + "kind": "", + "startPos": { + "offset": 333, + "line": 7, + "column": 23 + }, + "endPos": { + "offset": 334, + "line": 7, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 333, + "end": 334 + }, + { + "kind": "", + "startPos": { + "offset": 334, + "line": 7, + "column": 24 + }, + "endPos": { + "offset": 335, + "line": 7, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 334, + "end": 335 + }, + { + "kind": "", + "startPos": { + "offset": 335, + "line": 7, + "column": 25 + }, + "endPos": { + "offset": 336, + "line": 7, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 335, + "end": 336 + }, + { + "kind": "", + "startPos": { + "offset": 336, + "line": 7, + "column": 26 + }, + "endPos": { + "offset": 337, + "line": 7, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 336, + "end": 337 + }, + { + "kind": "", + "startPos": { + "offset": 337, + "line": 7, + "column": 27 + }, + "endPos": { + "offset": 338, + "line": 7, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 337, + "end": 338 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 338, + "end": 348 + } + ] + }, + "value": { + "id": 41, + "kind": "", + "startPos": { + "offset": 350, + "line": 7, + "column": 40 + }, + "fullStart": 350, + "endPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "fullEnd": 355, + "start": 350, + "end": 355, + "expression": { + "id": 40, + "kind": "", + "startPos": { + "offset": 350, + "line": 7, + "column": 40 + }, + "fullStart": 350, + "endPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "fullEnd": 355, + "start": 350, + "end": 355, + "variable": { + "kind": "", + "startPos": { + "offset": 350, + "line": 7, + "column": 40 + }, + "endPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "value": "false", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 350, + "end": 355 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 348, + "line": 7, + "column": 38 + }, + "endPos": { + "offset": 349, + "line": 7, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 349, + "line": 7, + "column": 39 + }, + "endPos": { + "offset": 350, + "line": 7, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 349, + "end": 350 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 348, + "end": 349 + } + }, + { + "id": 46, + "kind": "", + "startPos": { + "offset": 385, + "line": 8, + "column": 28 + }, + "fullStart": 357, + "endPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "fullEnd": 401, + "start": 385, + "end": 401, + "name": { + "id": 43, + "kind": "", + "startPos": { + "offset": 385, + "line": 8, + "column": 28 + }, + "fullStart": 357, + "endPos": { + "offset": 395, + "line": 8, + "column": 38 + }, + "fullEnd": 395, + "start": 385, + "end": 395, + "identifiers": [ + { + "kind": "", + "startPos": { + "offset": 385, + "line": 8, + "column": 28 + }, + "endPos": { + "offset": 395, + "line": 8, + "column": 38 + }, + "value": "constraint", + "leadingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 357, + "line": 8, + "column": 0 + }, + "endPos": { + "offset": 358, + "line": 8, + "column": 1 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 357, + "end": 358 + }, + { + "kind": "", + "startPos": { + "offset": 358, + "line": 8, + "column": 1 + }, + "endPos": { + "offset": 359, + "line": 8, + "column": 2 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 358, + "end": 359 + }, + { + "kind": "", + "startPos": { + "offset": 359, + "line": 8, + "column": 2 + }, + "endPos": { + "offset": 360, + "line": 8, + "column": 3 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 359, + "end": 360 + }, + { + "kind": "", + "startPos": { + "offset": 360, + "line": 8, + "column": 3 + }, + "endPos": { + "offset": 361, + "line": 8, + "column": 4 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 360, + "end": 361 + }, + { + "kind": "", + "startPos": { + "offset": 361, + "line": 8, + "column": 4 + }, + "endPos": { + "offset": 362, + "line": 8, + "column": 5 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 361, + "end": 362 + }, + { + "kind": "", + "startPos": { + "offset": 362, + "line": 8, + "column": 5 + }, + "endPos": { + "offset": 363, + "line": 8, + "column": 6 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 362, + "end": 363 + }, + { + "kind": "", + "startPos": { + "offset": 363, + "line": 8, + "column": 6 + }, + "endPos": { + "offset": 364, + "line": 8, + "column": 7 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 363, + "end": 364 + }, + { + "kind": "", + "startPos": { + "offset": 364, + "line": 8, + "column": 7 + }, + "endPos": { + "offset": 365, + "line": 8, + "column": 8 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 364, + "end": 365 + }, + { + "kind": "", + "startPos": { + "offset": 365, + "line": 8, + "column": 8 + }, + "endPos": { + "offset": 366, + "line": 8, + "column": 9 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 365, + "end": 366 + }, + { + "kind": "", + "startPos": { + "offset": 366, + "line": 8, + "column": 9 + }, + "endPos": { + "offset": 367, + "line": 8, + "column": 10 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 366, + "end": 367 + }, + { + "kind": "", + "startPos": { + "offset": 367, + "line": 8, + "column": 10 + }, + "endPos": { + "offset": 368, + "line": 8, + "column": 11 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 367, + "end": 368 + }, + { + "kind": "", + "startPos": { + "offset": 368, + "line": 8, + "column": 11 + }, + "endPos": { + "offset": 369, + "line": 8, + "column": 12 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 368, + "end": 369 + }, + { + "kind": "", + "startPos": { + "offset": 369, + "line": 8, + "column": 12 + }, + "endPos": { + "offset": 370, + "line": 8, + "column": 13 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 369, + "end": 370 + }, + { + "kind": "", + "startPos": { + "offset": 370, + "line": 8, + "column": 13 + }, + "endPos": { + "offset": 371, + "line": 8, + "column": 14 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 370, + "end": 371 + }, + { + "kind": "", + "startPos": { + "offset": 371, + "line": 8, + "column": 14 + }, + "endPos": { + "offset": 372, + "line": 8, + "column": 15 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 371, + "end": 372 + }, + { + "kind": "", + "startPos": { + "offset": 372, + "line": 8, + "column": 15 + }, + "endPos": { + "offset": 373, + "line": 8, + "column": 16 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 372, + "end": 373 + }, + { + "kind": "", + "startPos": { + "offset": 373, + "line": 8, + "column": 16 + }, + "endPos": { + "offset": 374, + "line": 8, + "column": 17 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 373, + "end": 374 + }, + { + "kind": "", + "startPos": { + "offset": 374, + "line": 8, + "column": 17 + }, + "endPos": { + "offset": 375, + "line": 8, + "column": 18 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 374, + "end": 375 + }, + { + "kind": "", + "startPos": { + "offset": 375, + "line": 8, + "column": 18 + }, + "endPos": { + "offset": 376, + "line": 8, + "column": 19 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 375, + "end": 376 + }, + { + "kind": "", + "startPos": { + "offset": 376, + "line": 8, + "column": 19 + }, + "endPos": { + "offset": 377, + "line": 8, + "column": 20 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 376, + "end": 377 + }, + { + "kind": "", + "startPos": { + "offset": 377, + "line": 8, + "column": 20 + }, + "endPos": { + "offset": 378, + "line": 8, + "column": 21 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 377, + "end": 378 + }, + { + "kind": "", + "startPos": { + "offset": 378, + "line": 8, + "column": 21 + }, + "endPos": { + "offset": 379, + "line": 8, + "column": 22 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 378, + "end": 379 + }, + { + "kind": "", + "startPos": { + "offset": 379, + "line": 8, + "column": 22 + }, + "endPos": { + "offset": 380, + "line": 8, + "column": 23 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 379, + "end": 380 + }, + { + "kind": "", + "startPos": { + "offset": 380, + "line": 8, + "column": 23 + }, + "endPos": { + "offset": 381, + "line": 8, + "column": 24 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 380, + "end": 381 + }, + { + "kind": "", + "startPos": { + "offset": 381, + "line": 8, + "column": 24 + }, + "endPos": { + "offset": 382, + "line": 8, + "column": 25 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 381, + "end": 382 + }, + { + "kind": "", + "startPos": { + "offset": 382, + "line": 8, + "column": 25 + }, + "endPos": { + "offset": 383, + "line": 8, + "column": 26 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 382, + "end": 383 + }, + { + "kind": "", + "startPos": { + "offset": 383, + "line": 8, + "column": 26 + }, + "endPos": { + "offset": 384, + "line": 8, + "column": 27 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 383, + "end": 384 + }, + { + "kind": "", + "startPos": { + "offset": 384, + "line": 8, + "column": 27 + }, + "endPos": { + "offset": 385, + "line": 8, + "column": 28 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 384, + "end": 385 + } + ], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 385, + "end": 395 + } + ] + }, + "value": { + "id": 45, + "kind": "", + "startPos": { + "offset": 397, + "line": 8, + "column": 40 + }, + "fullStart": 397, + "endPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "fullEnd": 401, + "start": 397, + "end": 401, + "expression": { + "id": 44, + "kind": "", + "startPos": { + "offset": 397, + "line": 8, + "column": 40 + }, + "fullStart": 397, + "endPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "fullEnd": 401, + "start": 397, + "end": 401, + "variable": { + "kind": "", + "startPos": { + "offset": 397, + "line": 8, + "column": 40 + }, + "endPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "value": "null", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 397, + "end": 401 + } + } + }, + "colon": { + "kind": "", + "startPos": { + "offset": 395, + "line": 8, + "column": 38 + }, + "endPos": { + "offset": 396, + "line": 8, + "column": 39 + }, + "value": ":", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 396, + "line": 8, + "column": 39 + }, + "endPos": { + "offset": 397, + "line": 8, + "column": 40 + }, + "value": " ", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 396, + "end": 397 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 395, + "end": 396 + } + } + ], + "commaList": [ + { + "kind": "", + "startPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "endPos": { + "offset": 202, + "line": 4, + "column": 63 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 202, + "line": 4, + "column": 63 + }, + "endPos": { + "offset": 203, + "line": 5, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 202, + "end": 203 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 201, + "end": 202 + }, + { + "kind": "", + "startPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "endPos": { + "offset": 266, + "line": 5, + "column": 63 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 266, + "line": 5, + "column": 63 + }, + "endPos": { + "offset": 267, + "line": 6, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 266, + "end": 267 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 265, + "end": 266 + }, + { + "kind": "", + "startPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "endPos": { + "offset": 309, + "line": 6, + "column": 42 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 309, + "line": 6, + "column": 42 + }, + "endPos": { + "offset": 310, + "line": 7, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 309, + "end": 310 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 308, + "end": 309 + }, + { + "kind": "", + "startPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "endPos": { + "offset": 356, + "line": 7, + "column": 46 + }, + "value": ",", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 356, + "line": 7, + "column": 46 + }, + "endPos": { + "offset": 357, + "line": 8, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 356, + "end": 357 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 355, + "end": 356 + } + ], + "listCloseBracket": { + "kind": "", + "startPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "endPos": { + "offset": 402, + "line": 8, + "column": 45 + }, + "value": "]", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 402, + "line": 8, + "column": 45 + }, + "endPos": { + "offset": 403, + "line": 9, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 402, + "end": 403 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 401, + "end": 402 + } + } + ], + "symbol": 4 + } + ], + "blockCloseBrace": { + "kind": "", + "startPos": { + "offset": 403, + "line": 9, + "column": 0 + }, + "endPos": { + "offset": 404, + "line": 9, + "column": 1 + }, + "value": "}", + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "", + "startPos": { + "offset": 404, + "line": 9, + "column": 1 + }, + "endPos": { + "offset": 405, + "line": 10, + "column": 0 + }, + "value": "\n", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 404, + "end": 405 + } + ], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 403, + "end": 404 + } + }, + "parent": 51, + "symbol": 1 + } + ], + "eof": { + "kind": "", + "startPos": { + "offset": 405, + "line": 10, + "column": 0 + }, + "endPos": { + "offset": 405, + "line": 10, + "column": 0 + }, + "value": "", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 405, + "end": 405 + }, + "symbol": { + "symbolTable": { + "Table:Users": { + "references": [], + "id": 1, + "symbolTable": { + "Column:balance": { + "references": [], + "id": 2, + "declaration": 10 + }, + "Column:dependents": { + "references": [], + "id": 3, + "declaration": 22 + }, + "Column:invalid_col": { + "references": [], + "id": 4, + "declaration": 48 + } + }, + "declaration": 50 + } + }, + "id": 0, + "references": [] + } + }, + "errors": [ + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 29, + "kind": "", + "startPos": { + "offset": 179, + "line": 4, + "column": 40 + }, + "fullStart": 179, + "endPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "fullEnd": 201, + "start": 179, + "end": 201, + "expression": { + "id": 28, + "kind": "", + "startPos": { + "offset": 179, + "line": 4, + "column": 40 + }, + "fullStart": 179, + "endPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "fullEnd": 201, + "start": 179, + "end": 201, + "variable": { + "kind": "", + "startPos": { + "offset": 179, + "line": 4, + "column": 40 + }, + "endPos": { + "offset": 201, + "line": 4, + "column": 62 + }, + "value": "invalid constraint 1", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 179, + "end": 201 + } + } + }, + "start": 179, + "end": 201, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 33, + "kind": "", + "startPos": { + "offset": 243, + "line": 5, + "column": 40 + }, + "fullStart": 243, + "endPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "fullEnd": 265, + "start": 243, + "end": 265, + "expression": { + "id": 32, + "kind": "", + "startPos": { + "offset": 243, + "line": 5, + "column": 40 + }, + "fullStart": 243, + "endPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "fullEnd": 265, + "start": 243, + "end": 265, + "literal": { + "kind": "", + "startPos": { + "offset": 243, + "line": 5, + "column": 40 + }, + "endPos": { + "offset": 265, + "line": 5, + "column": 62 + }, + "value": "invalid constraint 2", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 243, + "end": 265 + } + } + }, + "start": 243, + "end": 265, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 37, + "kind": "", + "startPos": { + "offset": 307, + "line": 6, + "column": 40 + }, + "fullStart": 307, + "endPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "fullEnd": 308, + "start": 307, + "end": 308, + "expression": { + "id": 36, + "kind": "", + "startPos": { + "offset": 307, + "line": 6, + "column": 40 + }, + "fullStart": 307, + "endPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "fullEnd": 308, + "start": 307, + "end": 308, + "literal": { + "kind": "", + "startPos": { + "offset": 307, + "line": 6, + "column": 40 + }, + "endPos": { + "offset": 308, + "line": 6, + "column": 41 + }, + "value": "3", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 307, + "end": 308 + } + } + }, + "start": 307, + "end": 308, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 41, + "kind": "", + "startPos": { + "offset": 350, + "line": 7, + "column": 40 + }, + "fullStart": 350, + "endPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "fullEnd": 355, + "start": 350, + "end": 355, + "expression": { + "id": 40, + "kind": "", + "startPos": { + "offset": 350, + "line": 7, + "column": 40 + }, + "fullStart": 350, + "endPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "fullEnd": 355, + "start": 350, + "end": 355, + "variable": { + "kind": "", + "startPos": { + "offset": 350, + "line": 7, + "column": 40 + }, + "endPos": { + "offset": 355, + "line": 7, + "column": 45 + }, + "value": "false", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 350, + "end": 355 + } + } + }, + "start": 350, + "end": 355, + "name": "CompileError" + }, + { + "code": 3025, + "diagnostic": "'constraint' must be a function expression", + "nodeOrToken": { + "id": 45, + "kind": "", + "startPos": { + "offset": 397, + "line": 8, + "column": 40 + }, + "fullStart": 397, + "endPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "fullEnd": 401, + "start": 397, + "end": 401, + "expression": { + "id": 44, + "kind": "", + "startPos": { + "offset": 397, + "line": 8, + "column": 40 + }, + "fullStart": 397, + "endPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "fullEnd": 401, + "start": 397, + "end": 401, + "variable": { + "kind": "", + "startPos": { + "offset": 397, + "line": 8, + "column": 40 + }, + "endPos": { + "offset": 401, + "line": 8, + "column": 44 + }, + "value": "null", + "leadingTrivia": [], + "trailingTrivia": [], + "leadingInvalid": [], + "trailingInvalid": [], + "isInvalid": false, + "start": 397, + "end": 401 + } + } + }, + "start": 397, + "end": 401, + "name": "CompileError" + } + ] +} \ No newline at end of file diff --git a/packages/dbml-parse/tests/validator/output/table_settings.out.json b/packages/dbml-parse/tests/validator/output/table_settings_general.out.json similarity index 99% rename from packages/dbml-parse/tests/validator/output/table_settings.out.json rename to packages/dbml-parse/tests/validator/output/table_settings_general.out.json index 6aaf308f1..769792be9 100644 --- a/packages/dbml-parse/tests/validator/output/table_settings.out.json +++ b/packages/dbml-parse/tests/validator/output/table_settings_general.out.json @@ -6801,7 +6801,7 @@ "name": "CompileError" }, { - "code": 3011, + "code": 3025, "diagnostic": "'default' must be a string literal, number literal, function expression, true, false or null", "nodeOrToken": { "id": 64,