From 30cfe5322e12909ff2c00402d1d0a82060eefde3 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 29 Oct 2024 16:16:59 +0000 Subject: [PATCH 01/15] chore: create ClickHouse override tables (#25681) --- plugin-server/src/config/kafka-topics.ts | 6 +- ...ingerprint_overrides_table_and_consumer.py | 12 +++ posthog/clickhouse/schema.py | 8 ++ .../test/__snapshots__/test_schema.ambr | 99 +++++++++++++++++++ posthog/conftest.py | 2 + .../test/__snapshots__/test_in_cohort.ambr | 8 +- posthog/kafka_client/topics.py | 5 +- posthog/models/error_tracking/sql.py | 79 +++++++++++++++ 8 files changed, 211 insertions(+), 8 deletions(-) create mode 100644 posthog/clickhouse/migrations/0083_add_error_tracking_issue_fingerprint_overrides_table_and_consumer.py create mode 100644 posthog/models/error_tracking/sql.py diff --git a/plugin-server/src/config/kafka-topics.ts b/plugin-server/src/config/kafka-topics.ts index d7ea527904477..8610bf8f0b819 100644 --- a/plugin-server/src/config/kafka-topics.ts +++ b/plugin-server/src/config/kafka-topics.ts @@ -38,8 +38,6 @@ export const KAFKA_CLICKHOUSE_SESSION_REPLAY_EVENTS = `${prefix}clickhouse_sessi export const KAFKA_PERFORMANCE_EVENTS = `${prefix}clickhouse_performance_events${suffix}` // write heatmap events to ClickHouse export const KAFKA_CLICKHOUSE_HEATMAP_EVENTS = `${prefix}clickhouse_heatmap_events${suffix}` -// write exception events to ClickHouse -export const KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = `${prefix}exception_symbolification_events${suffix}` // log entries for ingestion into ClickHouse export const KAFKA_LOG_ENTRIES = `${prefix}log_entries${suffix}` @@ -47,3 +45,7 @@ export const KAFKA_LOG_ENTRIES = `${prefix}log_entries${suffix}` // CDP topics export const KAFKA_CDP_FUNCTION_CALLBACKS = `${prefix}cdp_function_callbacks${suffix}` export const KAFKA_CDP_FUNCTION_OVERFLOW = `${prefix}cdp_function_overflow${suffix}` + +// Error tracking topics +export const KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = `${prefix}exception_symbolification_events${suffix}` +export const KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT = `${prefix}clickhouse_error_tracking_issue_fingerprint${suffix}` diff --git a/posthog/clickhouse/migrations/0083_add_error_tracking_issue_fingerprint_overrides_table_and_consumer.py b/posthog/clickhouse/migrations/0083_add_error_tracking_issue_fingerprint_overrides_table_and_consumer.py new file mode 100644 index 0000000000000..1d24e713ee6c3 --- /dev/null +++ b/posthog/clickhouse/migrations/0083_add_error_tracking_issue_fingerprint_overrides_table_and_consumer.py @@ -0,0 +1,12 @@ +from posthog.clickhouse.client.migration_tools import run_sql_with_exceptions +from posthog.models.error_tracking.sql import ( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL, +) + +operations = [ + run_sql_with_exceptions(ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL()), + run_sql_with_exceptions(KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL()), + run_sql_with_exceptions(ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL), +] diff --git a/posthog/clickhouse/schema.py b/posthog/clickhouse/schema.py index e3f5044b7a419..1df1fa52792af 100644 --- a/posthog/clickhouse/schema.py +++ b/posthog/clickhouse/schema.py @@ -84,6 +84,11 @@ PERSON_DISTINCT_ID_OVERRIDES_MV_SQL, KAFKA_PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, ) +from posthog.models.error_tracking.sql import ( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL, + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, +) from posthog.models.person_overrides.sql import ( PERSON_OVERRIDES_CREATE_TABLE_SQL, PERSON_OVERRIDES_CREATE_DICTIONARY_SQL, @@ -130,6 +135,7 @@ PERSONS_DISTINCT_ID_TABLE_SQL, PERSON_DISTINCT_ID2_TABLE_SQL, PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, PLUGIN_LOG_ENTRIES_TABLE_SQL, SESSION_RECORDING_EVENTS_TABLE_SQL, INGESTION_WARNINGS_DATA_TABLE_SQL, @@ -170,6 +176,7 @@ KAFKA_PERSONS_DISTINCT_ID_TABLE_SQL, KAFKA_PERSON_DISTINCT_ID2_TABLE_SQL, KAFKA_PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, KAFKA_PLUGIN_LOG_ENTRIES_TABLE_SQL, KAFKA_SESSION_RECORDING_EVENTS_TABLE_SQL, KAFKA_INGESTION_WARNINGS_TABLE_SQL, @@ -189,6 +196,7 @@ PERSONS_DISTINCT_ID_TABLE_MV_SQL, PERSON_DISTINCT_ID2_MV_SQL, PERSON_DISTINCT_ID_OVERRIDES_MV_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL, PLUGIN_LOG_ENTRIES_TABLE_MV_SQL, SESSION_RECORDING_EVENTS_TABLE_MV_SQL, INGESTION_WARNINGS_MV_TABLE_SQL, diff --git a/posthog/clickhouse/test/__snapshots__/test_schema.ambr b/posthog/clickhouse/test/__snapshots__/test_schema.ambr index ac13d60ef2d66..bc5a623ed0cdc 100644 --- a/posthog/clickhouse/test/__snapshots__/test_schema.ambr +++ b/posthog/clickhouse/test/__snapshots__/test_schema.ambr @@ -74,6 +74,21 @@ ''' # --- +# name: test_create_kafka_table_with_different_kafka_host[kafka_error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS kafka_error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + ) ENGINE = Kafka('test.kafka.broker:9092', 'clickhouse_error_tracking_issue_fingerprint_test', 'clickhouse-error-tracking-issue-fingerprint-overrides', 'JSONEachRow') + + ''' +# --- # name: test_create_kafka_table_with_different_kafka_host[kafka_events_dead_letter_queue] ''' @@ -558,6 +573,50 @@ Order By (team_id, cohort_id, person_id, version) + ''' +# --- +# name: test_create_table_query[error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + + , _timestamp DateTime + , _offset UInt64 + , _partition UInt64 + + , INDEX kafka_timestamp_minmax_error_tracking_issue_fingerprint_overrides _timestamp TYPE minmax GRANULARITY 3 + + ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/77f1df52-4b43-11e9-910f-b8ca3a9b9f3e_noshard/posthog.error_tracking_issue_fingerprint_overrides', '{replica}-{shard}', version) + + ORDER BY (team_id, fingerprint) + SETTINGS index_granularity = 512 + + ''' +# --- +# name: test_create_table_query[error_tracking_issue_fingerprint_overrides_mv] + ''' + + CREATE MATERIALIZED VIEW IF NOT EXISTS error_tracking_issue_fingerprint_overrides_mv ON CLUSTER 'posthog' + TO posthog_test.error_tracking_issue_fingerprint_overrides + AS SELECT + team_id, + fingerprint, + issue_id, + is_deleted, + version, + _timestamp, + _offset, + _partition + FROM posthog_test.kafka_error_tracking_issue_fingerprint_overrides + WHERE version > 0 -- only store updated rows, not newly inserted ones + ''' # --- # name: test_create_table_query[events] @@ -877,6 +936,21 @@ ''' # --- +# name: test_create_table_query[kafka_error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS kafka_error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + ) ENGINE = Kafka('kafka:9092', 'clickhouse_error_tracking_issue_fingerprint_test', 'clickhouse-error-tracking-issue-fingerprint-overrides', 'JSONEachRow') + + ''' +# --- # name: test_create_table_query[kafka_events_dead_letter_queue] ''' @@ -2910,6 +2984,31 @@ Order By (team_id, cohort_id, person_id, version) + ''' +# --- +# name: test_create_table_query_replicated_and_storage[error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + + , _timestamp DateTime + , _offset UInt64 + , _partition UInt64 + + , INDEX kafka_timestamp_minmax_error_tracking_issue_fingerprint_overrides _timestamp TYPE minmax GRANULARITY 3 + + ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/77f1df52-4b43-11e9-910f-b8ca3a9b9f3e_noshard/posthog.error_tracking_issue_fingerprint_overrides', '{replica}-{shard}', version) + + ORDER BY (team_id, fingerprint) + SETTINGS index_granularity = 512 + ''' # --- # name: test_create_table_query_replicated_and_storage[events_dead_letter_queue] diff --git a/posthog/conftest.py b/posthog/conftest.py index eb7c5500adb19..938ae3028bfeb 100644 --- a/posthog/conftest.py +++ b/posthog/conftest.py @@ -68,6 +68,7 @@ def reset_clickhouse_tables(): TRUNCATE_PERSON_STATIC_COHORT_TABLE_SQL, TRUNCATE_PERSON_TABLE_SQL, ) + from posthog.models.error_tracking.sql import TRUNCATE_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL from posthog.models.sessions.sql import TRUNCATE_SESSIONS_TABLE_SQL from posthog.session_recordings.sql.session_recording_event_sql import ( TRUNCATE_SESSION_RECORDING_EVENTS_TABLE_SQL, @@ -81,6 +82,7 @@ def reset_clickhouse_tables(): TRUNCATE_PERSON_DISTINCT_ID2_TABLE_SQL, TRUNCATE_PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, TRUNCATE_PERSON_STATIC_COHORT_TABLE_SQL, + TRUNCATE_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, TRUNCATE_SESSION_RECORDING_EVENTS_TABLE_SQL(), TRUNCATE_PLUGIN_LOG_ENTRIES_TABLE_SQL, TRUNCATE_COHORTPEOPLE_TABLE_SQL, diff --git a/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr b/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr index 06e46e0ca30b0..f018e96ef067a 100644 --- a/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr +++ b/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr @@ -31,7 +31,7 @@ FROM events LEFT JOIN ( SELECT person_static_cohort.person_id AS cohort_person_id, 1 AS matched, person_static_cohort.cohort_id AS cohort_id FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [6]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) + WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [4]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) WHERE and(equals(events.team_id, 420), 1, ifNull(equals(__in_cohort.matched, 1), 0)) LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, format_csv_allow_double_quotes=0, max_ast_elements=4000000, max_expanded_ast_elements=4000000, max_bytes_before_external_group_by=0 @@ -42,7 +42,7 @@ FROM events LEFT JOIN ( SELECT person_id AS cohort_person_id, 1 AS matched, cohort_id FROM static_cohort_people - WHERE in(cohort_id, [6])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) + WHERE in(cohort_id, [4])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) WHERE and(1, equals(__in_cohort.matched, 1)) LIMIT 100 ''' @@ -55,7 +55,7 @@ FROM events LEFT JOIN ( SELECT person_static_cohort.person_id AS cohort_person_id, 1 AS matched, person_static_cohort.cohort_id AS cohort_id FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [7]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) + WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [5]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) WHERE and(equals(events.team_id, 420), 1, ifNull(equals(__in_cohort.matched, 1), 0)) LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, format_csv_allow_double_quotes=0, max_ast_elements=4000000, max_expanded_ast_elements=4000000, max_bytes_before_external_group_by=0 @@ -66,7 +66,7 @@ FROM events LEFT JOIN ( SELECT person_id AS cohort_person_id, 1 AS matched, cohort_id FROM static_cohort_people - WHERE in(cohort_id, [7])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) + WHERE in(cohort_id, [5])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) WHERE and(1, equals(__in_cohort.matched, 1)) LIMIT 100 ''' diff --git a/posthog/kafka_client/topics.py b/posthog/kafka_client/topics.py index 227ca18d666fc..fa58d40c5fa36 100644 --- a/posthog/kafka_client/topics.py +++ b/posthog/kafka_client/topics.py @@ -23,8 +23,6 @@ KAFKA_CLICKHOUSE_HEATMAP_EVENTS = f"{KAFKA_PREFIX}clickhouse_heatmap_events{SUFFIX}" -KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = f"{KAFKA_PREFIX}exception_symbolification_events{SUFFIX}" - # from capture to recordings consumer KAFKA_SESSION_RECORDING_EVENTS = f"{KAFKA_PREFIX}session_recording_events{SUFFIX}" # from capture to recordings blob ingestion consumer @@ -34,3 +32,6 @@ # from recordings consumer to clickhouse KAFKA_CLICKHOUSE_SESSION_REPLAY_EVENTS = f"{KAFKA_PREFIX}clickhouse_session_replay_events{SUFFIX}" KAFKA_CLICKHOUSE_SESSION_RECORDING_EVENTS = f"{KAFKA_PREFIX}clickhouse_session_recording_events{SUFFIX}" + +KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = f"{KAFKA_PREFIX}exception_symbolification_events{SUFFIX}" +KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT = f"{KAFKA_PREFIX}clickhouse_error_tracking_issue_fingerprint{SUFFIX}" diff --git a/posthog/models/error_tracking/sql.py b/posthog/models/error_tracking/sql.py new file mode 100644 index 0000000000000..1700a6c7c4cd9 --- /dev/null +++ b/posthog/models/error_tracking/sql.py @@ -0,0 +1,79 @@ +from posthog.clickhouse.indexes import index_by_kafka_timestamp +from posthog.clickhouse.kafka_engine import KAFKA_COLUMNS_WITH_PARTITION, kafka_engine +from posthog.clickhouse.table_engines import ReplacingMergeTree +from posthog.kafka_client.topics import KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT +from posthog.settings import CLICKHOUSE_CLUSTER, CLICKHOUSE_DATABASE + +# +# error_tracking_issue_fingerprint_overrides: This table contains rows for all (team_id, fingerprint) +# pairs where the $exception_issue_id has changed. +# + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE = "error_tracking_issue_fingerprint_overrides" + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_BASE_SQL = """ +CREATE TABLE IF NOT EXISTS {table_name} ON CLUSTER '{cluster}' +( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + {extra_fields} +) ENGINE = {engine} +""" + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_ENGINE = lambda: ReplacingMergeTree( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, ver="version" +) + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL = lambda: ( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_BASE_SQL + + """ + ORDER BY (team_id, fingerprint) + SETTINGS index_granularity = 512 + """ +).format( + table_name=ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, + cluster=CLICKHOUSE_CLUSTER, + engine=ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_ENGINE(), + extra_fields=f""" + {KAFKA_COLUMNS_WITH_PARTITION} + , {index_by_kafka_timestamp(ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE)} + """, +) + +KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL = ( + lambda: ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_BASE_SQL.format( + table_name="kafka_" + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, + cluster=CLICKHOUSE_CLUSTER, + engine=kafka_engine( + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT, group="clickhouse-error-tracking-issue-fingerprint-overrides" + ), + extra_fields="", + ) +) + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL = """ +CREATE MATERIALIZED VIEW IF NOT EXISTS {table_name}_mv ON CLUSTER '{cluster}' +TO {database}.{table_name} +AS SELECT +team_id, +fingerprint, +issue_id, +is_deleted, +version, +_timestamp, +_offset, +_partition +FROM {database}.kafka_{table_name} +WHERE version > 0 -- only store updated rows, not newly inserted ones +""".format( + table_name=ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, + cluster=CLICKHOUSE_CLUSTER, + database=CLICKHOUSE_DATABASE, +) + +TRUNCATE_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL = ( + f"TRUNCATE TABLE IF EXISTS {ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE} ON CLUSTER '{CLICKHOUSE_CLUSTER}'" +) From e6877d34365e314f0dc46e9d530382bac090735a Mon Sep 17 00:00:00 2001 From: Raquel Smith Date: Tue, 29 Oct 2024 09:52:29 -0700 Subject: [PATCH 02/15] feat: record non-onboarding product intents for data warehouse (#25859) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../data-warehouse/new/sourceWizardLogic.tsx | 7 +++++ frontend/src/scenes/teamActivityDescriber.tsx | 1 + frontend/src/scenes/teamLogic.tsx | 3 +- frontend/src/types.ts | 7 +++++ posthog/api/project.py | 24 ++++++++++++++-- posthog/api/team.py | 28 +++++++++++++++---- .../api/test/__snapshots__/test_api_docs.ambr | 2 +- .../api/test/__snapshots__/test_decide.ambr | 3 +- posthog/api/test/test_team.py | 9 ++++++ 9 files changed, 73 insertions(+), 11 deletions(-) diff --git a/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx b/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx index 2d8bba2f256bc..95a525987b8a2 100644 --- a/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx +++ b/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx @@ -6,6 +6,7 @@ import api from 'lib/api' import posthog from 'posthog-js' import { preflightLogic } from 'scenes/PreflightCheck/preflightLogic' import { Scene } from 'scenes/sceneTypes' +import { teamLogic } from 'scenes/teamLogic' import { urls } from 'scenes/urls' import { @@ -16,6 +17,7 @@ import { manualLinkSources, ManualLinkSourceType, PipelineTab, + ProductKey, SourceConfig, SourceFieldConfig, } from '~/types' @@ -731,6 +733,8 @@ export const sourceWizardLogic = kea([ ['resetTable', 'createTableSuccess'], dataWarehouseSettingsLogic, ['loadSources'], + teamLogic, + ['addProductIntent'], ], }), reducers({ @@ -1129,6 +1133,9 @@ export const sourceWizardLogic = kea([ setManualLinkingProvider: () => { actions.onNext() }, + selectConnector: () => { + actions.addProductIntent({ product_type: ProductKey.DATA_WAREHOUSE, intent_context: 'selected connector' }) + }, })), urlToAction(({ actions }) => ({ '/data-warehouse/:kind/redirect': ({ kind = '' }, searchParams) => { diff --git a/frontend/src/scenes/teamActivityDescriber.tsx b/frontend/src/scenes/teamActivityDescriber.tsx index 7c1a5cd22e44a..e3c4f9d27052f 100644 --- a/frontend/src/scenes/teamActivityDescriber.tsx +++ b/frontend/src/scenes/teamActivityDescriber.tsx @@ -347,6 +347,7 @@ const teamActionsMapping: Record< updated_at: () => null, uuid: () => null, live_events_token: () => null, + product_intents: () => null, } function nameAndLink(logItem?: ActivityLogItem): JSX.Element { diff --git a/frontend/src/scenes/teamLogic.tsx b/frontend/src/scenes/teamLogic.tsx index 3f6d102270525..0e6754609ca29 100644 --- a/frontend/src/scenes/teamLogic.tsx +++ b/frontend/src/scenes/teamLogic.tsx @@ -145,13 +145,14 @@ export const teamLogic = kea([ resetToken: async () => await api.update(`api/environments/${values.currentTeamId}/reset_token`, {}), addProductIntent: async ({ product_type, + intent_context, }: { product_type: ProductKey intent_context?: string | null }) => await api.update(`api/environments/${values.currentTeamId}/add_product_intent`, { product_type, - intent_context: null, + intent_context: intent_context ?? undefined, }), recordProductIntentOnboardingComplete: async ({ product_type }: { product_type: ProductKey }) => await api.update(`api/environments/${values.currentTeamId}/complete_product_onboarding`, { diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 3d08ee1fb7512..6b78307b81774 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -545,6 +545,13 @@ export interface TeamType extends TeamBasicType { extra_settings?: Record modifiers?: HogQLQueryModifiers default_modifiers?: HogQLQueryModifiers + product_intents?: ProductIntentType[] +} + +export interface ProductIntentType { + product_type: string + created_at: string + onboarding_completed_at?: string } // This type would be more correct without `Partial`, but it's only used in the shared dashboard/insight diff --git a/posthog/api/project.py b/posthog/api/project.py index 0c60c7e649a91..8efca11b21968 100644 --- a/posthog/api/project.py +++ b/posthog/api/project.py @@ -44,7 +44,11 @@ TeamMemberStrictManagementPermission, ) from posthog.user_permissions import UserPermissions, UserPermissionsSerializerMixin -from posthog.utils import get_ip_address, get_week_start_for_country_code +from posthog.utils import ( + get_instance_realm, + get_ip_address, + get_week_start_for_country_code, +) class ProjectSerializer(serializers.ModelSerializer): @@ -195,7 +199,9 @@ def get_live_events_token(self, project: Project) -> Optional[str]: def get_product_intents(self, obj): project = obj team = project.passthrough_team - return ProductIntent.objects.filter(team=team).values("product_type", "created_at", "onboarding_completed_at") + return ProductIntent.objects.filter(team=team).values( + "product_type", "created_at", "onboarding_completed_at", "updated_at" + ) @staticmethod def validate_session_recording_linked_flag(value) -> dict | None: @@ -572,7 +578,7 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): product_intent.updated_at = datetime.now(tz=UTC) product_intent.save() - if created and isinstance(user, User): + if isinstance(user, User): report_user_action( user, "user showed product intent", @@ -582,6 +588,10 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -612,6 +622,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -626,6 +640,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "product_key": product_type, "$current_url": current_url, "$session_id": session_id, + "intent_context": request.data.get("intent_context"), + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) diff --git a/posthog/api/team.py b/posthog/api/team.py index b92f3acaf35ae..148471919cbc0 100644 --- a/posthog/api/team.py +++ b/posthog/api/team.py @@ -6,17 +6,17 @@ from django.shortcuts import get_object_or_404 from loginas.utils import is_impersonated_session -from posthog.auth import PersonalAPIKeyAuthentication -from posthog.jwt import PosthogJwtAudience, encode_jwt from rest_framework import exceptions, request, response, serializers, viewsets from rest_framework.permissions import BasePermission, IsAuthenticated from posthog.api.routing import TeamAndOrgViewSetMixin from posthog.api.shared import TeamBasicSerializer from posthog.api.utils import action +from posthog.auth import PersonalAPIKeyAuthentication from posthog.constants import AvailableFeature from posthog.event_usage import report_user_action from posthog.geoip import get_geoip_properties +from posthog.jwt import PosthogJwtAudience, encode_jwt from posthog.models import ProductIntent, Team, User from posthog.models.activity_logging.activity_log import ( Detail, @@ -43,7 +43,11 @@ get_organization_from_view, ) from posthog.user_permissions import UserPermissions, UserPermissionsSerializerMixin -from posthog.utils import get_ip_address, get_week_start_for_country_code +from posthog.utils import ( + get_instance_realm, + get_ip_address, + get_week_start_for_country_code, +) class PremiumMultiProjectPermissions(BasePermission): # TODO: Rename to include "Env" in name @@ -211,7 +215,9 @@ def get_live_events_token(self, team: Team) -> Optional[str]: ) def get_product_intents(self, obj): - return ProductIntent.objects.filter(team=obj).values("product_type", "created_at", "onboarding_completed_at") + return ProductIntent.objects.filter(team=obj).values( + "product_type", "created_at", "onboarding_completed_at", "updated_at" + ) @staticmethod def validate_session_recording_linked_flag(value) -> dict | None: @@ -582,7 +588,7 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): product_intent.updated_at = datetime.now(tz=UTC) product_intent.save() - if created and isinstance(user, User): + if isinstance(user, User): report_user_action( user, "user showed product intent", @@ -592,6 +598,10 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -621,6 +631,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -635,6 +649,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "product_key": product_type, "$current_url": current_url, "$session_id": session_id, + "intent_context": request.data.get("intent_context"), + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) diff --git a/posthog/api/test/__snapshots__/test_api_docs.ambr b/posthog/api/test/__snapshots__/test_api_docs.ambr index a5f9b394809ae..6ef31c6530176 100644 --- a/posthog/api/test/__snapshots__/test_api_docs.ambr +++ b/posthog/api/test/__snapshots__/test_api_docs.ambr @@ -97,8 +97,8 @@ '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet > SurveySerializer]: unable to resolve type hint for function "get_conditions". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/web_experiment.py: Warning [WebExperimentViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.web_experiment.WebExperiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', 'Warning: encountered multiple names for the same choice set (HrefMatchingEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind069Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "type". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "TypeF73Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (EffectivePrivilegeLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', diff --git a/posthog/api/test/__snapshots__/test_decide.ambr b/posthog/api/test/__snapshots__/test_decide.ambr index 93ec860efb05b..18fc2e400e3fd 100644 --- a/posthog/api/test/__snapshots__/test_decide.ambr +++ b/posthog/api/test/__snapshots__/test_decide.ambr @@ -523,7 +523,8 @@ ''' SELECT "posthog_productintent"."product_type", "posthog_productintent"."created_at", - "posthog_productintent"."onboarding_completed_at" + "posthog_productintent"."onboarding_completed_at", + "posthog_productintent"."updated_at" FROM "posthog_productintent" WHERE "posthog_productintent"."team_id" = 2 ''' diff --git a/posthog/api/test/test_team.py b/posthog/api/test/test_team.py index ba697d073699f..3a881facfea44 100644 --- a/posthog/api/test/test_team.py +++ b/posthog/api/test/test_team.py @@ -26,6 +26,7 @@ from posthog.temporal.common.client import sync_connect from posthog.temporal.common.schedule import describe_schedule from posthog.test.base import APIBaseTest +from posthog.utils import get_instance_realm def team_api_test_factory(): @@ -1042,6 +1043,10 @@ def test_can_add_product_intent( "$session_id": "test_session_id", "intent_context": "onboarding product selected", "$set_once": {"first_onboarding_product_selected": "product_analytics"}, + "is_first_intent_for_product": True, + "intent_created_at": datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + "intent_updated_at": datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + "realm": get_instance_realm(), }, team=self.team, ) @@ -1073,6 +1078,10 @@ def test_can_complete_product_onboarding( "product_key": "product_analytics", "$current_url": "https://posthogtest.com/my-url", "$session_id": "test_session_id", + "intent_context": None, + "intent_created_at": datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + "intent_updated_at": datetime(2024, 1, 5, 0, 0, 0, tzinfo=UTC), + "realm": get_instance_realm(), }, team=self.team, ) From 447a18930f5a84d50ea2ebd9f5149c1ed9cb34a4 Mon Sep 17 00:00:00 2001 From: Sandy Spicer Date: Tue, 29 Oct 2024 11:31:56 -0700 Subject: [PATCH 03/15] feat: add "INTERSECT" and "EXCEPT" to HogQL (#25737) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- hogql_parser/HogQLLexer.cpp | 1022 ++--- hogql_parser/HogQLLexer.h | 53 +- hogql_parser/HogQLLexer.interp | 8 +- hogql_parser/HogQLLexer.tokens | 352 +- hogql_parser/HogQLParser.cpp | 3285 +++++++------- hogql_parser/HogQLParser.h | 153 +- hogql_parser/HogQLParser.interp | 9 +- hogql_parser/HogQLParser.tokens | 352 +- hogql_parser/HogQLParserBaseVisitor.h | 8 +- hogql_parser/HogQLParserVisitor.h | 6 +- hogql_parser/__init__.pyi | 4 +- hogql_parser/parser.cpp | 102 +- hogql_parser/setup.py | 2 +- mypy-baseline.txt | 64 +- posthog/api/test/test_plugin.py | 39 +- posthog/batch_exports/http.py | 6 +- posthog/hogql/ast.py | 50 +- posthog/hogql/autocomplete.py | 5 +- .../test_person_where_clause_extractor.py | 2 +- .../test_session_v2_where_clause_extractor.py | 38 +- .../test_session_where_clause_extractor.py | 2 +- posthog/hogql/grammar/HogQLLexer.g4 | 2 + posthog/hogql/grammar/HogQLLexer.interp | 8 +- posthog/hogql/grammar/HogQLLexer.py | 1471 ++++--- posthog/hogql/grammar/HogQLLexer.tokens | 352 +- posthog/hogql/grammar/HogQLParser.g4 | 14 +- posthog/hogql/grammar/HogQLParser.interp | 9 +- posthog/hogql/grammar/HogQLParser.py | 3914 +++++++++-------- posthog/hogql/grammar/HogQLParser.tokens | 352 +- posthog/hogql/grammar/HogQLParserVisitor.py | 13 +- posthog/hogql/metadata.py | 15 +- posthog/hogql/parser.py | 52 +- posthog/hogql/printer.py | 32 +- posthog/hogql/query.py | 14 +- posthog/hogql/resolver.py | 23 +- posthog/hogql/resolver_utils.py | 10 + .../test/__snapshots__/test_resolver.ambr | 1924 ++++---- posthog/hogql/test/_test_parser.py | 54 +- posthog/hogql/test/test_printer.py | 132 +- posthog/hogql/visitor.py | 20 +- posthog/hogql_queries/actors_query_runner.py | 5 +- .../actors_property_taxonomy_query_runner.py | 2 +- .../ai/event_taxonomy_query_runner.py | 2 +- .../ai/team_taxonomy_query_runner.py | 2 +- .../hogql_queries/insights/funnels/base.py | 2 +- .../funnel_correlation_query_runner.py | 14 +- .../insights/funnels/funnel_unordered.py | 2 +- .../insights/funnels/funnels_query_runner.py | 2 +- .../insight_actors_query_options_runner.py | 2 +- .../insights/insight_actors_query_runner.py | 4 +- .../insights/lifecycle_query_runner.py | 4 +- .../insights/paths_query_runner.py | 4 +- .../insights/retention_query_runner.py | 2 +- .../insights/stickiness_query_runner.py | 8 +- .../insights/trends/aggregation_operations.py | 10 +- .../hogql_queries/insights/trends/display.py | 4 +- .../trends/trends_actors_query_builder.py | 2 +- .../insights/trends/trends_query_builder.py | 8 +- .../insights/trends/trends_query_runner.py | 34 +- .../insights/utils/aggregations.py | 4 +- posthog/hogql_queries/query_runner.py | 4 +- .../hogql_queries/web_analytics/top_clicks.py | 2 +- .../hogql_queries/web_analytics/web_goals.py | 2 +- .../web_analytics/web_overview.py | 2 +- posthog/models/cohort/util.py | 5 +- .../session_recording_list_from_filters.py | 10 +- posthog/warehouse/models/modeling.py | 13 +- requirements.in | 2 +- requirements.txt | 2 +- 69 files changed, 7293 insertions(+), 6839 deletions(-) diff --git a/hogql_parser/HogQLLexer.cpp b/hogql_parser/HogQLLexer.cpp index 6041af94e2ea0..51f7c603a8216 100644 --- a/hogql_parser/HogQLLexer.cpp +++ b/hogql_parser/HogQLLexer.cpp @@ -60,26 +60,26 @@ void hogqllexerLexerInitialize() { "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", - "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", - "ILIKE", "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", - "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", "SELECT", - "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", - "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", - "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", - "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", "A", "B", - "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", - "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "LETTER", "OCT_DIGIT", - "DEC_DIGIT", "HEX_DIGIT", "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", - "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", - "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", - "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", - "NOT_REGEX", "NULL_PROPERTY", "NULLISH", "PERCENT", "PLUS", "QUERY", - "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", + "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", + "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", + "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", + "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", + "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", + "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", + "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", + "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "LETTER", + "OCT_DIGIT", "DEC_DIGIT", "HEX_DIGIT", "ARROW", "ASTERISK", "BACKQUOTE", + "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", + "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", + "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", + "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", "NULLISH", "PERCENT", + "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", @@ -98,30 +98,30 @@ void hogqllexerLexerInitialize() { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", "'\\'", - "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", "'>='", - "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", "'<'", - "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", "'+'", - "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", "'}'", - "']'", "')'", "';'", "'/'", "'_'" + "", "", "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", + "'\\'", "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", + "'>='", "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", + "'<'", "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", + "'+'", "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", + "'}'", "']'", "')'", "';'", "'/'", "'_'" }, std::vector{ "", "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", - "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", - "ILIKE", "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", - "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", "SELECT", - "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", - "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", - "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", - "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", - "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", + "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", + "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", + "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", + "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", + "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", + "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", + "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", @@ -133,7 +133,7 @@ void hogqllexerLexerInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,0,160,1455,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2, + 4,0,162,1476,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2, 5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2, @@ -162,111 +162,113 @@ void hogqllexerLexerInitialize() { 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,1,0,1,0,1,0,1,0,1,1,1,1,1,1, - 1,1,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1, - 5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,426, - 8,6,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, - 9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12, - 1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15, - 1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,17, - 1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19, - 1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,22,1,22, - 1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,26, - 1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28, - 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,30, - 1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32, - 1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,35,1,35, - 1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37, - 1,37,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41, - 1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,3,43,647,8,43,1,44,1,44,1,44,1,44,1,44, - 1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,47, - 1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50, - 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52, - 1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,55, - 1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57, - 1,57,1,57,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60, - 1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,63, - 1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65, - 1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69, - 1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70, - 1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73, - 1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75, - 1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77, - 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79, - 1,80,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81, - 1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83, - 1,83,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,86,1,86, - 1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,88,1,88,1,88, - 1,88,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90, - 1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92, - 1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94, - 1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96, - 1,96,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99, - 1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101, - 1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103, - 1,103,1,103,1,103,1,103,1,103,1,103,1,103,3,103,1021,8,103,1,104,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,3,104,1050,8,104,1,105,1,105,1,105,3,105,1055,8,105,1,105,1,105, - 1,105,1,105,5,105,1061,8,105,10,105,12,105,1064,9,105,1,105,1,105,1,105, - 1,105,1,105,1,105,1,105,1,105,1,105,5,105,1075,8,105,10,105,12,105,1078, - 9,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105, - 5,105,1091,8,105,10,105,12,105,1094,9,105,1,105,1,105,3,105,1098,8,105, - 1,106,1,106,1,106,5,106,1103,8,106,10,106,12,106,1106,9,106,1,106,1,106, - 3,106,1110,8,106,1,106,1,106,3,106,1114,8,106,1,106,4,106,1117,8,106, - 11,106,12,106,1118,1,106,1,106,1,106,3,106,1124,8,106,1,106,1,106,3,106, - 1128,8,106,1,106,4,106,1131,8,106,11,106,12,106,1132,1,106,1,106,1,106, - 5,106,1138,8,106,10,106,12,106,1141,9,106,1,106,1,106,1,106,3,106,1146, - 8,106,1,106,4,106,1149,8,106,11,106,12,106,1150,1,106,1,106,1,106,1,106, - 1,106,3,106,1158,8,106,1,106,4,106,1161,8,106,11,106,12,106,1162,1,106, - 1,106,1,106,1,106,3,106,1169,8,106,1,106,4,106,1172,8,106,11,106,12,106, - 1173,3,106,1176,8,106,1,107,1,107,4,107,1180,8,107,11,107,12,107,1181, - 1,108,4,108,1185,8,108,11,108,12,108,1186,1,109,1,109,1,109,4,109,1192, - 8,109,11,109,12,109,1193,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1, - 110,1,110,5,110,1205,8,110,10,110,12,110,1208,9,110,1,110,1,110,1,111, - 1,111,1,112,1,112,1,113,1,113,1,114,1,114,1,115,1,115,1,116,1,116,1,117, - 1,117,1,118,1,118,1,119,1,119,1,120,1,120,1,121,1,121,1,122,1,122,1,123, - 1,123,1,124,1,124,1,125,1,125,1,126,1,126,1,127,1,127,1,128,1,128,1,129, - 1,129,1,130,1,130,1,131,1,131,1,132,1,132,1,133,1,133,1,134,1,134,1,135, - 1,135,1,136,1,136,1,137,1,137,1,138,1,138,1,139,1,139,1,140,1,140,1,141, - 1,141,1,141,1,142,1,142,1,143,1,143,1,144,1,144,1,145,1,145,1,146,1,146, - 1,147,1,147,1,147,1,148,1,148,1,149,1,149,1,150,1,150,1,151,1,151,1,151, - 1,152,1,152,1,153,1,153,1,153,1,154,1,154,1,155,1,155,1,156,1,156,1,156, - 1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158,1,159,1,159,1,160,1,160, - 1,161,1,161,1,161,1,162,1,162,1,163,1,163,1,163,1,163,3,163,1330,8,163, - 1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,166,1,166,1,166,1,167,1,167, - 1,167,1,168,1,168,1,169,1,169,1,170,1,170,1,171,1,171,1,172,1,172,1,172, - 1,172,1,172,1,173,1,173,1,173,1,173,1,173,1,174,1,174,1,175,1,175,1,176, - 1,176,1,176,1,177,1,177,1,177,1,177,1,178,1,178,1,179,1,179,1,180,1,180, - 1,181,1,181,1,182,1,182,1,183,1,183,1,183,1,183,5,183,1388,8,183,10,183, - 12,183,1391,9,183,1,183,1,183,1,183,1,183,1,183,1,184,1,184,1,184,1,184, - 3,184,1402,8,184,1,184,5,184,1405,8,184,10,184,12,184,1408,9,184,1,184, - 3,184,1411,8,184,1,184,1,184,1,185,1,185,1,185,1,185,1,186,1,186,1,186, - 1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186,4,186,1430,8,186,11,186, - 12,186,1431,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,188,1,189, - 1,189,1,189,1,189,1,189,4,189,1448,8,189,11,189,12,189,1449,1,190,1,190, - 1,190,1,190,1,1389,0,191,3,1,5,2,7,3,9,4,11,5,13,6,15,7,17,8,19,9,21, - 10,23,11,25,12,27,13,29,14,31,15,33,16,35,17,37,18,39,19,41,20,43,21, - 45,22,47,23,49,24,51,25,53,26,55,27,57,28,59,29,61,30,63,31,65,32,67, - 33,69,34,71,35,73,36,75,37,77,38,79,39,81,40,83,41,85,42,87,43,89,44, - 91,45,93,46,95,47,97,48,99,49,101,50,103,51,105,52,107,53,109,54,111, - 55,113,56,115,57,117,58,119,59,121,60,123,61,125,62,127,63,129,64,131, - 65,133,66,135,67,137,68,139,69,141,70,143,71,145,72,147,73,149,74,151, - 75,153,76,155,77,157,78,159,79,161,80,163,81,165,82,167,83,169,84,171, - 85,173,86,175,87,177,88,179,89,181,90,183,91,185,92,187,93,189,94,191, - 95,193,96,195,97,197,98,199,99,201,100,203,101,205,102,207,103,209,104, - 211,105,213,106,215,107,217,108,219,109,221,110,223,111,225,0,227,0,229, - 0,231,0,233,0,235,0,237,0,239,0,241,0,243,0,245,0,247,0,249,0,251,0,253, - 0,255,0,257,0,259,0,261,0,263,0,265,0,267,0,269,0,271,0,273,0,275,0,277, - 0,279,0,281,0,283,0,285,112,287,113,289,114,291,115,293,116,295,117,297, - 118,299,119,301,120,303,121,305,122,307,123,309,124,311,125,313,126,315, - 127,317,128,319,129,321,130,323,131,325,132,327,133,329,134,331,135,333, - 136,335,137,337,138,339,139,341,140,343,141,345,142,347,143,349,144,351, - 145,353,146,355,147,357,148,359,149,361,150,363,151,365,152,367,153,369, - 154,371,155,373,156,375,157,377,158,379,0,381,159,383,160,3,0,1,2,38, + 7,187,2,188,7,188,2,189,7,189,2,190,7,190,2,191,7,191,2,192,7,192,1,0, + 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1, + 4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6, + 1,6,1,6,1,6,1,6,3,6,430,8,6,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1, + 8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11, + 1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16, + 1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21, + 1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24, + 1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27, + 1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29, + 1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33, + 1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36, + 1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39, + 1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,42,1,42, + 1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, + 1,44,1,44,1,44,1,44,3,44,658,8,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46, + 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47, + 1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50,1,50, + 1,50,1,50,1,51,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,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55, + 1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57, + 1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60, + 1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63, + 1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66, + 1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70, + 1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73, + 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,76, + 1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78, + 1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80, + 1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,83, + 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,84, + 1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86, + 1,86,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88, + 1,88,1,88,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,91, + 1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93, + 1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95, + 1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1,97, + 1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99, + 1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,102, + 1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103, + 1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105,1,105, + 1,105,1,105,1,105,3,105,1042,8,105,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,3,106,1071,8,106, + 1,107,1,107,1,107,3,107,1076,8,107,1,107,1,107,1,107,1,107,5,107,1082, + 8,107,10,107,12,107,1085,9,107,1,107,1,107,1,107,1,107,1,107,1,107,1, + 107,1,107,1,107,5,107,1096,8,107,10,107,12,107,1099,9,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,5,107,1112,8,107, + 10,107,12,107,1115,9,107,1,107,1,107,3,107,1119,8,107,1,108,1,108,1,108, + 5,108,1124,8,108,10,108,12,108,1127,9,108,1,108,1,108,3,108,1131,8,108, + 1,108,1,108,3,108,1135,8,108,1,108,4,108,1138,8,108,11,108,12,108,1139, + 1,108,1,108,1,108,3,108,1145,8,108,1,108,1,108,3,108,1149,8,108,1,108, + 4,108,1152,8,108,11,108,12,108,1153,1,108,1,108,1,108,5,108,1159,8,108, + 10,108,12,108,1162,9,108,1,108,1,108,1,108,3,108,1167,8,108,1,108,4,108, + 1170,8,108,11,108,12,108,1171,1,108,1,108,1,108,1,108,1,108,3,108,1179, + 8,108,1,108,4,108,1182,8,108,11,108,12,108,1183,1,108,1,108,1,108,1,108, + 3,108,1190,8,108,1,108,4,108,1193,8,108,11,108,12,108,1194,3,108,1197, + 8,108,1,109,1,109,4,109,1201,8,109,11,109,12,109,1202,1,110,4,110,1206, + 8,110,11,110,12,110,1207,1,111,1,111,1,111,4,111,1213,8,111,11,111,12, + 111,1214,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,5,112, + 1226,8,112,10,112,12,112,1229,9,112,1,112,1,112,1,113,1,113,1,114,1,114, + 1,115,1,115,1,116,1,116,1,117,1,117,1,118,1,118,1,119,1,119,1,120,1,120, + 1,121,1,121,1,122,1,122,1,123,1,123,1,124,1,124,1,125,1,125,1,126,1,126, + 1,127,1,127,1,128,1,128,1,129,1,129,1,130,1,130,1,131,1,131,1,132,1,132, + 1,133,1,133,1,134,1,134,1,135,1,135,1,136,1,136,1,137,1,137,1,138,1,138, + 1,139,1,139,1,140,1,140,1,141,1,141,1,142,1,142,1,143,1,143,1,143,1,144, + 1,144,1,145,1,145,1,146,1,146,1,147,1,147,1,148,1,148,1,149,1,149,1,149, + 1,150,1,150,1,151,1,151,1,152,1,152,1,153,1,153,1,153,1,154,1,154,1,155, + 1,155,1,155,1,156,1,156,1,157,1,157,1,158,1,158,1,158,1,159,1,159,1,159, + 1,159,1,160,1,160,1,160,1,160,1,161,1,161,1,162,1,162,1,163,1,163,1,163, + 1,164,1,164,1,165,1,165,1,165,1,165,3,165,1351,8,165,1,166,1,166,1,166, + 1,166,1,167,1,167,1,167,1,168,1,168,1,168,1,169,1,169,1,169,1,170,1,170, + 1,171,1,171,1,172,1,172,1,173,1,173,1,174,1,174,1,174,1,174,1,174,1,175, + 1,175,1,175,1,175,1,175,1,176,1,176,1,177,1,177,1,178,1,178,1,178,1,179, + 1,179,1,179,1,179,1,180,1,180,1,181,1,181,1,182,1,182,1,183,1,183,1,184, + 1,184,1,185,1,185,1,185,1,185,5,185,1409,8,185,10,185,12,185,1412,9,185, + 1,185,1,185,1,185,1,185,1,185,1,186,1,186,1,186,1,186,3,186,1423,8,186, + 1,186,5,186,1426,8,186,10,186,12,186,1429,9,186,1,186,3,186,1432,8,186, + 1,186,1,186,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,188,1,188, + 1,188,1,188,1,188,1,188,1,188,4,188,1451,8,188,11,188,12,188,1452,1,189, + 1,189,1,189,1,189,1,190,1,190,1,190,1,190,1,190,1,191,1,191,1,191,1,191, + 1,191,4,191,1469,8,191,11,191,12,191,1470,1,192,1,192,1,192,1,192,1,1410, + 0,193,3,1,5,2,7,3,9,4,11,5,13,6,15,7,17,8,19,9,21,10,23,11,25,12,27,13, + 29,14,31,15,33,16,35,17,37,18,39,19,41,20,43,21,45,22,47,23,49,24,51, + 25,53,26,55,27,57,28,59,29,61,30,63,31,65,32,67,33,69,34,71,35,73,36, + 75,37,77,38,79,39,81,40,83,41,85,42,87,43,89,44,91,45,93,46,95,47,97, + 48,99,49,101,50,103,51,105,52,107,53,109,54,111,55,113,56,115,57,117, + 58,119,59,121,60,123,61,125,62,127,63,129,64,131,65,133,66,135,67,137, + 68,139,69,141,70,143,71,145,72,147,73,149,74,151,75,153,76,155,77,157, + 78,159,79,161,80,163,81,165,82,167,83,169,84,171,85,173,86,175,87,177, + 88,179,89,181,90,183,91,185,92,187,93,189,94,191,95,193,96,195,97,197, + 98,199,99,201,100,203,101,205,102,207,103,209,104,211,105,213,106,215, + 107,217,108,219,109,221,110,223,111,225,112,227,113,229,0,231,0,233,0, + 235,0,237,0,239,0,241,0,243,0,245,0,247,0,249,0,251,0,253,0,255,0,257, + 0,259,0,261,0,263,0,265,0,267,0,269,0,271,0,273,0,275,0,277,0,279,0,281, + 0,283,0,285,0,287,0,289,114,291,115,293,116,295,117,297,118,299,119,301, + 120,303,121,305,122,307,123,309,124,311,125,313,126,315,127,317,128,319, + 129,321,130,323,131,325,132,327,133,329,134,331,135,333,136,335,137,337, + 138,339,139,341,140,343,141,345,142,347,143,349,144,351,145,353,146,355, + 147,357,148,359,149,361,150,363,151,365,152,367,153,369,154,371,155,373, + 156,375,157,377,158,379,159,381,160,383,0,385,161,387,162,3,0,1,2,38, 2,0,92,92,96,96,2,0,34,34,92,92,2,0,39,39,92,92,2,0,65,65,97,97,2,0,66, 66,98,98,2,0,67,67,99,99,2,0,68,68,100,100,2,0,69,69,101,101,2,0,70,70, 102,102,2,0,71,71,103,103,2,0,72,72,104,104,2,0,73,73,105,105,2,0,74, @@ -276,7 +278,7 @@ void hogqllexerLexerInitialize() { 2,0,86,86,118,118,2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121,121, 2,0,90,90,122,122,2,0,65,90,97,122,1,0,48,55,1,0,48,57,3,0,48,57,65,70, 97,102,2,0,10,10,13,13,2,1,10,10,13,13,2,0,9,13,32,32,3,0,39,39,92,92, - 123,123,1,0,123,123,1491,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0, + 123,123,1,0,123,123,1512,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0, 0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0, 0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31, 1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0, @@ -297,8 +299,8 @@ void hogqllexerLexerInitialize() { 0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1, 0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1, 0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1, - 0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,285,1, - 0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1, + 0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1, + 0,0,0,0,227,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1, 0,0,0,0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1, 0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0,315,1, 0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0,323,1,0,0,0,0,325,1, @@ -306,365 +308,371 @@ void hogqllexerLexerInitialize() { 0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,0,0,0,343,1,0,0,0,0,345,1, 0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1,0,0,0,0,353,1,0,0,0,0,355,1, 0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0,361,1,0,0,0,0,363,1,0,0,0,0,365,1, - 0,0,0,0,367,1,0,0,0,0,369,1,0,0,0,0,371,1,0,0,0,0,373,1,0,0,0,1,375,1, - 0,0,0,1,377,1,0,0,0,1,379,1,0,0,0,2,381,1,0,0,0,2,383,1,0,0,0,3,385,1, - 0,0,0,5,389,1,0,0,0,7,393,1,0,0,0,9,398,1,0,0,0,11,402,1,0,0,0,13,408, - 1,0,0,0,15,425,1,0,0,0,17,427,1,0,0,0,19,432,1,0,0,0,21,440,1,0,0,0,23, - 445,1,0,0,0,25,448,1,0,0,0,27,453,1,0,0,0,29,458,1,0,0,0,31,464,1,0,0, - 0,33,471,1,0,0,0,35,479,1,0,0,0,37,485,1,0,0,0,39,490,1,0,0,0,41,498, - 1,0,0,0,43,503,1,0,0,0,45,507,1,0,0,0,47,512,1,0,0,0,49,523,1,0,0,0,51, - 532,1,0,0,0,53,537,1,0,0,0,55,541,1,0,0,0,57,549,1,0,0,0,59,555,1,0,0, - 0,61,563,1,0,0,0,63,569,1,0,0,0,65,572,1,0,0,0,67,582,1,0,0,0,69,586, - 1,0,0,0,71,591,1,0,0,0,73,596,1,0,0,0,75,600,1,0,0,0,77,606,1,0,0,0,79, - 613,1,0,0,0,81,618,1,0,0,0,83,621,1,0,0,0,85,624,1,0,0,0,87,630,1,0,0, - 0,89,646,1,0,0,0,91,648,1,0,0,0,93,654,1,0,0,0,95,663,1,0,0,0,97,666, - 1,0,0,0,99,671,1,0,0,0,101,675,1,0,0,0,103,680,1,0,0,0,105,688,1,0,0, - 0,107,693,1,0,0,0,109,697,1,0,0,0,111,702,1,0,0,0,113,708,1,0,0,0,115, - 715,1,0,0,0,117,721,1,0,0,0,119,725,1,0,0,0,121,729,1,0,0,0,123,734,1, - 0,0,0,125,740,1,0,0,0,127,747,1,0,0,0,129,750,1,0,0,0,131,753,1,0,0,0, - 133,759,1,0,0,0,135,765,1,0,0,0,137,770,1,0,0,0,139,780,1,0,0,0,141,790, - 1,0,0,0,143,799,1,0,0,0,145,807,1,0,0,0,147,813,1,0,0,0,149,820,1,0,0, - 0,151,826,1,0,0,0,153,833,1,0,0,0,155,837,1,0,0,0,157,842,1,0,0,0,159, - 849,1,0,0,0,161,856,1,0,0,0,163,863,1,0,0,0,165,868,1,0,0,0,167,877,1, - 0,0,0,169,887,1,0,0,0,171,892,1,0,0,0,173,898,1,0,0,0,175,903,1,0,0,0, - 177,913,1,0,0,0,179,916,1,0,0,0,181,920,1,0,0,0,183,927,1,0,0,0,185,936, - 1,0,0,0,187,941,1,0,0,0,189,950,1,0,0,0,191,954,1,0,0,0,193,964,1,0,0, - 0,195,970,1,0,0,0,197,976,1,0,0,0,199,981,1,0,0,0,201,986,1,0,0,0,203, - 992,1,0,0,0,205,998,1,0,0,0,207,1005,1,0,0,0,209,1020,1,0,0,0,211,1049, - 1,0,0,0,213,1097,1,0,0,0,215,1175,1,0,0,0,217,1177,1,0,0,0,219,1184,1, - 0,0,0,221,1188,1,0,0,0,223,1195,1,0,0,0,225,1211,1,0,0,0,227,1213,1,0, - 0,0,229,1215,1,0,0,0,231,1217,1,0,0,0,233,1219,1,0,0,0,235,1221,1,0,0, - 0,237,1223,1,0,0,0,239,1225,1,0,0,0,241,1227,1,0,0,0,243,1229,1,0,0,0, - 245,1231,1,0,0,0,247,1233,1,0,0,0,249,1235,1,0,0,0,251,1237,1,0,0,0,253, - 1239,1,0,0,0,255,1241,1,0,0,0,257,1243,1,0,0,0,259,1245,1,0,0,0,261,1247, - 1,0,0,0,263,1249,1,0,0,0,265,1251,1,0,0,0,267,1253,1,0,0,0,269,1255,1, - 0,0,0,271,1257,1,0,0,0,273,1259,1,0,0,0,275,1261,1,0,0,0,277,1263,1,0, - 0,0,279,1265,1,0,0,0,281,1267,1,0,0,0,283,1269,1,0,0,0,285,1271,1,0,0, - 0,287,1274,1,0,0,0,289,1276,1,0,0,0,291,1278,1,0,0,0,293,1280,1,0,0,0, - 295,1282,1,0,0,0,297,1284,1,0,0,0,299,1287,1,0,0,0,301,1289,1,0,0,0,303, - 1291,1,0,0,0,305,1293,1,0,0,0,307,1296,1,0,0,0,309,1298,1,0,0,0,311,1301, - 1,0,0,0,313,1303,1,0,0,0,315,1305,1,0,0,0,317,1308,1,0,0,0,319,1312,1, - 0,0,0,321,1316,1,0,0,0,323,1318,1,0,0,0,325,1320,1,0,0,0,327,1323,1,0, - 0,0,329,1329,1,0,0,0,331,1331,1,0,0,0,333,1335,1,0,0,0,335,1338,1,0,0, - 0,337,1341,1,0,0,0,339,1344,1,0,0,0,341,1346,1,0,0,0,343,1348,1,0,0,0, - 345,1350,1,0,0,0,347,1352,1,0,0,0,349,1357,1,0,0,0,351,1362,1,0,0,0,353, - 1364,1,0,0,0,355,1366,1,0,0,0,357,1369,1,0,0,0,359,1373,1,0,0,0,361,1375, - 1,0,0,0,363,1377,1,0,0,0,365,1379,1,0,0,0,367,1381,1,0,0,0,369,1383,1, - 0,0,0,371,1401,1,0,0,0,373,1414,1,0,0,0,375,1429,1,0,0,0,377,1433,1,0, - 0,0,379,1437,1,0,0,0,381,1447,1,0,0,0,383,1451,1,0,0,0,385,386,3,225, - 111,0,386,387,3,247,122,0,387,388,3,247,122,0,388,4,1,0,0,0,389,390,3, - 225,111,0,390,391,3,251,124,0,391,392,3,231,114,0,392,6,1,0,0,0,393,394, - 3,225,111,0,394,395,3,251,124,0,395,396,3,263,130,0,396,397,3,241,119, - 0,397,8,1,0,0,0,398,399,3,225,111,0,399,400,3,251,124,0,400,401,3,273, - 135,0,401,10,1,0,0,0,402,403,3,225,111,0,403,404,3,259,128,0,404,405, - 3,259,128,0,405,406,3,225,111,0,406,407,3,273,135,0,407,12,1,0,0,0,408, - 409,3,225,111,0,409,410,3,261,129,0,410,14,1,0,0,0,411,412,3,225,111, - 0,412,413,3,261,129,0,413,414,3,229,113,0,414,426,1,0,0,0,415,416,3,225, - 111,0,416,417,3,261,129,0,417,418,3,229,113,0,418,419,3,233,115,0,419, - 420,3,251,124,0,420,421,3,231,114,0,421,422,3,241,119,0,422,423,3,251, - 124,0,423,424,3,237,117,0,424,426,1,0,0,0,425,411,1,0,0,0,425,415,1,0, - 0,0,426,16,1,0,0,0,427,428,3,225,111,0,428,429,3,261,129,0,429,430,3, - 253,125,0,430,431,3,235,116,0,431,18,1,0,0,0,432,433,3,227,112,0,433, - 434,3,233,115,0,434,435,3,263,130,0,435,436,3,269,133,0,436,437,3,233, - 115,0,437,438,3,233,115,0,438,439,3,251,124,0,439,20,1,0,0,0,440,441, - 3,227,112,0,441,442,3,253,125,0,442,443,3,263,130,0,443,444,3,239,118, - 0,444,22,1,0,0,0,445,446,3,227,112,0,446,447,3,273,135,0,447,24,1,0,0, - 0,448,449,3,229,113,0,449,450,3,225,111,0,450,451,3,261,129,0,451,452, - 3,233,115,0,452,26,1,0,0,0,453,454,3,229,113,0,454,455,3,225,111,0,455, - 456,3,261,129,0,456,457,3,263,130,0,457,28,1,0,0,0,458,459,3,229,113, - 0,459,460,3,225,111,0,460,461,3,263,130,0,461,462,3,229,113,0,462,463, - 3,239,118,0,463,30,1,0,0,0,464,465,3,229,113,0,465,466,3,253,125,0,466, - 467,3,239,118,0,467,468,3,253,125,0,468,469,3,259,128,0,469,470,3,263, - 130,0,470,32,1,0,0,0,471,472,3,229,113,0,472,473,3,253,125,0,473,474, - 3,247,122,0,474,475,3,247,122,0,475,476,3,225,111,0,476,477,3,263,130, - 0,477,478,3,233,115,0,478,34,1,0,0,0,479,480,3,229,113,0,480,481,3,259, - 128,0,481,482,3,253,125,0,482,483,3,261,129,0,483,484,3,261,129,0,484, - 36,1,0,0,0,485,486,3,229,113,0,486,487,3,265,131,0,487,488,3,227,112, - 0,488,489,3,233,115,0,489,38,1,0,0,0,490,491,3,229,113,0,491,492,3,265, - 131,0,492,493,3,259,128,0,493,494,3,259,128,0,494,495,3,233,115,0,495, - 496,3,251,124,0,496,497,3,263,130,0,497,40,1,0,0,0,498,499,3,231,114, - 0,499,500,3,225,111,0,500,501,3,263,130,0,501,502,3,233,115,0,502,42, - 1,0,0,0,503,504,3,231,114,0,504,505,3,225,111,0,505,506,3,273,135,0,506, - 44,1,0,0,0,507,508,3,231,114,0,508,509,3,233,115,0,509,510,3,261,129, - 0,510,511,3,229,113,0,511,46,1,0,0,0,512,513,3,231,114,0,513,514,3,233, - 115,0,514,515,3,261,129,0,515,516,3,229,113,0,516,517,3,233,115,0,517, - 518,3,251,124,0,518,519,3,231,114,0,519,520,3,241,119,0,520,521,3,251, - 124,0,521,522,3,237,117,0,522,48,1,0,0,0,523,524,3,231,114,0,524,525, - 3,241,119,0,525,526,3,261,129,0,526,527,3,263,130,0,527,528,3,241,119, - 0,528,529,3,251,124,0,529,530,3,229,113,0,530,531,3,263,130,0,531,50, - 1,0,0,0,532,533,3,233,115,0,533,534,3,247,122,0,534,535,3,261,129,0,535, - 536,3,233,115,0,536,52,1,0,0,0,537,538,3,233,115,0,538,539,3,251,124, - 0,539,540,3,231,114,0,540,54,1,0,0,0,541,542,3,233,115,0,542,543,3,271, - 134,0,543,544,3,263,130,0,544,545,3,259,128,0,545,546,3,225,111,0,546, - 547,3,229,113,0,547,548,3,263,130,0,548,56,1,0,0,0,549,550,3,235,116, - 0,550,551,3,241,119,0,551,552,3,251,124,0,552,553,3,225,111,0,553,554, - 3,247,122,0,554,58,1,0,0,0,555,556,3,235,116,0,556,557,3,241,119,0,557, - 558,3,251,124,0,558,559,3,225,111,0,559,560,3,247,122,0,560,561,3,247, - 122,0,561,562,3,273,135,0,562,60,1,0,0,0,563,564,3,235,116,0,564,565, - 3,241,119,0,565,566,3,259,128,0,566,567,3,261,129,0,567,568,3,263,130, - 0,568,62,1,0,0,0,569,570,3,235,116,0,570,571,3,251,124,0,571,64,1,0,0, - 0,572,573,3,235,116,0,573,574,3,253,125,0,574,575,3,247,122,0,575,576, - 3,247,122,0,576,577,3,253,125,0,577,578,3,269,133,0,578,579,3,241,119, - 0,579,580,3,251,124,0,580,581,3,237,117,0,581,66,1,0,0,0,582,583,3,235, - 116,0,583,584,3,253,125,0,584,585,3,259,128,0,585,68,1,0,0,0,586,587, - 3,235,116,0,587,588,3,259,128,0,588,589,3,253,125,0,589,590,3,249,123, - 0,590,70,1,0,0,0,591,592,3,235,116,0,592,593,3,265,131,0,593,594,3,247, - 122,0,594,595,3,247,122,0,595,72,1,0,0,0,596,597,3,235,116,0,597,598, - 3,265,131,0,598,599,3,251,124,0,599,74,1,0,0,0,600,601,3,237,117,0,601, - 602,3,259,128,0,602,603,3,253,125,0,603,604,3,265,131,0,604,605,3,255, - 126,0,605,76,1,0,0,0,606,607,3,239,118,0,607,608,3,225,111,0,608,609, - 3,267,132,0,609,610,3,241,119,0,610,611,3,251,124,0,611,612,3,237,117, - 0,612,78,1,0,0,0,613,614,3,239,118,0,614,615,3,253,125,0,615,616,3,265, - 131,0,616,617,3,259,128,0,617,80,1,0,0,0,618,619,3,241,119,0,619,620, - 3,231,114,0,620,82,1,0,0,0,621,622,3,241,119,0,622,623,3,235,116,0,623, - 84,1,0,0,0,624,625,3,241,119,0,625,626,3,247,122,0,626,627,3,241,119, - 0,627,628,3,245,121,0,628,629,3,233,115,0,629,86,1,0,0,0,630,631,3,241, - 119,0,631,632,3,251,124,0,632,88,1,0,0,0,633,634,3,241,119,0,634,635, - 3,251,124,0,635,636,3,235,116,0,636,647,1,0,0,0,637,638,3,241,119,0,638, - 639,3,251,124,0,639,640,3,235,116,0,640,641,3,241,119,0,641,642,3,251, - 124,0,642,643,3,241,119,0,643,644,3,263,130,0,644,645,3,273,135,0,645, - 647,1,0,0,0,646,633,1,0,0,0,646,637,1,0,0,0,647,90,1,0,0,0,648,649,3, - 241,119,0,649,650,3,251,124,0,650,651,3,251,124,0,651,652,3,233,115,0, - 652,653,3,259,128,0,653,92,1,0,0,0,654,655,3,241,119,0,655,656,3,251, - 124,0,656,657,3,263,130,0,657,658,3,233,115,0,658,659,3,259,128,0,659, - 660,3,267,132,0,660,661,3,225,111,0,661,662,3,247,122,0,662,94,1,0,0, - 0,663,664,3,241,119,0,664,665,3,261,129,0,665,96,1,0,0,0,666,667,3,243, - 120,0,667,668,3,253,125,0,668,669,3,241,119,0,669,670,3,251,124,0,670, - 98,1,0,0,0,671,672,3,245,121,0,672,673,3,233,115,0,673,674,3,273,135, - 0,674,100,1,0,0,0,675,676,3,247,122,0,676,677,3,225,111,0,677,678,3,261, - 129,0,678,679,3,263,130,0,679,102,1,0,0,0,680,681,3,247,122,0,681,682, - 3,233,115,0,682,683,3,225,111,0,683,684,3,231,114,0,684,685,3,241,119, - 0,685,686,3,251,124,0,686,687,3,237,117,0,687,104,1,0,0,0,688,689,3,247, - 122,0,689,690,3,233,115,0,690,691,3,235,116,0,691,692,3,263,130,0,692, - 106,1,0,0,0,693,694,3,247,122,0,694,695,3,233,115,0,695,696,3,263,130, - 0,696,108,1,0,0,0,697,698,3,247,122,0,698,699,3,241,119,0,699,700,3,245, - 121,0,700,701,3,233,115,0,701,110,1,0,0,0,702,703,3,247,122,0,703,704, - 3,241,119,0,704,705,3,249,123,0,705,706,3,241,119,0,706,707,3,263,130, - 0,707,112,1,0,0,0,708,709,3,249,123,0,709,710,3,241,119,0,710,711,3,251, - 124,0,711,712,3,265,131,0,712,713,3,263,130,0,713,714,3,233,115,0,714, - 114,1,0,0,0,715,716,3,249,123,0,716,717,3,253,125,0,717,718,3,251,124, - 0,718,719,3,263,130,0,719,720,3,239,118,0,720,116,1,0,0,0,721,722,3,251, - 124,0,722,723,3,225,111,0,723,724,3,251,124,0,724,118,1,0,0,0,725,726, - 3,251,124,0,726,727,3,253,125,0,727,728,3,263,130,0,728,120,1,0,0,0,729, - 730,3,251,124,0,730,731,3,265,131,0,731,732,3,247,122,0,732,733,3,247, - 122,0,733,122,1,0,0,0,734,735,3,251,124,0,735,736,3,265,131,0,736,737, - 3,247,122,0,737,738,3,247,122,0,738,739,3,261,129,0,739,124,1,0,0,0,740, - 741,3,253,125,0,741,742,3,235,116,0,742,743,3,235,116,0,743,744,3,261, - 129,0,744,745,3,233,115,0,745,746,3,263,130,0,746,126,1,0,0,0,747,748, - 3,253,125,0,748,749,3,251,124,0,749,128,1,0,0,0,750,751,3,253,125,0,751, - 752,3,259,128,0,752,130,1,0,0,0,753,754,3,253,125,0,754,755,3,259,128, - 0,755,756,3,231,114,0,756,757,3,233,115,0,757,758,3,259,128,0,758,132, - 1,0,0,0,759,760,3,253,125,0,760,761,3,265,131,0,761,762,3,263,130,0,762, - 763,3,233,115,0,763,764,3,259,128,0,764,134,1,0,0,0,765,766,3,253,125, - 0,766,767,3,267,132,0,767,768,3,233,115,0,768,769,3,259,128,0,769,136, - 1,0,0,0,770,771,3,255,126,0,771,772,3,225,111,0,772,773,3,259,128,0,773, - 774,3,263,130,0,774,775,3,241,119,0,775,776,3,263,130,0,776,777,3,241, - 119,0,777,778,3,253,125,0,778,779,3,251,124,0,779,138,1,0,0,0,780,781, - 3,255,126,0,781,782,3,259,128,0,782,783,3,233,115,0,783,784,3,229,113, - 0,784,785,3,233,115,0,785,786,3,231,114,0,786,787,3,241,119,0,787,788, - 3,251,124,0,788,789,3,237,117,0,789,140,1,0,0,0,790,791,3,255,126,0,791, - 792,3,259,128,0,792,793,3,233,115,0,793,794,3,269,133,0,794,795,3,239, - 118,0,795,796,3,233,115,0,796,797,3,259,128,0,797,798,3,233,115,0,798, - 142,1,0,0,0,799,800,3,257,127,0,800,801,3,265,131,0,801,802,3,225,111, - 0,802,803,3,259,128,0,803,804,3,263,130,0,804,805,3,233,115,0,805,806, - 3,259,128,0,806,144,1,0,0,0,807,808,3,259,128,0,808,809,3,225,111,0,809, - 810,3,251,124,0,810,811,3,237,117,0,811,812,3,233,115,0,812,146,1,0,0, - 0,813,814,3,259,128,0,814,815,3,233,115,0,815,816,3,263,130,0,816,817, - 3,265,131,0,817,818,3,259,128,0,818,819,3,251,124,0,819,148,1,0,0,0,820, - 821,3,259,128,0,821,822,3,241,119,0,822,823,3,237,117,0,823,824,3,239, - 118,0,824,825,3,263,130,0,825,150,1,0,0,0,826,827,3,259,128,0,827,828, - 3,253,125,0,828,829,3,247,122,0,829,830,3,247,122,0,830,831,3,265,131, - 0,831,832,3,255,126,0,832,152,1,0,0,0,833,834,3,259,128,0,834,835,3,253, - 125,0,835,836,3,269,133,0,836,154,1,0,0,0,837,838,3,259,128,0,838,839, - 3,253,125,0,839,840,3,269,133,0,840,841,3,261,129,0,841,156,1,0,0,0,842, - 843,3,261,129,0,843,844,3,225,111,0,844,845,3,249,123,0,845,846,3,255, - 126,0,846,847,3,247,122,0,847,848,3,233,115,0,848,158,1,0,0,0,849,850, - 3,261,129,0,850,851,3,233,115,0,851,852,3,229,113,0,852,853,3,253,125, - 0,853,854,3,251,124,0,854,855,3,231,114,0,855,160,1,0,0,0,856,857,3,261, - 129,0,857,858,3,233,115,0,858,859,3,247,122,0,859,860,3,233,115,0,860, - 861,3,229,113,0,861,862,3,263,130,0,862,162,1,0,0,0,863,864,3,261,129, - 0,864,865,3,233,115,0,865,866,3,249,123,0,866,867,3,241,119,0,867,164, - 1,0,0,0,868,869,3,261,129,0,869,870,3,233,115,0,870,871,3,263,130,0,871, - 872,3,263,130,0,872,873,3,241,119,0,873,874,3,251,124,0,874,875,3,237, - 117,0,875,876,3,261,129,0,876,166,1,0,0,0,877,878,3,261,129,0,878,879, - 3,265,131,0,879,880,3,227,112,0,880,881,3,261,129,0,881,882,3,263,130, - 0,882,883,3,259,128,0,883,884,3,241,119,0,884,885,3,251,124,0,885,886, - 3,237,117,0,886,168,1,0,0,0,887,888,3,263,130,0,888,889,3,239,118,0,889, - 890,3,233,115,0,890,891,3,251,124,0,891,170,1,0,0,0,892,893,3,263,130, - 0,893,894,3,239,118,0,894,895,3,259,128,0,895,896,3,253,125,0,896,897, - 3,269,133,0,897,172,1,0,0,0,898,899,3,263,130,0,899,900,3,241,119,0,900, - 901,3,233,115,0,901,902,3,261,129,0,902,174,1,0,0,0,903,904,3,263,130, - 0,904,905,3,241,119,0,905,906,3,249,123,0,906,907,3,233,115,0,907,908, - 3,261,129,0,908,909,3,263,130,0,909,910,3,225,111,0,910,911,3,249,123, - 0,911,912,3,255,126,0,912,176,1,0,0,0,913,914,3,263,130,0,914,915,3,253, - 125,0,915,178,1,0,0,0,916,917,3,263,130,0,917,918,3,253,125,0,918,919, - 3,255,126,0,919,180,1,0,0,0,920,921,3,263,130,0,921,922,3,253,125,0,922, - 923,3,263,130,0,923,924,3,225,111,0,924,925,3,247,122,0,925,926,3,261, - 129,0,926,182,1,0,0,0,927,928,3,263,130,0,928,929,3,259,128,0,929,930, - 3,225,111,0,930,931,3,241,119,0,931,932,3,247,122,0,932,933,3,241,119, - 0,933,934,3,251,124,0,934,935,3,237,117,0,935,184,1,0,0,0,936,937,3,263, - 130,0,937,938,3,259,128,0,938,939,3,241,119,0,939,940,3,249,123,0,940, - 186,1,0,0,0,941,942,3,263,130,0,942,943,3,259,128,0,943,944,3,265,131, - 0,944,945,3,251,124,0,945,946,3,229,113,0,946,947,3,225,111,0,947,948, - 3,263,130,0,948,949,3,233,115,0,949,188,1,0,0,0,950,951,3,263,130,0,951, - 952,3,259,128,0,952,953,3,273,135,0,953,190,1,0,0,0,954,955,3,265,131, - 0,955,956,3,251,124,0,956,957,3,227,112,0,957,958,3,253,125,0,958,959, - 3,265,131,0,959,960,3,251,124,0,960,961,3,231,114,0,961,962,3,233,115, - 0,962,963,3,231,114,0,963,192,1,0,0,0,964,965,3,265,131,0,965,966,3,251, - 124,0,966,967,3,241,119,0,967,968,3,253,125,0,968,969,3,251,124,0,969, - 194,1,0,0,0,970,971,3,265,131,0,971,972,3,261,129,0,972,973,3,241,119, - 0,973,974,3,251,124,0,974,975,3,237,117,0,975,196,1,0,0,0,976,977,3,269, - 133,0,977,978,3,233,115,0,978,979,3,233,115,0,979,980,3,245,121,0,980, - 198,1,0,0,0,981,982,3,269,133,0,982,983,3,239,118,0,983,984,3,233,115, - 0,984,985,3,251,124,0,985,200,1,0,0,0,986,987,3,269,133,0,987,988,3,239, - 118,0,988,989,3,233,115,0,989,990,3,259,128,0,990,991,3,233,115,0,991, - 202,1,0,0,0,992,993,3,269,133,0,993,994,3,239,118,0,994,995,3,241,119, - 0,995,996,3,247,122,0,996,997,3,233,115,0,997,204,1,0,0,0,998,999,3,269, - 133,0,999,1000,3,241,119,0,1000,1001,3,251,124,0,1001,1002,3,231,114, - 0,1002,1003,3,253,125,0,1003,1004,3,269,133,0,1004,206,1,0,0,0,1005,1006, - 3,269,133,0,1006,1007,3,241,119,0,1007,1008,3,263,130,0,1008,1009,3,239, - 118,0,1009,208,1,0,0,0,1010,1011,3,273,135,0,1011,1012,3,233,115,0,1012, - 1013,3,225,111,0,1013,1014,3,259,128,0,1014,1021,1,0,0,0,1015,1016,3, - 273,135,0,1016,1017,3,273,135,0,1017,1018,3,273,135,0,1018,1019,3,273, - 135,0,1019,1021,1,0,0,0,1020,1010,1,0,0,0,1020,1015,1,0,0,0,1021,210, - 1,0,0,0,1022,1023,3,291,144,0,1023,1024,3,227,112,0,1024,1050,1,0,0,0, - 1025,1026,3,291,144,0,1026,1027,3,235,116,0,1027,1050,1,0,0,0,1028,1029, - 3,291,144,0,1029,1030,3,259,128,0,1030,1050,1,0,0,0,1031,1032,3,291,144, - 0,1032,1033,3,251,124,0,1033,1050,1,0,0,0,1034,1035,3,291,144,0,1035, - 1036,3,263,130,0,1036,1050,1,0,0,0,1037,1038,3,291,144,0,1038,1039,5, - 48,0,0,1039,1050,1,0,0,0,1040,1041,3,291,144,0,1041,1042,3,225,111,0, - 1042,1050,1,0,0,0,1043,1044,3,291,144,0,1044,1045,3,267,132,0,1045,1050, - 1,0,0,0,1046,1047,3,291,144,0,1047,1048,3,291,144,0,1048,1050,1,0,0,0, - 1049,1022,1,0,0,0,1049,1025,1,0,0,0,1049,1028,1,0,0,0,1049,1031,1,0,0, - 0,1049,1034,1,0,0,0,1049,1037,1,0,0,0,1049,1040,1,0,0,0,1049,1043,1,0, - 0,0,1049,1046,1,0,0,0,1050,212,1,0,0,0,1051,1055,3,277,137,0,1052,1055, - 3,367,182,0,1053,1055,3,301,149,0,1054,1051,1,0,0,0,1054,1052,1,0,0,0, - 1054,1053,1,0,0,0,1055,1062,1,0,0,0,1056,1061,3,277,137,0,1057,1061,3, - 367,182,0,1058,1061,3,281,139,0,1059,1061,3,301,149,0,1060,1056,1,0,0, - 0,1060,1057,1,0,0,0,1060,1058,1,0,0,0,1060,1059,1,0,0,0,1061,1064,1,0, - 0,0,1062,1060,1,0,0,0,1062,1063,1,0,0,0,1063,1098,1,0,0,0,1064,1062,1, - 0,0,0,1065,1076,3,289,143,0,1066,1075,8,0,0,0,1067,1075,3,211,104,0,1068, - 1069,3,291,144,0,1069,1070,3,351,174,0,1070,1075,1,0,0,0,1071,1072,3, - 289,143,0,1072,1073,3,289,143,0,1073,1075,1,0,0,0,1074,1066,1,0,0,0,1074, - 1067,1,0,0,0,1074,1068,1,0,0,0,1074,1071,1,0,0,0,1075,1078,1,0,0,0,1076, - 1074,1,0,0,0,1076,1077,1,0,0,0,1077,1079,1,0,0,0,1078,1076,1,0,0,0,1079, - 1080,3,289,143,0,1080,1098,1,0,0,0,1081,1092,3,345,171,0,1082,1091,8, - 1,0,0,1083,1091,3,211,104,0,1084,1085,3,291,144,0,1085,1086,3,345,171, - 0,1086,1091,1,0,0,0,1087,1088,3,345,171,0,1088,1089,3,345,171,0,1089, - 1091,1,0,0,0,1090,1082,1,0,0,0,1090,1083,1,0,0,0,1090,1084,1,0,0,0,1090, - 1087,1,0,0,0,1091,1094,1,0,0,0,1092,1090,1,0,0,0,1092,1093,1,0,0,0,1093, - 1095,1,0,0,0,1094,1092,1,0,0,0,1095,1096,3,345,171,0,1096,1098,1,0,0, - 0,1097,1054,1,0,0,0,1097,1065,1,0,0,0,1097,1081,1,0,0,0,1098,214,1,0, - 0,0,1099,1100,3,221,109,0,1100,1104,3,303,150,0,1101,1103,3,283,140,0, - 1102,1101,1,0,0,0,1103,1106,1,0,0,0,1104,1102,1,0,0,0,1104,1105,1,0,0, - 0,1105,1109,1,0,0,0,1106,1104,1,0,0,0,1107,1110,3,255,126,0,1108,1110, - 3,233,115,0,1109,1107,1,0,0,0,1109,1108,1,0,0,0,1110,1113,1,0,0,0,1111, - 1114,3,341,169,0,1112,1114,3,299,148,0,1113,1111,1,0,0,0,1113,1112,1, - 0,0,0,1113,1114,1,0,0,0,1114,1116,1,0,0,0,1115,1117,3,281,139,0,1116, - 1115,1,0,0,0,1117,1118,1,0,0,0,1118,1116,1,0,0,0,1118,1119,1,0,0,0,1119, - 1176,1,0,0,0,1120,1123,3,221,109,0,1121,1124,3,255,126,0,1122,1124,3, - 233,115,0,1123,1121,1,0,0,0,1123,1122,1,0,0,0,1124,1127,1,0,0,0,1125, - 1128,3,341,169,0,1126,1128,3,299,148,0,1127,1125,1,0,0,0,1127,1126,1, - 0,0,0,1127,1128,1,0,0,0,1128,1130,1,0,0,0,1129,1131,3,281,139,0,1130, - 1129,1,0,0,0,1131,1132,1,0,0,0,1132,1130,1,0,0,0,1132,1133,1,0,0,0,1133, - 1176,1,0,0,0,1134,1135,3,219,108,0,1135,1139,3,303,150,0,1136,1138,3, - 281,139,0,1137,1136,1,0,0,0,1138,1141,1,0,0,0,1139,1137,1,0,0,0,1139, - 1140,1,0,0,0,1140,1142,1,0,0,0,1141,1139,1,0,0,0,1142,1145,3,233,115, - 0,1143,1146,3,341,169,0,1144,1146,3,299,148,0,1145,1143,1,0,0,0,1145, - 1144,1,0,0,0,1145,1146,1,0,0,0,1146,1148,1,0,0,0,1147,1149,3,281,139, - 0,1148,1147,1,0,0,0,1149,1150,1,0,0,0,1150,1148,1,0,0,0,1150,1151,1,0, - 0,0,1151,1176,1,0,0,0,1152,1153,3,303,150,0,1153,1154,3,219,108,0,1154, - 1157,3,233,115,0,1155,1158,3,341,169,0,1156,1158,3,299,148,0,1157,1155, - 1,0,0,0,1157,1156,1,0,0,0,1157,1158,1,0,0,0,1158,1160,1,0,0,0,1159,1161, - 3,281,139,0,1160,1159,1,0,0,0,1161,1162,1,0,0,0,1162,1160,1,0,0,0,1162, - 1163,1,0,0,0,1163,1176,1,0,0,0,1164,1165,3,219,108,0,1165,1168,3,233, - 115,0,1166,1169,3,341,169,0,1167,1169,3,299,148,0,1168,1166,1,0,0,0,1168, - 1167,1,0,0,0,1168,1169,1,0,0,0,1169,1171,1,0,0,0,1170,1172,3,281,139, - 0,1171,1170,1,0,0,0,1172,1173,1,0,0,0,1173,1171,1,0,0,0,1173,1174,1,0, - 0,0,1174,1176,1,0,0,0,1175,1099,1,0,0,0,1175,1120,1,0,0,0,1175,1134,1, - 0,0,0,1175,1152,1,0,0,0,1175,1164,1,0,0,0,1176,216,1,0,0,0,1177,1179, - 5,48,0,0,1178,1180,3,279,138,0,1179,1178,1,0,0,0,1180,1181,1,0,0,0,1181, - 1179,1,0,0,0,1181,1182,1,0,0,0,1182,218,1,0,0,0,1183,1185,3,281,139,0, - 1184,1183,1,0,0,0,1185,1186,1,0,0,0,1186,1184,1,0,0,0,1186,1187,1,0,0, - 0,1187,220,1,0,0,0,1188,1189,5,48,0,0,1189,1191,3,271,134,0,1190,1192, - 3,283,140,0,1191,1190,1,0,0,0,1192,1193,1,0,0,0,1193,1191,1,0,0,0,1193, - 1194,1,0,0,0,1194,222,1,0,0,0,1195,1206,3,351,174,0,1196,1205,8,2,0,0, - 1197,1205,3,211,104,0,1198,1199,3,291,144,0,1199,1200,3,351,174,0,1200, - 1205,1,0,0,0,1201,1202,3,351,174,0,1202,1203,3,351,174,0,1203,1205,1, - 0,0,0,1204,1196,1,0,0,0,1204,1197,1,0,0,0,1204,1198,1,0,0,0,1204,1201, - 1,0,0,0,1205,1208,1,0,0,0,1206,1204,1,0,0,0,1206,1207,1,0,0,0,1207,1209, - 1,0,0,0,1208,1206,1,0,0,0,1209,1210,3,351,174,0,1210,224,1,0,0,0,1211, - 1212,7,3,0,0,1212,226,1,0,0,0,1213,1214,7,4,0,0,1214,228,1,0,0,0,1215, - 1216,7,5,0,0,1216,230,1,0,0,0,1217,1218,7,6,0,0,1218,232,1,0,0,0,1219, - 1220,7,7,0,0,1220,234,1,0,0,0,1221,1222,7,8,0,0,1222,236,1,0,0,0,1223, - 1224,7,9,0,0,1224,238,1,0,0,0,1225,1226,7,10,0,0,1226,240,1,0,0,0,1227, - 1228,7,11,0,0,1228,242,1,0,0,0,1229,1230,7,12,0,0,1230,244,1,0,0,0,1231, - 1232,7,13,0,0,1232,246,1,0,0,0,1233,1234,7,14,0,0,1234,248,1,0,0,0,1235, - 1236,7,15,0,0,1236,250,1,0,0,0,1237,1238,7,16,0,0,1238,252,1,0,0,0,1239, - 1240,7,17,0,0,1240,254,1,0,0,0,1241,1242,7,18,0,0,1242,256,1,0,0,0,1243, - 1244,7,19,0,0,1244,258,1,0,0,0,1245,1246,7,20,0,0,1246,260,1,0,0,0,1247, - 1248,7,21,0,0,1248,262,1,0,0,0,1249,1250,7,22,0,0,1250,264,1,0,0,0,1251, - 1252,7,23,0,0,1252,266,1,0,0,0,1253,1254,7,24,0,0,1254,268,1,0,0,0,1255, - 1256,7,25,0,0,1256,270,1,0,0,0,1257,1258,7,26,0,0,1258,272,1,0,0,0,1259, - 1260,7,27,0,0,1260,274,1,0,0,0,1261,1262,7,28,0,0,1262,276,1,0,0,0,1263, - 1264,7,29,0,0,1264,278,1,0,0,0,1265,1266,7,30,0,0,1266,280,1,0,0,0,1267, - 1268,7,31,0,0,1268,282,1,0,0,0,1269,1270,7,32,0,0,1270,284,1,0,0,0,1271, - 1272,5,45,0,0,1272,1273,5,62,0,0,1273,286,1,0,0,0,1274,1275,5,42,0,0, - 1275,288,1,0,0,0,1276,1277,5,96,0,0,1277,290,1,0,0,0,1278,1279,5,92,0, - 0,1279,292,1,0,0,0,1280,1281,5,58,0,0,1281,294,1,0,0,0,1282,1283,5,44, - 0,0,1283,296,1,0,0,0,1284,1285,5,124,0,0,1285,1286,5,124,0,0,1286,298, - 1,0,0,0,1287,1288,5,45,0,0,1288,300,1,0,0,0,1289,1290,5,36,0,0,1290,302, - 1,0,0,0,1291,1292,5,46,0,0,1292,304,1,0,0,0,1293,1294,5,61,0,0,1294,1295, - 5,61,0,0,1295,306,1,0,0,0,1296,1297,5,61,0,0,1297,308,1,0,0,0,1298,1299, - 5,62,0,0,1299,1300,5,61,0,0,1300,310,1,0,0,0,1301,1302,5,62,0,0,1302, - 312,1,0,0,0,1303,1304,5,35,0,0,1304,314,1,0,0,0,1305,1306,5,126,0,0,1306, - 1307,5,42,0,0,1307,316,1,0,0,0,1308,1309,5,61,0,0,1309,1310,5,126,0,0, - 1310,1311,5,42,0,0,1311,318,1,0,0,0,1312,1313,5,123,0,0,1313,1314,1,0, - 0,0,1314,1315,6,158,0,0,1315,320,1,0,0,0,1316,1317,5,91,0,0,1317,322, - 1,0,0,0,1318,1319,5,40,0,0,1319,324,1,0,0,0,1320,1321,5,60,0,0,1321,1322, - 5,61,0,0,1322,326,1,0,0,0,1323,1324,5,60,0,0,1324,328,1,0,0,0,1325,1326, - 5,33,0,0,1326,1330,5,61,0,0,1327,1328,5,60,0,0,1328,1330,5,62,0,0,1329, - 1325,1,0,0,0,1329,1327,1,0,0,0,1330,330,1,0,0,0,1331,1332,5,33,0,0,1332, - 1333,5,126,0,0,1333,1334,5,42,0,0,1334,332,1,0,0,0,1335,1336,5,33,0,0, - 1336,1337,5,126,0,0,1337,334,1,0,0,0,1338,1339,5,63,0,0,1339,1340,5,46, - 0,0,1340,336,1,0,0,0,1341,1342,5,63,0,0,1342,1343,5,63,0,0,1343,338,1, - 0,0,0,1344,1345,5,37,0,0,1345,340,1,0,0,0,1346,1347,5,43,0,0,1347,342, - 1,0,0,0,1348,1349,5,63,0,0,1349,344,1,0,0,0,1350,1351,5,34,0,0,1351,346, - 1,0,0,0,1352,1353,5,102,0,0,1353,1354,5,39,0,0,1354,1355,1,0,0,0,1355, - 1356,6,172,1,0,1356,348,1,0,0,0,1357,1358,5,70,0,0,1358,1359,5,39,0,0, - 1359,1360,1,0,0,0,1360,1361,6,173,2,0,1361,350,1,0,0,0,1362,1363,5,39, - 0,0,1363,352,1,0,0,0,1364,1365,5,126,0,0,1365,354,1,0,0,0,1366,1367,5, - 61,0,0,1367,1368,5,126,0,0,1368,356,1,0,0,0,1369,1370,5,125,0,0,1370, - 1371,1,0,0,0,1371,1372,6,177,3,0,1372,358,1,0,0,0,1373,1374,5,93,0,0, - 1374,360,1,0,0,0,1375,1376,5,41,0,0,1376,362,1,0,0,0,1377,1378,5,59,0, - 0,1378,364,1,0,0,0,1379,1380,5,47,0,0,1380,366,1,0,0,0,1381,1382,5,95, - 0,0,1382,368,1,0,0,0,1383,1384,5,47,0,0,1384,1385,5,42,0,0,1385,1389, - 1,0,0,0,1386,1388,9,0,0,0,1387,1386,1,0,0,0,1388,1391,1,0,0,0,1389,1390, - 1,0,0,0,1389,1387,1,0,0,0,1390,1392,1,0,0,0,1391,1389,1,0,0,0,1392,1393, - 5,42,0,0,1393,1394,5,47,0,0,1394,1395,1,0,0,0,1395,1396,6,183,4,0,1396, - 370,1,0,0,0,1397,1398,5,45,0,0,1398,1402,5,45,0,0,1399,1400,5,47,0,0, - 1400,1402,5,47,0,0,1401,1397,1,0,0,0,1401,1399,1,0,0,0,1402,1406,1,0, - 0,0,1403,1405,8,33,0,0,1404,1403,1,0,0,0,1405,1408,1,0,0,0,1406,1404, - 1,0,0,0,1406,1407,1,0,0,0,1407,1410,1,0,0,0,1408,1406,1,0,0,0,1409,1411, - 7,34,0,0,1410,1409,1,0,0,0,1411,1412,1,0,0,0,1412,1413,6,184,4,0,1413, - 372,1,0,0,0,1414,1415,7,35,0,0,1415,1416,1,0,0,0,1416,1417,6,185,5,0, - 1417,374,1,0,0,0,1418,1430,8,36,0,0,1419,1430,3,211,104,0,1420,1421,3, - 291,144,0,1421,1422,3,351,174,0,1422,1430,1,0,0,0,1423,1424,3,291,144, - 0,1424,1425,3,319,158,0,1425,1430,1,0,0,0,1426,1427,3,351,174,0,1427, - 1428,3,351,174,0,1428,1430,1,0,0,0,1429,1418,1,0,0,0,1429,1419,1,0,0, - 0,1429,1420,1,0,0,0,1429,1423,1,0,0,0,1429,1426,1,0,0,0,1430,1431,1,0, - 0,0,1431,1429,1,0,0,0,1431,1432,1,0,0,0,1432,376,1,0,0,0,1433,1434,3, - 319,158,0,1434,1435,1,0,0,0,1435,1436,6,187,0,0,1436,378,1,0,0,0,1437, - 1438,3,351,174,0,1438,1439,1,0,0,0,1439,1440,6,188,6,0,1440,1441,6,188, - 3,0,1441,380,1,0,0,0,1442,1448,8,37,0,0,1443,1448,3,211,104,0,1444,1445, - 3,291,144,0,1445,1446,3,319,158,0,1446,1448,1,0,0,0,1447,1442,1,0,0,0, - 1447,1443,1,0,0,0,1447,1444,1,0,0,0,1448,1449,1,0,0,0,1449,1447,1,0,0, - 0,1449,1450,1,0,0,0,1450,382,1,0,0,0,1451,1452,3,319,158,0,1452,1453, - 1,0,0,0,1453,1454,6,190,0,0,1454,384,1,0,0,0,44,0,1,2,425,646,1020,1049, - 1054,1060,1062,1074,1076,1090,1092,1097,1104,1109,1113,1118,1123,1127, - 1132,1139,1145,1150,1157,1162,1168,1173,1175,1181,1186,1193,1204,1206, - 1329,1389,1401,1406,1410,1429,1431,1447,1449,7,5,0,0,5,1,0,5,2,0,4,0, - 0,6,0,0,0,1,0,7,145,0 + 0,0,0,0,367,1,0,0,0,0,369,1,0,0,0,0,371,1,0,0,0,0,373,1,0,0,0,0,375,1, + 0,0,0,0,377,1,0,0,0,1,379,1,0,0,0,1,381,1,0,0,0,1,383,1,0,0,0,2,385,1, + 0,0,0,2,387,1,0,0,0,3,389,1,0,0,0,5,393,1,0,0,0,7,397,1,0,0,0,9,402,1, + 0,0,0,11,406,1,0,0,0,13,412,1,0,0,0,15,429,1,0,0,0,17,431,1,0,0,0,19, + 436,1,0,0,0,21,444,1,0,0,0,23,449,1,0,0,0,25,452,1,0,0,0,27,457,1,0,0, + 0,29,462,1,0,0,0,31,468,1,0,0,0,33,475,1,0,0,0,35,483,1,0,0,0,37,489, + 1,0,0,0,39,494,1,0,0,0,41,502,1,0,0,0,43,507,1,0,0,0,45,511,1,0,0,0,47, + 516,1,0,0,0,49,527,1,0,0,0,51,536,1,0,0,0,53,541,1,0,0,0,55,545,1,0,0, + 0,57,552,1,0,0,0,59,560,1,0,0,0,61,566,1,0,0,0,63,574,1,0,0,0,65,580, + 1,0,0,0,67,583,1,0,0,0,69,593,1,0,0,0,71,597,1,0,0,0,73,602,1,0,0,0,75, + 607,1,0,0,0,77,611,1,0,0,0,79,617,1,0,0,0,81,624,1,0,0,0,83,629,1,0,0, + 0,85,632,1,0,0,0,87,635,1,0,0,0,89,641,1,0,0,0,91,657,1,0,0,0,93,659, + 1,0,0,0,95,665,1,0,0,0,97,675,1,0,0,0,99,684,1,0,0,0,101,687,1,0,0,0, + 103,692,1,0,0,0,105,696,1,0,0,0,107,701,1,0,0,0,109,709,1,0,0,0,111,714, + 1,0,0,0,113,718,1,0,0,0,115,723,1,0,0,0,117,729,1,0,0,0,119,736,1,0,0, + 0,121,742,1,0,0,0,123,746,1,0,0,0,125,750,1,0,0,0,127,755,1,0,0,0,129, + 761,1,0,0,0,131,768,1,0,0,0,133,771,1,0,0,0,135,774,1,0,0,0,137,780,1, + 0,0,0,139,786,1,0,0,0,141,791,1,0,0,0,143,801,1,0,0,0,145,811,1,0,0,0, + 147,820,1,0,0,0,149,828,1,0,0,0,151,834,1,0,0,0,153,841,1,0,0,0,155,847, + 1,0,0,0,157,854,1,0,0,0,159,858,1,0,0,0,161,863,1,0,0,0,163,870,1,0,0, + 0,165,877,1,0,0,0,167,884,1,0,0,0,169,889,1,0,0,0,171,898,1,0,0,0,173, + 908,1,0,0,0,175,913,1,0,0,0,177,919,1,0,0,0,179,924,1,0,0,0,181,934,1, + 0,0,0,183,937,1,0,0,0,185,941,1,0,0,0,187,948,1,0,0,0,189,957,1,0,0,0, + 191,962,1,0,0,0,193,971,1,0,0,0,195,975,1,0,0,0,197,985,1,0,0,0,199,991, + 1,0,0,0,201,997,1,0,0,0,203,1002,1,0,0,0,205,1007,1,0,0,0,207,1013,1, + 0,0,0,209,1019,1,0,0,0,211,1026,1,0,0,0,213,1041,1,0,0,0,215,1070,1,0, + 0,0,217,1118,1,0,0,0,219,1196,1,0,0,0,221,1198,1,0,0,0,223,1205,1,0,0, + 0,225,1209,1,0,0,0,227,1216,1,0,0,0,229,1232,1,0,0,0,231,1234,1,0,0,0, + 233,1236,1,0,0,0,235,1238,1,0,0,0,237,1240,1,0,0,0,239,1242,1,0,0,0,241, + 1244,1,0,0,0,243,1246,1,0,0,0,245,1248,1,0,0,0,247,1250,1,0,0,0,249,1252, + 1,0,0,0,251,1254,1,0,0,0,253,1256,1,0,0,0,255,1258,1,0,0,0,257,1260,1, + 0,0,0,259,1262,1,0,0,0,261,1264,1,0,0,0,263,1266,1,0,0,0,265,1268,1,0, + 0,0,267,1270,1,0,0,0,269,1272,1,0,0,0,271,1274,1,0,0,0,273,1276,1,0,0, + 0,275,1278,1,0,0,0,277,1280,1,0,0,0,279,1282,1,0,0,0,281,1284,1,0,0,0, + 283,1286,1,0,0,0,285,1288,1,0,0,0,287,1290,1,0,0,0,289,1292,1,0,0,0,291, + 1295,1,0,0,0,293,1297,1,0,0,0,295,1299,1,0,0,0,297,1301,1,0,0,0,299,1303, + 1,0,0,0,301,1305,1,0,0,0,303,1308,1,0,0,0,305,1310,1,0,0,0,307,1312,1, + 0,0,0,309,1314,1,0,0,0,311,1317,1,0,0,0,313,1319,1,0,0,0,315,1322,1,0, + 0,0,317,1324,1,0,0,0,319,1326,1,0,0,0,321,1329,1,0,0,0,323,1333,1,0,0, + 0,325,1337,1,0,0,0,327,1339,1,0,0,0,329,1341,1,0,0,0,331,1344,1,0,0,0, + 333,1350,1,0,0,0,335,1352,1,0,0,0,337,1356,1,0,0,0,339,1359,1,0,0,0,341, + 1362,1,0,0,0,343,1365,1,0,0,0,345,1367,1,0,0,0,347,1369,1,0,0,0,349,1371, + 1,0,0,0,351,1373,1,0,0,0,353,1378,1,0,0,0,355,1383,1,0,0,0,357,1385,1, + 0,0,0,359,1387,1,0,0,0,361,1390,1,0,0,0,363,1394,1,0,0,0,365,1396,1,0, + 0,0,367,1398,1,0,0,0,369,1400,1,0,0,0,371,1402,1,0,0,0,373,1404,1,0,0, + 0,375,1422,1,0,0,0,377,1435,1,0,0,0,379,1450,1,0,0,0,381,1454,1,0,0,0, + 383,1458,1,0,0,0,385,1468,1,0,0,0,387,1472,1,0,0,0,389,390,3,229,113, + 0,390,391,3,251,124,0,391,392,3,251,124,0,392,4,1,0,0,0,393,394,3,229, + 113,0,394,395,3,255,126,0,395,396,3,235,116,0,396,6,1,0,0,0,397,398,3, + 229,113,0,398,399,3,255,126,0,399,400,3,267,132,0,400,401,3,245,121,0, + 401,8,1,0,0,0,402,403,3,229,113,0,403,404,3,255,126,0,404,405,3,277,137, + 0,405,10,1,0,0,0,406,407,3,229,113,0,407,408,3,263,130,0,408,409,3,263, + 130,0,409,410,3,229,113,0,410,411,3,277,137,0,411,12,1,0,0,0,412,413, + 3,229,113,0,413,414,3,265,131,0,414,14,1,0,0,0,415,416,3,229,113,0,416, + 417,3,265,131,0,417,418,3,233,115,0,418,430,1,0,0,0,419,420,3,229,113, + 0,420,421,3,265,131,0,421,422,3,233,115,0,422,423,3,237,117,0,423,424, + 3,255,126,0,424,425,3,235,116,0,425,426,3,245,121,0,426,427,3,255,126, + 0,427,428,3,241,119,0,428,430,1,0,0,0,429,415,1,0,0,0,429,419,1,0,0,0, + 430,16,1,0,0,0,431,432,3,229,113,0,432,433,3,265,131,0,433,434,3,257, + 127,0,434,435,3,239,118,0,435,18,1,0,0,0,436,437,3,231,114,0,437,438, + 3,237,117,0,438,439,3,267,132,0,439,440,3,273,135,0,440,441,3,237,117, + 0,441,442,3,237,117,0,442,443,3,255,126,0,443,20,1,0,0,0,444,445,3,231, + 114,0,445,446,3,257,127,0,446,447,3,267,132,0,447,448,3,243,120,0,448, + 22,1,0,0,0,449,450,3,231,114,0,450,451,3,277,137,0,451,24,1,0,0,0,452, + 453,3,233,115,0,453,454,3,229,113,0,454,455,3,265,131,0,455,456,3,237, + 117,0,456,26,1,0,0,0,457,458,3,233,115,0,458,459,3,229,113,0,459,460, + 3,265,131,0,460,461,3,267,132,0,461,28,1,0,0,0,462,463,3,233,115,0,463, + 464,3,229,113,0,464,465,3,267,132,0,465,466,3,233,115,0,466,467,3,243, + 120,0,467,30,1,0,0,0,468,469,3,233,115,0,469,470,3,257,127,0,470,471, + 3,243,120,0,471,472,3,257,127,0,472,473,3,263,130,0,473,474,3,267,132, + 0,474,32,1,0,0,0,475,476,3,233,115,0,476,477,3,257,127,0,477,478,3,251, + 124,0,478,479,3,251,124,0,479,480,3,229,113,0,480,481,3,267,132,0,481, + 482,3,237,117,0,482,34,1,0,0,0,483,484,3,233,115,0,484,485,3,263,130, + 0,485,486,3,257,127,0,486,487,3,265,131,0,487,488,3,265,131,0,488,36, + 1,0,0,0,489,490,3,233,115,0,490,491,3,269,133,0,491,492,3,231,114,0,492, + 493,3,237,117,0,493,38,1,0,0,0,494,495,3,233,115,0,495,496,3,269,133, + 0,496,497,3,263,130,0,497,498,3,263,130,0,498,499,3,237,117,0,499,500, + 3,255,126,0,500,501,3,267,132,0,501,40,1,0,0,0,502,503,3,235,116,0,503, + 504,3,229,113,0,504,505,3,267,132,0,505,506,3,237,117,0,506,42,1,0,0, + 0,507,508,3,235,116,0,508,509,3,229,113,0,509,510,3,277,137,0,510,44, + 1,0,0,0,511,512,3,235,116,0,512,513,3,237,117,0,513,514,3,265,131,0,514, + 515,3,233,115,0,515,46,1,0,0,0,516,517,3,235,116,0,517,518,3,237,117, + 0,518,519,3,265,131,0,519,520,3,233,115,0,520,521,3,237,117,0,521,522, + 3,255,126,0,522,523,3,235,116,0,523,524,3,245,121,0,524,525,3,255,126, + 0,525,526,3,241,119,0,526,48,1,0,0,0,527,528,3,235,116,0,528,529,3,245, + 121,0,529,530,3,265,131,0,530,531,3,267,132,0,531,532,3,245,121,0,532, + 533,3,255,126,0,533,534,3,233,115,0,534,535,3,267,132,0,535,50,1,0,0, + 0,536,537,3,237,117,0,537,538,3,251,124,0,538,539,3,265,131,0,539,540, + 3,237,117,0,540,52,1,0,0,0,541,542,3,237,117,0,542,543,3,255,126,0,543, + 544,3,235,116,0,544,54,1,0,0,0,545,546,3,237,117,0,546,547,3,275,136, + 0,547,548,3,233,115,0,548,549,3,237,117,0,549,550,3,259,128,0,550,551, + 3,267,132,0,551,56,1,0,0,0,552,553,3,237,117,0,553,554,3,275,136,0,554, + 555,3,267,132,0,555,556,3,263,130,0,556,557,3,229,113,0,557,558,3,233, + 115,0,558,559,3,267,132,0,559,58,1,0,0,0,560,561,3,239,118,0,561,562, + 3,245,121,0,562,563,3,255,126,0,563,564,3,229,113,0,564,565,3,251,124, + 0,565,60,1,0,0,0,566,567,3,239,118,0,567,568,3,245,121,0,568,569,3,255, + 126,0,569,570,3,229,113,0,570,571,3,251,124,0,571,572,3,251,124,0,572, + 573,3,277,137,0,573,62,1,0,0,0,574,575,3,239,118,0,575,576,3,245,121, + 0,576,577,3,263,130,0,577,578,3,265,131,0,578,579,3,267,132,0,579,64, + 1,0,0,0,580,581,3,239,118,0,581,582,3,255,126,0,582,66,1,0,0,0,583,584, + 3,239,118,0,584,585,3,257,127,0,585,586,3,251,124,0,586,587,3,251,124, + 0,587,588,3,257,127,0,588,589,3,273,135,0,589,590,3,245,121,0,590,591, + 3,255,126,0,591,592,3,241,119,0,592,68,1,0,0,0,593,594,3,239,118,0,594, + 595,3,257,127,0,595,596,3,263,130,0,596,70,1,0,0,0,597,598,3,239,118, + 0,598,599,3,263,130,0,599,600,3,257,127,0,600,601,3,253,125,0,601,72, + 1,0,0,0,602,603,3,239,118,0,603,604,3,269,133,0,604,605,3,251,124,0,605, + 606,3,251,124,0,606,74,1,0,0,0,607,608,3,239,118,0,608,609,3,269,133, + 0,609,610,3,255,126,0,610,76,1,0,0,0,611,612,3,241,119,0,612,613,3,263, + 130,0,613,614,3,257,127,0,614,615,3,269,133,0,615,616,3,259,128,0,616, + 78,1,0,0,0,617,618,3,243,120,0,618,619,3,229,113,0,619,620,3,271,134, + 0,620,621,3,245,121,0,621,622,3,255,126,0,622,623,3,241,119,0,623,80, + 1,0,0,0,624,625,3,243,120,0,625,626,3,257,127,0,626,627,3,269,133,0,627, + 628,3,263,130,0,628,82,1,0,0,0,629,630,3,245,121,0,630,631,3,235,116, + 0,631,84,1,0,0,0,632,633,3,245,121,0,633,634,3,239,118,0,634,86,1,0,0, + 0,635,636,3,245,121,0,636,637,3,251,124,0,637,638,3,245,121,0,638,639, + 3,249,123,0,639,640,3,237,117,0,640,88,1,0,0,0,641,642,3,245,121,0,642, + 643,3,255,126,0,643,90,1,0,0,0,644,645,3,245,121,0,645,646,3,255,126, + 0,646,647,3,239,118,0,647,658,1,0,0,0,648,649,3,245,121,0,649,650,3,255, + 126,0,650,651,3,239,118,0,651,652,3,245,121,0,652,653,3,255,126,0,653, + 654,3,245,121,0,654,655,3,267,132,0,655,656,3,277,137,0,656,658,1,0,0, + 0,657,644,1,0,0,0,657,648,1,0,0,0,658,92,1,0,0,0,659,660,3,245,121,0, + 660,661,3,255,126,0,661,662,3,255,126,0,662,663,3,237,117,0,663,664,3, + 263,130,0,664,94,1,0,0,0,665,666,3,245,121,0,666,667,3,255,126,0,667, + 668,3,267,132,0,668,669,3,237,117,0,669,670,3,263,130,0,670,671,3,265, + 131,0,671,672,3,237,117,0,672,673,3,233,115,0,673,674,3,267,132,0,674, + 96,1,0,0,0,675,676,3,245,121,0,676,677,3,255,126,0,677,678,3,267,132, + 0,678,679,3,237,117,0,679,680,3,263,130,0,680,681,3,271,134,0,681,682, + 3,229,113,0,682,683,3,251,124,0,683,98,1,0,0,0,684,685,3,245,121,0,685, + 686,3,265,131,0,686,100,1,0,0,0,687,688,3,247,122,0,688,689,3,257,127, + 0,689,690,3,245,121,0,690,691,3,255,126,0,691,102,1,0,0,0,692,693,3,249, + 123,0,693,694,3,237,117,0,694,695,3,277,137,0,695,104,1,0,0,0,696,697, + 3,251,124,0,697,698,3,229,113,0,698,699,3,265,131,0,699,700,3,267,132, + 0,700,106,1,0,0,0,701,702,3,251,124,0,702,703,3,237,117,0,703,704,3,229, + 113,0,704,705,3,235,116,0,705,706,3,245,121,0,706,707,3,255,126,0,707, + 708,3,241,119,0,708,108,1,0,0,0,709,710,3,251,124,0,710,711,3,237,117, + 0,711,712,3,239,118,0,712,713,3,267,132,0,713,110,1,0,0,0,714,715,3,251, + 124,0,715,716,3,237,117,0,716,717,3,267,132,0,717,112,1,0,0,0,718,719, + 3,251,124,0,719,720,3,245,121,0,720,721,3,249,123,0,721,722,3,237,117, + 0,722,114,1,0,0,0,723,724,3,251,124,0,724,725,3,245,121,0,725,726,3,253, + 125,0,726,727,3,245,121,0,727,728,3,267,132,0,728,116,1,0,0,0,729,730, + 3,253,125,0,730,731,3,245,121,0,731,732,3,255,126,0,732,733,3,269,133, + 0,733,734,3,267,132,0,734,735,3,237,117,0,735,118,1,0,0,0,736,737,3,253, + 125,0,737,738,3,257,127,0,738,739,3,255,126,0,739,740,3,267,132,0,740, + 741,3,243,120,0,741,120,1,0,0,0,742,743,3,255,126,0,743,744,3,229,113, + 0,744,745,3,255,126,0,745,122,1,0,0,0,746,747,3,255,126,0,747,748,3,257, + 127,0,748,749,3,267,132,0,749,124,1,0,0,0,750,751,3,255,126,0,751,752, + 3,269,133,0,752,753,3,251,124,0,753,754,3,251,124,0,754,126,1,0,0,0,755, + 756,3,255,126,0,756,757,3,269,133,0,757,758,3,251,124,0,758,759,3,251, + 124,0,759,760,3,265,131,0,760,128,1,0,0,0,761,762,3,257,127,0,762,763, + 3,239,118,0,763,764,3,239,118,0,764,765,3,265,131,0,765,766,3,237,117, + 0,766,767,3,267,132,0,767,130,1,0,0,0,768,769,3,257,127,0,769,770,3,255, + 126,0,770,132,1,0,0,0,771,772,3,257,127,0,772,773,3,263,130,0,773,134, + 1,0,0,0,774,775,3,257,127,0,775,776,3,263,130,0,776,777,3,235,116,0,777, + 778,3,237,117,0,778,779,3,263,130,0,779,136,1,0,0,0,780,781,3,257,127, + 0,781,782,3,269,133,0,782,783,3,267,132,0,783,784,3,237,117,0,784,785, + 3,263,130,0,785,138,1,0,0,0,786,787,3,257,127,0,787,788,3,271,134,0,788, + 789,3,237,117,0,789,790,3,263,130,0,790,140,1,0,0,0,791,792,3,259,128, + 0,792,793,3,229,113,0,793,794,3,263,130,0,794,795,3,267,132,0,795,796, + 3,245,121,0,796,797,3,267,132,0,797,798,3,245,121,0,798,799,3,257,127, + 0,799,800,3,255,126,0,800,142,1,0,0,0,801,802,3,259,128,0,802,803,3,263, + 130,0,803,804,3,237,117,0,804,805,3,233,115,0,805,806,3,237,117,0,806, + 807,3,235,116,0,807,808,3,245,121,0,808,809,3,255,126,0,809,810,3,241, + 119,0,810,144,1,0,0,0,811,812,3,259,128,0,812,813,3,263,130,0,813,814, + 3,237,117,0,814,815,3,273,135,0,815,816,3,243,120,0,816,817,3,237,117, + 0,817,818,3,263,130,0,818,819,3,237,117,0,819,146,1,0,0,0,820,821,3,261, + 129,0,821,822,3,269,133,0,822,823,3,229,113,0,823,824,3,263,130,0,824, + 825,3,267,132,0,825,826,3,237,117,0,826,827,3,263,130,0,827,148,1,0,0, + 0,828,829,3,263,130,0,829,830,3,229,113,0,830,831,3,255,126,0,831,832, + 3,241,119,0,832,833,3,237,117,0,833,150,1,0,0,0,834,835,3,263,130,0,835, + 836,3,237,117,0,836,837,3,267,132,0,837,838,3,269,133,0,838,839,3,263, + 130,0,839,840,3,255,126,0,840,152,1,0,0,0,841,842,3,263,130,0,842,843, + 3,245,121,0,843,844,3,241,119,0,844,845,3,243,120,0,845,846,3,267,132, + 0,846,154,1,0,0,0,847,848,3,263,130,0,848,849,3,257,127,0,849,850,3,251, + 124,0,850,851,3,251,124,0,851,852,3,269,133,0,852,853,3,259,128,0,853, + 156,1,0,0,0,854,855,3,263,130,0,855,856,3,257,127,0,856,857,3,273,135, + 0,857,158,1,0,0,0,858,859,3,263,130,0,859,860,3,257,127,0,860,861,3,273, + 135,0,861,862,3,265,131,0,862,160,1,0,0,0,863,864,3,265,131,0,864,865, + 3,229,113,0,865,866,3,253,125,0,866,867,3,259,128,0,867,868,3,251,124, + 0,868,869,3,237,117,0,869,162,1,0,0,0,870,871,3,265,131,0,871,872,3,237, + 117,0,872,873,3,233,115,0,873,874,3,257,127,0,874,875,3,255,126,0,875, + 876,3,235,116,0,876,164,1,0,0,0,877,878,3,265,131,0,878,879,3,237,117, + 0,879,880,3,251,124,0,880,881,3,237,117,0,881,882,3,233,115,0,882,883, + 3,267,132,0,883,166,1,0,0,0,884,885,3,265,131,0,885,886,3,237,117,0,886, + 887,3,253,125,0,887,888,3,245,121,0,888,168,1,0,0,0,889,890,3,265,131, + 0,890,891,3,237,117,0,891,892,3,267,132,0,892,893,3,267,132,0,893,894, + 3,245,121,0,894,895,3,255,126,0,895,896,3,241,119,0,896,897,3,265,131, + 0,897,170,1,0,0,0,898,899,3,265,131,0,899,900,3,269,133,0,900,901,3,231, + 114,0,901,902,3,265,131,0,902,903,3,267,132,0,903,904,3,263,130,0,904, + 905,3,245,121,0,905,906,3,255,126,0,906,907,3,241,119,0,907,172,1,0,0, + 0,908,909,3,267,132,0,909,910,3,243,120,0,910,911,3,237,117,0,911,912, + 3,255,126,0,912,174,1,0,0,0,913,914,3,267,132,0,914,915,3,243,120,0,915, + 916,3,263,130,0,916,917,3,257,127,0,917,918,3,273,135,0,918,176,1,0,0, + 0,919,920,3,267,132,0,920,921,3,245,121,0,921,922,3,237,117,0,922,923, + 3,265,131,0,923,178,1,0,0,0,924,925,3,267,132,0,925,926,3,245,121,0,926, + 927,3,253,125,0,927,928,3,237,117,0,928,929,3,265,131,0,929,930,3,267, + 132,0,930,931,3,229,113,0,931,932,3,253,125,0,932,933,3,259,128,0,933, + 180,1,0,0,0,934,935,3,267,132,0,935,936,3,257,127,0,936,182,1,0,0,0,937, + 938,3,267,132,0,938,939,3,257,127,0,939,940,3,259,128,0,940,184,1,0,0, + 0,941,942,3,267,132,0,942,943,3,257,127,0,943,944,3,267,132,0,944,945, + 3,229,113,0,945,946,3,251,124,0,946,947,3,265,131,0,947,186,1,0,0,0,948, + 949,3,267,132,0,949,950,3,263,130,0,950,951,3,229,113,0,951,952,3,245, + 121,0,952,953,3,251,124,0,953,954,3,245,121,0,954,955,3,255,126,0,955, + 956,3,241,119,0,956,188,1,0,0,0,957,958,3,267,132,0,958,959,3,263,130, + 0,959,960,3,245,121,0,960,961,3,253,125,0,961,190,1,0,0,0,962,963,3,267, + 132,0,963,964,3,263,130,0,964,965,3,269,133,0,965,966,3,255,126,0,966, + 967,3,233,115,0,967,968,3,229,113,0,968,969,3,267,132,0,969,970,3,237, + 117,0,970,192,1,0,0,0,971,972,3,267,132,0,972,973,3,263,130,0,973,974, + 3,277,137,0,974,194,1,0,0,0,975,976,3,269,133,0,976,977,3,255,126,0,977, + 978,3,231,114,0,978,979,3,257,127,0,979,980,3,269,133,0,980,981,3,255, + 126,0,981,982,3,235,116,0,982,983,3,237,117,0,983,984,3,235,116,0,984, + 196,1,0,0,0,985,986,3,269,133,0,986,987,3,255,126,0,987,988,3,245,121, + 0,988,989,3,257,127,0,989,990,3,255,126,0,990,198,1,0,0,0,991,992,3,269, + 133,0,992,993,3,265,131,0,993,994,3,245,121,0,994,995,3,255,126,0,995, + 996,3,241,119,0,996,200,1,0,0,0,997,998,3,273,135,0,998,999,3,237,117, + 0,999,1000,3,237,117,0,1000,1001,3,249,123,0,1001,202,1,0,0,0,1002,1003, + 3,273,135,0,1003,1004,3,243,120,0,1004,1005,3,237,117,0,1005,1006,3,255, + 126,0,1006,204,1,0,0,0,1007,1008,3,273,135,0,1008,1009,3,243,120,0,1009, + 1010,3,237,117,0,1010,1011,3,263,130,0,1011,1012,3,237,117,0,1012,206, + 1,0,0,0,1013,1014,3,273,135,0,1014,1015,3,243,120,0,1015,1016,3,245,121, + 0,1016,1017,3,251,124,0,1017,1018,3,237,117,0,1018,208,1,0,0,0,1019,1020, + 3,273,135,0,1020,1021,3,245,121,0,1021,1022,3,255,126,0,1022,1023,3,235, + 116,0,1023,1024,3,257,127,0,1024,1025,3,273,135,0,1025,210,1,0,0,0,1026, + 1027,3,273,135,0,1027,1028,3,245,121,0,1028,1029,3,267,132,0,1029,1030, + 3,243,120,0,1030,212,1,0,0,0,1031,1032,3,277,137,0,1032,1033,3,237,117, + 0,1033,1034,3,229,113,0,1034,1035,3,263,130,0,1035,1042,1,0,0,0,1036, + 1037,3,277,137,0,1037,1038,3,277,137,0,1038,1039,3,277,137,0,1039,1040, + 3,277,137,0,1040,1042,1,0,0,0,1041,1031,1,0,0,0,1041,1036,1,0,0,0,1042, + 214,1,0,0,0,1043,1044,3,295,146,0,1044,1045,3,231,114,0,1045,1071,1,0, + 0,0,1046,1047,3,295,146,0,1047,1048,3,239,118,0,1048,1071,1,0,0,0,1049, + 1050,3,295,146,0,1050,1051,3,263,130,0,1051,1071,1,0,0,0,1052,1053,3, + 295,146,0,1053,1054,3,255,126,0,1054,1071,1,0,0,0,1055,1056,3,295,146, + 0,1056,1057,3,267,132,0,1057,1071,1,0,0,0,1058,1059,3,295,146,0,1059, + 1060,5,48,0,0,1060,1071,1,0,0,0,1061,1062,3,295,146,0,1062,1063,3,229, + 113,0,1063,1071,1,0,0,0,1064,1065,3,295,146,0,1065,1066,3,271,134,0,1066, + 1071,1,0,0,0,1067,1068,3,295,146,0,1068,1069,3,295,146,0,1069,1071,1, + 0,0,0,1070,1043,1,0,0,0,1070,1046,1,0,0,0,1070,1049,1,0,0,0,1070,1052, + 1,0,0,0,1070,1055,1,0,0,0,1070,1058,1,0,0,0,1070,1061,1,0,0,0,1070,1064, + 1,0,0,0,1070,1067,1,0,0,0,1071,216,1,0,0,0,1072,1076,3,281,139,0,1073, + 1076,3,371,184,0,1074,1076,3,305,151,0,1075,1072,1,0,0,0,1075,1073,1, + 0,0,0,1075,1074,1,0,0,0,1076,1083,1,0,0,0,1077,1082,3,281,139,0,1078, + 1082,3,371,184,0,1079,1082,3,285,141,0,1080,1082,3,305,151,0,1081,1077, + 1,0,0,0,1081,1078,1,0,0,0,1081,1079,1,0,0,0,1081,1080,1,0,0,0,1082,1085, + 1,0,0,0,1083,1081,1,0,0,0,1083,1084,1,0,0,0,1084,1119,1,0,0,0,1085,1083, + 1,0,0,0,1086,1097,3,293,145,0,1087,1096,8,0,0,0,1088,1096,3,215,106,0, + 1089,1090,3,295,146,0,1090,1091,3,355,176,0,1091,1096,1,0,0,0,1092,1093, + 3,293,145,0,1093,1094,3,293,145,0,1094,1096,1,0,0,0,1095,1087,1,0,0,0, + 1095,1088,1,0,0,0,1095,1089,1,0,0,0,1095,1092,1,0,0,0,1096,1099,1,0,0, + 0,1097,1095,1,0,0,0,1097,1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097,1,0, + 0,0,1100,1101,3,293,145,0,1101,1119,1,0,0,0,1102,1113,3,349,173,0,1103, + 1112,8,1,0,0,1104,1112,3,215,106,0,1105,1106,3,295,146,0,1106,1107,3, + 349,173,0,1107,1112,1,0,0,0,1108,1109,3,349,173,0,1109,1110,3,349,173, + 0,1110,1112,1,0,0,0,1111,1103,1,0,0,0,1111,1104,1,0,0,0,1111,1105,1,0, + 0,0,1111,1108,1,0,0,0,1112,1115,1,0,0,0,1113,1111,1,0,0,0,1113,1114,1, + 0,0,0,1114,1116,1,0,0,0,1115,1113,1,0,0,0,1116,1117,3,349,173,0,1117, + 1119,1,0,0,0,1118,1075,1,0,0,0,1118,1086,1,0,0,0,1118,1102,1,0,0,0,1119, + 218,1,0,0,0,1120,1121,3,225,111,0,1121,1125,3,307,152,0,1122,1124,3,287, + 142,0,1123,1122,1,0,0,0,1124,1127,1,0,0,0,1125,1123,1,0,0,0,1125,1126, + 1,0,0,0,1126,1130,1,0,0,0,1127,1125,1,0,0,0,1128,1131,3,259,128,0,1129, + 1131,3,237,117,0,1130,1128,1,0,0,0,1130,1129,1,0,0,0,1131,1134,1,0,0, + 0,1132,1135,3,345,171,0,1133,1135,3,303,150,0,1134,1132,1,0,0,0,1134, + 1133,1,0,0,0,1134,1135,1,0,0,0,1135,1137,1,0,0,0,1136,1138,3,285,141, + 0,1137,1136,1,0,0,0,1138,1139,1,0,0,0,1139,1137,1,0,0,0,1139,1140,1,0, + 0,0,1140,1197,1,0,0,0,1141,1144,3,225,111,0,1142,1145,3,259,128,0,1143, + 1145,3,237,117,0,1144,1142,1,0,0,0,1144,1143,1,0,0,0,1145,1148,1,0,0, + 0,1146,1149,3,345,171,0,1147,1149,3,303,150,0,1148,1146,1,0,0,0,1148, + 1147,1,0,0,0,1148,1149,1,0,0,0,1149,1151,1,0,0,0,1150,1152,3,285,141, + 0,1151,1150,1,0,0,0,1152,1153,1,0,0,0,1153,1151,1,0,0,0,1153,1154,1,0, + 0,0,1154,1197,1,0,0,0,1155,1156,3,223,110,0,1156,1160,3,307,152,0,1157, + 1159,3,285,141,0,1158,1157,1,0,0,0,1159,1162,1,0,0,0,1160,1158,1,0,0, + 0,1160,1161,1,0,0,0,1161,1163,1,0,0,0,1162,1160,1,0,0,0,1163,1166,3,237, + 117,0,1164,1167,3,345,171,0,1165,1167,3,303,150,0,1166,1164,1,0,0,0,1166, + 1165,1,0,0,0,1166,1167,1,0,0,0,1167,1169,1,0,0,0,1168,1170,3,285,141, + 0,1169,1168,1,0,0,0,1170,1171,1,0,0,0,1171,1169,1,0,0,0,1171,1172,1,0, + 0,0,1172,1197,1,0,0,0,1173,1174,3,307,152,0,1174,1175,3,223,110,0,1175, + 1178,3,237,117,0,1176,1179,3,345,171,0,1177,1179,3,303,150,0,1178,1176, + 1,0,0,0,1178,1177,1,0,0,0,1178,1179,1,0,0,0,1179,1181,1,0,0,0,1180,1182, + 3,285,141,0,1181,1180,1,0,0,0,1182,1183,1,0,0,0,1183,1181,1,0,0,0,1183, + 1184,1,0,0,0,1184,1197,1,0,0,0,1185,1186,3,223,110,0,1186,1189,3,237, + 117,0,1187,1190,3,345,171,0,1188,1190,3,303,150,0,1189,1187,1,0,0,0,1189, + 1188,1,0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1193,3,285,141, + 0,1192,1191,1,0,0,0,1193,1194,1,0,0,0,1194,1192,1,0,0,0,1194,1195,1,0, + 0,0,1195,1197,1,0,0,0,1196,1120,1,0,0,0,1196,1141,1,0,0,0,1196,1155,1, + 0,0,0,1196,1173,1,0,0,0,1196,1185,1,0,0,0,1197,220,1,0,0,0,1198,1200, + 5,48,0,0,1199,1201,3,283,140,0,1200,1199,1,0,0,0,1201,1202,1,0,0,0,1202, + 1200,1,0,0,0,1202,1203,1,0,0,0,1203,222,1,0,0,0,1204,1206,3,285,141,0, + 1205,1204,1,0,0,0,1206,1207,1,0,0,0,1207,1205,1,0,0,0,1207,1208,1,0,0, + 0,1208,224,1,0,0,0,1209,1210,5,48,0,0,1210,1212,3,275,136,0,1211,1213, + 3,287,142,0,1212,1211,1,0,0,0,1213,1214,1,0,0,0,1214,1212,1,0,0,0,1214, + 1215,1,0,0,0,1215,226,1,0,0,0,1216,1227,3,355,176,0,1217,1226,8,2,0,0, + 1218,1226,3,215,106,0,1219,1220,3,295,146,0,1220,1221,3,355,176,0,1221, + 1226,1,0,0,0,1222,1223,3,355,176,0,1223,1224,3,355,176,0,1224,1226,1, + 0,0,0,1225,1217,1,0,0,0,1225,1218,1,0,0,0,1225,1219,1,0,0,0,1225,1222, + 1,0,0,0,1226,1229,1,0,0,0,1227,1225,1,0,0,0,1227,1228,1,0,0,0,1228,1230, + 1,0,0,0,1229,1227,1,0,0,0,1230,1231,3,355,176,0,1231,228,1,0,0,0,1232, + 1233,7,3,0,0,1233,230,1,0,0,0,1234,1235,7,4,0,0,1235,232,1,0,0,0,1236, + 1237,7,5,0,0,1237,234,1,0,0,0,1238,1239,7,6,0,0,1239,236,1,0,0,0,1240, + 1241,7,7,0,0,1241,238,1,0,0,0,1242,1243,7,8,0,0,1243,240,1,0,0,0,1244, + 1245,7,9,0,0,1245,242,1,0,0,0,1246,1247,7,10,0,0,1247,244,1,0,0,0,1248, + 1249,7,11,0,0,1249,246,1,0,0,0,1250,1251,7,12,0,0,1251,248,1,0,0,0,1252, + 1253,7,13,0,0,1253,250,1,0,0,0,1254,1255,7,14,0,0,1255,252,1,0,0,0,1256, + 1257,7,15,0,0,1257,254,1,0,0,0,1258,1259,7,16,0,0,1259,256,1,0,0,0,1260, + 1261,7,17,0,0,1261,258,1,0,0,0,1262,1263,7,18,0,0,1263,260,1,0,0,0,1264, + 1265,7,19,0,0,1265,262,1,0,0,0,1266,1267,7,20,0,0,1267,264,1,0,0,0,1268, + 1269,7,21,0,0,1269,266,1,0,0,0,1270,1271,7,22,0,0,1271,268,1,0,0,0,1272, + 1273,7,23,0,0,1273,270,1,0,0,0,1274,1275,7,24,0,0,1275,272,1,0,0,0,1276, + 1277,7,25,0,0,1277,274,1,0,0,0,1278,1279,7,26,0,0,1279,276,1,0,0,0,1280, + 1281,7,27,0,0,1281,278,1,0,0,0,1282,1283,7,28,0,0,1283,280,1,0,0,0,1284, + 1285,7,29,0,0,1285,282,1,0,0,0,1286,1287,7,30,0,0,1287,284,1,0,0,0,1288, + 1289,7,31,0,0,1289,286,1,0,0,0,1290,1291,7,32,0,0,1291,288,1,0,0,0,1292, + 1293,5,45,0,0,1293,1294,5,62,0,0,1294,290,1,0,0,0,1295,1296,5,42,0,0, + 1296,292,1,0,0,0,1297,1298,5,96,0,0,1298,294,1,0,0,0,1299,1300,5,92,0, + 0,1300,296,1,0,0,0,1301,1302,5,58,0,0,1302,298,1,0,0,0,1303,1304,5,44, + 0,0,1304,300,1,0,0,0,1305,1306,5,124,0,0,1306,1307,5,124,0,0,1307,302, + 1,0,0,0,1308,1309,5,45,0,0,1309,304,1,0,0,0,1310,1311,5,36,0,0,1311,306, + 1,0,0,0,1312,1313,5,46,0,0,1313,308,1,0,0,0,1314,1315,5,61,0,0,1315,1316, + 5,61,0,0,1316,310,1,0,0,0,1317,1318,5,61,0,0,1318,312,1,0,0,0,1319,1320, + 5,62,0,0,1320,1321,5,61,0,0,1321,314,1,0,0,0,1322,1323,5,62,0,0,1323, + 316,1,0,0,0,1324,1325,5,35,0,0,1325,318,1,0,0,0,1326,1327,5,126,0,0,1327, + 1328,5,42,0,0,1328,320,1,0,0,0,1329,1330,5,61,0,0,1330,1331,5,126,0,0, + 1331,1332,5,42,0,0,1332,322,1,0,0,0,1333,1334,5,123,0,0,1334,1335,1,0, + 0,0,1335,1336,6,160,0,0,1336,324,1,0,0,0,1337,1338,5,91,0,0,1338,326, + 1,0,0,0,1339,1340,5,40,0,0,1340,328,1,0,0,0,1341,1342,5,60,0,0,1342,1343, + 5,61,0,0,1343,330,1,0,0,0,1344,1345,5,60,0,0,1345,332,1,0,0,0,1346,1347, + 5,33,0,0,1347,1351,5,61,0,0,1348,1349,5,60,0,0,1349,1351,5,62,0,0,1350, + 1346,1,0,0,0,1350,1348,1,0,0,0,1351,334,1,0,0,0,1352,1353,5,33,0,0,1353, + 1354,5,126,0,0,1354,1355,5,42,0,0,1355,336,1,0,0,0,1356,1357,5,33,0,0, + 1357,1358,5,126,0,0,1358,338,1,0,0,0,1359,1360,5,63,0,0,1360,1361,5,46, + 0,0,1361,340,1,0,0,0,1362,1363,5,63,0,0,1363,1364,5,63,0,0,1364,342,1, + 0,0,0,1365,1366,5,37,0,0,1366,344,1,0,0,0,1367,1368,5,43,0,0,1368,346, + 1,0,0,0,1369,1370,5,63,0,0,1370,348,1,0,0,0,1371,1372,5,34,0,0,1372,350, + 1,0,0,0,1373,1374,5,102,0,0,1374,1375,5,39,0,0,1375,1376,1,0,0,0,1376, + 1377,6,174,1,0,1377,352,1,0,0,0,1378,1379,5,70,0,0,1379,1380,5,39,0,0, + 1380,1381,1,0,0,0,1381,1382,6,175,2,0,1382,354,1,0,0,0,1383,1384,5,39, + 0,0,1384,356,1,0,0,0,1385,1386,5,126,0,0,1386,358,1,0,0,0,1387,1388,5, + 61,0,0,1388,1389,5,126,0,0,1389,360,1,0,0,0,1390,1391,5,125,0,0,1391, + 1392,1,0,0,0,1392,1393,6,179,3,0,1393,362,1,0,0,0,1394,1395,5,93,0,0, + 1395,364,1,0,0,0,1396,1397,5,41,0,0,1397,366,1,0,0,0,1398,1399,5,59,0, + 0,1399,368,1,0,0,0,1400,1401,5,47,0,0,1401,370,1,0,0,0,1402,1403,5,95, + 0,0,1403,372,1,0,0,0,1404,1405,5,47,0,0,1405,1406,5,42,0,0,1406,1410, + 1,0,0,0,1407,1409,9,0,0,0,1408,1407,1,0,0,0,1409,1412,1,0,0,0,1410,1411, + 1,0,0,0,1410,1408,1,0,0,0,1411,1413,1,0,0,0,1412,1410,1,0,0,0,1413,1414, + 5,42,0,0,1414,1415,5,47,0,0,1415,1416,1,0,0,0,1416,1417,6,185,4,0,1417, + 374,1,0,0,0,1418,1419,5,45,0,0,1419,1423,5,45,0,0,1420,1421,5,47,0,0, + 1421,1423,5,47,0,0,1422,1418,1,0,0,0,1422,1420,1,0,0,0,1423,1427,1,0, + 0,0,1424,1426,8,33,0,0,1425,1424,1,0,0,0,1426,1429,1,0,0,0,1427,1425, + 1,0,0,0,1427,1428,1,0,0,0,1428,1431,1,0,0,0,1429,1427,1,0,0,0,1430,1432, + 7,34,0,0,1431,1430,1,0,0,0,1432,1433,1,0,0,0,1433,1434,6,186,4,0,1434, + 376,1,0,0,0,1435,1436,7,35,0,0,1436,1437,1,0,0,0,1437,1438,6,187,5,0, + 1438,378,1,0,0,0,1439,1451,8,36,0,0,1440,1451,3,215,106,0,1441,1442,3, + 295,146,0,1442,1443,3,355,176,0,1443,1451,1,0,0,0,1444,1445,3,295,146, + 0,1445,1446,3,323,160,0,1446,1451,1,0,0,0,1447,1448,3,355,176,0,1448, + 1449,3,355,176,0,1449,1451,1,0,0,0,1450,1439,1,0,0,0,1450,1440,1,0,0, + 0,1450,1441,1,0,0,0,1450,1444,1,0,0,0,1450,1447,1,0,0,0,1451,1452,1,0, + 0,0,1452,1450,1,0,0,0,1452,1453,1,0,0,0,1453,380,1,0,0,0,1454,1455,3, + 323,160,0,1455,1456,1,0,0,0,1456,1457,6,189,0,0,1457,382,1,0,0,0,1458, + 1459,3,355,176,0,1459,1460,1,0,0,0,1460,1461,6,190,6,0,1461,1462,6,190, + 3,0,1462,384,1,0,0,0,1463,1469,8,37,0,0,1464,1469,3,215,106,0,1465,1466, + 3,295,146,0,1466,1467,3,323,160,0,1467,1469,1,0,0,0,1468,1463,1,0,0,0, + 1468,1464,1,0,0,0,1468,1465,1,0,0,0,1469,1470,1,0,0,0,1470,1468,1,0,0, + 0,1470,1471,1,0,0,0,1471,386,1,0,0,0,1472,1473,3,323,160,0,1473,1474, + 1,0,0,0,1474,1475,6,192,0,0,1475,388,1,0,0,0,44,0,1,2,429,657,1041,1070, + 1075,1081,1083,1095,1097,1111,1113,1118,1125,1130,1134,1139,1144,1148, + 1153,1160,1166,1171,1178,1183,1189,1194,1196,1202,1207,1214,1225,1227, + 1350,1410,1422,1427,1431,1450,1452,1468,1470,7,5,0,0,5,1,0,5,2,0,4,0, + 0,6,0,0,0,1,0,7,147,0 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); diff --git a/hogql_parser/HogQLLexer.h b/hogql_parser/HogQLLexer.h index bb58a9f4db1d1..243379314630a 100644 --- a/hogql_parser/HogQLLexer.h +++ b/hogql_parser/HogQLLexer.h @@ -16,32 +16,33 @@ class HogQLLexer : public antlr4::Lexer { ASOF = 8, BETWEEN = 9, BOTH = 10, BY = 11, CASE = 12, CAST = 13, CATCH = 14, COHORT = 15, COLLATE = 16, CROSS = 17, CUBE = 18, CURRENT = 19, DATE = 20, DAY = 21, DESC = 22, DESCENDING = 23, DISTINCT = 24, ELSE = 25, END = 26, - EXTRACT = 27, FINAL = 28, FINALLY = 29, FIRST = 30, FN = 31, FOLLOWING = 32, - FOR = 33, FROM = 34, FULL = 35, FUN = 36, GROUP = 37, HAVING = 38, HOUR = 39, - ID = 40, IF = 41, ILIKE = 42, IN = 43, INF = 44, INNER = 45, INTERVAL = 46, - IS = 47, JOIN = 48, KEY = 49, LAST = 50, LEADING = 51, LEFT = 52, LET = 53, - LIKE = 54, LIMIT = 55, MINUTE = 56, MONTH = 57, NAN_SQL = 58, NOT = 59, - NULL_SQL = 60, NULLS = 61, OFFSET = 62, ON = 63, OR = 64, ORDER = 65, - OUTER = 66, OVER = 67, PARTITION = 68, PRECEDING = 69, PREWHERE = 70, - QUARTER = 71, RANGE = 72, RETURN = 73, RIGHT = 74, ROLLUP = 75, ROW = 76, - ROWS = 77, SAMPLE = 78, SECOND = 79, SELECT = 80, SEMI = 81, SETTINGS = 82, - SUBSTRING = 83, THEN = 84, THROW = 85, TIES = 86, TIMESTAMP = 87, TO = 88, - TOP = 89, TOTALS = 90, TRAILING = 91, TRIM = 92, TRUNCATE = 93, TRY = 94, - UNBOUNDED = 95, UNION = 96, USING = 97, WEEK = 98, WHEN = 99, WHERE = 100, - WHILE = 101, WINDOW = 102, WITH = 103, YEAR = 104, ESCAPE_CHAR_COMMON = 105, - IDENTIFIER = 106, FLOATING_LITERAL = 107, OCTAL_LITERAL = 108, DECIMAL_LITERAL = 109, - HEXADECIMAL_LITERAL = 110, STRING_LITERAL = 111, ARROW = 112, ASTERISK = 113, - BACKQUOTE = 114, BACKSLASH = 115, COLON = 116, COMMA = 117, CONCAT = 118, - DASH = 119, DOLLAR = 120, DOT = 121, EQ_DOUBLE = 122, EQ_SINGLE = 123, - GT_EQ = 124, GT = 125, HASH = 126, IREGEX_SINGLE = 127, IREGEX_DOUBLE = 128, - LBRACE = 129, LBRACKET = 130, LPAREN = 131, LT_EQ = 132, LT = 133, NOT_EQ = 134, - NOT_IREGEX = 135, NOT_REGEX = 136, NULL_PROPERTY = 137, NULLISH = 138, - PERCENT = 139, PLUS = 140, QUERY = 141, QUOTE_DOUBLE = 142, QUOTE_SINGLE_TEMPLATE = 143, - QUOTE_SINGLE_TEMPLATE_FULL = 144, QUOTE_SINGLE = 145, REGEX_SINGLE = 146, - REGEX_DOUBLE = 147, RBRACE = 148, RBRACKET = 149, RPAREN = 150, SEMICOLON = 151, - SLASH = 152, UNDERSCORE = 153, MULTI_LINE_COMMENT = 154, SINGLE_LINE_COMMENT = 155, - WHITESPACE = 156, STRING_TEXT = 157, STRING_ESCAPE_TRIGGER = 158, FULL_STRING_TEXT = 159, - FULL_STRING_ESCAPE_TRIGGER = 160 + EXCEPT = 27, EXTRACT = 28, FINAL = 29, FINALLY = 30, FIRST = 31, FN = 32, + FOLLOWING = 33, FOR = 34, FROM = 35, FULL = 36, FUN = 37, GROUP = 38, + HAVING = 39, HOUR = 40, ID = 41, IF = 42, ILIKE = 43, IN = 44, INF = 45, + INNER = 46, INTERSECT = 47, INTERVAL = 48, IS = 49, JOIN = 50, KEY = 51, + LAST = 52, LEADING = 53, LEFT = 54, LET = 55, LIKE = 56, LIMIT = 57, + MINUTE = 58, MONTH = 59, NAN_SQL = 60, NOT = 61, NULL_SQL = 62, NULLS = 63, + OFFSET = 64, ON = 65, OR = 66, ORDER = 67, OUTER = 68, OVER = 69, PARTITION = 70, + PRECEDING = 71, PREWHERE = 72, QUARTER = 73, RANGE = 74, RETURN = 75, + RIGHT = 76, ROLLUP = 77, ROW = 78, ROWS = 79, SAMPLE = 80, SECOND = 81, + SELECT = 82, SEMI = 83, SETTINGS = 84, SUBSTRING = 85, THEN = 86, THROW = 87, + TIES = 88, TIMESTAMP = 89, TO = 90, TOP = 91, TOTALS = 92, TRAILING = 93, + TRIM = 94, TRUNCATE = 95, TRY = 96, UNBOUNDED = 97, UNION = 98, USING = 99, + WEEK = 100, WHEN = 101, WHERE = 102, WHILE = 103, WINDOW = 104, WITH = 105, + YEAR = 106, ESCAPE_CHAR_COMMON = 107, IDENTIFIER = 108, FLOATING_LITERAL = 109, + OCTAL_LITERAL = 110, DECIMAL_LITERAL = 111, HEXADECIMAL_LITERAL = 112, + STRING_LITERAL = 113, ARROW = 114, ASTERISK = 115, BACKQUOTE = 116, + BACKSLASH = 117, COLON = 118, COMMA = 119, CONCAT = 120, DASH = 121, + DOLLAR = 122, DOT = 123, EQ_DOUBLE = 124, EQ_SINGLE = 125, GT_EQ = 126, + GT = 127, HASH = 128, IREGEX_SINGLE = 129, IREGEX_DOUBLE = 130, LBRACE = 131, + LBRACKET = 132, LPAREN = 133, LT_EQ = 134, LT = 135, NOT_EQ = 136, NOT_IREGEX = 137, + NOT_REGEX = 138, NULL_PROPERTY = 139, NULLISH = 140, PERCENT = 141, + PLUS = 142, QUERY = 143, QUOTE_DOUBLE = 144, QUOTE_SINGLE_TEMPLATE = 145, + QUOTE_SINGLE_TEMPLATE_FULL = 146, QUOTE_SINGLE = 147, REGEX_SINGLE = 148, + REGEX_DOUBLE = 149, RBRACE = 150, RBRACKET = 151, RPAREN = 152, SEMICOLON = 153, + SLASH = 154, UNDERSCORE = 155, MULTI_LINE_COMMENT = 156, SINGLE_LINE_COMMENT = 157, + WHITESPACE = 158, STRING_TEXT = 159, STRING_ESCAPE_TRIGGER = 160, FULL_STRING_TEXT = 161, + FULL_STRING_ESCAPE_TRIGGER = 162 }; enum { diff --git a/hogql_parser/HogQLLexer.interp b/hogql_parser/HogQLLexer.interp index dc4c26657342d..f461a8e011b30 100644 --- a/hogql_parser/HogQLLexer.interp +++ b/hogql_parser/HogQLLexer.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -351,6 +355,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -370,6 +375,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -527,4 +533,4 @@ IN_TEMPLATE_STRING IN_FULL_TEMPLATE_STRING atn: -[4, 0, 160, 1455, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 426, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 647, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1021, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1050, 8, 104, 1, 105, 1, 105, 1, 105, 3, 105, 1055, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1061, 8, 105, 10, 105, 12, 105, 1064, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1075, 8, 105, 10, 105, 12, 105, 1078, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1091, 8, 105, 10, 105, 12, 105, 1094, 9, 105, 1, 105, 1, 105, 3, 105, 1098, 8, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1103, 8, 106, 10, 106, 12, 106, 1106, 9, 106, 1, 106, 1, 106, 3, 106, 1110, 8, 106, 1, 106, 1, 106, 3, 106, 1114, 8, 106, 1, 106, 4, 106, 1117, 8, 106, 11, 106, 12, 106, 1118, 1, 106, 1, 106, 1, 106, 3, 106, 1124, 8, 106, 1, 106, 1, 106, 3, 106, 1128, 8, 106, 1, 106, 4, 106, 1131, 8, 106, 11, 106, 12, 106, 1132, 1, 106, 1, 106, 1, 106, 5, 106, 1138, 8, 106, 10, 106, 12, 106, 1141, 9, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1146, 8, 106, 1, 106, 4, 106, 1149, 8, 106, 11, 106, 12, 106, 1150, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1158, 8, 106, 1, 106, 4, 106, 1161, 8, 106, 11, 106, 12, 106, 1162, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1169, 8, 106, 1, 106, 4, 106, 1172, 8, 106, 11, 106, 12, 106, 1173, 3, 106, 1176, 8, 106, 1, 107, 1, 107, 4, 107, 1180, 8, 107, 11, 107, 12, 107, 1181, 1, 108, 4, 108, 1185, 8, 108, 11, 108, 12, 108, 1186, 1, 109, 1, 109, 1, 109, 4, 109, 1192, 8, 109, 11, 109, 12, 109, 1193, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1205, 8, 110, 10, 110, 12, 110, 1208, 9, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 3, 163, 1330, 8, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 5, 183, 1388, 8, 183, 10, 183, 12, 183, 1391, 9, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 1402, 8, 184, 1, 184, 5, 184, 1405, 8, 184, 10, 184, 12, 184, 1408, 9, 184, 1, 184, 3, 184, 1411, 8, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 4, 186, 1430, 8, 186, 11, 186, 12, 186, 1431, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 4, 189, 1448, 8, 189, 11, 189, 12, 189, 1449, 1, 190, 1, 190, 1, 190, 1, 190, 1, 1389, 0, 191, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 0, 227, 0, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 112, 287, 113, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 0, 381, 159, 383, 160, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1491, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 1, 375, 1, 0, 0, 0, 1, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 2, 381, 1, 0, 0, 0, 2, 383, 1, 0, 0, 0, 3, 385, 1, 0, 0, 0, 5, 389, 1, 0, 0, 0, 7, 393, 1, 0, 0, 0, 9, 398, 1, 0, 0, 0, 11, 402, 1, 0, 0, 0, 13, 408, 1, 0, 0, 0, 15, 425, 1, 0, 0, 0, 17, 427, 1, 0, 0, 0, 19, 432, 1, 0, 0, 0, 21, 440, 1, 0, 0, 0, 23, 445, 1, 0, 0, 0, 25, 448, 1, 0, 0, 0, 27, 453, 1, 0, 0, 0, 29, 458, 1, 0, 0, 0, 31, 464, 1, 0, 0, 0, 33, 471, 1, 0, 0, 0, 35, 479, 1, 0, 0, 0, 37, 485, 1, 0, 0, 0, 39, 490, 1, 0, 0, 0, 41, 498, 1, 0, 0, 0, 43, 503, 1, 0, 0, 0, 45, 507, 1, 0, 0, 0, 47, 512, 1, 0, 0, 0, 49, 523, 1, 0, 0, 0, 51, 532, 1, 0, 0, 0, 53, 537, 1, 0, 0, 0, 55, 541, 1, 0, 0, 0, 57, 549, 1, 0, 0, 0, 59, 555, 1, 0, 0, 0, 61, 563, 1, 0, 0, 0, 63, 569, 1, 0, 0, 0, 65, 572, 1, 0, 0, 0, 67, 582, 1, 0, 0, 0, 69, 586, 1, 0, 0, 0, 71, 591, 1, 0, 0, 0, 73, 596, 1, 0, 0, 0, 75, 600, 1, 0, 0, 0, 77, 606, 1, 0, 0, 0, 79, 613, 1, 0, 0, 0, 81, 618, 1, 0, 0, 0, 83, 621, 1, 0, 0, 0, 85, 624, 1, 0, 0, 0, 87, 630, 1, 0, 0, 0, 89, 646, 1, 0, 0, 0, 91, 648, 1, 0, 0, 0, 93, 654, 1, 0, 0, 0, 95, 663, 1, 0, 0, 0, 97, 666, 1, 0, 0, 0, 99, 671, 1, 0, 0, 0, 101, 675, 1, 0, 0, 0, 103, 680, 1, 0, 0, 0, 105, 688, 1, 0, 0, 0, 107, 693, 1, 0, 0, 0, 109, 697, 1, 0, 0, 0, 111, 702, 1, 0, 0, 0, 113, 708, 1, 0, 0, 0, 115, 715, 1, 0, 0, 0, 117, 721, 1, 0, 0, 0, 119, 725, 1, 0, 0, 0, 121, 729, 1, 0, 0, 0, 123, 734, 1, 0, 0, 0, 125, 740, 1, 0, 0, 0, 127, 747, 1, 0, 0, 0, 129, 750, 1, 0, 0, 0, 131, 753, 1, 0, 0, 0, 133, 759, 1, 0, 0, 0, 135, 765, 1, 0, 0, 0, 137, 770, 1, 0, 0, 0, 139, 780, 1, 0, 0, 0, 141, 790, 1, 0, 0, 0, 143, 799, 1, 0, 0, 0, 145, 807, 1, 0, 0, 0, 147, 813, 1, 0, 0, 0, 149, 820, 1, 0, 0, 0, 151, 826, 1, 0, 0, 0, 153, 833, 1, 0, 0, 0, 155, 837, 1, 0, 0, 0, 157, 842, 1, 0, 0, 0, 159, 849, 1, 0, 0, 0, 161, 856, 1, 0, 0, 0, 163, 863, 1, 0, 0, 0, 165, 868, 1, 0, 0, 0, 167, 877, 1, 0, 0, 0, 169, 887, 1, 0, 0, 0, 171, 892, 1, 0, 0, 0, 173, 898, 1, 0, 0, 0, 175, 903, 1, 0, 0, 0, 177, 913, 1, 0, 0, 0, 179, 916, 1, 0, 0, 0, 181, 920, 1, 0, 0, 0, 183, 927, 1, 0, 0, 0, 185, 936, 1, 0, 0, 0, 187, 941, 1, 0, 0, 0, 189, 950, 1, 0, 0, 0, 191, 954, 1, 0, 0, 0, 193, 964, 1, 0, 0, 0, 195, 970, 1, 0, 0, 0, 197, 976, 1, 0, 0, 0, 199, 981, 1, 0, 0, 0, 201, 986, 1, 0, 0, 0, 203, 992, 1, 0, 0, 0, 205, 998, 1, 0, 0, 0, 207, 1005, 1, 0, 0, 0, 209, 1020, 1, 0, 0, 0, 211, 1049, 1, 0, 0, 0, 213, 1097, 1, 0, 0, 0, 215, 1175, 1, 0, 0, 0, 217, 1177, 1, 0, 0, 0, 219, 1184, 1, 0, 0, 0, 221, 1188, 1, 0, 0, 0, 223, 1195, 1, 0, 0, 0, 225, 1211, 1, 0, 0, 0, 227, 1213, 1, 0, 0, 0, 229, 1215, 1, 0, 0, 0, 231, 1217, 1, 0, 0, 0, 233, 1219, 1, 0, 0, 0, 235, 1221, 1, 0, 0, 0, 237, 1223, 1, 0, 0, 0, 239, 1225, 1, 0, 0, 0, 241, 1227, 1, 0, 0, 0, 243, 1229, 1, 0, 0, 0, 245, 1231, 1, 0, 0, 0, 247, 1233, 1, 0, 0, 0, 249, 1235, 1, 0, 0, 0, 251, 1237, 1, 0, 0, 0, 253, 1239, 1, 0, 0, 0, 255, 1241, 1, 0, 0, 0, 257, 1243, 1, 0, 0, 0, 259, 1245, 1, 0, 0, 0, 261, 1247, 1, 0, 0, 0, 263, 1249, 1, 0, 0, 0, 265, 1251, 1, 0, 0, 0, 267, 1253, 1, 0, 0, 0, 269, 1255, 1, 0, 0, 0, 271, 1257, 1, 0, 0, 0, 273, 1259, 1, 0, 0, 0, 275, 1261, 1, 0, 0, 0, 277, 1263, 1, 0, 0, 0, 279, 1265, 1, 0, 0, 0, 281, 1267, 1, 0, 0, 0, 283, 1269, 1, 0, 0, 0, 285, 1271, 1, 0, 0, 0, 287, 1274, 1, 0, 0, 0, 289, 1276, 1, 0, 0, 0, 291, 1278, 1, 0, 0, 0, 293, 1280, 1, 0, 0, 0, 295, 1282, 1, 0, 0, 0, 297, 1284, 1, 0, 0, 0, 299, 1287, 1, 0, 0, 0, 301, 1289, 1, 0, 0, 0, 303, 1291, 1, 0, 0, 0, 305, 1293, 1, 0, 0, 0, 307, 1296, 1, 0, 0, 0, 309, 1298, 1, 0, 0, 0, 311, 1301, 1, 0, 0, 0, 313, 1303, 1, 0, 0, 0, 315, 1305, 1, 0, 0, 0, 317, 1308, 1, 0, 0, 0, 319, 1312, 1, 0, 0, 0, 321, 1316, 1, 0, 0, 0, 323, 1318, 1, 0, 0, 0, 325, 1320, 1, 0, 0, 0, 327, 1323, 1, 0, 0, 0, 329, 1329, 1, 0, 0, 0, 331, 1331, 1, 0, 0, 0, 333, 1335, 1, 0, 0, 0, 335, 1338, 1, 0, 0, 0, 337, 1341, 1, 0, 0, 0, 339, 1344, 1, 0, 0, 0, 341, 1346, 1, 0, 0, 0, 343, 1348, 1, 0, 0, 0, 345, 1350, 1, 0, 0, 0, 347, 1352, 1, 0, 0, 0, 349, 1357, 1, 0, 0, 0, 351, 1362, 1, 0, 0, 0, 353, 1364, 1, 0, 0, 0, 355, 1366, 1, 0, 0, 0, 357, 1369, 1, 0, 0, 0, 359, 1373, 1, 0, 0, 0, 361, 1375, 1, 0, 0, 0, 363, 1377, 1, 0, 0, 0, 365, 1379, 1, 0, 0, 0, 367, 1381, 1, 0, 0, 0, 369, 1383, 1, 0, 0, 0, 371, 1401, 1, 0, 0, 0, 373, 1414, 1, 0, 0, 0, 375, 1429, 1, 0, 0, 0, 377, 1433, 1, 0, 0, 0, 379, 1437, 1, 0, 0, 0, 381, 1447, 1, 0, 0, 0, 383, 1451, 1, 0, 0, 0, 385, 386, 3, 225, 111, 0, 386, 387, 3, 247, 122, 0, 387, 388, 3, 247, 122, 0, 388, 4, 1, 0, 0, 0, 389, 390, 3, 225, 111, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 231, 114, 0, 392, 6, 1, 0, 0, 0, 393, 394, 3, 225, 111, 0, 394, 395, 3, 251, 124, 0, 395, 396, 3, 263, 130, 0, 396, 397, 3, 241, 119, 0, 397, 8, 1, 0, 0, 0, 398, 399, 3, 225, 111, 0, 399, 400, 3, 251, 124, 0, 400, 401, 3, 273, 135, 0, 401, 10, 1, 0, 0, 0, 402, 403, 3, 225, 111, 0, 403, 404, 3, 259, 128, 0, 404, 405, 3, 259, 128, 0, 405, 406, 3, 225, 111, 0, 406, 407, 3, 273, 135, 0, 407, 12, 1, 0, 0, 0, 408, 409, 3, 225, 111, 0, 409, 410, 3, 261, 129, 0, 410, 14, 1, 0, 0, 0, 411, 412, 3, 225, 111, 0, 412, 413, 3, 261, 129, 0, 413, 414, 3, 229, 113, 0, 414, 426, 1, 0, 0, 0, 415, 416, 3, 225, 111, 0, 416, 417, 3, 261, 129, 0, 417, 418, 3, 229, 113, 0, 418, 419, 3, 233, 115, 0, 419, 420, 3, 251, 124, 0, 420, 421, 3, 231, 114, 0, 421, 422, 3, 241, 119, 0, 422, 423, 3, 251, 124, 0, 423, 424, 3, 237, 117, 0, 424, 426, 1, 0, 0, 0, 425, 411, 1, 0, 0, 0, 425, 415, 1, 0, 0, 0, 426, 16, 1, 0, 0, 0, 427, 428, 3, 225, 111, 0, 428, 429, 3, 261, 129, 0, 429, 430, 3, 253, 125, 0, 430, 431, 3, 235, 116, 0, 431, 18, 1, 0, 0, 0, 432, 433, 3, 227, 112, 0, 433, 434, 3, 233, 115, 0, 434, 435, 3, 263, 130, 0, 435, 436, 3, 269, 133, 0, 436, 437, 3, 233, 115, 0, 437, 438, 3, 233, 115, 0, 438, 439, 3, 251, 124, 0, 439, 20, 1, 0, 0, 0, 440, 441, 3, 227, 112, 0, 441, 442, 3, 253, 125, 0, 442, 443, 3, 263, 130, 0, 443, 444, 3, 239, 118, 0, 444, 22, 1, 0, 0, 0, 445, 446, 3, 227, 112, 0, 446, 447, 3, 273, 135, 0, 447, 24, 1, 0, 0, 0, 448, 449, 3, 229, 113, 0, 449, 450, 3, 225, 111, 0, 450, 451, 3, 261, 129, 0, 451, 452, 3, 233, 115, 0, 452, 26, 1, 0, 0, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 225, 111, 0, 455, 456, 3, 261, 129, 0, 456, 457, 3, 263, 130, 0, 457, 28, 1, 0, 0, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 225, 111, 0, 460, 461, 3, 263, 130, 0, 461, 462, 3, 229, 113, 0, 462, 463, 3, 239, 118, 0, 463, 30, 1, 0, 0, 0, 464, 465, 3, 229, 113, 0, 465, 466, 3, 253, 125, 0, 466, 467, 3, 239, 118, 0, 467, 468, 3, 253, 125, 0, 468, 469, 3, 259, 128, 0, 469, 470, 3, 263, 130, 0, 470, 32, 1, 0, 0, 0, 471, 472, 3, 229, 113, 0, 472, 473, 3, 253, 125, 0, 473, 474, 3, 247, 122, 0, 474, 475, 3, 247, 122, 0, 475, 476, 3, 225, 111, 0, 476, 477, 3, 263, 130, 0, 477, 478, 3, 233, 115, 0, 478, 34, 1, 0, 0, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 259, 128, 0, 481, 482, 3, 253, 125, 0, 482, 483, 3, 261, 129, 0, 483, 484, 3, 261, 129, 0, 484, 36, 1, 0, 0, 0, 485, 486, 3, 229, 113, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 227, 112, 0, 488, 489, 3, 233, 115, 0, 489, 38, 1, 0, 0, 0, 490, 491, 3, 229, 113, 0, 491, 492, 3, 265, 131, 0, 492, 493, 3, 259, 128, 0, 493, 494, 3, 259, 128, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 251, 124, 0, 496, 497, 3, 263, 130, 0, 497, 40, 1, 0, 0, 0, 498, 499, 3, 231, 114, 0, 499, 500, 3, 225, 111, 0, 500, 501, 3, 263, 130, 0, 501, 502, 3, 233, 115, 0, 502, 42, 1, 0, 0, 0, 503, 504, 3, 231, 114, 0, 504, 505, 3, 225, 111, 0, 505, 506, 3, 273, 135, 0, 506, 44, 1, 0, 0, 0, 507, 508, 3, 231, 114, 0, 508, 509, 3, 233, 115, 0, 509, 510, 3, 261, 129, 0, 510, 511, 3, 229, 113, 0, 511, 46, 1, 0, 0, 0, 512, 513, 3, 231, 114, 0, 513, 514, 3, 233, 115, 0, 514, 515, 3, 261, 129, 0, 515, 516, 3, 229, 113, 0, 516, 517, 3, 233, 115, 0, 517, 518, 3, 251, 124, 0, 518, 519, 3, 231, 114, 0, 519, 520, 3, 241, 119, 0, 520, 521, 3, 251, 124, 0, 521, 522, 3, 237, 117, 0, 522, 48, 1, 0, 0, 0, 523, 524, 3, 231, 114, 0, 524, 525, 3, 241, 119, 0, 525, 526, 3, 261, 129, 0, 526, 527, 3, 263, 130, 0, 527, 528, 3, 241, 119, 0, 528, 529, 3, 251, 124, 0, 529, 530, 3, 229, 113, 0, 530, 531, 3, 263, 130, 0, 531, 50, 1, 0, 0, 0, 532, 533, 3, 233, 115, 0, 533, 534, 3, 247, 122, 0, 534, 535, 3, 261, 129, 0, 535, 536, 3, 233, 115, 0, 536, 52, 1, 0, 0, 0, 537, 538, 3, 233, 115, 0, 538, 539, 3, 251, 124, 0, 539, 540, 3, 231, 114, 0, 540, 54, 1, 0, 0, 0, 541, 542, 3, 233, 115, 0, 542, 543, 3, 271, 134, 0, 543, 544, 3, 263, 130, 0, 544, 545, 3, 259, 128, 0, 545, 546, 3, 225, 111, 0, 546, 547, 3, 229, 113, 0, 547, 548, 3, 263, 130, 0, 548, 56, 1, 0, 0, 0, 549, 550, 3, 235, 116, 0, 550, 551, 3, 241, 119, 0, 551, 552, 3, 251, 124, 0, 552, 553, 3, 225, 111, 0, 553, 554, 3, 247, 122, 0, 554, 58, 1, 0, 0, 0, 555, 556, 3, 235, 116, 0, 556, 557, 3, 241, 119, 0, 557, 558, 3, 251, 124, 0, 558, 559, 3, 225, 111, 0, 559, 560, 3, 247, 122, 0, 560, 561, 3, 247, 122, 0, 561, 562, 3, 273, 135, 0, 562, 60, 1, 0, 0, 0, 563, 564, 3, 235, 116, 0, 564, 565, 3, 241, 119, 0, 565, 566, 3, 259, 128, 0, 566, 567, 3, 261, 129, 0, 567, 568, 3, 263, 130, 0, 568, 62, 1, 0, 0, 0, 569, 570, 3, 235, 116, 0, 570, 571, 3, 251, 124, 0, 571, 64, 1, 0, 0, 0, 572, 573, 3, 235, 116, 0, 573, 574, 3, 253, 125, 0, 574, 575, 3, 247, 122, 0, 575, 576, 3, 247, 122, 0, 576, 577, 3, 253, 125, 0, 577, 578, 3, 269, 133, 0, 578, 579, 3, 241, 119, 0, 579, 580, 3, 251, 124, 0, 580, 581, 3, 237, 117, 0, 581, 66, 1, 0, 0, 0, 582, 583, 3, 235, 116, 0, 583, 584, 3, 253, 125, 0, 584, 585, 3, 259, 128, 0, 585, 68, 1, 0, 0, 0, 586, 587, 3, 235, 116, 0, 587, 588, 3, 259, 128, 0, 588, 589, 3, 253, 125, 0, 589, 590, 3, 249, 123, 0, 590, 70, 1, 0, 0, 0, 591, 592, 3, 235, 116, 0, 592, 593, 3, 265, 131, 0, 593, 594, 3, 247, 122, 0, 594, 595, 3, 247, 122, 0, 595, 72, 1, 0, 0, 0, 596, 597, 3, 235, 116, 0, 597, 598, 3, 265, 131, 0, 598, 599, 3, 251, 124, 0, 599, 74, 1, 0, 0, 0, 600, 601, 3, 237, 117, 0, 601, 602, 3, 259, 128, 0, 602, 603, 3, 253, 125, 0, 603, 604, 3, 265, 131, 0, 604, 605, 3, 255, 126, 0, 605, 76, 1, 0, 0, 0, 606, 607, 3, 239, 118, 0, 607, 608, 3, 225, 111, 0, 608, 609, 3, 267, 132, 0, 609, 610, 3, 241, 119, 0, 610, 611, 3, 251, 124, 0, 611, 612, 3, 237, 117, 0, 612, 78, 1, 0, 0, 0, 613, 614, 3, 239, 118, 0, 614, 615, 3, 253, 125, 0, 615, 616, 3, 265, 131, 0, 616, 617, 3, 259, 128, 0, 617, 80, 1, 0, 0, 0, 618, 619, 3, 241, 119, 0, 619, 620, 3, 231, 114, 0, 620, 82, 1, 0, 0, 0, 621, 622, 3, 241, 119, 0, 622, 623, 3, 235, 116, 0, 623, 84, 1, 0, 0, 0, 624, 625, 3, 241, 119, 0, 625, 626, 3, 247, 122, 0, 626, 627, 3, 241, 119, 0, 627, 628, 3, 245, 121, 0, 628, 629, 3, 233, 115, 0, 629, 86, 1, 0, 0, 0, 630, 631, 3, 241, 119, 0, 631, 632, 3, 251, 124, 0, 632, 88, 1, 0, 0, 0, 633, 634, 3, 241, 119, 0, 634, 635, 3, 251, 124, 0, 635, 636, 3, 235, 116, 0, 636, 647, 1, 0, 0, 0, 637, 638, 3, 241, 119, 0, 638, 639, 3, 251, 124, 0, 639, 640, 3, 235, 116, 0, 640, 641, 3, 241, 119, 0, 641, 642, 3, 251, 124, 0, 642, 643, 3, 241, 119, 0, 643, 644, 3, 263, 130, 0, 644, 645, 3, 273, 135, 0, 645, 647, 1, 0, 0, 0, 646, 633, 1, 0, 0, 0, 646, 637, 1, 0, 0, 0, 647, 90, 1, 0, 0, 0, 648, 649, 3, 241, 119, 0, 649, 650, 3, 251, 124, 0, 650, 651, 3, 251, 124, 0, 651, 652, 3, 233, 115, 0, 652, 653, 3, 259, 128, 0, 653, 92, 1, 0, 0, 0, 654, 655, 3, 241, 119, 0, 655, 656, 3, 251, 124, 0, 656, 657, 3, 263, 130, 0, 657, 658, 3, 233, 115, 0, 658, 659, 3, 259, 128, 0, 659, 660, 3, 267, 132, 0, 660, 661, 3, 225, 111, 0, 661, 662, 3, 247, 122, 0, 662, 94, 1, 0, 0, 0, 663, 664, 3, 241, 119, 0, 664, 665, 3, 261, 129, 0, 665, 96, 1, 0, 0, 0, 666, 667, 3, 243, 120, 0, 667, 668, 3, 253, 125, 0, 668, 669, 3, 241, 119, 0, 669, 670, 3, 251, 124, 0, 670, 98, 1, 0, 0, 0, 671, 672, 3, 245, 121, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 273, 135, 0, 674, 100, 1, 0, 0, 0, 675, 676, 3, 247, 122, 0, 676, 677, 3, 225, 111, 0, 677, 678, 3, 261, 129, 0, 678, 679, 3, 263, 130, 0, 679, 102, 1, 0, 0, 0, 680, 681, 3, 247, 122, 0, 681, 682, 3, 233, 115, 0, 682, 683, 3, 225, 111, 0, 683, 684, 3, 231, 114, 0, 684, 685, 3, 241, 119, 0, 685, 686, 3, 251, 124, 0, 686, 687, 3, 237, 117, 0, 687, 104, 1, 0, 0, 0, 688, 689, 3, 247, 122, 0, 689, 690, 3, 233, 115, 0, 690, 691, 3, 235, 116, 0, 691, 692, 3, 263, 130, 0, 692, 106, 1, 0, 0, 0, 693, 694, 3, 247, 122, 0, 694, 695, 3, 233, 115, 0, 695, 696, 3, 263, 130, 0, 696, 108, 1, 0, 0, 0, 697, 698, 3, 247, 122, 0, 698, 699, 3, 241, 119, 0, 699, 700, 3, 245, 121, 0, 700, 701, 3, 233, 115, 0, 701, 110, 1, 0, 0, 0, 702, 703, 3, 247, 122, 0, 703, 704, 3, 241, 119, 0, 704, 705, 3, 249, 123, 0, 705, 706, 3, 241, 119, 0, 706, 707, 3, 263, 130, 0, 707, 112, 1, 0, 0, 0, 708, 709, 3, 249, 123, 0, 709, 710, 3, 241, 119, 0, 710, 711, 3, 251, 124, 0, 711, 712, 3, 265, 131, 0, 712, 713, 3, 263, 130, 0, 713, 714, 3, 233, 115, 0, 714, 114, 1, 0, 0, 0, 715, 716, 3, 249, 123, 0, 716, 717, 3, 253, 125, 0, 717, 718, 3, 251, 124, 0, 718, 719, 3, 263, 130, 0, 719, 720, 3, 239, 118, 0, 720, 116, 1, 0, 0, 0, 721, 722, 3, 251, 124, 0, 722, 723, 3, 225, 111, 0, 723, 724, 3, 251, 124, 0, 724, 118, 1, 0, 0, 0, 725, 726, 3, 251, 124, 0, 726, 727, 3, 253, 125, 0, 727, 728, 3, 263, 130, 0, 728, 120, 1, 0, 0, 0, 729, 730, 3, 251, 124, 0, 730, 731, 3, 265, 131, 0, 731, 732, 3, 247, 122, 0, 732, 733, 3, 247, 122, 0, 733, 122, 1, 0, 0, 0, 734, 735, 3, 251, 124, 0, 735, 736, 3, 265, 131, 0, 736, 737, 3, 247, 122, 0, 737, 738, 3, 247, 122, 0, 738, 739, 3, 261, 129, 0, 739, 124, 1, 0, 0, 0, 740, 741, 3, 253, 125, 0, 741, 742, 3, 235, 116, 0, 742, 743, 3, 235, 116, 0, 743, 744, 3, 261, 129, 0, 744, 745, 3, 233, 115, 0, 745, 746, 3, 263, 130, 0, 746, 126, 1, 0, 0, 0, 747, 748, 3, 253, 125, 0, 748, 749, 3, 251, 124, 0, 749, 128, 1, 0, 0, 0, 750, 751, 3, 253, 125, 0, 751, 752, 3, 259, 128, 0, 752, 130, 1, 0, 0, 0, 753, 754, 3, 253, 125, 0, 754, 755, 3, 259, 128, 0, 755, 756, 3, 231, 114, 0, 756, 757, 3, 233, 115, 0, 757, 758, 3, 259, 128, 0, 758, 132, 1, 0, 0, 0, 759, 760, 3, 253, 125, 0, 760, 761, 3, 265, 131, 0, 761, 762, 3, 263, 130, 0, 762, 763, 3, 233, 115, 0, 763, 764, 3, 259, 128, 0, 764, 134, 1, 0, 0, 0, 765, 766, 3, 253, 125, 0, 766, 767, 3, 267, 132, 0, 767, 768, 3, 233, 115, 0, 768, 769, 3, 259, 128, 0, 769, 136, 1, 0, 0, 0, 770, 771, 3, 255, 126, 0, 771, 772, 3, 225, 111, 0, 772, 773, 3, 259, 128, 0, 773, 774, 3, 263, 130, 0, 774, 775, 3, 241, 119, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 241, 119, 0, 777, 778, 3, 253, 125, 0, 778, 779, 3, 251, 124, 0, 779, 138, 1, 0, 0, 0, 780, 781, 3, 255, 126, 0, 781, 782, 3, 259, 128, 0, 782, 783, 3, 233, 115, 0, 783, 784, 3, 229, 113, 0, 784, 785, 3, 233, 115, 0, 785, 786, 3, 231, 114, 0, 786, 787, 3, 241, 119, 0, 787, 788, 3, 251, 124, 0, 788, 789, 3, 237, 117, 0, 789, 140, 1, 0, 0, 0, 790, 791, 3, 255, 126, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 233, 115, 0, 793, 794, 3, 269, 133, 0, 794, 795, 3, 239, 118, 0, 795, 796, 3, 233, 115, 0, 796, 797, 3, 259, 128, 0, 797, 798, 3, 233, 115, 0, 798, 142, 1, 0, 0, 0, 799, 800, 3, 257, 127, 0, 800, 801, 3, 265, 131, 0, 801, 802, 3, 225, 111, 0, 802, 803, 3, 259, 128, 0, 803, 804, 3, 263, 130, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 259, 128, 0, 806, 144, 1, 0, 0, 0, 807, 808, 3, 259, 128, 0, 808, 809, 3, 225, 111, 0, 809, 810, 3, 251, 124, 0, 810, 811, 3, 237, 117, 0, 811, 812, 3, 233, 115, 0, 812, 146, 1, 0, 0, 0, 813, 814, 3, 259, 128, 0, 814, 815, 3, 233, 115, 0, 815, 816, 3, 263, 130, 0, 816, 817, 3, 265, 131, 0, 817, 818, 3, 259, 128, 0, 818, 819, 3, 251, 124, 0, 819, 148, 1, 0, 0, 0, 820, 821, 3, 259, 128, 0, 821, 822, 3, 241, 119, 0, 822, 823, 3, 237, 117, 0, 823, 824, 3, 239, 118, 0, 824, 825, 3, 263, 130, 0, 825, 150, 1, 0, 0, 0, 826, 827, 3, 259, 128, 0, 827, 828, 3, 253, 125, 0, 828, 829, 3, 247, 122, 0, 829, 830, 3, 247, 122, 0, 830, 831, 3, 265, 131, 0, 831, 832, 3, 255, 126, 0, 832, 152, 1, 0, 0, 0, 833, 834, 3, 259, 128, 0, 834, 835, 3, 253, 125, 0, 835, 836, 3, 269, 133, 0, 836, 154, 1, 0, 0, 0, 837, 838, 3, 259, 128, 0, 838, 839, 3, 253, 125, 0, 839, 840, 3, 269, 133, 0, 840, 841, 3, 261, 129, 0, 841, 156, 1, 0, 0, 0, 842, 843, 3, 261, 129, 0, 843, 844, 3, 225, 111, 0, 844, 845, 3, 249, 123, 0, 845, 846, 3, 255, 126, 0, 846, 847, 3, 247, 122, 0, 847, 848, 3, 233, 115, 0, 848, 158, 1, 0, 0, 0, 849, 850, 3, 261, 129, 0, 850, 851, 3, 233, 115, 0, 851, 852, 3, 229, 113, 0, 852, 853, 3, 253, 125, 0, 853, 854, 3, 251, 124, 0, 854, 855, 3, 231, 114, 0, 855, 160, 1, 0, 0, 0, 856, 857, 3, 261, 129, 0, 857, 858, 3, 233, 115, 0, 858, 859, 3, 247, 122, 0, 859, 860, 3, 233, 115, 0, 860, 861, 3, 229, 113, 0, 861, 862, 3, 263, 130, 0, 862, 162, 1, 0, 0, 0, 863, 864, 3, 261, 129, 0, 864, 865, 3, 233, 115, 0, 865, 866, 3, 249, 123, 0, 866, 867, 3, 241, 119, 0, 867, 164, 1, 0, 0, 0, 868, 869, 3, 261, 129, 0, 869, 870, 3, 233, 115, 0, 870, 871, 3, 263, 130, 0, 871, 872, 3, 263, 130, 0, 872, 873, 3, 241, 119, 0, 873, 874, 3, 251, 124, 0, 874, 875, 3, 237, 117, 0, 875, 876, 3, 261, 129, 0, 876, 166, 1, 0, 0, 0, 877, 878, 3, 261, 129, 0, 878, 879, 3, 265, 131, 0, 879, 880, 3, 227, 112, 0, 880, 881, 3, 261, 129, 0, 881, 882, 3, 263, 130, 0, 882, 883, 3, 259, 128, 0, 883, 884, 3, 241, 119, 0, 884, 885, 3, 251, 124, 0, 885, 886, 3, 237, 117, 0, 886, 168, 1, 0, 0, 0, 887, 888, 3, 263, 130, 0, 888, 889, 3, 239, 118, 0, 889, 890, 3, 233, 115, 0, 890, 891, 3, 251, 124, 0, 891, 170, 1, 0, 0, 0, 892, 893, 3, 263, 130, 0, 893, 894, 3, 239, 118, 0, 894, 895, 3, 259, 128, 0, 895, 896, 3, 253, 125, 0, 896, 897, 3, 269, 133, 0, 897, 172, 1, 0, 0, 0, 898, 899, 3, 263, 130, 0, 899, 900, 3, 241, 119, 0, 900, 901, 3, 233, 115, 0, 901, 902, 3, 261, 129, 0, 902, 174, 1, 0, 0, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 241, 119, 0, 905, 906, 3, 249, 123, 0, 906, 907, 3, 233, 115, 0, 907, 908, 3, 261, 129, 0, 908, 909, 3, 263, 130, 0, 909, 910, 3, 225, 111, 0, 910, 911, 3, 249, 123, 0, 911, 912, 3, 255, 126, 0, 912, 176, 1, 0, 0, 0, 913, 914, 3, 263, 130, 0, 914, 915, 3, 253, 125, 0, 915, 178, 1, 0, 0, 0, 916, 917, 3, 263, 130, 0, 917, 918, 3, 253, 125, 0, 918, 919, 3, 255, 126, 0, 919, 180, 1, 0, 0, 0, 920, 921, 3, 263, 130, 0, 921, 922, 3, 253, 125, 0, 922, 923, 3, 263, 130, 0, 923, 924, 3, 225, 111, 0, 924, 925, 3, 247, 122, 0, 925, 926, 3, 261, 129, 0, 926, 182, 1, 0, 0, 0, 927, 928, 3, 263, 130, 0, 928, 929, 3, 259, 128, 0, 929, 930, 3, 225, 111, 0, 930, 931, 3, 241, 119, 0, 931, 932, 3, 247, 122, 0, 932, 933, 3, 241, 119, 0, 933, 934, 3, 251, 124, 0, 934, 935, 3, 237, 117, 0, 935, 184, 1, 0, 0, 0, 936, 937, 3, 263, 130, 0, 937, 938, 3, 259, 128, 0, 938, 939, 3, 241, 119, 0, 939, 940, 3, 249, 123, 0, 940, 186, 1, 0, 0, 0, 941, 942, 3, 263, 130, 0, 942, 943, 3, 259, 128, 0, 943, 944, 3, 265, 131, 0, 944, 945, 3, 251, 124, 0, 945, 946, 3, 229, 113, 0, 946, 947, 3, 225, 111, 0, 947, 948, 3, 263, 130, 0, 948, 949, 3, 233, 115, 0, 949, 188, 1, 0, 0, 0, 950, 951, 3, 263, 130, 0, 951, 952, 3, 259, 128, 0, 952, 953, 3, 273, 135, 0, 953, 190, 1, 0, 0, 0, 954, 955, 3, 265, 131, 0, 955, 956, 3, 251, 124, 0, 956, 957, 3, 227, 112, 0, 957, 958, 3, 253, 125, 0, 958, 959, 3, 265, 131, 0, 959, 960, 3, 251, 124, 0, 960, 961, 3, 231, 114, 0, 961, 962, 3, 233, 115, 0, 962, 963, 3, 231, 114, 0, 963, 192, 1, 0, 0, 0, 964, 965, 3, 265, 131, 0, 965, 966, 3, 251, 124, 0, 966, 967, 3, 241, 119, 0, 967, 968, 3, 253, 125, 0, 968, 969, 3, 251, 124, 0, 969, 194, 1, 0, 0, 0, 970, 971, 3, 265, 131, 0, 971, 972, 3, 261, 129, 0, 972, 973, 3, 241, 119, 0, 973, 974, 3, 251, 124, 0, 974, 975, 3, 237, 117, 0, 975, 196, 1, 0, 0, 0, 976, 977, 3, 269, 133, 0, 977, 978, 3, 233, 115, 0, 978, 979, 3, 233, 115, 0, 979, 980, 3, 245, 121, 0, 980, 198, 1, 0, 0, 0, 981, 982, 3, 269, 133, 0, 982, 983, 3, 239, 118, 0, 983, 984, 3, 233, 115, 0, 984, 985, 3, 251, 124, 0, 985, 200, 1, 0, 0, 0, 986, 987, 3, 269, 133, 0, 987, 988, 3, 239, 118, 0, 988, 989, 3, 233, 115, 0, 989, 990, 3, 259, 128, 0, 990, 991, 3, 233, 115, 0, 991, 202, 1, 0, 0, 0, 992, 993, 3, 269, 133, 0, 993, 994, 3, 239, 118, 0, 994, 995, 3, 241, 119, 0, 995, 996, 3, 247, 122, 0, 996, 997, 3, 233, 115, 0, 997, 204, 1, 0, 0, 0, 998, 999, 3, 269, 133, 0, 999, 1000, 3, 241, 119, 0, 1000, 1001, 3, 251, 124, 0, 1001, 1002, 3, 231, 114, 0, 1002, 1003, 3, 253, 125, 0, 1003, 1004, 3, 269, 133, 0, 1004, 206, 1, 0, 0, 0, 1005, 1006, 3, 269, 133, 0, 1006, 1007, 3, 241, 119, 0, 1007, 1008, 3, 263, 130, 0, 1008, 1009, 3, 239, 118, 0, 1009, 208, 1, 0, 0, 0, 1010, 1011, 3, 273, 135, 0, 1011, 1012, 3, 233, 115, 0, 1012, 1013, 3, 225, 111, 0, 1013, 1014, 3, 259, 128, 0, 1014, 1021, 1, 0, 0, 0, 1015, 1016, 3, 273, 135, 0, 1016, 1017, 3, 273, 135, 0, 1017, 1018, 3, 273, 135, 0, 1018, 1019, 3, 273, 135, 0, 1019, 1021, 1, 0, 0, 0, 1020, 1010, 1, 0, 0, 0, 1020, 1015, 1, 0, 0, 0, 1021, 210, 1, 0, 0, 0, 1022, 1023, 3, 291, 144, 0, 1023, 1024, 3, 227, 112, 0, 1024, 1050, 1, 0, 0, 0, 1025, 1026, 3, 291, 144, 0, 1026, 1027, 3, 235, 116, 0, 1027, 1050, 1, 0, 0, 0, 1028, 1029, 3, 291, 144, 0, 1029, 1030, 3, 259, 128, 0, 1030, 1050, 1, 0, 0, 0, 1031, 1032, 3, 291, 144, 0, 1032, 1033, 3, 251, 124, 0, 1033, 1050, 1, 0, 0, 0, 1034, 1035, 3, 291, 144, 0, 1035, 1036, 3, 263, 130, 0, 1036, 1050, 1, 0, 0, 0, 1037, 1038, 3, 291, 144, 0, 1038, 1039, 5, 48, 0, 0, 1039, 1050, 1, 0, 0, 0, 1040, 1041, 3, 291, 144, 0, 1041, 1042, 3, 225, 111, 0, 1042, 1050, 1, 0, 0, 0, 1043, 1044, 3, 291, 144, 0, 1044, 1045, 3, 267, 132, 0, 1045, 1050, 1, 0, 0, 0, 1046, 1047, 3, 291, 144, 0, 1047, 1048, 3, 291, 144, 0, 1048, 1050, 1, 0, 0, 0, 1049, 1022, 1, 0, 0, 0, 1049, 1025, 1, 0, 0, 0, 1049, 1028, 1, 0, 0, 0, 1049, 1031, 1, 0, 0, 0, 1049, 1034, 1, 0, 0, 0, 1049, 1037, 1, 0, 0, 0, 1049, 1040, 1, 0, 0, 0, 1049, 1043, 1, 0, 0, 0, 1049, 1046, 1, 0, 0, 0, 1050, 212, 1, 0, 0, 0, 1051, 1055, 3, 277, 137, 0, 1052, 1055, 3, 367, 182, 0, 1053, 1055, 3, 301, 149, 0, 1054, 1051, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1062, 1, 0, 0, 0, 1056, 1061, 3, 277, 137, 0, 1057, 1061, 3, 367, 182, 0, 1058, 1061, 3, 281, 139, 0, 1059, 1061, 3, 301, 149, 0, 1060, 1056, 1, 0, 0, 0, 1060, 1057, 1, 0, 0, 0, 1060, 1058, 1, 0, 0, 0, 1060, 1059, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1098, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1076, 3, 289, 143, 0, 1066, 1075, 8, 0, 0, 0, 1067, 1075, 3, 211, 104, 0, 1068, 1069, 3, 291, 144, 0, 1069, 1070, 3, 351, 174, 0, 1070, 1075, 1, 0, 0, 0, 1071, 1072, 3, 289, 143, 0, 1072, 1073, 3, 289, 143, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1066, 1, 0, 0, 0, 1074, 1067, 1, 0, 0, 0, 1074, 1068, 1, 0, 0, 0, 1074, 1071, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1079, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1079, 1080, 3, 289, 143, 0, 1080, 1098, 1, 0, 0, 0, 1081, 1092, 3, 345, 171, 0, 1082, 1091, 8, 1, 0, 0, 1083, 1091, 3, 211, 104, 0, 1084, 1085, 3, 291, 144, 0, 1085, 1086, 3, 345, 171, 0, 1086, 1091, 1, 0, 0, 0, 1087, 1088, 3, 345, 171, 0, 1088, 1089, 3, 345, 171, 0, 1089, 1091, 1, 0, 0, 0, 1090, 1082, 1, 0, 0, 0, 1090, 1083, 1, 0, 0, 0, 1090, 1084, 1, 0, 0, 0, 1090, 1087, 1, 0, 0, 0, 1091, 1094, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1095, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1095, 1096, 3, 345, 171, 0, 1096, 1098, 1, 0, 0, 0, 1097, 1054, 1, 0, 0, 0, 1097, 1065, 1, 0, 0, 0, 1097, 1081, 1, 0, 0, 0, 1098, 214, 1, 0, 0, 0, 1099, 1100, 3, 221, 109, 0, 1100, 1104, 3, 303, 150, 0, 1101, 1103, 3, 283, 140, 0, 1102, 1101, 1, 0, 0, 0, 1103, 1106, 1, 0, 0, 0, 1104, 1102, 1, 0, 0, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1109, 1, 0, 0, 0, 1106, 1104, 1, 0, 0, 0, 1107, 1110, 3, 255, 126, 0, 1108, 1110, 3, 233, 115, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1108, 1, 0, 0, 0, 1110, 1113, 1, 0, 0, 0, 1111, 1114, 3, 341, 169, 0, 1112, 1114, 3, 299, 148, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1117, 3, 281, 139, 0, 1116, 1115, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1116, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1176, 1, 0, 0, 0, 1120, 1123, 3, 221, 109, 0, 1121, 1124, 3, 255, 126, 0, 1122, 1124, 3, 233, 115, 0, 1123, 1121, 1, 0, 0, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1128, 3, 341, 169, 0, 1126, 1128, 3, 299, 148, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1126, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1130, 1, 0, 0, 0, 1129, 1131, 3, 281, 139, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1130, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1176, 1, 0, 0, 0, 1134, 1135, 3, 219, 108, 0, 1135, 1139, 3, 303, 150, 0, 1136, 1138, 3, 281, 139, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1141, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1142, 1145, 3, 233, 115, 0, 1143, 1146, 3, 341, 169, 0, 1144, 1146, 3, 299, 148, 0, 1145, 1143, 1, 0, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1148, 1, 0, 0, 0, 1147, 1149, 3, 281, 139, 0, 1148, 1147, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1176, 1, 0, 0, 0, 1152, 1153, 3, 303, 150, 0, 1153, 1154, 3, 219, 108, 0, 1154, 1157, 3, 233, 115, 0, 1155, 1158, 3, 341, 169, 0, 1156, 1158, 3, 299, 148, 0, 1157, 1155, 1, 0, 0, 0, 1157, 1156, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1160, 1, 0, 0, 0, 1159, 1161, 3, 281, 139, 0, 1160, 1159, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1176, 1, 0, 0, 0, 1164, 1165, 3, 219, 108, 0, 1165, 1168, 3, 233, 115, 0, 1166, 1169, 3, 341, 169, 0, 1167, 1169, 3, 299, 148, 0, 1168, 1166, 1, 0, 0, 0, 1168, 1167, 1, 0, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1171, 1, 0, 0, 0, 1170, 1172, 3, 281, 139, 0, 1171, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1099, 1, 0, 0, 0, 1175, 1120, 1, 0, 0, 0, 1175, 1134, 1, 0, 0, 0, 1175, 1152, 1, 0, 0, 0, 1175, 1164, 1, 0, 0, 0, 1176, 216, 1, 0, 0, 0, 1177, 1179, 5, 48, 0, 0, 1178, 1180, 3, 279, 138, 0, 1179, 1178, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1179, 1, 0, 0, 0, 1181, 1182, 1, 0, 0, 0, 1182, 218, 1, 0, 0, 0, 1183, 1185, 3, 281, 139, 0, 1184, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1184, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 220, 1, 0, 0, 0, 1188, 1189, 5, 48, 0, 0, 1189, 1191, 3, 271, 134, 0, 1190, 1192, 3, 283, 140, 0, 1191, 1190, 1, 0, 0, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 222, 1, 0, 0, 0, 1195, 1206, 3, 351, 174, 0, 1196, 1205, 8, 2, 0, 0, 1197, 1205, 3, 211, 104, 0, 1198, 1199, 3, 291, 144, 0, 1199, 1200, 3, 351, 174, 0, 1200, 1205, 1, 0, 0, 0, 1201, 1202, 3, 351, 174, 0, 1202, 1203, 3, 351, 174, 0, 1203, 1205, 1, 0, 0, 0, 1204, 1196, 1, 0, 0, 0, 1204, 1197, 1, 0, 0, 0, 1204, 1198, 1, 0, 0, 0, 1204, 1201, 1, 0, 0, 0, 1205, 1208, 1, 0, 0, 0, 1206, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1206, 1, 0, 0, 0, 1209, 1210, 3, 351, 174, 0, 1210, 224, 1, 0, 0, 0, 1211, 1212, 7, 3, 0, 0, 1212, 226, 1, 0, 0, 0, 1213, 1214, 7, 4, 0, 0, 1214, 228, 1, 0, 0, 0, 1215, 1216, 7, 5, 0, 0, 1216, 230, 1, 0, 0, 0, 1217, 1218, 7, 6, 0, 0, 1218, 232, 1, 0, 0, 0, 1219, 1220, 7, 7, 0, 0, 1220, 234, 1, 0, 0, 0, 1221, 1222, 7, 8, 0, 0, 1222, 236, 1, 0, 0, 0, 1223, 1224, 7, 9, 0, 0, 1224, 238, 1, 0, 0, 0, 1225, 1226, 7, 10, 0, 0, 1226, 240, 1, 0, 0, 0, 1227, 1228, 7, 11, 0, 0, 1228, 242, 1, 0, 0, 0, 1229, 1230, 7, 12, 0, 0, 1230, 244, 1, 0, 0, 0, 1231, 1232, 7, 13, 0, 0, 1232, 246, 1, 0, 0, 0, 1233, 1234, 7, 14, 0, 0, 1234, 248, 1, 0, 0, 0, 1235, 1236, 7, 15, 0, 0, 1236, 250, 1, 0, 0, 0, 1237, 1238, 7, 16, 0, 0, 1238, 252, 1, 0, 0, 0, 1239, 1240, 7, 17, 0, 0, 1240, 254, 1, 0, 0, 0, 1241, 1242, 7, 18, 0, 0, 1242, 256, 1, 0, 0, 0, 1243, 1244, 7, 19, 0, 0, 1244, 258, 1, 0, 0, 0, 1245, 1246, 7, 20, 0, 0, 1246, 260, 1, 0, 0, 0, 1247, 1248, 7, 21, 0, 0, 1248, 262, 1, 0, 0, 0, 1249, 1250, 7, 22, 0, 0, 1250, 264, 1, 0, 0, 0, 1251, 1252, 7, 23, 0, 0, 1252, 266, 1, 0, 0, 0, 1253, 1254, 7, 24, 0, 0, 1254, 268, 1, 0, 0, 0, 1255, 1256, 7, 25, 0, 0, 1256, 270, 1, 0, 0, 0, 1257, 1258, 7, 26, 0, 0, 1258, 272, 1, 0, 0, 0, 1259, 1260, 7, 27, 0, 0, 1260, 274, 1, 0, 0, 0, 1261, 1262, 7, 28, 0, 0, 1262, 276, 1, 0, 0, 0, 1263, 1264, 7, 29, 0, 0, 1264, 278, 1, 0, 0, 0, 1265, 1266, 7, 30, 0, 0, 1266, 280, 1, 0, 0, 0, 1267, 1268, 7, 31, 0, 0, 1268, 282, 1, 0, 0, 0, 1269, 1270, 7, 32, 0, 0, 1270, 284, 1, 0, 0, 0, 1271, 1272, 5, 45, 0, 0, 1272, 1273, 5, 62, 0, 0, 1273, 286, 1, 0, 0, 0, 1274, 1275, 5, 42, 0, 0, 1275, 288, 1, 0, 0, 0, 1276, 1277, 5, 96, 0, 0, 1277, 290, 1, 0, 0, 0, 1278, 1279, 5, 92, 0, 0, 1279, 292, 1, 0, 0, 0, 1280, 1281, 5, 58, 0, 0, 1281, 294, 1, 0, 0, 0, 1282, 1283, 5, 44, 0, 0, 1283, 296, 1, 0, 0, 0, 1284, 1285, 5, 124, 0, 0, 1285, 1286, 5, 124, 0, 0, 1286, 298, 1, 0, 0, 0, 1287, 1288, 5, 45, 0, 0, 1288, 300, 1, 0, 0, 0, 1289, 1290, 5, 36, 0, 0, 1290, 302, 1, 0, 0, 0, 1291, 1292, 5, 46, 0, 0, 1292, 304, 1, 0, 0, 0, 1293, 1294, 5, 61, 0, 0, 1294, 1295, 5, 61, 0, 0, 1295, 306, 1, 0, 0, 0, 1296, 1297, 5, 61, 0, 0, 1297, 308, 1, 0, 0, 0, 1298, 1299, 5, 62, 0, 0, 1299, 1300, 5, 61, 0, 0, 1300, 310, 1, 0, 0, 0, 1301, 1302, 5, 62, 0, 0, 1302, 312, 1, 0, 0, 0, 1303, 1304, 5, 35, 0, 0, 1304, 314, 1, 0, 0, 0, 1305, 1306, 5, 126, 0, 0, 1306, 1307, 5, 42, 0, 0, 1307, 316, 1, 0, 0, 0, 1308, 1309, 5, 61, 0, 0, 1309, 1310, 5, 126, 0, 0, 1310, 1311, 5, 42, 0, 0, 1311, 318, 1, 0, 0, 0, 1312, 1313, 5, 123, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 158, 0, 0, 1315, 320, 1, 0, 0, 0, 1316, 1317, 5, 91, 0, 0, 1317, 322, 1, 0, 0, 0, 1318, 1319, 5, 40, 0, 0, 1319, 324, 1, 0, 0, 0, 1320, 1321, 5, 60, 0, 0, 1321, 1322, 5, 61, 0, 0, 1322, 326, 1, 0, 0, 0, 1323, 1324, 5, 60, 0, 0, 1324, 328, 1, 0, 0, 0, 1325, 1326, 5, 33, 0, 0, 1326, 1330, 5, 61, 0, 0, 1327, 1328, 5, 60, 0, 0, 1328, 1330, 5, 62, 0, 0, 1329, 1325, 1, 0, 0, 0, 1329, 1327, 1, 0, 0, 0, 1330, 330, 1, 0, 0, 0, 1331, 1332, 5, 33, 0, 0, 1332, 1333, 5, 126, 0, 0, 1333, 1334, 5, 42, 0, 0, 1334, 332, 1, 0, 0, 0, 1335, 1336, 5, 33, 0, 0, 1336, 1337, 5, 126, 0, 0, 1337, 334, 1, 0, 0, 0, 1338, 1339, 5, 63, 0, 0, 1339, 1340, 5, 46, 0, 0, 1340, 336, 1, 0, 0, 0, 1341, 1342, 5, 63, 0, 0, 1342, 1343, 5, 63, 0, 0, 1343, 338, 1, 0, 0, 0, 1344, 1345, 5, 37, 0, 0, 1345, 340, 1, 0, 0, 0, 1346, 1347, 5, 43, 0, 0, 1347, 342, 1, 0, 0, 0, 1348, 1349, 5, 63, 0, 0, 1349, 344, 1, 0, 0, 0, 1350, 1351, 5, 34, 0, 0, 1351, 346, 1, 0, 0, 0, 1352, 1353, 5, 102, 0, 0, 1353, 1354, 5, 39, 0, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 172, 1, 0, 1356, 348, 1, 0, 0, 0, 1357, 1358, 5, 70, 0, 0, 1358, 1359, 5, 39, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1361, 6, 173, 2, 0, 1361, 350, 1, 0, 0, 0, 1362, 1363, 5, 39, 0, 0, 1363, 352, 1, 0, 0, 0, 1364, 1365, 5, 126, 0, 0, 1365, 354, 1, 0, 0, 0, 1366, 1367, 5, 61, 0, 0, 1367, 1368, 5, 126, 0, 0, 1368, 356, 1, 0, 0, 0, 1369, 1370, 5, 125, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 177, 3, 0, 1372, 358, 1, 0, 0, 0, 1373, 1374, 5, 93, 0, 0, 1374, 360, 1, 0, 0, 0, 1375, 1376, 5, 41, 0, 0, 1376, 362, 1, 0, 0, 0, 1377, 1378, 5, 59, 0, 0, 1378, 364, 1, 0, 0, 0, 1379, 1380, 5, 47, 0, 0, 1380, 366, 1, 0, 0, 0, 1381, 1382, 5, 95, 0, 0, 1382, 368, 1, 0, 0, 0, 1383, 1384, 5, 47, 0, 0, 1384, 1385, 5, 42, 0, 0, 1385, 1389, 1, 0, 0, 0, 1386, 1388, 9, 0, 0, 0, 1387, 1386, 1, 0, 0, 0, 1388, 1391, 1, 0, 0, 0, 1389, 1390, 1, 0, 0, 0, 1389, 1387, 1, 0, 0, 0, 1390, 1392, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1392, 1393, 5, 42, 0, 0, 1393, 1394, 5, 47, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 183, 4, 0, 1396, 370, 1, 0, 0, 0, 1397, 1398, 5, 45, 0, 0, 1398, 1402, 5, 45, 0, 0, 1399, 1400, 5, 47, 0, 0, 1400, 1402, 5, 47, 0, 0, 1401, 1397, 1, 0, 0, 0, 1401, 1399, 1, 0, 0, 0, 1402, 1406, 1, 0, 0, 0, 1403, 1405, 8, 33, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 1408, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1410, 1, 0, 0, 0, 1408, 1406, 1, 0, 0, 0, 1409, 1411, 7, 34, 0, 0, 1410, 1409, 1, 0, 0, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1413, 6, 184, 4, 0, 1413, 372, 1, 0, 0, 0, 1414, 1415, 7, 35, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 5, 0, 1417, 374, 1, 0, 0, 0, 1418, 1430, 8, 36, 0, 0, 1419, 1430, 3, 211, 104, 0, 1420, 1421, 3, 291, 144, 0, 1421, 1422, 3, 351, 174, 0, 1422, 1430, 1, 0, 0, 0, 1423, 1424, 3, 291, 144, 0, 1424, 1425, 3, 319, 158, 0, 1425, 1430, 1, 0, 0, 0, 1426, 1427, 3, 351, 174, 0, 1427, 1428, 3, 351, 174, 0, 1428, 1430, 1, 0, 0, 0, 1429, 1418, 1, 0, 0, 0, 1429, 1419, 1, 0, 0, 0, 1429, 1420, 1, 0, 0, 0, 1429, 1423, 1, 0, 0, 0, 1429, 1426, 1, 0, 0, 0, 1430, 1431, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1431, 1432, 1, 0, 0, 0, 1432, 376, 1, 0, 0, 0, 1433, 1434, 3, 319, 158, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 187, 0, 0, 1436, 378, 1, 0, 0, 0, 1437, 1438, 3, 351, 174, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1440, 6, 188, 6, 0, 1440, 1441, 6, 188, 3, 0, 1441, 380, 1, 0, 0, 0, 1442, 1448, 8, 37, 0, 0, 1443, 1448, 3, 211, 104, 0, 1444, 1445, 3, 291, 144, 0, 1445, 1446, 3, 319, 158, 0, 1446, 1448, 1, 0, 0, 0, 1447, 1442, 1, 0, 0, 0, 1447, 1443, 1, 0, 0, 0, 1447, 1444, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 382, 1, 0, 0, 0, 1451, 1452, 3, 319, 158, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 190, 0, 0, 1454, 384, 1, 0, 0, 0, 44, 0, 1, 2, 425, 646, 1020, 1049, 1054, 1060, 1062, 1074, 1076, 1090, 1092, 1097, 1104, 1109, 1113, 1118, 1123, 1127, 1132, 1139, 1145, 1150, 1157, 1162, 1168, 1173, 1175, 1181, 1186, 1193, 1204, 1206, 1329, 1389, 1401, 1406, 1410, 1429, 1431, 1447, 1449, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 145, 0] \ No newline at end of file +[4, 0, 162, 1476, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 430, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 658, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 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, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 1042, 8, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1071, 8, 106, 1, 107, 1, 107, 1, 107, 3, 107, 1076, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1082, 8, 107, 10, 107, 12, 107, 1085, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1096, 8, 107, 10, 107, 12, 107, 1099, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1112, 8, 107, 10, 107, 12, 107, 1115, 9, 107, 1, 107, 1, 107, 3, 107, 1119, 8, 107, 1, 108, 1, 108, 1, 108, 5, 108, 1124, 8, 108, 10, 108, 12, 108, 1127, 9, 108, 1, 108, 1, 108, 3, 108, 1131, 8, 108, 1, 108, 1, 108, 3, 108, 1135, 8, 108, 1, 108, 4, 108, 1138, 8, 108, 11, 108, 12, 108, 1139, 1, 108, 1, 108, 1, 108, 3, 108, 1145, 8, 108, 1, 108, 1, 108, 3, 108, 1149, 8, 108, 1, 108, 4, 108, 1152, 8, 108, 11, 108, 12, 108, 1153, 1, 108, 1, 108, 1, 108, 5, 108, 1159, 8, 108, 10, 108, 12, 108, 1162, 9, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1167, 8, 108, 1, 108, 4, 108, 1170, 8, 108, 11, 108, 12, 108, 1171, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1179, 8, 108, 1, 108, 4, 108, 1182, 8, 108, 11, 108, 12, 108, 1183, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1190, 8, 108, 1, 108, 4, 108, 1193, 8, 108, 11, 108, 12, 108, 1194, 3, 108, 1197, 8, 108, 1, 109, 1, 109, 4, 109, 1201, 8, 109, 11, 109, 12, 109, 1202, 1, 110, 4, 110, 1206, 8, 110, 11, 110, 12, 110, 1207, 1, 111, 1, 111, 1, 111, 4, 111, 1213, 8, 111, 11, 111, 12, 111, 1214, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 5, 112, 1226, 8, 112, 10, 112, 12, 112, 1229, 9, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 3, 165, 1351, 8, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 5, 185, 1409, 8, 185, 10, 185, 12, 185, 1412, 9, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 3, 186, 1423, 8, 186, 1, 186, 5, 186, 1426, 8, 186, 10, 186, 12, 186, 1429, 9, 186, 1, 186, 3, 186, 1432, 8, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 4, 188, 1451, 8, 188, 11, 188, 12, 188, 1452, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 4, 191, 1469, 8, 191, 11, 191, 12, 191, 1470, 1, 192, 1, 192, 1, 192, 1, 192, 1, 1410, 0, 193, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 112, 227, 113, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 159, 381, 160, 383, 0, 385, 161, 387, 162, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1512, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 1, 381, 1, 0, 0, 0, 1, 383, 1, 0, 0, 0, 2, 385, 1, 0, 0, 0, 2, 387, 1, 0, 0, 0, 3, 389, 1, 0, 0, 0, 5, 393, 1, 0, 0, 0, 7, 397, 1, 0, 0, 0, 9, 402, 1, 0, 0, 0, 11, 406, 1, 0, 0, 0, 13, 412, 1, 0, 0, 0, 15, 429, 1, 0, 0, 0, 17, 431, 1, 0, 0, 0, 19, 436, 1, 0, 0, 0, 21, 444, 1, 0, 0, 0, 23, 449, 1, 0, 0, 0, 25, 452, 1, 0, 0, 0, 27, 457, 1, 0, 0, 0, 29, 462, 1, 0, 0, 0, 31, 468, 1, 0, 0, 0, 33, 475, 1, 0, 0, 0, 35, 483, 1, 0, 0, 0, 37, 489, 1, 0, 0, 0, 39, 494, 1, 0, 0, 0, 41, 502, 1, 0, 0, 0, 43, 507, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 516, 1, 0, 0, 0, 49, 527, 1, 0, 0, 0, 51, 536, 1, 0, 0, 0, 53, 541, 1, 0, 0, 0, 55, 545, 1, 0, 0, 0, 57, 552, 1, 0, 0, 0, 59, 560, 1, 0, 0, 0, 61, 566, 1, 0, 0, 0, 63, 574, 1, 0, 0, 0, 65, 580, 1, 0, 0, 0, 67, 583, 1, 0, 0, 0, 69, 593, 1, 0, 0, 0, 71, 597, 1, 0, 0, 0, 73, 602, 1, 0, 0, 0, 75, 607, 1, 0, 0, 0, 77, 611, 1, 0, 0, 0, 79, 617, 1, 0, 0, 0, 81, 624, 1, 0, 0, 0, 83, 629, 1, 0, 0, 0, 85, 632, 1, 0, 0, 0, 87, 635, 1, 0, 0, 0, 89, 641, 1, 0, 0, 0, 91, 657, 1, 0, 0, 0, 93, 659, 1, 0, 0, 0, 95, 665, 1, 0, 0, 0, 97, 675, 1, 0, 0, 0, 99, 684, 1, 0, 0, 0, 101, 687, 1, 0, 0, 0, 103, 692, 1, 0, 0, 0, 105, 696, 1, 0, 0, 0, 107, 701, 1, 0, 0, 0, 109, 709, 1, 0, 0, 0, 111, 714, 1, 0, 0, 0, 113, 718, 1, 0, 0, 0, 115, 723, 1, 0, 0, 0, 117, 729, 1, 0, 0, 0, 119, 736, 1, 0, 0, 0, 121, 742, 1, 0, 0, 0, 123, 746, 1, 0, 0, 0, 125, 750, 1, 0, 0, 0, 127, 755, 1, 0, 0, 0, 129, 761, 1, 0, 0, 0, 131, 768, 1, 0, 0, 0, 133, 771, 1, 0, 0, 0, 135, 774, 1, 0, 0, 0, 137, 780, 1, 0, 0, 0, 139, 786, 1, 0, 0, 0, 141, 791, 1, 0, 0, 0, 143, 801, 1, 0, 0, 0, 145, 811, 1, 0, 0, 0, 147, 820, 1, 0, 0, 0, 149, 828, 1, 0, 0, 0, 151, 834, 1, 0, 0, 0, 153, 841, 1, 0, 0, 0, 155, 847, 1, 0, 0, 0, 157, 854, 1, 0, 0, 0, 159, 858, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 870, 1, 0, 0, 0, 165, 877, 1, 0, 0, 0, 167, 884, 1, 0, 0, 0, 169, 889, 1, 0, 0, 0, 171, 898, 1, 0, 0, 0, 173, 908, 1, 0, 0, 0, 175, 913, 1, 0, 0, 0, 177, 919, 1, 0, 0, 0, 179, 924, 1, 0, 0, 0, 181, 934, 1, 0, 0, 0, 183, 937, 1, 0, 0, 0, 185, 941, 1, 0, 0, 0, 187, 948, 1, 0, 0, 0, 189, 957, 1, 0, 0, 0, 191, 962, 1, 0, 0, 0, 193, 971, 1, 0, 0, 0, 195, 975, 1, 0, 0, 0, 197, 985, 1, 0, 0, 0, 199, 991, 1, 0, 0, 0, 201, 997, 1, 0, 0, 0, 203, 1002, 1, 0, 0, 0, 205, 1007, 1, 0, 0, 0, 207, 1013, 1, 0, 0, 0, 209, 1019, 1, 0, 0, 0, 211, 1026, 1, 0, 0, 0, 213, 1041, 1, 0, 0, 0, 215, 1070, 1, 0, 0, 0, 217, 1118, 1, 0, 0, 0, 219, 1196, 1, 0, 0, 0, 221, 1198, 1, 0, 0, 0, 223, 1205, 1, 0, 0, 0, 225, 1209, 1, 0, 0, 0, 227, 1216, 1, 0, 0, 0, 229, 1232, 1, 0, 0, 0, 231, 1234, 1, 0, 0, 0, 233, 1236, 1, 0, 0, 0, 235, 1238, 1, 0, 0, 0, 237, 1240, 1, 0, 0, 0, 239, 1242, 1, 0, 0, 0, 241, 1244, 1, 0, 0, 0, 243, 1246, 1, 0, 0, 0, 245, 1248, 1, 0, 0, 0, 247, 1250, 1, 0, 0, 0, 249, 1252, 1, 0, 0, 0, 251, 1254, 1, 0, 0, 0, 253, 1256, 1, 0, 0, 0, 255, 1258, 1, 0, 0, 0, 257, 1260, 1, 0, 0, 0, 259, 1262, 1, 0, 0, 0, 261, 1264, 1, 0, 0, 0, 263, 1266, 1, 0, 0, 0, 265, 1268, 1, 0, 0, 0, 267, 1270, 1, 0, 0, 0, 269, 1272, 1, 0, 0, 0, 271, 1274, 1, 0, 0, 0, 273, 1276, 1, 0, 0, 0, 275, 1278, 1, 0, 0, 0, 277, 1280, 1, 0, 0, 0, 279, 1282, 1, 0, 0, 0, 281, 1284, 1, 0, 0, 0, 283, 1286, 1, 0, 0, 0, 285, 1288, 1, 0, 0, 0, 287, 1290, 1, 0, 0, 0, 289, 1292, 1, 0, 0, 0, 291, 1295, 1, 0, 0, 0, 293, 1297, 1, 0, 0, 0, 295, 1299, 1, 0, 0, 0, 297, 1301, 1, 0, 0, 0, 299, 1303, 1, 0, 0, 0, 301, 1305, 1, 0, 0, 0, 303, 1308, 1, 0, 0, 0, 305, 1310, 1, 0, 0, 0, 307, 1312, 1, 0, 0, 0, 309, 1314, 1, 0, 0, 0, 311, 1317, 1, 0, 0, 0, 313, 1319, 1, 0, 0, 0, 315, 1322, 1, 0, 0, 0, 317, 1324, 1, 0, 0, 0, 319, 1326, 1, 0, 0, 0, 321, 1329, 1, 0, 0, 0, 323, 1333, 1, 0, 0, 0, 325, 1337, 1, 0, 0, 0, 327, 1339, 1, 0, 0, 0, 329, 1341, 1, 0, 0, 0, 331, 1344, 1, 0, 0, 0, 333, 1350, 1, 0, 0, 0, 335, 1352, 1, 0, 0, 0, 337, 1356, 1, 0, 0, 0, 339, 1359, 1, 0, 0, 0, 341, 1362, 1, 0, 0, 0, 343, 1365, 1, 0, 0, 0, 345, 1367, 1, 0, 0, 0, 347, 1369, 1, 0, 0, 0, 349, 1371, 1, 0, 0, 0, 351, 1373, 1, 0, 0, 0, 353, 1378, 1, 0, 0, 0, 355, 1383, 1, 0, 0, 0, 357, 1385, 1, 0, 0, 0, 359, 1387, 1, 0, 0, 0, 361, 1390, 1, 0, 0, 0, 363, 1394, 1, 0, 0, 0, 365, 1396, 1, 0, 0, 0, 367, 1398, 1, 0, 0, 0, 369, 1400, 1, 0, 0, 0, 371, 1402, 1, 0, 0, 0, 373, 1404, 1, 0, 0, 0, 375, 1422, 1, 0, 0, 0, 377, 1435, 1, 0, 0, 0, 379, 1450, 1, 0, 0, 0, 381, 1454, 1, 0, 0, 0, 383, 1458, 1, 0, 0, 0, 385, 1468, 1, 0, 0, 0, 387, 1472, 1, 0, 0, 0, 389, 390, 3, 229, 113, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 251, 124, 0, 392, 4, 1, 0, 0, 0, 393, 394, 3, 229, 113, 0, 394, 395, 3, 255, 126, 0, 395, 396, 3, 235, 116, 0, 396, 6, 1, 0, 0, 0, 397, 398, 3, 229, 113, 0, 398, 399, 3, 255, 126, 0, 399, 400, 3, 267, 132, 0, 400, 401, 3, 245, 121, 0, 401, 8, 1, 0, 0, 0, 402, 403, 3, 229, 113, 0, 403, 404, 3, 255, 126, 0, 404, 405, 3, 277, 137, 0, 405, 10, 1, 0, 0, 0, 406, 407, 3, 229, 113, 0, 407, 408, 3, 263, 130, 0, 408, 409, 3, 263, 130, 0, 409, 410, 3, 229, 113, 0, 410, 411, 3, 277, 137, 0, 411, 12, 1, 0, 0, 0, 412, 413, 3, 229, 113, 0, 413, 414, 3, 265, 131, 0, 414, 14, 1, 0, 0, 0, 415, 416, 3, 229, 113, 0, 416, 417, 3, 265, 131, 0, 417, 418, 3, 233, 115, 0, 418, 430, 1, 0, 0, 0, 419, 420, 3, 229, 113, 0, 420, 421, 3, 265, 131, 0, 421, 422, 3, 233, 115, 0, 422, 423, 3, 237, 117, 0, 423, 424, 3, 255, 126, 0, 424, 425, 3, 235, 116, 0, 425, 426, 3, 245, 121, 0, 426, 427, 3, 255, 126, 0, 427, 428, 3, 241, 119, 0, 428, 430, 1, 0, 0, 0, 429, 415, 1, 0, 0, 0, 429, 419, 1, 0, 0, 0, 430, 16, 1, 0, 0, 0, 431, 432, 3, 229, 113, 0, 432, 433, 3, 265, 131, 0, 433, 434, 3, 257, 127, 0, 434, 435, 3, 239, 118, 0, 435, 18, 1, 0, 0, 0, 436, 437, 3, 231, 114, 0, 437, 438, 3, 237, 117, 0, 438, 439, 3, 267, 132, 0, 439, 440, 3, 273, 135, 0, 440, 441, 3, 237, 117, 0, 441, 442, 3, 237, 117, 0, 442, 443, 3, 255, 126, 0, 443, 20, 1, 0, 0, 0, 444, 445, 3, 231, 114, 0, 445, 446, 3, 257, 127, 0, 446, 447, 3, 267, 132, 0, 447, 448, 3, 243, 120, 0, 448, 22, 1, 0, 0, 0, 449, 450, 3, 231, 114, 0, 450, 451, 3, 277, 137, 0, 451, 24, 1, 0, 0, 0, 452, 453, 3, 233, 115, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 265, 131, 0, 455, 456, 3, 237, 117, 0, 456, 26, 1, 0, 0, 0, 457, 458, 3, 233, 115, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 265, 131, 0, 460, 461, 3, 267, 132, 0, 461, 28, 1, 0, 0, 0, 462, 463, 3, 233, 115, 0, 463, 464, 3, 229, 113, 0, 464, 465, 3, 267, 132, 0, 465, 466, 3, 233, 115, 0, 466, 467, 3, 243, 120, 0, 467, 30, 1, 0, 0, 0, 468, 469, 3, 233, 115, 0, 469, 470, 3, 257, 127, 0, 470, 471, 3, 243, 120, 0, 471, 472, 3, 257, 127, 0, 472, 473, 3, 263, 130, 0, 473, 474, 3, 267, 132, 0, 474, 32, 1, 0, 0, 0, 475, 476, 3, 233, 115, 0, 476, 477, 3, 257, 127, 0, 477, 478, 3, 251, 124, 0, 478, 479, 3, 251, 124, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 267, 132, 0, 481, 482, 3, 237, 117, 0, 482, 34, 1, 0, 0, 0, 483, 484, 3, 233, 115, 0, 484, 485, 3, 263, 130, 0, 485, 486, 3, 257, 127, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 265, 131, 0, 488, 36, 1, 0, 0, 0, 489, 490, 3, 233, 115, 0, 490, 491, 3, 269, 133, 0, 491, 492, 3, 231, 114, 0, 492, 493, 3, 237, 117, 0, 493, 38, 1, 0, 0, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 269, 133, 0, 496, 497, 3, 263, 130, 0, 497, 498, 3, 263, 130, 0, 498, 499, 3, 237, 117, 0, 499, 500, 3, 255, 126, 0, 500, 501, 3, 267, 132, 0, 501, 40, 1, 0, 0, 0, 502, 503, 3, 235, 116, 0, 503, 504, 3, 229, 113, 0, 504, 505, 3, 267, 132, 0, 505, 506, 3, 237, 117, 0, 506, 42, 1, 0, 0, 0, 507, 508, 3, 235, 116, 0, 508, 509, 3, 229, 113, 0, 509, 510, 3, 277, 137, 0, 510, 44, 1, 0, 0, 0, 511, 512, 3, 235, 116, 0, 512, 513, 3, 237, 117, 0, 513, 514, 3, 265, 131, 0, 514, 515, 3, 233, 115, 0, 515, 46, 1, 0, 0, 0, 516, 517, 3, 235, 116, 0, 517, 518, 3, 237, 117, 0, 518, 519, 3, 265, 131, 0, 519, 520, 3, 233, 115, 0, 520, 521, 3, 237, 117, 0, 521, 522, 3, 255, 126, 0, 522, 523, 3, 235, 116, 0, 523, 524, 3, 245, 121, 0, 524, 525, 3, 255, 126, 0, 525, 526, 3, 241, 119, 0, 526, 48, 1, 0, 0, 0, 527, 528, 3, 235, 116, 0, 528, 529, 3, 245, 121, 0, 529, 530, 3, 265, 131, 0, 530, 531, 3, 267, 132, 0, 531, 532, 3, 245, 121, 0, 532, 533, 3, 255, 126, 0, 533, 534, 3, 233, 115, 0, 534, 535, 3, 267, 132, 0, 535, 50, 1, 0, 0, 0, 536, 537, 3, 237, 117, 0, 537, 538, 3, 251, 124, 0, 538, 539, 3, 265, 131, 0, 539, 540, 3, 237, 117, 0, 540, 52, 1, 0, 0, 0, 541, 542, 3, 237, 117, 0, 542, 543, 3, 255, 126, 0, 543, 544, 3, 235, 116, 0, 544, 54, 1, 0, 0, 0, 545, 546, 3, 237, 117, 0, 546, 547, 3, 275, 136, 0, 547, 548, 3, 233, 115, 0, 548, 549, 3, 237, 117, 0, 549, 550, 3, 259, 128, 0, 550, 551, 3, 267, 132, 0, 551, 56, 1, 0, 0, 0, 552, 553, 3, 237, 117, 0, 553, 554, 3, 275, 136, 0, 554, 555, 3, 267, 132, 0, 555, 556, 3, 263, 130, 0, 556, 557, 3, 229, 113, 0, 557, 558, 3, 233, 115, 0, 558, 559, 3, 267, 132, 0, 559, 58, 1, 0, 0, 0, 560, 561, 3, 239, 118, 0, 561, 562, 3, 245, 121, 0, 562, 563, 3, 255, 126, 0, 563, 564, 3, 229, 113, 0, 564, 565, 3, 251, 124, 0, 565, 60, 1, 0, 0, 0, 566, 567, 3, 239, 118, 0, 567, 568, 3, 245, 121, 0, 568, 569, 3, 255, 126, 0, 569, 570, 3, 229, 113, 0, 570, 571, 3, 251, 124, 0, 571, 572, 3, 251, 124, 0, 572, 573, 3, 277, 137, 0, 573, 62, 1, 0, 0, 0, 574, 575, 3, 239, 118, 0, 575, 576, 3, 245, 121, 0, 576, 577, 3, 263, 130, 0, 577, 578, 3, 265, 131, 0, 578, 579, 3, 267, 132, 0, 579, 64, 1, 0, 0, 0, 580, 581, 3, 239, 118, 0, 581, 582, 3, 255, 126, 0, 582, 66, 1, 0, 0, 0, 583, 584, 3, 239, 118, 0, 584, 585, 3, 257, 127, 0, 585, 586, 3, 251, 124, 0, 586, 587, 3, 251, 124, 0, 587, 588, 3, 257, 127, 0, 588, 589, 3, 273, 135, 0, 589, 590, 3, 245, 121, 0, 590, 591, 3, 255, 126, 0, 591, 592, 3, 241, 119, 0, 592, 68, 1, 0, 0, 0, 593, 594, 3, 239, 118, 0, 594, 595, 3, 257, 127, 0, 595, 596, 3, 263, 130, 0, 596, 70, 1, 0, 0, 0, 597, 598, 3, 239, 118, 0, 598, 599, 3, 263, 130, 0, 599, 600, 3, 257, 127, 0, 600, 601, 3, 253, 125, 0, 601, 72, 1, 0, 0, 0, 602, 603, 3, 239, 118, 0, 603, 604, 3, 269, 133, 0, 604, 605, 3, 251, 124, 0, 605, 606, 3, 251, 124, 0, 606, 74, 1, 0, 0, 0, 607, 608, 3, 239, 118, 0, 608, 609, 3, 269, 133, 0, 609, 610, 3, 255, 126, 0, 610, 76, 1, 0, 0, 0, 611, 612, 3, 241, 119, 0, 612, 613, 3, 263, 130, 0, 613, 614, 3, 257, 127, 0, 614, 615, 3, 269, 133, 0, 615, 616, 3, 259, 128, 0, 616, 78, 1, 0, 0, 0, 617, 618, 3, 243, 120, 0, 618, 619, 3, 229, 113, 0, 619, 620, 3, 271, 134, 0, 620, 621, 3, 245, 121, 0, 621, 622, 3, 255, 126, 0, 622, 623, 3, 241, 119, 0, 623, 80, 1, 0, 0, 0, 624, 625, 3, 243, 120, 0, 625, 626, 3, 257, 127, 0, 626, 627, 3, 269, 133, 0, 627, 628, 3, 263, 130, 0, 628, 82, 1, 0, 0, 0, 629, 630, 3, 245, 121, 0, 630, 631, 3, 235, 116, 0, 631, 84, 1, 0, 0, 0, 632, 633, 3, 245, 121, 0, 633, 634, 3, 239, 118, 0, 634, 86, 1, 0, 0, 0, 635, 636, 3, 245, 121, 0, 636, 637, 3, 251, 124, 0, 637, 638, 3, 245, 121, 0, 638, 639, 3, 249, 123, 0, 639, 640, 3, 237, 117, 0, 640, 88, 1, 0, 0, 0, 641, 642, 3, 245, 121, 0, 642, 643, 3, 255, 126, 0, 643, 90, 1, 0, 0, 0, 644, 645, 3, 245, 121, 0, 645, 646, 3, 255, 126, 0, 646, 647, 3, 239, 118, 0, 647, 658, 1, 0, 0, 0, 648, 649, 3, 245, 121, 0, 649, 650, 3, 255, 126, 0, 650, 651, 3, 239, 118, 0, 651, 652, 3, 245, 121, 0, 652, 653, 3, 255, 126, 0, 653, 654, 3, 245, 121, 0, 654, 655, 3, 267, 132, 0, 655, 656, 3, 277, 137, 0, 656, 658, 1, 0, 0, 0, 657, 644, 1, 0, 0, 0, 657, 648, 1, 0, 0, 0, 658, 92, 1, 0, 0, 0, 659, 660, 3, 245, 121, 0, 660, 661, 3, 255, 126, 0, 661, 662, 3, 255, 126, 0, 662, 663, 3, 237, 117, 0, 663, 664, 3, 263, 130, 0, 664, 94, 1, 0, 0, 0, 665, 666, 3, 245, 121, 0, 666, 667, 3, 255, 126, 0, 667, 668, 3, 267, 132, 0, 668, 669, 3, 237, 117, 0, 669, 670, 3, 263, 130, 0, 670, 671, 3, 265, 131, 0, 671, 672, 3, 237, 117, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 267, 132, 0, 674, 96, 1, 0, 0, 0, 675, 676, 3, 245, 121, 0, 676, 677, 3, 255, 126, 0, 677, 678, 3, 267, 132, 0, 678, 679, 3, 237, 117, 0, 679, 680, 3, 263, 130, 0, 680, 681, 3, 271, 134, 0, 681, 682, 3, 229, 113, 0, 682, 683, 3, 251, 124, 0, 683, 98, 1, 0, 0, 0, 684, 685, 3, 245, 121, 0, 685, 686, 3, 265, 131, 0, 686, 100, 1, 0, 0, 0, 687, 688, 3, 247, 122, 0, 688, 689, 3, 257, 127, 0, 689, 690, 3, 245, 121, 0, 690, 691, 3, 255, 126, 0, 691, 102, 1, 0, 0, 0, 692, 693, 3, 249, 123, 0, 693, 694, 3, 237, 117, 0, 694, 695, 3, 277, 137, 0, 695, 104, 1, 0, 0, 0, 696, 697, 3, 251, 124, 0, 697, 698, 3, 229, 113, 0, 698, 699, 3, 265, 131, 0, 699, 700, 3, 267, 132, 0, 700, 106, 1, 0, 0, 0, 701, 702, 3, 251, 124, 0, 702, 703, 3, 237, 117, 0, 703, 704, 3, 229, 113, 0, 704, 705, 3, 235, 116, 0, 705, 706, 3, 245, 121, 0, 706, 707, 3, 255, 126, 0, 707, 708, 3, 241, 119, 0, 708, 108, 1, 0, 0, 0, 709, 710, 3, 251, 124, 0, 710, 711, 3, 237, 117, 0, 711, 712, 3, 239, 118, 0, 712, 713, 3, 267, 132, 0, 713, 110, 1, 0, 0, 0, 714, 715, 3, 251, 124, 0, 715, 716, 3, 237, 117, 0, 716, 717, 3, 267, 132, 0, 717, 112, 1, 0, 0, 0, 718, 719, 3, 251, 124, 0, 719, 720, 3, 245, 121, 0, 720, 721, 3, 249, 123, 0, 721, 722, 3, 237, 117, 0, 722, 114, 1, 0, 0, 0, 723, 724, 3, 251, 124, 0, 724, 725, 3, 245, 121, 0, 725, 726, 3, 253, 125, 0, 726, 727, 3, 245, 121, 0, 727, 728, 3, 267, 132, 0, 728, 116, 1, 0, 0, 0, 729, 730, 3, 253, 125, 0, 730, 731, 3, 245, 121, 0, 731, 732, 3, 255, 126, 0, 732, 733, 3, 269, 133, 0, 733, 734, 3, 267, 132, 0, 734, 735, 3, 237, 117, 0, 735, 118, 1, 0, 0, 0, 736, 737, 3, 253, 125, 0, 737, 738, 3, 257, 127, 0, 738, 739, 3, 255, 126, 0, 739, 740, 3, 267, 132, 0, 740, 741, 3, 243, 120, 0, 741, 120, 1, 0, 0, 0, 742, 743, 3, 255, 126, 0, 743, 744, 3, 229, 113, 0, 744, 745, 3, 255, 126, 0, 745, 122, 1, 0, 0, 0, 746, 747, 3, 255, 126, 0, 747, 748, 3, 257, 127, 0, 748, 749, 3, 267, 132, 0, 749, 124, 1, 0, 0, 0, 750, 751, 3, 255, 126, 0, 751, 752, 3, 269, 133, 0, 752, 753, 3, 251, 124, 0, 753, 754, 3, 251, 124, 0, 754, 126, 1, 0, 0, 0, 755, 756, 3, 255, 126, 0, 756, 757, 3, 269, 133, 0, 757, 758, 3, 251, 124, 0, 758, 759, 3, 251, 124, 0, 759, 760, 3, 265, 131, 0, 760, 128, 1, 0, 0, 0, 761, 762, 3, 257, 127, 0, 762, 763, 3, 239, 118, 0, 763, 764, 3, 239, 118, 0, 764, 765, 3, 265, 131, 0, 765, 766, 3, 237, 117, 0, 766, 767, 3, 267, 132, 0, 767, 130, 1, 0, 0, 0, 768, 769, 3, 257, 127, 0, 769, 770, 3, 255, 126, 0, 770, 132, 1, 0, 0, 0, 771, 772, 3, 257, 127, 0, 772, 773, 3, 263, 130, 0, 773, 134, 1, 0, 0, 0, 774, 775, 3, 257, 127, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 235, 116, 0, 777, 778, 3, 237, 117, 0, 778, 779, 3, 263, 130, 0, 779, 136, 1, 0, 0, 0, 780, 781, 3, 257, 127, 0, 781, 782, 3, 269, 133, 0, 782, 783, 3, 267, 132, 0, 783, 784, 3, 237, 117, 0, 784, 785, 3, 263, 130, 0, 785, 138, 1, 0, 0, 0, 786, 787, 3, 257, 127, 0, 787, 788, 3, 271, 134, 0, 788, 789, 3, 237, 117, 0, 789, 790, 3, 263, 130, 0, 790, 140, 1, 0, 0, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 229, 113, 0, 793, 794, 3, 263, 130, 0, 794, 795, 3, 267, 132, 0, 795, 796, 3, 245, 121, 0, 796, 797, 3, 267, 132, 0, 797, 798, 3, 245, 121, 0, 798, 799, 3, 257, 127, 0, 799, 800, 3, 255, 126, 0, 800, 142, 1, 0, 0, 0, 801, 802, 3, 259, 128, 0, 802, 803, 3, 263, 130, 0, 803, 804, 3, 237, 117, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 237, 117, 0, 806, 807, 3, 235, 116, 0, 807, 808, 3, 245, 121, 0, 808, 809, 3, 255, 126, 0, 809, 810, 3, 241, 119, 0, 810, 144, 1, 0, 0, 0, 811, 812, 3, 259, 128, 0, 812, 813, 3, 263, 130, 0, 813, 814, 3, 237, 117, 0, 814, 815, 3, 273, 135, 0, 815, 816, 3, 243, 120, 0, 816, 817, 3, 237, 117, 0, 817, 818, 3, 263, 130, 0, 818, 819, 3, 237, 117, 0, 819, 146, 1, 0, 0, 0, 820, 821, 3, 261, 129, 0, 821, 822, 3, 269, 133, 0, 822, 823, 3, 229, 113, 0, 823, 824, 3, 263, 130, 0, 824, 825, 3, 267, 132, 0, 825, 826, 3, 237, 117, 0, 826, 827, 3, 263, 130, 0, 827, 148, 1, 0, 0, 0, 828, 829, 3, 263, 130, 0, 829, 830, 3, 229, 113, 0, 830, 831, 3, 255, 126, 0, 831, 832, 3, 241, 119, 0, 832, 833, 3, 237, 117, 0, 833, 150, 1, 0, 0, 0, 834, 835, 3, 263, 130, 0, 835, 836, 3, 237, 117, 0, 836, 837, 3, 267, 132, 0, 837, 838, 3, 269, 133, 0, 838, 839, 3, 263, 130, 0, 839, 840, 3, 255, 126, 0, 840, 152, 1, 0, 0, 0, 841, 842, 3, 263, 130, 0, 842, 843, 3, 245, 121, 0, 843, 844, 3, 241, 119, 0, 844, 845, 3, 243, 120, 0, 845, 846, 3, 267, 132, 0, 846, 154, 1, 0, 0, 0, 847, 848, 3, 263, 130, 0, 848, 849, 3, 257, 127, 0, 849, 850, 3, 251, 124, 0, 850, 851, 3, 251, 124, 0, 851, 852, 3, 269, 133, 0, 852, 853, 3, 259, 128, 0, 853, 156, 1, 0, 0, 0, 854, 855, 3, 263, 130, 0, 855, 856, 3, 257, 127, 0, 856, 857, 3, 273, 135, 0, 857, 158, 1, 0, 0, 0, 858, 859, 3, 263, 130, 0, 859, 860, 3, 257, 127, 0, 860, 861, 3, 273, 135, 0, 861, 862, 3, 265, 131, 0, 862, 160, 1, 0, 0, 0, 863, 864, 3, 265, 131, 0, 864, 865, 3, 229, 113, 0, 865, 866, 3, 253, 125, 0, 866, 867, 3, 259, 128, 0, 867, 868, 3, 251, 124, 0, 868, 869, 3, 237, 117, 0, 869, 162, 1, 0, 0, 0, 870, 871, 3, 265, 131, 0, 871, 872, 3, 237, 117, 0, 872, 873, 3, 233, 115, 0, 873, 874, 3, 257, 127, 0, 874, 875, 3, 255, 126, 0, 875, 876, 3, 235, 116, 0, 876, 164, 1, 0, 0, 0, 877, 878, 3, 265, 131, 0, 878, 879, 3, 237, 117, 0, 879, 880, 3, 251, 124, 0, 880, 881, 3, 237, 117, 0, 881, 882, 3, 233, 115, 0, 882, 883, 3, 267, 132, 0, 883, 166, 1, 0, 0, 0, 884, 885, 3, 265, 131, 0, 885, 886, 3, 237, 117, 0, 886, 887, 3, 253, 125, 0, 887, 888, 3, 245, 121, 0, 888, 168, 1, 0, 0, 0, 889, 890, 3, 265, 131, 0, 890, 891, 3, 237, 117, 0, 891, 892, 3, 267, 132, 0, 892, 893, 3, 267, 132, 0, 893, 894, 3, 245, 121, 0, 894, 895, 3, 255, 126, 0, 895, 896, 3, 241, 119, 0, 896, 897, 3, 265, 131, 0, 897, 170, 1, 0, 0, 0, 898, 899, 3, 265, 131, 0, 899, 900, 3, 269, 133, 0, 900, 901, 3, 231, 114, 0, 901, 902, 3, 265, 131, 0, 902, 903, 3, 267, 132, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 245, 121, 0, 905, 906, 3, 255, 126, 0, 906, 907, 3, 241, 119, 0, 907, 172, 1, 0, 0, 0, 908, 909, 3, 267, 132, 0, 909, 910, 3, 243, 120, 0, 910, 911, 3, 237, 117, 0, 911, 912, 3, 255, 126, 0, 912, 174, 1, 0, 0, 0, 913, 914, 3, 267, 132, 0, 914, 915, 3, 243, 120, 0, 915, 916, 3, 263, 130, 0, 916, 917, 3, 257, 127, 0, 917, 918, 3, 273, 135, 0, 918, 176, 1, 0, 0, 0, 919, 920, 3, 267, 132, 0, 920, 921, 3, 245, 121, 0, 921, 922, 3, 237, 117, 0, 922, 923, 3, 265, 131, 0, 923, 178, 1, 0, 0, 0, 924, 925, 3, 267, 132, 0, 925, 926, 3, 245, 121, 0, 926, 927, 3, 253, 125, 0, 927, 928, 3, 237, 117, 0, 928, 929, 3, 265, 131, 0, 929, 930, 3, 267, 132, 0, 930, 931, 3, 229, 113, 0, 931, 932, 3, 253, 125, 0, 932, 933, 3, 259, 128, 0, 933, 180, 1, 0, 0, 0, 934, 935, 3, 267, 132, 0, 935, 936, 3, 257, 127, 0, 936, 182, 1, 0, 0, 0, 937, 938, 3, 267, 132, 0, 938, 939, 3, 257, 127, 0, 939, 940, 3, 259, 128, 0, 940, 184, 1, 0, 0, 0, 941, 942, 3, 267, 132, 0, 942, 943, 3, 257, 127, 0, 943, 944, 3, 267, 132, 0, 944, 945, 3, 229, 113, 0, 945, 946, 3, 251, 124, 0, 946, 947, 3, 265, 131, 0, 947, 186, 1, 0, 0, 0, 948, 949, 3, 267, 132, 0, 949, 950, 3, 263, 130, 0, 950, 951, 3, 229, 113, 0, 951, 952, 3, 245, 121, 0, 952, 953, 3, 251, 124, 0, 953, 954, 3, 245, 121, 0, 954, 955, 3, 255, 126, 0, 955, 956, 3, 241, 119, 0, 956, 188, 1, 0, 0, 0, 957, 958, 3, 267, 132, 0, 958, 959, 3, 263, 130, 0, 959, 960, 3, 245, 121, 0, 960, 961, 3, 253, 125, 0, 961, 190, 1, 0, 0, 0, 962, 963, 3, 267, 132, 0, 963, 964, 3, 263, 130, 0, 964, 965, 3, 269, 133, 0, 965, 966, 3, 255, 126, 0, 966, 967, 3, 233, 115, 0, 967, 968, 3, 229, 113, 0, 968, 969, 3, 267, 132, 0, 969, 970, 3, 237, 117, 0, 970, 192, 1, 0, 0, 0, 971, 972, 3, 267, 132, 0, 972, 973, 3, 263, 130, 0, 973, 974, 3, 277, 137, 0, 974, 194, 1, 0, 0, 0, 975, 976, 3, 269, 133, 0, 976, 977, 3, 255, 126, 0, 977, 978, 3, 231, 114, 0, 978, 979, 3, 257, 127, 0, 979, 980, 3, 269, 133, 0, 980, 981, 3, 255, 126, 0, 981, 982, 3, 235, 116, 0, 982, 983, 3, 237, 117, 0, 983, 984, 3, 235, 116, 0, 984, 196, 1, 0, 0, 0, 985, 986, 3, 269, 133, 0, 986, 987, 3, 255, 126, 0, 987, 988, 3, 245, 121, 0, 988, 989, 3, 257, 127, 0, 989, 990, 3, 255, 126, 0, 990, 198, 1, 0, 0, 0, 991, 992, 3, 269, 133, 0, 992, 993, 3, 265, 131, 0, 993, 994, 3, 245, 121, 0, 994, 995, 3, 255, 126, 0, 995, 996, 3, 241, 119, 0, 996, 200, 1, 0, 0, 0, 997, 998, 3, 273, 135, 0, 998, 999, 3, 237, 117, 0, 999, 1000, 3, 237, 117, 0, 1000, 1001, 3, 249, 123, 0, 1001, 202, 1, 0, 0, 0, 1002, 1003, 3, 273, 135, 0, 1003, 1004, 3, 243, 120, 0, 1004, 1005, 3, 237, 117, 0, 1005, 1006, 3, 255, 126, 0, 1006, 204, 1, 0, 0, 0, 1007, 1008, 3, 273, 135, 0, 1008, 1009, 3, 243, 120, 0, 1009, 1010, 3, 237, 117, 0, 1010, 1011, 3, 263, 130, 0, 1011, 1012, 3, 237, 117, 0, 1012, 206, 1, 0, 0, 0, 1013, 1014, 3, 273, 135, 0, 1014, 1015, 3, 243, 120, 0, 1015, 1016, 3, 245, 121, 0, 1016, 1017, 3, 251, 124, 0, 1017, 1018, 3, 237, 117, 0, 1018, 208, 1, 0, 0, 0, 1019, 1020, 3, 273, 135, 0, 1020, 1021, 3, 245, 121, 0, 1021, 1022, 3, 255, 126, 0, 1022, 1023, 3, 235, 116, 0, 1023, 1024, 3, 257, 127, 0, 1024, 1025, 3, 273, 135, 0, 1025, 210, 1, 0, 0, 0, 1026, 1027, 3, 273, 135, 0, 1027, 1028, 3, 245, 121, 0, 1028, 1029, 3, 267, 132, 0, 1029, 1030, 3, 243, 120, 0, 1030, 212, 1, 0, 0, 0, 1031, 1032, 3, 277, 137, 0, 1032, 1033, 3, 237, 117, 0, 1033, 1034, 3, 229, 113, 0, 1034, 1035, 3, 263, 130, 0, 1035, 1042, 1, 0, 0, 0, 1036, 1037, 3, 277, 137, 0, 1037, 1038, 3, 277, 137, 0, 1038, 1039, 3, 277, 137, 0, 1039, 1040, 3, 277, 137, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1031, 1, 0, 0, 0, 1041, 1036, 1, 0, 0, 0, 1042, 214, 1, 0, 0, 0, 1043, 1044, 3, 295, 146, 0, 1044, 1045, 3, 231, 114, 0, 1045, 1071, 1, 0, 0, 0, 1046, 1047, 3, 295, 146, 0, 1047, 1048, 3, 239, 118, 0, 1048, 1071, 1, 0, 0, 0, 1049, 1050, 3, 295, 146, 0, 1050, 1051, 3, 263, 130, 0, 1051, 1071, 1, 0, 0, 0, 1052, 1053, 3, 295, 146, 0, 1053, 1054, 3, 255, 126, 0, 1054, 1071, 1, 0, 0, 0, 1055, 1056, 3, 295, 146, 0, 1056, 1057, 3, 267, 132, 0, 1057, 1071, 1, 0, 0, 0, 1058, 1059, 3, 295, 146, 0, 1059, 1060, 5, 48, 0, 0, 1060, 1071, 1, 0, 0, 0, 1061, 1062, 3, 295, 146, 0, 1062, 1063, 3, 229, 113, 0, 1063, 1071, 1, 0, 0, 0, 1064, 1065, 3, 295, 146, 0, 1065, 1066, 3, 271, 134, 0, 1066, 1071, 1, 0, 0, 0, 1067, 1068, 3, 295, 146, 0, 1068, 1069, 3, 295, 146, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1043, 1, 0, 0, 0, 1070, 1046, 1, 0, 0, 0, 1070, 1049, 1, 0, 0, 0, 1070, 1052, 1, 0, 0, 0, 1070, 1055, 1, 0, 0, 0, 1070, 1058, 1, 0, 0, 0, 1070, 1061, 1, 0, 0, 0, 1070, 1064, 1, 0, 0, 0, 1070, 1067, 1, 0, 0, 0, 1071, 216, 1, 0, 0, 0, 1072, 1076, 3, 281, 139, 0, 1073, 1076, 3, 371, 184, 0, 1074, 1076, 3, 305, 151, 0, 1075, 1072, 1, 0, 0, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1074, 1, 0, 0, 0, 1076, 1083, 1, 0, 0, 0, 1077, 1082, 3, 281, 139, 0, 1078, 1082, 3, 371, 184, 0, 1079, 1082, 3, 285, 141, 0, 1080, 1082, 3, 305, 151, 0, 1081, 1077, 1, 0, 0, 0, 1081, 1078, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 1085, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1119, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1086, 1097, 3, 293, 145, 0, 1087, 1096, 8, 0, 0, 0, 1088, 1096, 3, 215, 106, 0, 1089, 1090, 3, 295, 146, 0, 1090, 1091, 3, 355, 176, 0, 1091, 1096, 1, 0, 0, 0, 1092, 1093, 3, 293, 145, 0, 1093, 1094, 3, 293, 145, 0, 1094, 1096, 1, 0, 0, 0, 1095, 1087, 1, 0, 0, 0, 1095, 1088, 1, 0, 0, 0, 1095, 1089, 1, 0, 0, 0, 1095, 1092, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1101, 3, 293, 145, 0, 1101, 1119, 1, 0, 0, 0, 1102, 1113, 3, 349, 173, 0, 1103, 1112, 8, 1, 0, 0, 1104, 1112, 3, 215, 106, 0, 1105, 1106, 3, 295, 146, 0, 1106, 1107, 3, 349, 173, 0, 1107, 1112, 1, 0, 0, 0, 1108, 1109, 3, 349, 173, 0, 1109, 1110, 3, 349, 173, 0, 1110, 1112, 1, 0, 0, 0, 1111, 1103, 1, 0, 0, 0, 1111, 1104, 1, 0, 0, 0, 1111, 1105, 1, 0, 0, 0, 1111, 1108, 1, 0, 0, 0, 1112, 1115, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1113, 1, 0, 0, 0, 1116, 1117, 3, 349, 173, 0, 1117, 1119, 1, 0, 0, 0, 1118, 1075, 1, 0, 0, 0, 1118, 1086, 1, 0, 0, 0, 1118, 1102, 1, 0, 0, 0, 1119, 218, 1, 0, 0, 0, 1120, 1121, 3, 225, 111, 0, 1121, 1125, 3, 307, 152, 0, 1122, 1124, 3, 287, 142, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1123, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1130, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1128, 1131, 3, 259, 128, 0, 1129, 1131, 3, 237, 117, 0, 1130, 1128, 1, 0, 0, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1134, 1, 0, 0, 0, 1132, 1135, 3, 345, 171, 0, 1133, 1135, 3, 303, 150, 0, 1134, 1132, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1137, 1, 0, 0, 0, 1136, 1138, 3, 285, 141, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1197, 1, 0, 0, 0, 1141, 1144, 3, 225, 111, 0, 1142, 1145, 3, 259, 128, 0, 1143, 1145, 3, 237, 117, 0, 1144, 1142, 1, 0, 0, 0, 1144, 1143, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1149, 3, 345, 171, 0, 1147, 1149, 3, 303, 150, 0, 1148, 1146, 1, 0, 0, 0, 1148, 1147, 1, 0, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1151, 1, 0, 0, 0, 1150, 1152, 3, 285, 141, 0, 1151, 1150, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1197, 1, 0, 0, 0, 1155, 1156, 3, 223, 110, 0, 1156, 1160, 3, 307, 152, 0, 1157, 1159, 3, 285, 141, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1162, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1163, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1163, 1166, 3, 237, 117, 0, 1164, 1167, 3, 345, 171, 0, 1165, 1167, 3, 303, 150, 0, 1166, 1164, 1, 0, 0, 0, 1166, 1165, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1169, 1, 0, 0, 0, 1168, 1170, 3, 285, 141, 0, 1169, 1168, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1169, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1197, 1, 0, 0, 0, 1173, 1174, 3, 307, 152, 0, 1174, 1175, 3, 223, 110, 0, 1175, 1178, 3, 237, 117, 0, 1176, 1179, 3, 345, 171, 0, 1177, 1179, 3, 303, 150, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1181, 1, 0, 0, 0, 1180, 1182, 3, 285, 141, 0, 1181, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1197, 1, 0, 0, 0, 1185, 1186, 3, 223, 110, 0, 1186, 1189, 3, 237, 117, 0, 1187, 1190, 3, 345, 171, 0, 1188, 1190, 3, 303, 150, 0, 1189, 1187, 1, 0, 0, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1193, 3, 285, 141, 0, 1192, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1192, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1197, 1, 0, 0, 0, 1196, 1120, 1, 0, 0, 0, 1196, 1141, 1, 0, 0, 0, 1196, 1155, 1, 0, 0, 0, 1196, 1173, 1, 0, 0, 0, 1196, 1185, 1, 0, 0, 0, 1197, 220, 1, 0, 0, 0, 1198, 1200, 5, 48, 0, 0, 1199, 1201, 3, 283, 140, 0, 1200, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 222, 1, 0, 0, 0, 1204, 1206, 3, 285, 141, 0, 1205, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1207, 1208, 1, 0, 0, 0, 1208, 224, 1, 0, 0, 0, 1209, 1210, 5, 48, 0, 0, 1210, 1212, 3, 275, 136, 0, 1211, 1213, 3, 287, 142, 0, 1212, 1211, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1212, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 226, 1, 0, 0, 0, 1216, 1227, 3, 355, 176, 0, 1217, 1226, 8, 2, 0, 0, 1218, 1226, 3, 215, 106, 0, 1219, 1220, 3, 295, 146, 0, 1220, 1221, 3, 355, 176, 0, 1221, 1226, 1, 0, 0, 0, 1222, 1223, 3, 355, 176, 0, 1223, 1224, 3, 355, 176, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1219, 1, 0, 0, 0, 1225, 1222, 1, 0, 0, 0, 1226, 1229, 1, 0, 0, 0, 1227, 1225, 1, 0, 0, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1230, 1231, 3, 355, 176, 0, 1231, 228, 1, 0, 0, 0, 1232, 1233, 7, 3, 0, 0, 1233, 230, 1, 0, 0, 0, 1234, 1235, 7, 4, 0, 0, 1235, 232, 1, 0, 0, 0, 1236, 1237, 7, 5, 0, 0, 1237, 234, 1, 0, 0, 0, 1238, 1239, 7, 6, 0, 0, 1239, 236, 1, 0, 0, 0, 1240, 1241, 7, 7, 0, 0, 1241, 238, 1, 0, 0, 0, 1242, 1243, 7, 8, 0, 0, 1243, 240, 1, 0, 0, 0, 1244, 1245, 7, 9, 0, 0, 1245, 242, 1, 0, 0, 0, 1246, 1247, 7, 10, 0, 0, 1247, 244, 1, 0, 0, 0, 1248, 1249, 7, 11, 0, 0, 1249, 246, 1, 0, 0, 0, 1250, 1251, 7, 12, 0, 0, 1251, 248, 1, 0, 0, 0, 1252, 1253, 7, 13, 0, 0, 1253, 250, 1, 0, 0, 0, 1254, 1255, 7, 14, 0, 0, 1255, 252, 1, 0, 0, 0, 1256, 1257, 7, 15, 0, 0, 1257, 254, 1, 0, 0, 0, 1258, 1259, 7, 16, 0, 0, 1259, 256, 1, 0, 0, 0, 1260, 1261, 7, 17, 0, 0, 1261, 258, 1, 0, 0, 0, 1262, 1263, 7, 18, 0, 0, 1263, 260, 1, 0, 0, 0, 1264, 1265, 7, 19, 0, 0, 1265, 262, 1, 0, 0, 0, 1266, 1267, 7, 20, 0, 0, 1267, 264, 1, 0, 0, 0, 1268, 1269, 7, 21, 0, 0, 1269, 266, 1, 0, 0, 0, 1270, 1271, 7, 22, 0, 0, 1271, 268, 1, 0, 0, 0, 1272, 1273, 7, 23, 0, 0, 1273, 270, 1, 0, 0, 0, 1274, 1275, 7, 24, 0, 0, 1275, 272, 1, 0, 0, 0, 1276, 1277, 7, 25, 0, 0, 1277, 274, 1, 0, 0, 0, 1278, 1279, 7, 26, 0, 0, 1279, 276, 1, 0, 0, 0, 1280, 1281, 7, 27, 0, 0, 1281, 278, 1, 0, 0, 0, 1282, 1283, 7, 28, 0, 0, 1283, 280, 1, 0, 0, 0, 1284, 1285, 7, 29, 0, 0, 1285, 282, 1, 0, 0, 0, 1286, 1287, 7, 30, 0, 0, 1287, 284, 1, 0, 0, 0, 1288, 1289, 7, 31, 0, 0, 1289, 286, 1, 0, 0, 0, 1290, 1291, 7, 32, 0, 0, 1291, 288, 1, 0, 0, 0, 1292, 1293, 5, 45, 0, 0, 1293, 1294, 5, 62, 0, 0, 1294, 290, 1, 0, 0, 0, 1295, 1296, 5, 42, 0, 0, 1296, 292, 1, 0, 0, 0, 1297, 1298, 5, 96, 0, 0, 1298, 294, 1, 0, 0, 0, 1299, 1300, 5, 92, 0, 0, 1300, 296, 1, 0, 0, 0, 1301, 1302, 5, 58, 0, 0, 1302, 298, 1, 0, 0, 0, 1303, 1304, 5, 44, 0, 0, 1304, 300, 1, 0, 0, 0, 1305, 1306, 5, 124, 0, 0, 1306, 1307, 5, 124, 0, 0, 1307, 302, 1, 0, 0, 0, 1308, 1309, 5, 45, 0, 0, 1309, 304, 1, 0, 0, 0, 1310, 1311, 5, 36, 0, 0, 1311, 306, 1, 0, 0, 0, 1312, 1313, 5, 46, 0, 0, 1313, 308, 1, 0, 0, 0, 1314, 1315, 5, 61, 0, 0, 1315, 1316, 5, 61, 0, 0, 1316, 310, 1, 0, 0, 0, 1317, 1318, 5, 61, 0, 0, 1318, 312, 1, 0, 0, 0, 1319, 1320, 5, 62, 0, 0, 1320, 1321, 5, 61, 0, 0, 1321, 314, 1, 0, 0, 0, 1322, 1323, 5, 62, 0, 0, 1323, 316, 1, 0, 0, 0, 1324, 1325, 5, 35, 0, 0, 1325, 318, 1, 0, 0, 0, 1326, 1327, 5, 126, 0, 0, 1327, 1328, 5, 42, 0, 0, 1328, 320, 1, 0, 0, 0, 1329, 1330, 5, 61, 0, 0, 1330, 1331, 5, 126, 0, 0, 1331, 1332, 5, 42, 0, 0, 1332, 322, 1, 0, 0, 0, 1333, 1334, 5, 123, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 6, 160, 0, 0, 1336, 324, 1, 0, 0, 0, 1337, 1338, 5, 91, 0, 0, 1338, 326, 1, 0, 0, 0, 1339, 1340, 5, 40, 0, 0, 1340, 328, 1, 0, 0, 0, 1341, 1342, 5, 60, 0, 0, 1342, 1343, 5, 61, 0, 0, 1343, 330, 1, 0, 0, 0, 1344, 1345, 5, 60, 0, 0, 1345, 332, 1, 0, 0, 0, 1346, 1347, 5, 33, 0, 0, 1347, 1351, 5, 61, 0, 0, 1348, 1349, 5, 60, 0, 0, 1349, 1351, 5, 62, 0, 0, 1350, 1346, 1, 0, 0, 0, 1350, 1348, 1, 0, 0, 0, 1351, 334, 1, 0, 0, 0, 1352, 1353, 5, 33, 0, 0, 1353, 1354, 5, 126, 0, 0, 1354, 1355, 5, 42, 0, 0, 1355, 336, 1, 0, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 1358, 5, 126, 0, 0, 1358, 338, 1, 0, 0, 0, 1359, 1360, 5, 63, 0, 0, 1360, 1361, 5, 46, 0, 0, 1361, 340, 1, 0, 0, 0, 1362, 1363, 5, 63, 0, 0, 1363, 1364, 5, 63, 0, 0, 1364, 342, 1, 0, 0, 0, 1365, 1366, 5, 37, 0, 0, 1366, 344, 1, 0, 0, 0, 1367, 1368, 5, 43, 0, 0, 1368, 346, 1, 0, 0, 0, 1369, 1370, 5, 63, 0, 0, 1370, 348, 1, 0, 0, 0, 1371, 1372, 5, 34, 0, 0, 1372, 350, 1, 0, 0, 0, 1373, 1374, 5, 102, 0, 0, 1374, 1375, 5, 39, 0, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 174, 1, 0, 1377, 352, 1, 0, 0, 0, 1378, 1379, 5, 70, 0, 0, 1379, 1380, 5, 39, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 175, 2, 0, 1382, 354, 1, 0, 0, 0, 1383, 1384, 5, 39, 0, 0, 1384, 356, 1, 0, 0, 0, 1385, 1386, 5, 126, 0, 0, 1386, 358, 1, 0, 0, 0, 1387, 1388, 5, 61, 0, 0, 1388, 1389, 5, 126, 0, 0, 1389, 360, 1, 0, 0, 0, 1390, 1391, 5, 125, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 179, 3, 0, 1393, 362, 1, 0, 0, 0, 1394, 1395, 5, 93, 0, 0, 1395, 364, 1, 0, 0, 0, 1396, 1397, 5, 41, 0, 0, 1397, 366, 1, 0, 0, 0, 1398, 1399, 5, 59, 0, 0, 1399, 368, 1, 0, 0, 0, 1400, 1401, 5, 47, 0, 0, 1401, 370, 1, 0, 0, 0, 1402, 1403, 5, 95, 0, 0, 1403, 372, 1, 0, 0, 0, 1404, 1405, 5, 47, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1410, 1, 0, 0, 0, 1407, 1409, 9, 0, 0, 0, 1408, 1407, 1, 0, 0, 0, 1409, 1412, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1413, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1413, 1414, 5, 42, 0, 0, 1414, 1415, 5, 47, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 4, 0, 1417, 374, 1, 0, 0, 0, 1418, 1419, 5, 45, 0, 0, 1419, 1423, 5, 45, 0, 0, 1420, 1421, 5, 47, 0, 0, 1421, 1423, 5, 47, 0, 0, 1422, 1418, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1427, 1, 0, 0, 0, 1424, 1426, 8, 33, 0, 0, 1425, 1424, 1, 0, 0, 0, 1426, 1429, 1, 0, 0, 0, 1427, 1425, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1430, 1432, 7, 34, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 6, 186, 4, 0, 1434, 376, 1, 0, 0, 0, 1435, 1436, 7, 35, 0, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1438, 6, 187, 5, 0, 1438, 378, 1, 0, 0, 0, 1439, 1451, 8, 36, 0, 0, 1440, 1451, 3, 215, 106, 0, 1441, 1442, 3, 295, 146, 0, 1442, 1443, 3, 355, 176, 0, 1443, 1451, 1, 0, 0, 0, 1444, 1445, 3, 295, 146, 0, 1445, 1446, 3, 323, 160, 0, 1446, 1451, 1, 0, 0, 0, 1447, 1448, 3, 355, 176, 0, 1448, 1449, 3, 355, 176, 0, 1449, 1451, 1, 0, 0, 0, 1450, 1439, 1, 0, 0, 0, 1450, 1440, 1, 0, 0, 0, 1450, 1441, 1, 0, 0, 0, 1450, 1444, 1, 0, 0, 0, 1450, 1447, 1, 0, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1450, 1, 0, 0, 0, 1452, 1453, 1, 0, 0, 0, 1453, 380, 1, 0, 0, 0, 1454, 1455, 3, 323, 160, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1457, 6, 189, 0, 0, 1457, 382, 1, 0, 0, 0, 1458, 1459, 3, 355, 176, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 190, 6, 0, 1461, 1462, 6, 190, 3, 0, 1462, 384, 1, 0, 0, 0, 1463, 1469, 8, 37, 0, 0, 1464, 1469, 3, 215, 106, 0, 1465, 1466, 3, 295, 146, 0, 1466, 1467, 3, 323, 160, 0, 1467, 1469, 1, 0, 0, 0, 1468, 1463, 1, 0, 0, 0, 1468, 1464, 1, 0, 0, 0, 1468, 1465, 1, 0, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1468, 1, 0, 0, 0, 1470, 1471, 1, 0, 0, 0, 1471, 386, 1, 0, 0, 0, 1472, 1473, 3, 323, 160, 0, 1473, 1474, 1, 0, 0, 0, 1474, 1475, 6, 192, 0, 0, 1475, 388, 1, 0, 0, 0, 44, 0, 1, 2, 429, 657, 1041, 1070, 1075, 1081, 1083, 1095, 1097, 1111, 1113, 1118, 1125, 1130, 1134, 1139, 1144, 1148, 1153, 1160, 1166, 1171, 1178, 1183, 1189, 1194, 1196, 1202, 1207, 1214, 1225, 1227, 1350, 1410, 1422, 1427, 1431, 1450, 1452, 1468, 1470, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 147, 0] \ No newline at end of file diff --git a/hogql_parser/HogQLLexer.tokens b/hogql_parser/HogQLLexer.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/hogql_parser/HogQLLexer.tokens +++ b/hogql_parser/HogQLLexer.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/hogql_parser/HogQLParser.cpp b/hogql_parser/HogQLParser.cpp index 4b0766a579cd5..d964e54b51e2c 100644 --- a/hogql_parser/HogQLParser.cpp +++ b/hogql_parser/HogQLParser.cpp @@ -56,16 +56,17 @@ void hogqlparserParserInitialize() { "statement", "returnStmt", "throwStmt", "catchBlock", "tryCatchStmt", "ifStmt", "whileStmt", "forStmt", "forInStmt", "funcStmt", "varAssignment", "exprStmt", "emptyStmt", "block", "kvPair", "kvPairList", "select", - "selectUnionStmt", "selectStmtWithParens", "selectStmt", "withClause", - "topClause", "fromClause", "arrayJoinClause", "windowClause", "prewhereClause", - "whereClause", "groupByClause", "havingClause", "orderByClause", "projectionOrderByClause", - "limitAndOffsetClause", "offsetOnlyClause", "settingsClause", "joinExpr", - "joinOp", "joinOpCross", "joinConstraintClause", "sampleClause", "orderExprList", - "orderExpr", "ratioExpr", "settingExprList", "settingExpr", "windowExpr", - "winPartitionByClause", "winOrderByClause", "winFrameClause", "winFrameExtend", - "winFrameBound", "expr", "columnTypeExpr", "columnExprList", "columnExpr", - "columnLambdaExpr", "hogqlxTagElement", "hogqlxTagAttribute", "withExprList", - "withExpr", "columnIdentifier", "nestedIdentifier", "tableExpr", "tableFunctionExpr", + "selectStmtWithParens", "subsequentSelectSetClause", "selectSetStmt", + "selectStmt", "withClause", "topClause", "fromClause", "arrayJoinClause", + "windowClause", "prewhereClause", "whereClause", "groupByClause", + "havingClause", "orderByClause", "projectionOrderByClause", "limitAndOffsetClause", + "offsetOnlyClause", "settingsClause", "joinExpr", "joinOp", "joinOpCross", + "joinConstraintClause", "sampleClause", "orderExprList", "orderExpr", + "ratioExpr", "settingExprList", "settingExpr", "windowExpr", "winPartitionByClause", + "winOrderByClause", "winFrameClause", "winFrameExtend", "winFrameBound", + "expr", "columnTypeExpr", "columnExprList", "columnExpr", "columnLambdaExpr", + "hogqlxTagElement", "hogqlxTagAttribute", "withExprList", "withExpr", + "columnIdentifier", "nestedIdentifier", "tableExpr", "tableFunctionExpr", "tableIdentifier", "tableArgList", "databaseIdentifier", "floatingLiteral", "numberLiteral", "literal", "interval", "keyword", "keywordForAlias", "alias", "identifier", "enumValue", "placeholder", "string", "templateString", @@ -78,30 +79,30 @@ void hogqlparserParserInitialize() { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", "'\\'", - "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", "'>='", - "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", "'<'", - "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", "'+'", - "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", "'}'", - "']'", "')'", "';'", "'/'", "'_'" + "", "", "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", + "'\\'", "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", + "'>='", "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", + "'<'", "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", + "'+'", "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", + "'}'", "']'", "')'", "';'", "'/'", "'_'" }, std::vector{ "", "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", - "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", - "ILIKE", "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", - "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", "SELECT", - "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", - "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", - "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", - "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", - "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", + "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", + "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", + "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", + "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", + "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", + "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", + "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", @@ -113,7 +114,7 @@ void hogqlparserParserInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,1,160,1303,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, + 4,1,162,1311,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, @@ -125,481 +126,486 @@ void hogqlparserParserInitialize() { 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,1,0,5,0,174,8,0,10,0,12,0,177,9,0,1,0,1,0,1,1,1,1,3,1, - 183,8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,192,8,3,1,4,1,4,1,4,5,4,197,8, - 4,10,4,12,4,200,9,4,1,4,3,4,203,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,3,5,217,8,5,1,6,1,6,3,6,221,8,6,1,6,3,6,224,8,6,1,7,1,7, - 3,7,228,8,7,1,7,3,7,231,8,7,1,8,1,8,1,8,1,8,1,8,3,8,238,8,8,1,8,1,8,3, - 8,242,8,8,1,8,1,8,1,9,1,9,1,9,5,9,249,8,9,10,9,12,9,252,9,9,1,9,1,9,3, - 9,256,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,265,8,10,1,11,1,11, - 1,11,1,11,1,11,1,11,3,11,273,8,11,1,12,1,12,1,12,1,12,1,12,3,12,280,8, - 12,1,12,1,12,3,12,284,8,12,1,12,1,12,1,12,1,12,3,12,290,8,12,1,12,1,12, - 1,12,3,12,295,8,12,1,13,1,13,1,13,1,13,1,13,1,13,3,13,303,8,13,1,13,1, - 13,1,13,1,13,1,13,3,13,310,8,13,1,14,1,14,1,14,1,14,3,14,316,8,14,1,14, - 1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,16,1,16,3,16,328,8,16,1,17,1,17, - 1,18,1,18,5,18,334,8,18,10,18,12,18,337,9,18,1,18,1,18,1,19,1,19,1,19, - 1,19,1,20,1,20,1,20,5,20,348,8,20,10,20,12,20,351,9,20,1,20,3,20,354, - 8,20,1,21,1,21,1,21,3,21,359,8,21,1,21,1,21,1,22,1,22,1,22,1,22,5,22, - 367,8,22,10,22,12,22,370,9,22,1,23,1,23,1,23,1,23,1,23,1,23,3,23,378, - 8,23,1,24,3,24,381,8,24,1,24,1,24,3,24,385,8,24,1,24,3,24,388,8,24,1, - 24,1,24,3,24,392,8,24,1,24,3,24,395,8,24,1,24,3,24,398,8,24,1,24,3,24, - 401,8,24,1,24,3,24,404,8,24,1,24,1,24,3,24,408,8,24,1,24,1,24,3,24,412, - 8,24,1,24,3,24,415,8,24,1,24,3,24,418,8,24,1,24,3,24,421,8,24,1,24,1, - 24,3,24,425,8,24,1,24,3,24,428,8,24,1,25,1,25,1,25,1,26,1,26,1,26,1,26, - 3,26,437,8,26,1,27,1,27,1,27,1,28,3,28,443,8,28,1,28,1,28,1,28,1,28,1, - 29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,462, - 8,29,10,29,12,29,465,9,29,1,30,1,30,1,30,1,31,1,31,1,31,1,32,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,3,32,481,8,32,1,33,1,33,1,33,1,34,1,34,1,34, - 1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,3,36,498,8,36,1,36,1,36, - 1,36,1,36,3,36,504,8,36,1,36,1,36,1,36,1,36,3,36,510,8,36,1,36,1,36,1, - 36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,521,8,36,3,36,523,8,36,1,37,1,37, - 1,37,1,38,1,38,1,38,1,39,1,39,1,39,3,39,534,8,39,1,39,3,39,537,8,39,1, - 39,1,39,1,39,1,39,3,39,543,8,39,1,39,1,39,1,39,1,39,1,39,1,39,3,39,551, - 8,39,1,39,1,39,1,39,1,39,5,39,557,8,39,10,39,12,39,560,9,39,1,40,3,40, - 563,8,40,1,40,1,40,1,40,3,40,568,8,40,1,40,3,40,571,8,40,1,40,3,40,574, - 8,40,1,40,1,40,3,40,578,8,40,1,40,1,40,3,40,582,8,40,1,40,3,40,585,8, - 40,3,40,587,8,40,1,40,3,40,590,8,40,1,40,1,40,3,40,594,8,40,1,40,1,40, - 3,40,598,8,40,1,40,3,40,601,8,40,3,40,603,8,40,3,40,605,8,40,1,41,1,41, - 1,41,3,41,610,8,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42, - 621,8,42,1,43,1,43,1,43,1,43,3,43,627,8,43,1,44,1,44,1,44,5,44,632,8, - 44,10,44,12,44,635,9,44,1,45,1,45,3,45,639,8,45,1,45,1,45,3,45,643,8, - 45,1,45,1,45,3,45,647,8,45,1,46,1,46,1,46,1,46,3,46,653,8,46,3,46,655, - 8,46,1,47,1,47,1,47,5,47,660,8,47,10,47,12,47,663,9,47,1,48,1,48,1,48, - 1,48,1,49,3,49,670,8,49,1,49,3,49,673,8,49,1,49,3,49,676,8,49,1,50,1, - 50,1,50,1,50,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1, - 53,1,53,3,53,695,8,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1, - 54,1,54,1,54,3,54,709,8,54,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1, - 56,1,56,1,56,1,56,5,56,723,8,56,10,56,12,56,726,9,56,1,56,3,56,729,8, - 56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,738,8,56,10,56,12,56,741,9, - 56,1,56,3,56,744,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,753,8,56, - 10,56,12,56,756,9,56,1,56,3,56,759,8,56,1,56,1,56,1,56,1,56,1,56,3,56, - 766,8,56,1,56,1,56,3,56,770,8,56,1,57,1,57,1,57,5,57,775,8,57,10,57,12, - 57,778,9,57,1,57,3,57,781,8,57,1,58,1,58,1,58,3,58,786,8,58,1,58,1,58, - 1,58,1,58,1,58,4,58,793,8,58,11,58,12,58,794,1,58,1,58,3,58,799,8,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,823,8,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,840, - 8,58,1,58,1,58,1,58,1,58,3,58,846,8,58,1,58,3,58,849,8,58,1,58,3,58,852, - 8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,862,8,58,1,58,1,58, - 1,58,1,58,3,58,868,8,58,1,58,3,58,871,8,58,1,58,3,58,874,8,58,1,58,1, - 58,1,58,1,58,1,58,1,58,3,58,882,8,58,1,58,3,58,885,8,58,1,58,1,58,3,58, - 889,8,58,1,58,3,58,892,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,1,58,1,58,1,58,3,58,906,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,923,8,58,1,58,1,58,1,58,3, - 58,928,8,58,1,58,1,58,1,58,3,58,933,8,58,1,58,1,58,1,58,1,58,3,58,939, - 8,58,1,58,1,58,1,58,1,58,1,58,3,58,946,8,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,3,58,958,8,58,1,58,1,58,3,58,962,8,58,1,58,3, - 58,965,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,974,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,988,8,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58, - 1004,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,3,58,1033,8,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,1041,8,58,5,58, - 1043,8,58,10,58,12,58,1046,9,58,1,59,1,59,1,59,1,59,5,59,1052,8,59,10, - 59,12,59,1055,9,59,1,59,3,59,1058,8,59,1,59,1,59,1,59,1,59,1,59,5,59, - 1065,8,59,10,59,12,59,1068,9,59,1,59,3,59,1071,8,59,1,59,1,59,3,59,1075, - 8,59,1,59,1,59,1,59,3,59,1080,8,59,1,60,1,60,1,60,5,60,1085,8,60,10,60, - 12,60,1088,9,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,1096,8,60,10,60,12, - 60,1099,9,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1107,8,60,1,60,1,60,1, - 60,1,60,1,60,3,60,1114,8,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1, - 61,1,61,1,61,3,61,1127,8,61,1,62,1,62,1,62,5,62,1132,8,62,10,62,12,62, - 1135,9,62,1,62,3,62,1138,8,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,63,3,63,1150,8,63,1,64,1,64,1,64,1,64,3,64,1156,8,64,1,64,3,64, - 1159,8,64,1,65,1,65,1,65,5,65,1164,8,65,10,65,12,65,1167,9,65,1,66,1, - 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1178,8,66,1,66,1,66,1,66,1, - 66,3,66,1184,8,66,5,66,1186,8,66,10,66,12,66,1189,9,66,1,67,1,67,1,67, - 3,67,1194,8,67,1,67,1,67,1,68,1,68,1,68,3,68,1201,8,68,1,68,1,68,1,69, - 1,69,1,69,5,69,1208,8,69,10,69,12,69,1211,9,69,1,69,3,69,1214,8,69,1, - 70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1224,8,71,3,71,1226,8,71,1, - 72,3,72,1229,8,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1237,8,72,1,73,1, - 73,1,73,3,73,1242,8,73,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,3,77,1252, - 8,77,1,78,1,78,1,78,3,78,1257,8,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80, - 1,80,1,81,1,81,3,81,1269,8,81,1,82,1,82,5,82,1273,8,82,10,82,12,82,1276, - 9,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,3,83,1285,8,83,1,84,1,84,5,84, - 1289,8,84,10,84,12,84,1292,9,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,3, - 85,1301,8,85,1,85,0,3,78,116,132,86,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,0,17,2,0,31,31,36,36,2,0, - 18,18,75,75,2,0,45,45,52,52,3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,81,81,2,0, - 52,52,74,74,2,0,1,1,4,4,2,0,7,7,22,23,2,0,30,30,50,50,2,0,72,72,77,77, - 3,0,10,10,51,51,91,91,2,0,42,42,54,54,1,0,108,109,2,0,119,119,140,140, - 7,0,21,21,39,39,56,57,71,71,79,79,98,98,104,104,17,0,1,13,15,20,22,28, - 30,30,32,35,37,38,40,43,45,52,54,55,59,59,61,70,72,78,80,84,86,93,95, - 97,99,100,102,103,4,0,20,20,30,30,40,40,49,49,1475,0,175,1,0,0,0,2,182, - 1,0,0,0,4,184,1,0,0,0,6,186,1,0,0,0,8,193,1,0,0,0,10,216,1,0,0,0,12,218, - 1,0,0,0,14,225,1,0,0,0,16,232,1,0,0,0,18,245,1,0,0,0,20,257,1,0,0,0,22, - 266,1,0,0,0,24,274,1,0,0,0,26,296,1,0,0,0,28,311,1,0,0,0,30,320,1,0,0, - 0,32,325,1,0,0,0,34,329,1,0,0,0,36,331,1,0,0,0,38,340,1,0,0,0,40,344, - 1,0,0,0,42,358,1,0,0,0,44,362,1,0,0,0,46,377,1,0,0,0,48,380,1,0,0,0,50, - 429,1,0,0,0,52,432,1,0,0,0,54,438,1,0,0,0,56,442,1,0,0,0,58,448,1,0,0, - 0,60,466,1,0,0,0,62,469,1,0,0,0,64,472,1,0,0,0,66,482,1,0,0,0,68,485, - 1,0,0,0,70,489,1,0,0,0,72,522,1,0,0,0,74,524,1,0,0,0,76,527,1,0,0,0,78, - 542,1,0,0,0,80,604,1,0,0,0,82,609,1,0,0,0,84,620,1,0,0,0,86,622,1,0,0, - 0,88,628,1,0,0,0,90,636,1,0,0,0,92,654,1,0,0,0,94,656,1,0,0,0,96,664, - 1,0,0,0,98,669,1,0,0,0,100,677,1,0,0,0,102,681,1,0,0,0,104,685,1,0,0, - 0,106,694,1,0,0,0,108,708,1,0,0,0,110,710,1,0,0,0,112,769,1,0,0,0,114, - 771,1,0,0,0,116,932,1,0,0,0,118,1074,1,0,0,0,120,1113,1,0,0,0,122,1126, - 1,0,0,0,124,1128,1,0,0,0,126,1149,1,0,0,0,128,1158,1,0,0,0,130,1160,1, - 0,0,0,132,1177,1,0,0,0,134,1190,1,0,0,0,136,1200,1,0,0,0,138,1204,1,0, - 0,0,140,1215,1,0,0,0,142,1225,1,0,0,0,144,1228,1,0,0,0,146,1241,1,0,0, - 0,148,1243,1,0,0,0,150,1245,1,0,0,0,152,1247,1,0,0,0,154,1251,1,0,0,0, - 156,1256,1,0,0,0,158,1258,1,0,0,0,160,1262,1,0,0,0,162,1268,1,0,0,0,164, - 1270,1,0,0,0,166,1284,1,0,0,0,168,1286,1,0,0,0,170,1300,1,0,0,0,172,174, - 3,2,1,0,173,172,1,0,0,0,174,177,1,0,0,0,175,173,1,0,0,0,175,176,1,0,0, - 0,176,178,1,0,0,0,177,175,1,0,0,0,178,179,5,0,0,1,179,1,1,0,0,0,180,183, - 3,6,3,0,181,183,3,10,5,0,182,180,1,0,0,0,182,181,1,0,0,0,183,3,1,0,0, - 0,184,185,3,116,58,0,185,5,1,0,0,0,186,187,5,53,0,0,187,191,3,156,78, - 0,188,189,5,116,0,0,189,190,5,123,0,0,190,192,3,4,2,0,191,188,1,0,0,0, - 191,192,1,0,0,0,192,7,1,0,0,0,193,198,3,156,78,0,194,195,5,117,0,0,195, - 197,3,156,78,0,196,194,1,0,0,0,197,200,1,0,0,0,198,196,1,0,0,0,198,199, - 1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,201,203,5,117,0,0,202,201,1,0, - 0,0,202,203,1,0,0,0,203,9,1,0,0,0,204,217,3,12,6,0,205,217,3,14,7,0,206, - 217,3,18,9,0,207,217,3,20,10,0,208,217,3,22,11,0,209,217,3,26,13,0,210, - 217,3,24,12,0,211,217,3,28,14,0,212,217,3,30,15,0,213,217,3,36,18,0,214, - 217,3,32,16,0,215,217,3,34,17,0,216,204,1,0,0,0,216,205,1,0,0,0,216,206, - 1,0,0,0,216,207,1,0,0,0,216,208,1,0,0,0,216,209,1,0,0,0,216,210,1,0,0, - 0,216,211,1,0,0,0,216,212,1,0,0,0,216,213,1,0,0,0,216,214,1,0,0,0,216, - 215,1,0,0,0,217,11,1,0,0,0,218,220,5,73,0,0,219,221,3,4,2,0,220,219,1, - 0,0,0,220,221,1,0,0,0,221,223,1,0,0,0,222,224,5,151,0,0,223,222,1,0,0, - 0,223,224,1,0,0,0,224,13,1,0,0,0,225,227,5,85,0,0,226,228,3,4,2,0,227, - 226,1,0,0,0,227,228,1,0,0,0,228,230,1,0,0,0,229,231,5,151,0,0,230,229, - 1,0,0,0,230,231,1,0,0,0,231,15,1,0,0,0,232,241,5,14,0,0,233,234,5,131, - 0,0,234,237,3,156,78,0,235,236,5,116,0,0,236,238,3,156,78,0,237,235,1, - 0,0,0,237,238,1,0,0,0,238,239,1,0,0,0,239,240,5,150,0,0,240,242,1,0,0, - 0,241,233,1,0,0,0,241,242,1,0,0,0,242,243,1,0,0,0,243,244,3,36,18,0,244, - 17,1,0,0,0,245,246,5,94,0,0,246,250,3,36,18,0,247,249,3,16,8,0,248,247, - 1,0,0,0,249,252,1,0,0,0,250,248,1,0,0,0,250,251,1,0,0,0,251,255,1,0,0, - 0,252,250,1,0,0,0,253,254,5,29,0,0,254,256,3,36,18,0,255,253,1,0,0,0, - 255,256,1,0,0,0,256,19,1,0,0,0,257,258,5,41,0,0,258,259,5,131,0,0,259, - 260,3,4,2,0,260,261,5,150,0,0,261,264,3,10,5,0,262,263,5,25,0,0,263,265, - 3,10,5,0,264,262,1,0,0,0,264,265,1,0,0,0,265,21,1,0,0,0,266,267,5,101, - 0,0,267,268,5,131,0,0,268,269,3,4,2,0,269,270,5,150,0,0,270,272,3,10, - 5,0,271,273,5,151,0,0,272,271,1,0,0,0,272,273,1,0,0,0,273,23,1,0,0,0, - 274,275,5,33,0,0,275,279,5,131,0,0,276,280,3,6,3,0,277,280,3,30,15,0, - 278,280,3,4,2,0,279,276,1,0,0,0,279,277,1,0,0,0,279,278,1,0,0,0,279,280, - 1,0,0,0,280,281,1,0,0,0,281,283,5,151,0,0,282,284,3,4,2,0,283,282,1,0, - 0,0,283,284,1,0,0,0,284,285,1,0,0,0,285,289,5,151,0,0,286,290,3,6,3,0, - 287,290,3,30,15,0,288,290,3,4,2,0,289,286,1,0,0,0,289,287,1,0,0,0,289, - 288,1,0,0,0,289,290,1,0,0,0,290,291,1,0,0,0,291,292,5,150,0,0,292,294, - 3,10,5,0,293,295,5,151,0,0,294,293,1,0,0,0,294,295,1,0,0,0,295,25,1,0, - 0,0,296,297,5,33,0,0,297,298,5,131,0,0,298,299,5,53,0,0,299,302,3,156, - 78,0,300,301,5,117,0,0,301,303,3,156,78,0,302,300,1,0,0,0,302,303,1,0, - 0,0,303,304,1,0,0,0,304,305,5,43,0,0,305,306,3,4,2,0,306,307,5,150,0, - 0,307,309,3,10,5,0,308,310,5,151,0,0,309,308,1,0,0,0,309,310,1,0,0,0, - 310,27,1,0,0,0,311,312,7,0,0,0,312,313,3,156,78,0,313,315,5,131,0,0,314, - 316,3,8,4,0,315,314,1,0,0,0,315,316,1,0,0,0,316,317,1,0,0,0,317,318,5, - 150,0,0,318,319,3,36,18,0,319,29,1,0,0,0,320,321,3,4,2,0,321,322,5,116, - 0,0,322,323,5,123,0,0,323,324,3,4,2,0,324,31,1,0,0,0,325,327,3,4,2,0, - 326,328,5,151,0,0,327,326,1,0,0,0,327,328,1,0,0,0,328,33,1,0,0,0,329, - 330,5,151,0,0,330,35,1,0,0,0,331,335,5,129,0,0,332,334,3,2,1,0,333,332, - 1,0,0,0,334,337,1,0,0,0,335,333,1,0,0,0,335,336,1,0,0,0,336,338,1,0,0, - 0,337,335,1,0,0,0,338,339,5,148,0,0,339,37,1,0,0,0,340,341,3,4,2,0,341, - 342,5,116,0,0,342,343,3,4,2,0,343,39,1,0,0,0,344,349,3,38,19,0,345,346, - 5,117,0,0,346,348,3,38,19,0,347,345,1,0,0,0,348,351,1,0,0,0,349,347,1, - 0,0,0,349,350,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,352,354,5,117,0, - 0,353,352,1,0,0,0,353,354,1,0,0,0,354,41,1,0,0,0,355,359,3,44,22,0,356, - 359,3,48,24,0,357,359,3,120,60,0,358,355,1,0,0,0,358,356,1,0,0,0,358, - 357,1,0,0,0,359,360,1,0,0,0,360,361,5,0,0,1,361,43,1,0,0,0,362,368,3, - 46,23,0,363,364,5,96,0,0,364,365,5,1,0,0,365,367,3,46,23,0,366,363,1, - 0,0,0,367,370,1,0,0,0,368,366,1,0,0,0,368,369,1,0,0,0,369,45,1,0,0,0, - 370,368,1,0,0,0,371,378,3,48,24,0,372,373,5,131,0,0,373,374,3,44,22,0, - 374,375,5,150,0,0,375,378,1,0,0,0,376,378,3,160,80,0,377,371,1,0,0,0, - 377,372,1,0,0,0,377,376,1,0,0,0,378,47,1,0,0,0,379,381,3,50,25,0,380, - 379,1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,384,5,80,0,0,383,385, - 5,24,0,0,384,383,1,0,0,0,384,385,1,0,0,0,385,387,1,0,0,0,386,388,3,52, - 26,0,387,386,1,0,0,0,387,388,1,0,0,0,388,389,1,0,0,0,389,391,3,114,57, - 0,390,392,3,54,27,0,391,390,1,0,0,0,391,392,1,0,0,0,392,394,1,0,0,0,393, - 395,3,56,28,0,394,393,1,0,0,0,394,395,1,0,0,0,395,397,1,0,0,0,396,398, - 3,60,30,0,397,396,1,0,0,0,397,398,1,0,0,0,398,400,1,0,0,0,399,401,3,62, - 31,0,400,399,1,0,0,0,400,401,1,0,0,0,401,403,1,0,0,0,402,404,3,64,32, - 0,403,402,1,0,0,0,403,404,1,0,0,0,404,407,1,0,0,0,405,406,5,103,0,0,406, - 408,7,1,0,0,407,405,1,0,0,0,407,408,1,0,0,0,408,411,1,0,0,0,409,410,5, - 103,0,0,410,412,5,90,0,0,411,409,1,0,0,0,411,412,1,0,0,0,412,414,1,0, - 0,0,413,415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,417,1,0,0,0, - 416,418,3,58,29,0,417,416,1,0,0,0,417,418,1,0,0,0,418,420,1,0,0,0,419, - 421,3,68,34,0,420,419,1,0,0,0,420,421,1,0,0,0,421,424,1,0,0,0,422,425, - 3,72,36,0,423,425,3,74,37,0,424,422,1,0,0,0,424,423,1,0,0,0,424,425,1, - 0,0,0,425,427,1,0,0,0,426,428,3,76,38,0,427,426,1,0,0,0,427,428,1,0,0, - 0,428,49,1,0,0,0,429,430,5,103,0,0,430,431,3,124,62,0,431,51,1,0,0,0, - 432,433,5,89,0,0,433,436,5,109,0,0,434,435,5,103,0,0,435,437,5,86,0,0, - 436,434,1,0,0,0,436,437,1,0,0,0,437,53,1,0,0,0,438,439,5,34,0,0,439,440, - 3,78,39,0,440,55,1,0,0,0,441,443,7,2,0,0,442,441,1,0,0,0,442,443,1,0, - 0,0,443,444,1,0,0,0,444,445,5,5,0,0,445,446,5,48,0,0,446,447,3,114,57, - 0,447,57,1,0,0,0,448,449,5,102,0,0,449,450,3,156,78,0,450,451,5,6,0,0, - 451,452,5,131,0,0,452,453,3,98,49,0,453,463,5,150,0,0,454,455,5,117,0, - 0,455,456,3,156,78,0,456,457,5,6,0,0,457,458,5,131,0,0,458,459,3,98,49, - 0,459,460,5,150,0,0,460,462,1,0,0,0,461,454,1,0,0,0,462,465,1,0,0,0,463, - 461,1,0,0,0,463,464,1,0,0,0,464,59,1,0,0,0,465,463,1,0,0,0,466,467,5, - 70,0,0,467,468,3,116,58,0,468,61,1,0,0,0,469,470,5,100,0,0,470,471,3, - 116,58,0,471,63,1,0,0,0,472,473,5,37,0,0,473,480,5,11,0,0,474,475,7,1, - 0,0,475,476,5,131,0,0,476,477,3,114,57,0,477,478,5,150,0,0,478,481,1, - 0,0,0,479,481,3,114,57,0,480,474,1,0,0,0,480,479,1,0,0,0,481,65,1,0,0, - 0,482,483,5,38,0,0,483,484,3,116,58,0,484,67,1,0,0,0,485,486,5,65,0,0, - 486,487,5,11,0,0,487,488,3,88,44,0,488,69,1,0,0,0,489,490,5,65,0,0,490, - 491,5,11,0,0,491,492,3,114,57,0,492,71,1,0,0,0,493,494,5,55,0,0,494,497, - 3,116,58,0,495,496,5,117,0,0,496,498,3,116,58,0,497,495,1,0,0,0,497,498, - 1,0,0,0,498,503,1,0,0,0,499,500,5,103,0,0,500,504,5,86,0,0,501,502,5, - 11,0,0,502,504,3,114,57,0,503,499,1,0,0,0,503,501,1,0,0,0,503,504,1,0, - 0,0,504,523,1,0,0,0,505,506,5,55,0,0,506,509,3,116,58,0,507,508,5,103, - 0,0,508,510,5,86,0,0,509,507,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0, - 511,512,5,62,0,0,512,513,3,116,58,0,513,523,1,0,0,0,514,515,5,55,0,0, - 515,516,3,116,58,0,516,517,5,62,0,0,517,520,3,116,58,0,518,519,5,11,0, - 0,519,521,3,114,57,0,520,518,1,0,0,0,520,521,1,0,0,0,521,523,1,0,0,0, - 522,493,1,0,0,0,522,505,1,0,0,0,522,514,1,0,0,0,523,73,1,0,0,0,524,525, - 5,62,0,0,525,526,3,116,58,0,526,75,1,0,0,0,527,528,5,82,0,0,528,529,3, - 94,47,0,529,77,1,0,0,0,530,531,6,39,-1,0,531,533,3,132,66,0,532,534,5, - 28,0,0,533,532,1,0,0,0,533,534,1,0,0,0,534,536,1,0,0,0,535,537,3,86,43, - 0,536,535,1,0,0,0,536,537,1,0,0,0,537,543,1,0,0,0,538,539,5,131,0,0,539, - 540,3,78,39,0,540,541,5,150,0,0,541,543,1,0,0,0,542,530,1,0,0,0,542,538, - 1,0,0,0,543,558,1,0,0,0,544,545,10,3,0,0,545,546,3,82,41,0,546,547,3, - 78,39,4,547,557,1,0,0,0,548,550,10,4,0,0,549,551,3,80,40,0,550,549,1, - 0,0,0,550,551,1,0,0,0,551,552,1,0,0,0,552,553,5,48,0,0,553,554,3,78,39, - 0,554,555,3,84,42,0,555,557,1,0,0,0,556,544,1,0,0,0,556,548,1,0,0,0,557, - 560,1,0,0,0,558,556,1,0,0,0,558,559,1,0,0,0,559,79,1,0,0,0,560,558,1, - 0,0,0,561,563,7,3,0,0,562,561,1,0,0,0,562,563,1,0,0,0,563,564,1,0,0,0, - 564,571,5,45,0,0,565,567,5,45,0,0,566,568,7,3,0,0,567,566,1,0,0,0,567, - 568,1,0,0,0,568,571,1,0,0,0,569,571,7,3,0,0,570,562,1,0,0,0,570,565,1, - 0,0,0,570,569,1,0,0,0,571,605,1,0,0,0,572,574,7,4,0,0,573,572,1,0,0,0, - 573,574,1,0,0,0,574,575,1,0,0,0,575,577,7,5,0,0,576,578,5,66,0,0,577, - 576,1,0,0,0,577,578,1,0,0,0,578,587,1,0,0,0,579,581,7,5,0,0,580,582,5, - 66,0,0,581,580,1,0,0,0,581,582,1,0,0,0,582,584,1,0,0,0,583,585,7,4,0, - 0,584,583,1,0,0,0,584,585,1,0,0,0,585,587,1,0,0,0,586,573,1,0,0,0,586, - 579,1,0,0,0,587,605,1,0,0,0,588,590,7,6,0,0,589,588,1,0,0,0,589,590,1, - 0,0,0,590,591,1,0,0,0,591,593,5,35,0,0,592,594,5,66,0,0,593,592,1,0,0, - 0,593,594,1,0,0,0,594,603,1,0,0,0,595,597,5,35,0,0,596,598,5,66,0,0,597, - 596,1,0,0,0,597,598,1,0,0,0,598,600,1,0,0,0,599,601,7,6,0,0,600,599,1, - 0,0,0,600,601,1,0,0,0,601,603,1,0,0,0,602,589,1,0,0,0,602,595,1,0,0,0, - 603,605,1,0,0,0,604,570,1,0,0,0,604,586,1,0,0,0,604,602,1,0,0,0,605,81, - 1,0,0,0,606,607,5,17,0,0,607,610,5,48,0,0,608,610,5,117,0,0,609,606,1, - 0,0,0,609,608,1,0,0,0,610,83,1,0,0,0,611,612,5,63,0,0,612,621,3,114,57, - 0,613,614,5,97,0,0,614,615,5,131,0,0,615,616,3,114,57,0,616,617,5,150, - 0,0,617,621,1,0,0,0,618,619,5,97,0,0,619,621,3,114,57,0,620,611,1,0,0, - 0,620,613,1,0,0,0,620,618,1,0,0,0,621,85,1,0,0,0,622,623,5,78,0,0,623, - 626,3,92,46,0,624,625,5,62,0,0,625,627,3,92,46,0,626,624,1,0,0,0,626, - 627,1,0,0,0,627,87,1,0,0,0,628,633,3,90,45,0,629,630,5,117,0,0,630,632, - 3,90,45,0,631,629,1,0,0,0,632,635,1,0,0,0,633,631,1,0,0,0,633,634,1,0, - 0,0,634,89,1,0,0,0,635,633,1,0,0,0,636,638,3,116,58,0,637,639,7,7,0,0, - 638,637,1,0,0,0,638,639,1,0,0,0,639,642,1,0,0,0,640,641,5,61,0,0,641, - 643,7,8,0,0,642,640,1,0,0,0,642,643,1,0,0,0,643,646,1,0,0,0,644,645,5, - 16,0,0,645,647,5,111,0,0,646,644,1,0,0,0,646,647,1,0,0,0,647,91,1,0,0, - 0,648,655,3,160,80,0,649,652,3,144,72,0,650,651,5,152,0,0,651,653,3,144, - 72,0,652,650,1,0,0,0,652,653,1,0,0,0,653,655,1,0,0,0,654,648,1,0,0,0, - 654,649,1,0,0,0,655,93,1,0,0,0,656,661,3,96,48,0,657,658,5,117,0,0,658, - 660,3,96,48,0,659,657,1,0,0,0,660,663,1,0,0,0,661,659,1,0,0,0,661,662, - 1,0,0,0,662,95,1,0,0,0,663,661,1,0,0,0,664,665,3,156,78,0,665,666,5,123, - 0,0,666,667,3,146,73,0,667,97,1,0,0,0,668,670,3,100,50,0,669,668,1,0, - 0,0,669,670,1,0,0,0,670,672,1,0,0,0,671,673,3,102,51,0,672,671,1,0,0, - 0,672,673,1,0,0,0,673,675,1,0,0,0,674,676,3,104,52,0,675,674,1,0,0,0, - 675,676,1,0,0,0,676,99,1,0,0,0,677,678,5,68,0,0,678,679,5,11,0,0,679, - 680,3,114,57,0,680,101,1,0,0,0,681,682,5,65,0,0,682,683,5,11,0,0,683, - 684,3,88,44,0,684,103,1,0,0,0,685,686,7,9,0,0,686,687,3,106,53,0,687, - 105,1,0,0,0,688,695,3,108,54,0,689,690,5,9,0,0,690,691,3,108,54,0,691, - 692,5,2,0,0,692,693,3,108,54,0,693,695,1,0,0,0,694,688,1,0,0,0,694,689, - 1,0,0,0,695,107,1,0,0,0,696,697,5,19,0,0,697,709,5,76,0,0,698,699,5,95, - 0,0,699,709,5,69,0,0,700,701,5,95,0,0,701,709,5,32,0,0,702,703,3,144, - 72,0,703,704,5,69,0,0,704,709,1,0,0,0,705,706,3,144,72,0,706,707,5,32, - 0,0,707,709,1,0,0,0,708,696,1,0,0,0,708,698,1,0,0,0,708,700,1,0,0,0,708, - 702,1,0,0,0,708,705,1,0,0,0,709,109,1,0,0,0,710,711,3,116,58,0,711,712, - 5,0,0,1,712,111,1,0,0,0,713,770,3,156,78,0,714,715,3,156,78,0,715,716, - 5,131,0,0,716,717,3,156,78,0,717,724,3,112,56,0,718,719,5,117,0,0,719, - 720,3,156,78,0,720,721,3,112,56,0,721,723,1,0,0,0,722,718,1,0,0,0,723, - 726,1,0,0,0,724,722,1,0,0,0,724,725,1,0,0,0,725,728,1,0,0,0,726,724,1, - 0,0,0,727,729,5,117,0,0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0, - 0,730,731,5,150,0,0,731,770,1,0,0,0,732,733,3,156,78,0,733,734,5,131, - 0,0,734,739,3,158,79,0,735,736,5,117,0,0,736,738,3,158,79,0,737,735,1, - 0,0,0,738,741,1,0,0,0,739,737,1,0,0,0,739,740,1,0,0,0,740,743,1,0,0,0, - 741,739,1,0,0,0,742,744,5,117,0,0,743,742,1,0,0,0,743,744,1,0,0,0,744, - 745,1,0,0,0,745,746,5,150,0,0,746,770,1,0,0,0,747,748,3,156,78,0,748, - 749,5,131,0,0,749,754,3,112,56,0,750,751,5,117,0,0,751,753,3,112,56,0, - 752,750,1,0,0,0,753,756,1,0,0,0,754,752,1,0,0,0,754,755,1,0,0,0,755,758, - 1,0,0,0,756,754,1,0,0,0,757,759,5,117,0,0,758,757,1,0,0,0,758,759,1,0, - 0,0,759,760,1,0,0,0,760,761,5,150,0,0,761,770,1,0,0,0,762,763,3,156,78, - 0,763,765,5,131,0,0,764,766,3,114,57,0,765,764,1,0,0,0,765,766,1,0,0, - 0,766,767,1,0,0,0,767,768,5,150,0,0,768,770,1,0,0,0,769,713,1,0,0,0,769, - 714,1,0,0,0,769,732,1,0,0,0,769,747,1,0,0,0,769,762,1,0,0,0,770,113,1, - 0,0,0,771,776,3,116,58,0,772,773,5,117,0,0,773,775,3,116,58,0,774,772, - 1,0,0,0,775,778,1,0,0,0,776,774,1,0,0,0,776,777,1,0,0,0,777,780,1,0,0, - 0,778,776,1,0,0,0,779,781,5,117,0,0,780,779,1,0,0,0,780,781,1,0,0,0,781, - 115,1,0,0,0,782,783,6,58,-1,0,783,785,5,12,0,0,784,786,3,116,58,0,785, - 784,1,0,0,0,785,786,1,0,0,0,786,792,1,0,0,0,787,788,5,99,0,0,788,789, - 3,116,58,0,789,790,5,84,0,0,790,791,3,116,58,0,791,793,1,0,0,0,792,787, - 1,0,0,0,793,794,1,0,0,0,794,792,1,0,0,0,794,795,1,0,0,0,795,798,1,0,0, - 0,796,797,5,25,0,0,797,799,3,116,58,0,798,796,1,0,0,0,798,799,1,0,0,0, - 799,800,1,0,0,0,800,801,5,26,0,0,801,933,1,0,0,0,802,803,5,13,0,0,803, - 804,5,131,0,0,804,805,3,116,58,0,805,806,5,6,0,0,806,807,3,112,56,0,807, - 808,5,150,0,0,808,933,1,0,0,0,809,810,5,20,0,0,810,933,5,111,0,0,811, - 812,5,46,0,0,812,813,3,116,58,0,813,814,3,148,74,0,814,933,1,0,0,0,815, - 816,5,83,0,0,816,817,5,131,0,0,817,818,3,116,58,0,818,819,5,34,0,0,819, - 822,3,116,58,0,820,821,5,33,0,0,821,823,3,116,58,0,822,820,1,0,0,0,822, - 823,1,0,0,0,823,824,1,0,0,0,824,825,5,150,0,0,825,933,1,0,0,0,826,827, - 5,87,0,0,827,933,5,111,0,0,828,829,5,92,0,0,829,830,5,131,0,0,830,831, - 7,10,0,0,831,832,3,162,81,0,832,833,5,34,0,0,833,834,3,116,58,0,834,835, - 5,150,0,0,835,933,1,0,0,0,836,837,3,156,78,0,837,839,5,131,0,0,838,840, - 3,114,57,0,839,838,1,0,0,0,839,840,1,0,0,0,840,841,1,0,0,0,841,842,5, - 150,0,0,842,851,1,0,0,0,843,845,5,131,0,0,844,846,5,24,0,0,845,844,1, - 0,0,0,845,846,1,0,0,0,846,848,1,0,0,0,847,849,3,114,57,0,848,847,1,0, - 0,0,848,849,1,0,0,0,849,850,1,0,0,0,850,852,5,150,0,0,851,843,1,0,0,0, - 851,852,1,0,0,0,852,853,1,0,0,0,853,854,5,67,0,0,854,855,5,131,0,0,855, - 856,3,98,49,0,856,857,5,150,0,0,857,933,1,0,0,0,858,859,3,156,78,0,859, - 861,5,131,0,0,860,862,3,114,57,0,861,860,1,0,0,0,861,862,1,0,0,0,862, - 863,1,0,0,0,863,864,5,150,0,0,864,873,1,0,0,0,865,867,5,131,0,0,866,868, - 5,24,0,0,867,866,1,0,0,0,867,868,1,0,0,0,868,870,1,0,0,0,869,871,3,114, - 57,0,870,869,1,0,0,0,870,871,1,0,0,0,871,872,1,0,0,0,872,874,5,150,0, - 0,873,865,1,0,0,0,873,874,1,0,0,0,874,875,1,0,0,0,875,876,5,67,0,0,876, - 877,3,156,78,0,877,933,1,0,0,0,878,884,3,156,78,0,879,881,5,131,0,0,880, - 882,3,114,57,0,881,880,1,0,0,0,881,882,1,0,0,0,882,883,1,0,0,0,883,885, - 5,150,0,0,884,879,1,0,0,0,884,885,1,0,0,0,885,886,1,0,0,0,886,888,5,131, - 0,0,887,889,5,24,0,0,888,887,1,0,0,0,888,889,1,0,0,0,889,891,1,0,0,0, - 890,892,3,114,57,0,891,890,1,0,0,0,891,892,1,0,0,0,892,893,1,0,0,0,893, - 894,5,150,0,0,894,933,1,0,0,0,895,933,3,120,60,0,896,933,3,164,82,0,897, - 933,3,146,73,0,898,899,5,119,0,0,899,933,3,116,58,20,900,901,5,59,0,0, - 901,933,3,116,58,14,902,903,3,136,68,0,903,904,5,121,0,0,904,906,1,0, - 0,0,905,902,1,0,0,0,905,906,1,0,0,0,906,907,1,0,0,0,907,933,5,113,0,0, - 908,909,5,131,0,0,909,910,3,44,22,0,910,911,5,150,0,0,911,933,1,0,0,0, - 912,913,5,131,0,0,913,914,3,116,58,0,914,915,5,150,0,0,915,933,1,0,0, - 0,916,917,5,131,0,0,917,918,3,114,57,0,918,919,5,150,0,0,919,933,1,0, - 0,0,920,922,5,130,0,0,921,923,3,114,57,0,922,921,1,0,0,0,922,923,1,0, - 0,0,923,924,1,0,0,0,924,933,5,149,0,0,925,927,5,129,0,0,926,928,3,40, - 20,0,927,926,1,0,0,0,927,928,1,0,0,0,928,929,1,0,0,0,929,933,5,148,0, - 0,930,933,3,118,59,0,931,933,3,128,64,0,932,782,1,0,0,0,932,802,1,0,0, - 0,932,809,1,0,0,0,932,811,1,0,0,0,932,815,1,0,0,0,932,826,1,0,0,0,932, - 828,1,0,0,0,932,836,1,0,0,0,932,858,1,0,0,0,932,878,1,0,0,0,932,895,1, - 0,0,0,932,896,1,0,0,0,932,897,1,0,0,0,932,898,1,0,0,0,932,900,1,0,0,0, - 932,905,1,0,0,0,932,908,1,0,0,0,932,912,1,0,0,0,932,916,1,0,0,0,932,920, - 1,0,0,0,932,925,1,0,0,0,932,930,1,0,0,0,932,931,1,0,0,0,933,1044,1,0, - 0,0,934,938,10,19,0,0,935,939,5,113,0,0,936,939,5,152,0,0,937,939,5,139, - 0,0,938,935,1,0,0,0,938,936,1,0,0,0,938,937,1,0,0,0,939,940,1,0,0,0,940, - 1043,3,116,58,20,941,945,10,18,0,0,942,946,5,140,0,0,943,946,5,119,0, - 0,944,946,5,118,0,0,945,942,1,0,0,0,945,943,1,0,0,0,945,944,1,0,0,0,946, - 947,1,0,0,0,947,1043,3,116,58,19,948,973,10,17,0,0,949,974,5,122,0,0, - 950,974,5,123,0,0,951,974,5,134,0,0,952,974,5,132,0,0,953,974,5,133,0, - 0,954,974,5,124,0,0,955,974,5,125,0,0,956,958,5,59,0,0,957,956,1,0,0, - 0,957,958,1,0,0,0,958,959,1,0,0,0,959,961,5,43,0,0,960,962,5,15,0,0,961, - 960,1,0,0,0,961,962,1,0,0,0,962,974,1,0,0,0,963,965,5,59,0,0,964,963, - 1,0,0,0,964,965,1,0,0,0,965,966,1,0,0,0,966,974,7,11,0,0,967,974,5,146, - 0,0,968,974,5,147,0,0,969,974,5,136,0,0,970,974,5,127,0,0,971,974,5,128, - 0,0,972,974,5,135,0,0,973,949,1,0,0,0,973,950,1,0,0,0,973,951,1,0,0,0, - 973,952,1,0,0,0,973,953,1,0,0,0,973,954,1,0,0,0,973,955,1,0,0,0,973,957, - 1,0,0,0,973,964,1,0,0,0,973,967,1,0,0,0,973,968,1,0,0,0,973,969,1,0,0, - 0,973,970,1,0,0,0,973,971,1,0,0,0,973,972,1,0,0,0,974,975,1,0,0,0,975, - 1043,3,116,58,18,976,977,10,15,0,0,977,978,5,138,0,0,978,1043,3,116,58, - 16,979,980,10,13,0,0,980,981,5,2,0,0,981,1043,3,116,58,14,982,983,10, - 12,0,0,983,984,5,64,0,0,984,1043,3,116,58,13,985,987,10,11,0,0,986,988, - 5,59,0,0,987,986,1,0,0,0,987,988,1,0,0,0,988,989,1,0,0,0,989,990,5,9, - 0,0,990,991,3,116,58,0,991,992,5,2,0,0,992,993,3,116,58,12,993,1043,1, - 0,0,0,994,995,10,10,0,0,995,996,5,141,0,0,996,997,3,116,58,0,997,998, - 5,116,0,0,998,999,3,116,58,10,999,1043,1,0,0,0,1000,1001,10,30,0,0,1001, - 1003,5,131,0,0,1002,1004,3,114,57,0,1003,1002,1,0,0,0,1003,1004,1,0,0, - 0,1004,1005,1,0,0,0,1005,1043,5,150,0,0,1006,1007,10,26,0,0,1007,1008, - 5,130,0,0,1008,1009,3,116,58,0,1009,1010,5,149,0,0,1010,1043,1,0,0,0, - 1011,1012,10,25,0,0,1012,1013,5,121,0,0,1013,1043,5,109,0,0,1014,1015, - 10,24,0,0,1015,1016,5,121,0,0,1016,1043,3,156,78,0,1017,1018,10,23,0, - 0,1018,1019,5,137,0,0,1019,1020,5,130,0,0,1020,1021,3,116,58,0,1021,1022, - 5,149,0,0,1022,1043,1,0,0,0,1023,1024,10,22,0,0,1024,1025,5,137,0,0,1025, - 1043,5,109,0,0,1026,1027,10,21,0,0,1027,1028,5,137,0,0,1028,1043,3,156, - 78,0,1029,1030,10,16,0,0,1030,1032,5,47,0,0,1031,1033,5,59,0,0,1032,1031, - 1,0,0,0,1032,1033,1,0,0,0,1033,1034,1,0,0,0,1034,1043,5,60,0,0,1035,1040, - 10,9,0,0,1036,1037,5,6,0,0,1037,1041,3,156,78,0,1038,1039,5,6,0,0,1039, - 1041,5,111,0,0,1040,1036,1,0,0,0,1040,1038,1,0,0,0,1041,1043,1,0,0,0, - 1042,934,1,0,0,0,1042,941,1,0,0,0,1042,948,1,0,0,0,1042,976,1,0,0,0,1042, - 979,1,0,0,0,1042,982,1,0,0,0,1042,985,1,0,0,0,1042,994,1,0,0,0,1042,1000, - 1,0,0,0,1042,1006,1,0,0,0,1042,1011,1,0,0,0,1042,1014,1,0,0,0,1042,1017, - 1,0,0,0,1042,1023,1,0,0,0,1042,1026,1,0,0,0,1042,1029,1,0,0,0,1042,1035, - 1,0,0,0,1043,1046,1,0,0,0,1044,1042,1,0,0,0,1044,1045,1,0,0,0,1045,117, - 1,0,0,0,1046,1044,1,0,0,0,1047,1048,5,131,0,0,1048,1053,3,156,78,0,1049, - 1050,5,117,0,0,1050,1052,3,156,78,0,1051,1049,1,0,0,0,1052,1055,1,0,0, - 0,1053,1051,1,0,0,0,1053,1054,1,0,0,0,1054,1057,1,0,0,0,1055,1053,1,0, - 0,0,1056,1058,5,117,0,0,1057,1056,1,0,0,0,1057,1058,1,0,0,0,1058,1059, - 1,0,0,0,1059,1060,5,150,0,0,1060,1075,1,0,0,0,1061,1066,3,156,78,0,1062, - 1063,5,117,0,0,1063,1065,3,156,78,0,1064,1062,1,0,0,0,1065,1068,1,0,0, - 0,1066,1064,1,0,0,0,1066,1067,1,0,0,0,1067,1070,1,0,0,0,1068,1066,1,0, - 0,0,1069,1071,5,117,0,0,1070,1069,1,0,0,0,1070,1071,1,0,0,0,1071,1075, - 1,0,0,0,1072,1073,5,131,0,0,1073,1075,5,150,0,0,1074,1047,1,0,0,0,1074, - 1061,1,0,0,0,1074,1072,1,0,0,0,1075,1076,1,0,0,0,1076,1079,5,112,0,0, - 1077,1080,3,116,58,0,1078,1080,3,36,18,0,1079,1077,1,0,0,0,1079,1078, - 1,0,0,0,1080,119,1,0,0,0,1081,1082,5,133,0,0,1082,1086,3,156,78,0,1083, - 1085,3,122,61,0,1084,1083,1,0,0,0,1085,1088,1,0,0,0,1086,1084,1,0,0,0, - 1086,1087,1,0,0,0,1087,1089,1,0,0,0,1088,1086,1,0,0,0,1089,1090,5,152, - 0,0,1090,1091,5,125,0,0,1091,1114,1,0,0,0,1092,1093,5,133,0,0,1093,1097, - 3,156,78,0,1094,1096,3,122,61,0,1095,1094,1,0,0,0,1096,1099,1,0,0,0,1097, - 1095,1,0,0,0,1097,1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097,1,0,0,0,1100, - 1106,5,125,0,0,1101,1107,3,120,60,0,1102,1103,5,129,0,0,1103,1104,3,116, - 58,0,1104,1105,5,148,0,0,1105,1107,1,0,0,0,1106,1101,1,0,0,0,1106,1102, - 1,0,0,0,1106,1107,1,0,0,0,1107,1108,1,0,0,0,1108,1109,5,133,0,0,1109, - 1110,5,152,0,0,1110,1111,3,156,78,0,1111,1112,5,125,0,0,1112,1114,1,0, - 0,0,1113,1081,1,0,0,0,1113,1092,1,0,0,0,1114,121,1,0,0,0,1115,1116,3, - 156,78,0,1116,1117,5,123,0,0,1117,1118,3,162,81,0,1118,1127,1,0,0,0,1119, - 1120,3,156,78,0,1120,1121,5,123,0,0,1121,1122,5,129,0,0,1122,1123,3,116, - 58,0,1123,1124,5,148,0,0,1124,1127,1,0,0,0,1125,1127,3,156,78,0,1126, - 1115,1,0,0,0,1126,1119,1,0,0,0,1126,1125,1,0,0,0,1127,123,1,0,0,0,1128, - 1133,3,126,63,0,1129,1130,5,117,0,0,1130,1132,3,126,63,0,1131,1129,1, - 0,0,0,1132,1135,1,0,0,0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134,1137, - 1,0,0,0,1135,1133,1,0,0,0,1136,1138,5,117,0,0,1137,1136,1,0,0,0,1137, - 1138,1,0,0,0,1138,125,1,0,0,0,1139,1140,3,156,78,0,1140,1141,5,6,0,0, - 1141,1142,5,131,0,0,1142,1143,3,44,22,0,1143,1144,5,150,0,0,1144,1150, - 1,0,0,0,1145,1146,3,116,58,0,1146,1147,5,6,0,0,1147,1148,3,156,78,0,1148, - 1150,1,0,0,0,1149,1139,1,0,0,0,1149,1145,1,0,0,0,1150,127,1,0,0,0,1151, - 1159,3,160,80,0,1152,1153,3,136,68,0,1153,1154,5,121,0,0,1154,1156,1, - 0,0,0,1155,1152,1,0,0,0,1155,1156,1,0,0,0,1156,1157,1,0,0,0,1157,1159, - 3,130,65,0,1158,1151,1,0,0,0,1158,1155,1,0,0,0,1159,129,1,0,0,0,1160, - 1165,3,156,78,0,1161,1162,5,121,0,0,1162,1164,3,156,78,0,1163,1161,1, - 0,0,0,1164,1167,1,0,0,0,1165,1163,1,0,0,0,1165,1166,1,0,0,0,1166,131, - 1,0,0,0,1167,1165,1,0,0,0,1168,1169,6,66,-1,0,1169,1178,3,136,68,0,1170, - 1178,3,134,67,0,1171,1172,5,131,0,0,1172,1173,3,44,22,0,1173,1174,5,150, - 0,0,1174,1178,1,0,0,0,1175,1178,3,120,60,0,1176,1178,3,160,80,0,1177, - 1168,1,0,0,0,1177,1170,1,0,0,0,1177,1171,1,0,0,0,1177,1175,1,0,0,0,1177, - 1176,1,0,0,0,1178,1187,1,0,0,0,1179,1183,10,3,0,0,1180,1184,3,154,77, - 0,1181,1182,5,6,0,0,1182,1184,3,156,78,0,1183,1180,1,0,0,0,1183,1181, - 1,0,0,0,1184,1186,1,0,0,0,1185,1179,1,0,0,0,1186,1189,1,0,0,0,1187,1185, - 1,0,0,0,1187,1188,1,0,0,0,1188,133,1,0,0,0,1189,1187,1,0,0,0,1190,1191, - 3,156,78,0,1191,1193,5,131,0,0,1192,1194,3,138,69,0,1193,1192,1,0,0,0, - 1193,1194,1,0,0,0,1194,1195,1,0,0,0,1195,1196,5,150,0,0,1196,135,1,0, - 0,0,1197,1198,3,140,70,0,1198,1199,5,121,0,0,1199,1201,1,0,0,0,1200,1197, - 1,0,0,0,1200,1201,1,0,0,0,1201,1202,1,0,0,0,1202,1203,3,156,78,0,1203, - 137,1,0,0,0,1204,1209,3,116,58,0,1205,1206,5,117,0,0,1206,1208,3,116, - 58,0,1207,1205,1,0,0,0,1208,1211,1,0,0,0,1209,1207,1,0,0,0,1209,1210, - 1,0,0,0,1210,1213,1,0,0,0,1211,1209,1,0,0,0,1212,1214,5,117,0,0,1213, - 1212,1,0,0,0,1213,1214,1,0,0,0,1214,139,1,0,0,0,1215,1216,3,156,78,0, - 1216,141,1,0,0,0,1217,1226,5,107,0,0,1218,1219,5,121,0,0,1219,1226,7, - 12,0,0,1220,1221,5,109,0,0,1221,1223,5,121,0,0,1222,1224,7,12,0,0,1223, - 1222,1,0,0,0,1223,1224,1,0,0,0,1224,1226,1,0,0,0,1225,1217,1,0,0,0,1225, - 1218,1,0,0,0,1225,1220,1,0,0,0,1226,143,1,0,0,0,1227,1229,7,13,0,0,1228, - 1227,1,0,0,0,1228,1229,1,0,0,0,1229,1236,1,0,0,0,1230,1237,3,142,71,0, - 1231,1237,5,108,0,0,1232,1237,5,109,0,0,1233,1237,5,110,0,0,1234,1237, - 5,44,0,0,1235,1237,5,58,0,0,1236,1230,1,0,0,0,1236,1231,1,0,0,0,1236, - 1232,1,0,0,0,1236,1233,1,0,0,0,1236,1234,1,0,0,0,1236,1235,1,0,0,0,1237, - 145,1,0,0,0,1238,1242,3,144,72,0,1239,1242,5,111,0,0,1240,1242,5,60,0, - 0,1241,1238,1,0,0,0,1241,1239,1,0,0,0,1241,1240,1,0,0,0,1242,147,1,0, - 0,0,1243,1244,7,14,0,0,1244,149,1,0,0,0,1245,1246,7,15,0,0,1246,151,1, - 0,0,0,1247,1248,7,16,0,0,1248,153,1,0,0,0,1249,1252,5,106,0,0,1250,1252, - 3,152,76,0,1251,1249,1,0,0,0,1251,1250,1,0,0,0,1252,155,1,0,0,0,1253, - 1257,5,106,0,0,1254,1257,3,148,74,0,1255,1257,3,150,75,0,1256,1253,1, - 0,0,0,1256,1254,1,0,0,0,1256,1255,1,0,0,0,1257,157,1,0,0,0,1258,1259, - 3,162,81,0,1259,1260,5,123,0,0,1260,1261,3,144,72,0,1261,159,1,0,0,0, - 1262,1263,5,129,0,0,1263,1264,3,116,58,0,1264,1265,5,148,0,0,1265,161, - 1,0,0,0,1266,1269,5,111,0,0,1267,1269,3,164,82,0,1268,1266,1,0,0,0,1268, - 1267,1,0,0,0,1269,163,1,0,0,0,1270,1274,5,143,0,0,1271,1273,3,166,83, - 0,1272,1271,1,0,0,0,1273,1276,1,0,0,0,1274,1272,1,0,0,0,1274,1275,1,0, - 0,0,1275,1277,1,0,0,0,1276,1274,1,0,0,0,1277,1278,5,145,0,0,1278,165, - 1,0,0,0,1279,1280,5,158,0,0,1280,1281,3,116,58,0,1281,1282,5,148,0,0, - 1282,1285,1,0,0,0,1283,1285,5,157,0,0,1284,1279,1,0,0,0,1284,1283,1,0, - 0,0,1285,167,1,0,0,0,1286,1290,5,144,0,0,1287,1289,3,170,85,0,1288,1287, - 1,0,0,0,1289,1292,1,0,0,0,1290,1288,1,0,0,0,1290,1291,1,0,0,0,1291,1293, - 1,0,0,0,1292,1290,1,0,0,0,1293,1294,5,0,0,1,1294,169,1,0,0,0,1295,1296, - 5,160,0,0,1296,1297,3,116,58,0,1297,1298,5,148,0,0,1298,1301,1,0,0,0, - 1299,1301,5,159,0,0,1300,1295,1,0,0,0,1300,1299,1,0,0,0,1301,171,1,0, - 0,0,167,175,182,191,198,202,216,220,223,227,230,237,241,250,255,264,272, - 279,283,289,294,302,309,315,327,335,349,353,358,368,377,380,384,387,391, - 394,397,400,403,407,411,414,417,420,424,427,436,442,463,480,497,503,509, - 520,522,533,536,542,550,556,558,562,567,570,573,577,581,584,586,589,593, - 597,600,602,604,609,620,626,633,638,642,646,652,654,661,669,672,675,694, - 708,724,728,739,743,754,758,765,769,776,780,785,794,798,822,839,845,848, - 851,861,867,870,873,881,884,888,891,905,922,927,932,938,945,957,961,964, - 973,987,1003,1032,1040,1042,1044,1053,1057,1066,1070,1074,1079,1086,1097, - 1106,1113,1126,1133,1137,1149,1155,1158,1165,1177,1183,1187,1193,1200, - 1209,1213,1223,1225,1228,1236,1241,1251,1256,1268,1274,1284,1290,1300 + 7,84,2,85,7,85,2,86,7,86,1,0,5,0,176,8,0,10,0,12,0,179,9,0,1,0,1,0,1, + 1,1,1,3,1,185,8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,194,8,3,1,4,1,4,1,4, + 5,4,199,8,4,10,4,12,4,202,9,4,1,4,3,4,205,8,4,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,3,5,219,8,5,1,6,1,6,3,6,223,8,6,1,6,3,6,226,8, + 6,1,7,1,7,3,7,230,8,7,1,7,3,7,233,8,7,1,8,1,8,1,8,1,8,1,8,3,8,240,8,8, + 1,8,1,8,3,8,244,8,8,1,8,1,8,1,9,1,9,1,9,5,9,251,8,9,10,9,12,9,254,9,9, + 1,9,1,9,3,9,258,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,267,8,10, + 1,11,1,11,1,11,1,11,1,11,1,11,3,11,275,8,11,1,12,1,12,1,12,1,12,1,12, + 3,12,282,8,12,1,12,1,12,3,12,286,8,12,1,12,1,12,1,12,1,12,3,12,292,8, + 12,1,12,1,12,1,12,3,12,297,8,12,1,13,1,13,1,13,1,13,1,13,1,13,3,13,305, + 8,13,1,13,1,13,1,13,1,13,1,13,3,13,312,8,13,1,14,1,14,1,14,1,14,3,14, + 318,8,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,16,1,16,3,16,330,8, + 16,1,17,1,17,1,18,1,18,5,18,336,8,18,10,18,12,18,339,9,18,1,18,1,18,1, + 19,1,19,1,19,1,19,1,20,1,20,1,20,5,20,350,8,20,10,20,12,20,353,9,20,1, + 20,3,20,356,8,20,1,21,1,21,1,21,3,21,361,8,21,1,21,1,21,1,22,1,22,1,22, + 1,22,1,22,1,22,3,22,371,8,22,1,23,1,23,1,23,1,23,3,23,377,8,23,1,23,1, + 23,1,24,1,24,5,24,383,8,24,10,24,12,24,386,9,24,1,25,3,25,389,8,25,1, + 25,1,25,3,25,393,8,25,1,25,3,25,396,8,25,1,25,1,25,3,25,400,8,25,1,25, + 3,25,403,8,25,1,25,3,25,406,8,25,1,25,3,25,409,8,25,1,25,3,25,412,8,25, + 1,25,1,25,3,25,416,8,25,1,25,1,25,3,25,420,8,25,1,25,3,25,423,8,25,1, + 25,3,25,426,8,25,1,25,3,25,429,8,25,1,25,1,25,3,25,433,8,25,1,25,3,25, + 436,8,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,3,27,445,8,27,1,28,1,28,1, + 28,1,29,3,29,451,8,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1, + 30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,5,30,470,8,30,10,30,12,30,473,9, + 30,1,31,1,31,1,31,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1, + 33,3,33,489,8,33,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1, + 36,1,37,1,37,1,37,1,37,3,37,506,8,37,1,37,1,37,1,37,1,37,3,37,512,8,37, + 1,37,1,37,1,37,1,37,3,37,518,8,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37, + 1,37,1,37,3,37,529,8,37,3,37,531,8,37,1,38,1,38,1,38,1,39,1,39,1,39,1, + 40,1,40,1,40,3,40,542,8,40,1,40,3,40,545,8,40,1,40,1,40,1,40,1,40,3,40, + 551,8,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,559,8,40,1,40,1,40,1,40,1, + 40,5,40,565,8,40,10,40,12,40,568,9,40,1,41,3,41,571,8,41,1,41,1,41,1, + 41,3,41,576,8,41,1,41,3,41,579,8,41,1,41,3,41,582,8,41,1,41,1,41,3,41, + 586,8,41,1,41,1,41,3,41,590,8,41,1,41,3,41,593,8,41,3,41,595,8,41,1,41, + 3,41,598,8,41,1,41,1,41,3,41,602,8,41,1,41,1,41,3,41,606,8,41,1,41,3, + 41,609,8,41,3,41,611,8,41,3,41,613,8,41,1,42,1,42,1,42,3,42,618,8,42, + 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43,629,8,43,1,44,1,44, + 1,44,1,44,3,44,635,8,44,1,45,1,45,1,45,5,45,640,8,45,10,45,12,45,643, + 9,45,1,46,1,46,3,46,647,8,46,1,46,1,46,3,46,651,8,46,1,46,1,46,3,46,655, + 8,46,1,47,1,47,1,47,1,47,3,47,661,8,47,3,47,663,8,47,1,48,1,48,1,48,5, + 48,668,8,48,10,48,12,48,671,9,48,1,49,1,49,1,49,1,49,1,50,3,50,678,8, + 50,1,50,3,50,681,8,50,1,50,3,50,684,8,50,1,51,1,51,1,51,1,51,1,52,1,52, + 1,52,1,52,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,3,54,703,8,54, + 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,3,55,717, + 8,55,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,5,57, + 731,8,57,10,57,12,57,734,9,57,1,57,3,57,737,8,57,1,57,1,57,1,57,1,57, + 1,57,1,57,1,57,5,57,746,8,57,10,57,12,57,749,9,57,1,57,3,57,752,8,57, + 1,57,1,57,1,57,1,57,1,57,1,57,1,57,5,57,761,8,57,10,57,12,57,764,9,57, + 1,57,3,57,767,8,57,1,57,1,57,1,57,1,57,1,57,3,57,774,8,57,1,57,1,57,3, + 57,778,8,57,1,58,1,58,1,58,5,58,783,8,58,10,58,12,58,786,9,58,1,58,3, + 58,789,8,58,1,59,1,59,1,59,3,59,794,8,59,1,59,1,59,1,59,1,59,1,59,4,59, + 801,8,59,11,59,12,59,802,1,59,1,59,3,59,807,8,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,3,59,831,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,848,8,59,1,59,1,59,1,59, + 1,59,3,59,854,8,59,1,59,3,59,857,8,59,1,59,3,59,860,8,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,3,59,870,8,59,1,59,1,59,1,59,1,59,3,59,876, + 8,59,1,59,3,59,879,8,59,1,59,3,59,882,8,59,1,59,1,59,1,59,1,59,1,59,1, + 59,3,59,890,8,59,1,59,3,59,893,8,59,1,59,1,59,3,59,897,8,59,1,59,3,59, + 900,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 3,59,914,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,3,59,931,8,59,1,59,1,59,1,59,3,59,936,8,59,1,59,1, + 59,1,59,3,59,941,8,59,1,59,1,59,1,59,1,59,3,59,947,8,59,1,59,1,59,1,59, + 1,59,1,59,3,59,954,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,3,59,966,8,59,1,59,1,59,3,59,970,8,59,1,59,3,59,973,8,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,3,59,982,8,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,996,8,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1012,8,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1041,8, + 59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1049,8,59,5,59,1051,8,59,10,59, + 12,59,1054,9,59,1,60,1,60,1,60,1,60,5,60,1060,8,60,10,60,12,60,1063,9, + 60,1,60,3,60,1066,8,60,1,60,1,60,1,60,1,60,1,60,5,60,1073,8,60,10,60, + 12,60,1076,9,60,1,60,3,60,1079,8,60,1,60,1,60,3,60,1083,8,60,1,60,1,60, + 1,60,3,60,1088,8,60,1,61,1,61,1,61,5,61,1093,8,61,10,61,12,61,1096,9, + 61,1,61,1,61,1,61,1,61,1,61,1,61,5,61,1104,8,61,10,61,12,61,1107,9,61, + 1,61,1,61,1,61,1,61,1,61,1,61,3,61,1115,8,61,1,61,1,61,1,61,1,61,1,61, + 3,61,1122,8,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 3,62,1135,8,62,1,63,1,63,1,63,5,63,1140,8,63,10,63,12,63,1143,9,63,1, + 63,3,63,1146,8,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3, + 64,1158,8,64,1,65,1,65,1,65,1,65,3,65,1164,8,65,1,65,3,65,1167,8,65,1, + 66,1,66,1,66,5,66,1172,8,66,10,66,12,66,1175,9,66,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,3,67,1186,8,67,1,67,1,67,1,67,1,67,3,67,1192, + 8,67,5,67,1194,8,67,10,67,12,67,1197,9,67,1,68,1,68,1,68,3,68,1202,8, + 68,1,68,1,68,1,69,1,69,1,69,3,69,1209,8,69,1,69,1,69,1,70,1,70,1,70,5, + 70,1216,8,70,10,70,12,70,1219,9,70,1,70,3,70,1222,8,70,1,71,1,71,1,72, + 1,72,1,72,1,72,1,72,1,72,3,72,1232,8,72,3,72,1234,8,72,1,73,3,73,1237, + 8,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1245,8,73,1,74,1,74,1,74,3,74, + 1250,8,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78,1,78,3,78,1260,8,78,1,79, + 1,79,1,79,3,79,1265,8,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82, + 1,82,3,82,1277,8,82,1,83,1,83,5,83,1281,8,83,10,83,12,83,1284,9,83,1, + 83,1,83,1,84,1,84,1,84,1,84,1,84,3,84,1293,8,84,1,85,1,85,5,85,1297,8, + 85,10,85,12,85,1300,9,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,3,86,1309, + 8,86,1,86,0,3,80,118,134,87,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,0,17,2,0,32,32,37,37,2,0,18,18, + 77,77,2,0,46,46,54,54,3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,83,83,2,0,54,54, + 76,76,2,0,1,1,4,4,2,0,7,7,22,23,2,0,31,31,52,52,2,0,74,74,79,79,3,0,10, + 10,53,53,93,93,2,0,43,43,56,56,1,0,110,111,2,0,121,121,142,142,7,0,21, + 21,40,40,58,59,73,73,81,81,100,100,106,106,19,0,1,13,15,20,22,26,28,29, + 31,31,33,36,38,39,41,44,46,46,48,54,56,57,61,61,63,72,74,80,82,86,88, + 95,97,99,101,102,104,105,4,0,20,20,31,31,41,41,51,51,1484,0,177,1,0,0, + 0,2,184,1,0,0,0,4,186,1,0,0,0,6,188,1,0,0,0,8,195,1,0,0,0,10,218,1,0, + 0,0,12,220,1,0,0,0,14,227,1,0,0,0,16,234,1,0,0,0,18,247,1,0,0,0,20,259, + 1,0,0,0,22,268,1,0,0,0,24,276,1,0,0,0,26,298,1,0,0,0,28,313,1,0,0,0,30, + 322,1,0,0,0,32,327,1,0,0,0,34,331,1,0,0,0,36,333,1,0,0,0,38,342,1,0,0, + 0,40,346,1,0,0,0,42,360,1,0,0,0,44,370,1,0,0,0,46,376,1,0,0,0,48,380, + 1,0,0,0,50,388,1,0,0,0,52,437,1,0,0,0,54,440,1,0,0,0,56,446,1,0,0,0,58, + 450,1,0,0,0,60,456,1,0,0,0,62,474,1,0,0,0,64,477,1,0,0,0,66,480,1,0,0, + 0,68,490,1,0,0,0,70,493,1,0,0,0,72,497,1,0,0,0,74,530,1,0,0,0,76,532, + 1,0,0,0,78,535,1,0,0,0,80,550,1,0,0,0,82,612,1,0,0,0,84,617,1,0,0,0,86, + 628,1,0,0,0,88,630,1,0,0,0,90,636,1,0,0,0,92,644,1,0,0,0,94,662,1,0,0, + 0,96,664,1,0,0,0,98,672,1,0,0,0,100,677,1,0,0,0,102,685,1,0,0,0,104,689, + 1,0,0,0,106,693,1,0,0,0,108,702,1,0,0,0,110,716,1,0,0,0,112,718,1,0,0, + 0,114,777,1,0,0,0,116,779,1,0,0,0,118,940,1,0,0,0,120,1082,1,0,0,0,122, + 1121,1,0,0,0,124,1134,1,0,0,0,126,1136,1,0,0,0,128,1157,1,0,0,0,130,1166, + 1,0,0,0,132,1168,1,0,0,0,134,1185,1,0,0,0,136,1198,1,0,0,0,138,1208,1, + 0,0,0,140,1212,1,0,0,0,142,1223,1,0,0,0,144,1233,1,0,0,0,146,1236,1,0, + 0,0,148,1249,1,0,0,0,150,1251,1,0,0,0,152,1253,1,0,0,0,154,1255,1,0,0, + 0,156,1259,1,0,0,0,158,1264,1,0,0,0,160,1266,1,0,0,0,162,1270,1,0,0,0, + 164,1276,1,0,0,0,166,1278,1,0,0,0,168,1292,1,0,0,0,170,1294,1,0,0,0,172, + 1308,1,0,0,0,174,176,3,2,1,0,175,174,1,0,0,0,176,179,1,0,0,0,177,175, + 1,0,0,0,177,178,1,0,0,0,178,180,1,0,0,0,179,177,1,0,0,0,180,181,5,0,0, + 1,181,1,1,0,0,0,182,185,3,6,3,0,183,185,3,10,5,0,184,182,1,0,0,0,184, + 183,1,0,0,0,185,3,1,0,0,0,186,187,3,118,59,0,187,5,1,0,0,0,188,189,5, + 55,0,0,189,193,3,158,79,0,190,191,5,118,0,0,191,192,5,125,0,0,192,194, + 3,4,2,0,193,190,1,0,0,0,193,194,1,0,0,0,194,7,1,0,0,0,195,200,3,158,79, + 0,196,197,5,119,0,0,197,199,3,158,79,0,198,196,1,0,0,0,199,202,1,0,0, + 0,200,198,1,0,0,0,200,201,1,0,0,0,201,204,1,0,0,0,202,200,1,0,0,0,203, + 205,5,119,0,0,204,203,1,0,0,0,204,205,1,0,0,0,205,9,1,0,0,0,206,219,3, + 12,6,0,207,219,3,14,7,0,208,219,3,18,9,0,209,219,3,20,10,0,210,219,3, + 22,11,0,211,219,3,26,13,0,212,219,3,24,12,0,213,219,3,28,14,0,214,219, + 3,30,15,0,215,219,3,36,18,0,216,219,3,32,16,0,217,219,3,34,17,0,218,206, + 1,0,0,0,218,207,1,0,0,0,218,208,1,0,0,0,218,209,1,0,0,0,218,210,1,0,0, + 0,218,211,1,0,0,0,218,212,1,0,0,0,218,213,1,0,0,0,218,214,1,0,0,0,218, + 215,1,0,0,0,218,216,1,0,0,0,218,217,1,0,0,0,219,11,1,0,0,0,220,222,5, + 75,0,0,221,223,3,4,2,0,222,221,1,0,0,0,222,223,1,0,0,0,223,225,1,0,0, + 0,224,226,5,153,0,0,225,224,1,0,0,0,225,226,1,0,0,0,226,13,1,0,0,0,227, + 229,5,87,0,0,228,230,3,4,2,0,229,228,1,0,0,0,229,230,1,0,0,0,230,232, + 1,0,0,0,231,233,5,153,0,0,232,231,1,0,0,0,232,233,1,0,0,0,233,15,1,0, + 0,0,234,243,5,14,0,0,235,236,5,133,0,0,236,239,3,158,79,0,237,238,5,118, + 0,0,238,240,3,158,79,0,239,237,1,0,0,0,239,240,1,0,0,0,240,241,1,0,0, + 0,241,242,5,152,0,0,242,244,1,0,0,0,243,235,1,0,0,0,243,244,1,0,0,0,244, + 245,1,0,0,0,245,246,3,36,18,0,246,17,1,0,0,0,247,248,5,96,0,0,248,252, + 3,36,18,0,249,251,3,16,8,0,250,249,1,0,0,0,251,254,1,0,0,0,252,250,1, + 0,0,0,252,253,1,0,0,0,253,257,1,0,0,0,254,252,1,0,0,0,255,256,5,30,0, + 0,256,258,3,36,18,0,257,255,1,0,0,0,257,258,1,0,0,0,258,19,1,0,0,0,259, + 260,5,42,0,0,260,261,5,133,0,0,261,262,3,4,2,0,262,263,5,152,0,0,263, + 266,3,10,5,0,264,265,5,25,0,0,265,267,3,10,5,0,266,264,1,0,0,0,266,267, + 1,0,0,0,267,21,1,0,0,0,268,269,5,103,0,0,269,270,5,133,0,0,270,271,3, + 4,2,0,271,272,5,152,0,0,272,274,3,10,5,0,273,275,5,153,0,0,274,273,1, + 0,0,0,274,275,1,0,0,0,275,23,1,0,0,0,276,277,5,34,0,0,277,281,5,133,0, + 0,278,282,3,6,3,0,279,282,3,30,15,0,280,282,3,4,2,0,281,278,1,0,0,0,281, + 279,1,0,0,0,281,280,1,0,0,0,281,282,1,0,0,0,282,283,1,0,0,0,283,285,5, + 153,0,0,284,286,3,4,2,0,285,284,1,0,0,0,285,286,1,0,0,0,286,287,1,0,0, + 0,287,291,5,153,0,0,288,292,3,6,3,0,289,292,3,30,15,0,290,292,3,4,2,0, + 291,288,1,0,0,0,291,289,1,0,0,0,291,290,1,0,0,0,291,292,1,0,0,0,292,293, + 1,0,0,0,293,294,5,152,0,0,294,296,3,10,5,0,295,297,5,153,0,0,296,295, + 1,0,0,0,296,297,1,0,0,0,297,25,1,0,0,0,298,299,5,34,0,0,299,300,5,133, + 0,0,300,301,5,55,0,0,301,304,3,158,79,0,302,303,5,119,0,0,303,305,3,158, + 79,0,304,302,1,0,0,0,304,305,1,0,0,0,305,306,1,0,0,0,306,307,5,44,0,0, + 307,308,3,4,2,0,308,309,5,152,0,0,309,311,3,10,5,0,310,312,5,153,0,0, + 311,310,1,0,0,0,311,312,1,0,0,0,312,27,1,0,0,0,313,314,7,0,0,0,314,315, + 3,158,79,0,315,317,5,133,0,0,316,318,3,8,4,0,317,316,1,0,0,0,317,318, + 1,0,0,0,318,319,1,0,0,0,319,320,5,152,0,0,320,321,3,36,18,0,321,29,1, + 0,0,0,322,323,3,4,2,0,323,324,5,118,0,0,324,325,5,125,0,0,325,326,3,4, + 2,0,326,31,1,0,0,0,327,329,3,4,2,0,328,330,5,153,0,0,329,328,1,0,0,0, + 329,330,1,0,0,0,330,33,1,0,0,0,331,332,5,153,0,0,332,35,1,0,0,0,333,337, + 5,131,0,0,334,336,3,2,1,0,335,334,1,0,0,0,336,339,1,0,0,0,337,335,1,0, + 0,0,337,338,1,0,0,0,338,340,1,0,0,0,339,337,1,0,0,0,340,341,5,150,0,0, + 341,37,1,0,0,0,342,343,3,4,2,0,343,344,5,118,0,0,344,345,3,4,2,0,345, + 39,1,0,0,0,346,351,3,38,19,0,347,348,5,119,0,0,348,350,3,38,19,0,349, + 347,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,351,352,1,0,0,0,352,355,1, + 0,0,0,353,351,1,0,0,0,354,356,5,119,0,0,355,354,1,0,0,0,355,356,1,0,0, + 0,356,41,1,0,0,0,357,361,3,48,24,0,358,361,3,50,25,0,359,361,3,122,61, + 0,360,357,1,0,0,0,360,358,1,0,0,0,360,359,1,0,0,0,361,362,1,0,0,0,362, + 363,5,0,0,1,363,43,1,0,0,0,364,371,3,50,25,0,365,366,5,133,0,0,366,367, + 3,48,24,0,367,368,5,152,0,0,368,371,1,0,0,0,369,371,3,162,81,0,370,364, + 1,0,0,0,370,365,1,0,0,0,370,369,1,0,0,0,371,45,1,0,0,0,372,377,5,27,0, + 0,373,374,5,98,0,0,374,377,5,1,0,0,375,377,5,47,0,0,376,372,1,0,0,0,376, + 373,1,0,0,0,376,375,1,0,0,0,377,378,1,0,0,0,378,379,3,44,22,0,379,47, + 1,0,0,0,380,384,3,44,22,0,381,383,3,46,23,0,382,381,1,0,0,0,383,386,1, + 0,0,0,384,382,1,0,0,0,384,385,1,0,0,0,385,49,1,0,0,0,386,384,1,0,0,0, + 387,389,3,52,26,0,388,387,1,0,0,0,388,389,1,0,0,0,389,390,1,0,0,0,390, + 392,5,82,0,0,391,393,5,24,0,0,392,391,1,0,0,0,392,393,1,0,0,0,393,395, + 1,0,0,0,394,396,3,54,27,0,395,394,1,0,0,0,395,396,1,0,0,0,396,397,1,0, + 0,0,397,399,3,116,58,0,398,400,3,56,28,0,399,398,1,0,0,0,399,400,1,0, + 0,0,400,402,1,0,0,0,401,403,3,58,29,0,402,401,1,0,0,0,402,403,1,0,0,0, + 403,405,1,0,0,0,404,406,3,62,31,0,405,404,1,0,0,0,405,406,1,0,0,0,406, + 408,1,0,0,0,407,409,3,64,32,0,408,407,1,0,0,0,408,409,1,0,0,0,409,411, + 1,0,0,0,410,412,3,66,33,0,411,410,1,0,0,0,411,412,1,0,0,0,412,415,1,0, + 0,0,413,414,5,105,0,0,414,416,7,1,0,0,415,413,1,0,0,0,415,416,1,0,0,0, + 416,419,1,0,0,0,417,418,5,105,0,0,418,420,5,92,0,0,419,417,1,0,0,0,419, + 420,1,0,0,0,420,422,1,0,0,0,421,423,3,68,34,0,422,421,1,0,0,0,422,423, + 1,0,0,0,423,425,1,0,0,0,424,426,3,60,30,0,425,424,1,0,0,0,425,426,1,0, + 0,0,426,428,1,0,0,0,427,429,3,70,35,0,428,427,1,0,0,0,428,429,1,0,0,0, + 429,432,1,0,0,0,430,433,3,74,37,0,431,433,3,76,38,0,432,430,1,0,0,0,432, + 431,1,0,0,0,432,433,1,0,0,0,433,435,1,0,0,0,434,436,3,78,39,0,435,434, + 1,0,0,0,435,436,1,0,0,0,436,51,1,0,0,0,437,438,5,105,0,0,438,439,3,126, + 63,0,439,53,1,0,0,0,440,441,5,91,0,0,441,444,5,111,0,0,442,443,5,105, + 0,0,443,445,5,88,0,0,444,442,1,0,0,0,444,445,1,0,0,0,445,55,1,0,0,0,446, + 447,5,35,0,0,447,448,3,80,40,0,448,57,1,0,0,0,449,451,7,2,0,0,450,449, + 1,0,0,0,450,451,1,0,0,0,451,452,1,0,0,0,452,453,5,5,0,0,453,454,5,50, + 0,0,454,455,3,116,58,0,455,59,1,0,0,0,456,457,5,104,0,0,457,458,3,158, + 79,0,458,459,5,6,0,0,459,460,5,133,0,0,460,461,3,100,50,0,461,471,5,152, + 0,0,462,463,5,119,0,0,463,464,3,158,79,0,464,465,5,6,0,0,465,466,5,133, + 0,0,466,467,3,100,50,0,467,468,5,152,0,0,468,470,1,0,0,0,469,462,1,0, + 0,0,470,473,1,0,0,0,471,469,1,0,0,0,471,472,1,0,0,0,472,61,1,0,0,0,473, + 471,1,0,0,0,474,475,5,72,0,0,475,476,3,118,59,0,476,63,1,0,0,0,477,478, + 5,102,0,0,478,479,3,118,59,0,479,65,1,0,0,0,480,481,5,38,0,0,481,488, + 5,11,0,0,482,483,7,1,0,0,483,484,5,133,0,0,484,485,3,116,58,0,485,486, + 5,152,0,0,486,489,1,0,0,0,487,489,3,116,58,0,488,482,1,0,0,0,488,487, + 1,0,0,0,489,67,1,0,0,0,490,491,5,39,0,0,491,492,3,118,59,0,492,69,1,0, + 0,0,493,494,5,67,0,0,494,495,5,11,0,0,495,496,3,90,45,0,496,71,1,0,0, + 0,497,498,5,67,0,0,498,499,5,11,0,0,499,500,3,116,58,0,500,73,1,0,0,0, + 501,502,5,57,0,0,502,505,3,118,59,0,503,504,5,119,0,0,504,506,3,118,59, + 0,505,503,1,0,0,0,505,506,1,0,0,0,506,511,1,0,0,0,507,508,5,105,0,0,508, + 512,5,88,0,0,509,510,5,11,0,0,510,512,3,116,58,0,511,507,1,0,0,0,511, + 509,1,0,0,0,511,512,1,0,0,0,512,531,1,0,0,0,513,514,5,57,0,0,514,517, + 3,118,59,0,515,516,5,105,0,0,516,518,5,88,0,0,517,515,1,0,0,0,517,518, + 1,0,0,0,518,519,1,0,0,0,519,520,5,64,0,0,520,521,3,118,59,0,521,531,1, + 0,0,0,522,523,5,57,0,0,523,524,3,118,59,0,524,525,5,64,0,0,525,528,3, + 118,59,0,526,527,5,11,0,0,527,529,3,116,58,0,528,526,1,0,0,0,528,529, + 1,0,0,0,529,531,1,0,0,0,530,501,1,0,0,0,530,513,1,0,0,0,530,522,1,0,0, + 0,531,75,1,0,0,0,532,533,5,64,0,0,533,534,3,118,59,0,534,77,1,0,0,0,535, + 536,5,84,0,0,536,537,3,96,48,0,537,79,1,0,0,0,538,539,6,40,-1,0,539,541, + 3,134,67,0,540,542,5,29,0,0,541,540,1,0,0,0,541,542,1,0,0,0,542,544,1, + 0,0,0,543,545,3,88,44,0,544,543,1,0,0,0,544,545,1,0,0,0,545,551,1,0,0, + 0,546,547,5,133,0,0,547,548,3,80,40,0,548,549,5,152,0,0,549,551,1,0,0, + 0,550,538,1,0,0,0,550,546,1,0,0,0,551,566,1,0,0,0,552,553,10,3,0,0,553, + 554,3,84,42,0,554,555,3,80,40,4,555,565,1,0,0,0,556,558,10,4,0,0,557, + 559,3,82,41,0,558,557,1,0,0,0,558,559,1,0,0,0,559,560,1,0,0,0,560,561, + 5,50,0,0,561,562,3,80,40,0,562,563,3,86,43,0,563,565,1,0,0,0,564,552, + 1,0,0,0,564,556,1,0,0,0,565,568,1,0,0,0,566,564,1,0,0,0,566,567,1,0,0, + 0,567,81,1,0,0,0,568,566,1,0,0,0,569,571,7,3,0,0,570,569,1,0,0,0,570, + 571,1,0,0,0,571,572,1,0,0,0,572,579,5,46,0,0,573,575,5,46,0,0,574,576, + 7,3,0,0,575,574,1,0,0,0,575,576,1,0,0,0,576,579,1,0,0,0,577,579,7,3,0, + 0,578,570,1,0,0,0,578,573,1,0,0,0,578,577,1,0,0,0,579,613,1,0,0,0,580, + 582,7,4,0,0,581,580,1,0,0,0,581,582,1,0,0,0,582,583,1,0,0,0,583,585,7, + 5,0,0,584,586,5,68,0,0,585,584,1,0,0,0,585,586,1,0,0,0,586,595,1,0,0, + 0,587,589,7,5,0,0,588,590,5,68,0,0,589,588,1,0,0,0,589,590,1,0,0,0,590, + 592,1,0,0,0,591,593,7,4,0,0,592,591,1,0,0,0,592,593,1,0,0,0,593,595,1, + 0,0,0,594,581,1,0,0,0,594,587,1,0,0,0,595,613,1,0,0,0,596,598,7,6,0,0, + 597,596,1,0,0,0,597,598,1,0,0,0,598,599,1,0,0,0,599,601,5,36,0,0,600, + 602,5,68,0,0,601,600,1,0,0,0,601,602,1,0,0,0,602,611,1,0,0,0,603,605, + 5,36,0,0,604,606,5,68,0,0,605,604,1,0,0,0,605,606,1,0,0,0,606,608,1,0, + 0,0,607,609,7,6,0,0,608,607,1,0,0,0,608,609,1,0,0,0,609,611,1,0,0,0,610, + 597,1,0,0,0,610,603,1,0,0,0,611,613,1,0,0,0,612,578,1,0,0,0,612,594,1, + 0,0,0,612,610,1,0,0,0,613,83,1,0,0,0,614,615,5,17,0,0,615,618,5,50,0, + 0,616,618,5,119,0,0,617,614,1,0,0,0,617,616,1,0,0,0,618,85,1,0,0,0,619, + 620,5,65,0,0,620,629,3,116,58,0,621,622,5,99,0,0,622,623,5,133,0,0,623, + 624,3,116,58,0,624,625,5,152,0,0,625,629,1,0,0,0,626,627,5,99,0,0,627, + 629,3,116,58,0,628,619,1,0,0,0,628,621,1,0,0,0,628,626,1,0,0,0,629,87, + 1,0,0,0,630,631,5,80,0,0,631,634,3,94,47,0,632,633,5,64,0,0,633,635,3, + 94,47,0,634,632,1,0,0,0,634,635,1,0,0,0,635,89,1,0,0,0,636,641,3,92,46, + 0,637,638,5,119,0,0,638,640,3,92,46,0,639,637,1,0,0,0,640,643,1,0,0,0, + 641,639,1,0,0,0,641,642,1,0,0,0,642,91,1,0,0,0,643,641,1,0,0,0,644,646, + 3,118,59,0,645,647,7,7,0,0,646,645,1,0,0,0,646,647,1,0,0,0,647,650,1, + 0,0,0,648,649,5,63,0,0,649,651,7,8,0,0,650,648,1,0,0,0,650,651,1,0,0, + 0,651,654,1,0,0,0,652,653,5,16,0,0,653,655,5,113,0,0,654,652,1,0,0,0, + 654,655,1,0,0,0,655,93,1,0,0,0,656,663,3,162,81,0,657,660,3,146,73,0, + 658,659,5,154,0,0,659,661,3,146,73,0,660,658,1,0,0,0,660,661,1,0,0,0, + 661,663,1,0,0,0,662,656,1,0,0,0,662,657,1,0,0,0,663,95,1,0,0,0,664,669, + 3,98,49,0,665,666,5,119,0,0,666,668,3,98,49,0,667,665,1,0,0,0,668,671, + 1,0,0,0,669,667,1,0,0,0,669,670,1,0,0,0,670,97,1,0,0,0,671,669,1,0,0, + 0,672,673,3,158,79,0,673,674,5,125,0,0,674,675,3,148,74,0,675,99,1,0, + 0,0,676,678,3,102,51,0,677,676,1,0,0,0,677,678,1,0,0,0,678,680,1,0,0, + 0,679,681,3,104,52,0,680,679,1,0,0,0,680,681,1,0,0,0,681,683,1,0,0,0, + 682,684,3,106,53,0,683,682,1,0,0,0,683,684,1,0,0,0,684,101,1,0,0,0,685, + 686,5,70,0,0,686,687,5,11,0,0,687,688,3,116,58,0,688,103,1,0,0,0,689, + 690,5,67,0,0,690,691,5,11,0,0,691,692,3,90,45,0,692,105,1,0,0,0,693,694, + 7,9,0,0,694,695,3,108,54,0,695,107,1,0,0,0,696,703,3,110,55,0,697,698, + 5,9,0,0,698,699,3,110,55,0,699,700,5,2,0,0,700,701,3,110,55,0,701,703, + 1,0,0,0,702,696,1,0,0,0,702,697,1,0,0,0,703,109,1,0,0,0,704,705,5,19, + 0,0,705,717,5,78,0,0,706,707,5,97,0,0,707,717,5,71,0,0,708,709,5,97,0, + 0,709,717,5,33,0,0,710,711,3,146,73,0,711,712,5,71,0,0,712,717,1,0,0, + 0,713,714,3,146,73,0,714,715,5,33,0,0,715,717,1,0,0,0,716,704,1,0,0,0, + 716,706,1,0,0,0,716,708,1,0,0,0,716,710,1,0,0,0,716,713,1,0,0,0,717,111, + 1,0,0,0,718,719,3,118,59,0,719,720,5,0,0,1,720,113,1,0,0,0,721,778,3, + 158,79,0,722,723,3,158,79,0,723,724,5,133,0,0,724,725,3,158,79,0,725, + 732,3,114,57,0,726,727,5,119,0,0,727,728,3,158,79,0,728,729,3,114,57, + 0,729,731,1,0,0,0,730,726,1,0,0,0,731,734,1,0,0,0,732,730,1,0,0,0,732, + 733,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,735,737,5,119,0,0,736,735, + 1,0,0,0,736,737,1,0,0,0,737,738,1,0,0,0,738,739,5,152,0,0,739,778,1,0, + 0,0,740,741,3,158,79,0,741,742,5,133,0,0,742,747,3,160,80,0,743,744,5, + 119,0,0,744,746,3,160,80,0,745,743,1,0,0,0,746,749,1,0,0,0,747,745,1, + 0,0,0,747,748,1,0,0,0,748,751,1,0,0,0,749,747,1,0,0,0,750,752,5,119,0, + 0,751,750,1,0,0,0,751,752,1,0,0,0,752,753,1,0,0,0,753,754,5,152,0,0,754, + 778,1,0,0,0,755,756,3,158,79,0,756,757,5,133,0,0,757,762,3,114,57,0,758, + 759,5,119,0,0,759,761,3,114,57,0,760,758,1,0,0,0,761,764,1,0,0,0,762, + 760,1,0,0,0,762,763,1,0,0,0,763,766,1,0,0,0,764,762,1,0,0,0,765,767,5, + 119,0,0,766,765,1,0,0,0,766,767,1,0,0,0,767,768,1,0,0,0,768,769,5,152, + 0,0,769,778,1,0,0,0,770,771,3,158,79,0,771,773,5,133,0,0,772,774,3,116, + 58,0,773,772,1,0,0,0,773,774,1,0,0,0,774,775,1,0,0,0,775,776,5,152,0, + 0,776,778,1,0,0,0,777,721,1,0,0,0,777,722,1,0,0,0,777,740,1,0,0,0,777, + 755,1,0,0,0,777,770,1,0,0,0,778,115,1,0,0,0,779,784,3,118,59,0,780,781, + 5,119,0,0,781,783,3,118,59,0,782,780,1,0,0,0,783,786,1,0,0,0,784,782, + 1,0,0,0,784,785,1,0,0,0,785,788,1,0,0,0,786,784,1,0,0,0,787,789,5,119, + 0,0,788,787,1,0,0,0,788,789,1,0,0,0,789,117,1,0,0,0,790,791,6,59,-1,0, + 791,793,5,12,0,0,792,794,3,118,59,0,793,792,1,0,0,0,793,794,1,0,0,0,794, + 800,1,0,0,0,795,796,5,101,0,0,796,797,3,118,59,0,797,798,5,86,0,0,798, + 799,3,118,59,0,799,801,1,0,0,0,800,795,1,0,0,0,801,802,1,0,0,0,802,800, + 1,0,0,0,802,803,1,0,0,0,803,806,1,0,0,0,804,805,5,25,0,0,805,807,3,118, + 59,0,806,804,1,0,0,0,806,807,1,0,0,0,807,808,1,0,0,0,808,809,5,26,0,0, + 809,941,1,0,0,0,810,811,5,13,0,0,811,812,5,133,0,0,812,813,3,118,59,0, + 813,814,5,6,0,0,814,815,3,114,57,0,815,816,5,152,0,0,816,941,1,0,0,0, + 817,818,5,20,0,0,818,941,5,113,0,0,819,820,5,48,0,0,820,821,3,118,59, + 0,821,822,3,150,75,0,822,941,1,0,0,0,823,824,5,85,0,0,824,825,5,133,0, + 0,825,826,3,118,59,0,826,827,5,35,0,0,827,830,3,118,59,0,828,829,5,34, + 0,0,829,831,3,118,59,0,830,828,1,0,0,0,830,831,1,0,0,0,831,832,1,0,0, + 0,832,833,5,152,0,0,833,941,1,0,0,0,834,835,5,89,0,0,835,941,5,113,0, + 0,836,837,5,94,0,0,837,838,5,133,0,0,838,839,7,10,0,0,839,840,3,164,82, + 0,840,841,5,35,0,0,841,842,3,118,59,0,842,843,5,152,0,0,843,941,1,0,0, + 0,844,845,3,158,79,0,845,847,5,133,0,0,846,848,3,116,58,0,847,846,1,0, + 0,0,847,848,1,0,0,0,848,849,1,0,0,0,849,850,5,152,0,0,850,859,1,0,0,0, + 851,853,5,133,0,0,852,854,5,24,0,0,853,852,1,0,0,0,853,854,1,0,0,0,854, + 856,1,0,0,0,855,857,3,116,58,0,856,855,1,0,0,0,856,857,1,0,0,0,857,858, + 1,0,0,0,858,860,5,152,0,0,859,851,1,0,0,0,859,860,1,0,0,0,860,861,1,0, + 0,0,861,862,5,69,0,0,862,863,5,133,0,0,863,864,3,100,50,0,864,865,5,152, + 0,0,865,941,1,0,0,0,866,867,3,158,79,0,867,869,5,133,0,0,868,870,3,116, + 58,0,869,868,1,0,0,0,869,870,1,0,0,0,870,871,1,0,0,0,871,872,5,152,0, + 0,872,881,1,0,0,0,873,875,5,133,0,0,874,876,5,24,0,0,875,874,1,0,0,0, + 875,876,1,0,0,0,876,878,1,0,0,0,877,879,3,116,58,0,878,877,1,0,0,0,878, + 879,1,0,0,0,879,880,1,0,0,0,880,882,5,152,0,0,881,873,1,0,0,0,881,882, + 1,0,0,0,882,883,1,0,0,0,883,884,5,69,0,0,884,885,3,158,79,0,885,941,1, + 0,0,0,886,892,3,158,79,0,887,889,5,133,0,0,888,890,3,116,58,0,889,888, + 1,0,0,0,889,890,1,0,0,0,890,891,1,0,0,0,891,893,5,152,0,0,892,887,1,0, + 0,0,892,893,1,0,0,0,893,894,1,0,0,0,894,896,5,133,0,0,895,897,5,24,0, + 0,896,895,1,0,0,0,896,897,1,0,0,0,897,899,1,0,0,0,898,900,3,116,58,0, + 899,898,1,0,0,0,899,900,1,0,0,0,900,901,1,0,0,0,901,902,5,152,0,0,902, + 941,1,0,0,0,903,941,3,122,61,0,904,941,3,166,83,0,905,941,3,148,74,0, + 906,907,5,121,0,0,907,941,3,118,59,20,908,909,5,61,0,0,909,941,3,118, + 59,14,910,911,3,138,69,0,911,912,5,123,0,0,912,914,1,0,0,0,913,910,1, + 0,0,0,913,914,1,0,0,0,914,915,1,0,0,0,915,941,5,115,0,0,916,917,5,133, + 0,0,917,918,3,48,24,0,918,919,5,152,0,0,919,941,1,0,0,0,920,921,5,133, + 0,0,921,922,3,118,59,0,922,923,5,152,0,0,923,941,1,0,0,0,924,925,5,133, + 0,0,925,926,3,116,58,0,926,927,5,152,0,0,927,941,1,0,0,0,928,930,5,132, + 0,0,929,931,3,116,58,0,930,929,1,0,0,0,930,931,1,0,0,0,931,932,1,0,0, + 0,932,941,5,151,0,0,933,935,5,131,0,0,934,936,3,40,20,0,935,934,1,0,0, + 0,935,936,1,0,0,0,936,937,1,0,0,0,937,941,5,150,0,0,938,941,3,120,60, + 0,939,941,3,130,65,0,940,790,1,0,0,0,940,810,1,0,0,0,940,817,1,0,0,0, + 940,819,1,0,0,0,940,823,1,0,0,0,940,834,1,0,0,0,940,836,1,0,0,0,940,844, + 1,0,0,0,940,866,1,0,0,0,940,886,1,0,0,0,940,903,1,0,0,0,940,904,1,0,0, + 0,940,905,1,0,0,0,940,906,1,0,0,0,940,908,1,0,0,0,940,913,1,0,0,0,940, + 916,1,0,0,0,940,920,1,0,0,0,940,924,1,0,0,0,940,928,1,0,0,0,940,933,1, + 0,0,0,940,938,1,0,0,0,940,939,1,0,0,0,941,1052,1,0,0,0,942,946,10,19, + 0,0,943,947,5,115,0,0,944,947,5,154,0,0,945,947,5,141,0,0,946,943,1,0, + 0,0,946,944,1,0,0,0,946,945,1,0,0,0,947,948,1,0,0,0,948,1051,3,118,59, + 20,949,953,10,18,0,0,950,954,5,142,0,0,951,954,5,121,0,0,952,954,5,120, + 0,0,953,950,1,0,0,0,953,951,1,0,0,0,953,952,1,0,0,0,954,955,1,0,0,0,955, + 1051,3,118,59,19,956,981,10,17,0,0,957,982,5,124,0,0,958,982,5,125,0, + 0,959,982,5,136,0,0,960,982,5,134,0,0,961,982,5,135,0,0,962,982,5,126, + 0,0,963,982,5,127,0,0,964,966,5,61,0,0,965,964,1,0,0,0,965,966,1,0,0, + 0,966,967,1,0,0,0,967,969,5,44,0,0,968,970,5,15,0,0,969,968,1,0,0,0,969, + 970,1,0,0,0,970,982,1,0,0,0,971,973,5,61,0,0,972,971,1,0,0,0,972,973, + 1,0,0,0,973,974,1,0,0,0,974,982,7,11,0,0,975,982,5,148,0,0,976,982,5, + 149,0,0,977,982,5,138,0,0,978,982,5,129,0,0,979,982,5,130,0,0,980,982, + 5,137,0,0,981,957,1,0,0,0,981,958,1,0,0,0,981,959,1,0,0,0,981,960,1,0, + 0,0,981,961,1,0,0,0,981,962,1,0,0,0,981,963,1,0,0,0,981,965,1,0,0,0,981, + 972,1,0,0,0,981,975,1,0,0,0,981,976,1,0,0,0,981,977,1,0,0,0,981,978,1, + 0,0,0,981,979,1,0,0,0,981,980,1,0,0,0,982,983,1,0,0,0,983,1051,3,118, + 59,18,984,985,10,15,0,0,985,986,5,140,0,0,986,1051,3,118,59,16,987,988, + 10,13,0,0,988,989,5,2,0,0,989,1051,3,118,59,14,990,991,10,12,0,0,991, + 992,5,66,0,0,992,1051,3,118,59,13,993,995,10,11,0,0,994,996,5,61,0,0, + 995,994,1,0,0,0,995,996,1,0,0,0,996,997,1,0,0,0,997,998,5,9,0,0,998,999, + 3,118,59,0,999,1000,5,2,0,0,1000,1001,3,118,59,12,1001,1051,1,0,0,0,1002, + 1003,10,10,0,0,1003,1004,5,143,0,0,1004,1005,3,118,59,0,1005,1006,5,118, + 0,0,1006,1007,3,118,59,10,1007,1051,1,0,0,0,1008,1009,10,30,0,0,1009, + 1011,5,133,0,0,1010,1012,3,116,58,0,1011,1010,1,0,0,0,1011,1012,1,0,0, + 0,1012,1013,1,0,0,0,1013,1051,5,152,0,0,1014,1015,10,26,0,0,1015,1016, + 5,132,0,0,1016,1017,3,118,59,0,1017,1018,5,151,0,0,1018,1051,1,0,0,0, + 1019,1020,10,25,0,0,1020,1021,5,123,0,0,1021,1051,5,111,0,0,1022,1023, + 10,24,0,0,1023,1024,5,123,0,0,1024,1051,3,158,79,0,1025,1026,10,23,0, + 0,1026,1027,5,139,0,0,1027,1028,5,132,0,0,1028,1029,3,118,59,0,1029,1030, + 5,151,0,0,1030,1051,1,0,0,0,1031,1032,10,22,0,0,1032,1033,5,139,0,0,1033, + 1051,5,111,0,0,1034,1035,10,21,0,0,1035,1036,5,139,0,0,1036,1051,3,158, + 79,0,1037,1038,10,16,0,0,1038,1040,5,49,0,0,1039,1041,5,61,0,0,1040,1039, + 1,0,0,0,1040,1041,1,0,0,0,1041,1042,1,0,0,0,1042,1051,5,62,0,0,1043,1048, + 10,9,0,0,1044,1045,5,6,0,0,1045,1049,3,158,79,0,1046,1047,5,6,0,0,1047, + 1049,5,113,0,0,1048,1044,1,0,0,0,1048,1046,1,0,0,0,1049,1051,1,0,0,0, + 1050,942,1,0,0,0,1050,949,1,0,0,0,1050,956,1,0,0,0,1050,984,1,0,0,0,1050, + 987,1,0,0,0,1050,990,1,0,0,0,1050,993,1,0,0,0,1050,1002,1,0,0,0,1050, + 1008,1,0,0,0,1050,1014,1,0,0,0,1050,1019,1,0,0,0,1050,1022,1,0,0,0,1050, + 1025,1,0,0,0,1050,1031,1,0,0,0,1050,1034,1,0,0,0,1050,1037,1,0,0,0,1050, + 1043,1,0,0,0,1051,1054,1,0,0,0,1052,1050,1,0,0,0,1052,1053,1,0,0,0,1053, + 119,1,0,0,0,1054,1052,1,0,0,0,1055,1056,5,133,0,0,1056,1061,3,158,79, + 0,1057,1058,5,119,0,0,1058,1060,3,158,79,0,1059,1057,1,0,0,0,1060,1063, + 1,0,0,0,1061,1059,1,0,0,0,1061,1062,1,0,0,0,1062,1065,1,0,0,0,1063,1061, + 1,0,0,0,1064,1066,5,119,0,0,1065,1064,1,0,0,0,1065,1066,1,0,0,0,1066, + 1067,1,0,0,0,1067,1068,5,152,0,0,1068,1083,1,0,0,0,1069,1074,3,158,79, + 0,1070,1071,5,119,0,0,1071,1073,3,158,79,0,1072,1070,1,0,0,0,1073,1076, + 1,0,0,0,1074,1072,1,0,0,0,1074,1075,1,0,0,0,1075,1078,1,0,0,0,1076,1074, + 1,0,0,0,1077,1079,5,119,0,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079, + 1083,1,0,0,0,1080,1081,5,133,0,0,1081,1083,5,152,0,0,1082,1055,1,0,0, + 0,1082,1069,1,0,0,0,1082,1080,1,0,0,0,1083,1084,1,0,0,0,1084,1087,5,114, + 0,0,1085,1088,3,118,59,0,1086,1088,3,36,18,0,1087,1085,1,0,0,0,1087,1086, + 1,0,0,0,1088,121,1,0,0,0,1089,1090,5,135,0,0,1090,1094,3,158,79,0,1091, + 1093,3,124,62,0,1092,1091,1,0,0,0,1093,1096,1,0,0,0,1094,1092,1,0,0,0, + 1094,1095,1,0,0,0,1095,1097,1,0,0,0,1096,1094,1,0,0,0,1097,1098,5,154, + 0,0,1098,1099,5,127,0,0,1099,1122,1,0,0,0,1100,1101,5,135,0,0,1101,1105, + 3,158,79,0,1102,1104,3,124,62,0,1103,1102,1,0,0,0,1104,1107,1,0,0,0,1105, + 1103,1,0,0,0,1105,1106,1,0,0,0,1106,1108,1,0,0,0,1107,1105,1,0,0,0,1108, + 1114,5,127,0,0,1109,1115,3,122,61,0,1110,1111,5,131,0,0,1111,1112,3,118, + 59,0,1112,1113,5,150,0,0,1113,1115,1,0,0,0,1114,1109,1,0,0,0,1114,1110, + 1,0,0,0,1114,1115,1,0,0,0,1115,1116,1,0,0,0,1116,1117,5,135,0,0,1117, + 1118,5,154,0,0,1118,1119,3,158,79,0,1119,1120,5,127,0,0,1120,1122,1,0, + 0,0,1121,1089,1,0,0,0,1121,1100,1,0,0,0,1122,123,1,0,0,0,1123,1124,3, + 158,79,0,1124,1125,5,125,0,0,1125,1126,3,164,82,0,1126,1135,1,0,0,0,1127, + 1128,3,158,79,0,1128,1129,5,125,0,0,1129,1130,5,131,0,0,1130,1131,3,118, + 59,0,1131,1132,5,150,0,0,1132,1135,1,0,0,0,1133,1135,3,158,79,0,1134, + 1123,1,0,0,0,1134,1127,1,0,0,0,1134,1133,1,0,0,0,1135,125,1,0,0,0,1136, + 1141,3,128,64,0,1137,1138,5,119,0,0,1138,1140,3,128,64,0,1139,1137,1, + 0,0,0,1140,1143,1,0,0,0,1141,1139,1,0,0,0,1141,1142,1,0,0,0,1142,1145, + 1,0,0,0,1143,1141,1,0,0,0,1144,1146,5,119,0,0,1145,1144,1,0,0,0,1145, + 1146,1,0,0,0,1146,127,1,0,0,0,1147,1148,3,158,79,0,1148,1149,5,6,0,0, + 1149,1150,5,133,0,0,1150,1151,3,48,24,0,1151,1152,5,152,0,0,1152,1158, + 1,0,0,0,1153,1154,3,118,59,0,1154,1155,5,6,0,0,1155,1156,3,158,79,0,1156, + 1158,1,0,0,0,1157,1147,1,0,0,0,1157,1153,1,0,0,0,1158,129,1,0,0,0,1159, + 1167,3,162,81,0,1160,1161,3,138,69,0,1161,1162,5,123,0,0,1162,1164,1, + 0,0,0,1163,1160,1,0,0,0,1163,1164,1,0,0,0,1164,1165,1,0,0,0,1165,1167, + 3,132,66,0,1166,1159,1,0,0,0,1166,1163,1,0,0,0,1167,131,1,0,0,0,1168, + 1173,3,158,79,0,1169,1170,5,123,0,0,1170,1172,3,158,79,0,1171,1169,1, + 0,0,0,1172,1175,1,0,0,0,1173,1171,1,0,0,0,1173,1174,1,0,0,0,1174,133, + 1,0,0,0,1175,1173,1,0,0,0,1176,1177,6,67,-1,0,1177,1186,3,138,69,0,1178, + 1186,3,136,68,0,1179,1180,5,133,0,0,1180,1181,3,48,24,0,1181,1182,5,152, + 0,0,1182,1186,1,0,0,0,1183,1186,3,122,61,0,1184,1186,3,162,81,0,1185, + 1176,1,0,0,0,1185,1178,1,0,0,0,1185,1179,1,0,0,0,1185,1183,1,0,0,0,1185, + 1184,1,0,0,0,1186,1195,1,0,0,0,1187,1191,10,3,0,0,1188,1192,3,156,78, + 0,1189,1190,5,6,0,0,1190,1192,3,158,79,0,1191,1188,1,0,0,0,1191,1189, + 1,0,0,0,1192,1194,1,0,0,0,1193,1187,1,0,0,0,1194,1197,1,0,0,0,1195,1193, + 1,0,0,0,1195,1196,1,0,0,0,1196,135,1,0,0,0,1197,1195,1,0,0,0,1198,1199, + 3,158,79,0,1199,1201,5,133,0,0,1200,1202,3,140,70,0,1201,1200,1,0,0,0, + 1201,1202,1,0,0,0,1202,1203,1,0,0,0,1203,1204,5,152,0,0,1204,137,1,0, + 0,0,1205,1206,3,142,71,0,1206,1207,5,123,0,0,1207,1209,1,0,0,0,1208,1205, + 1,0,0,0,1208,1209,1,0,0,0,1209,1210,1,0,0,0,1210,1211,3,158,79,0,1211, + 139,1,0,0,0,1212,1217,3,118,59,0,1213,1214,5,119,0,0,1214,1216,3,118, + 59,0,1215,1213,1,0,0,0,1216,1219,1,0,0,0,1217,1215,1,0,0,0,1217,1218, + 1,0,0,0,1218,1221,1,0,0,0,1219,1217,1,0,0,0,1220,1222,5,119,0,0,1221, + 1220,1,0,0,0,1221,1222,1,0,0,0,1222,141,1,0,0,0,1223,1224,3,158,79,0, + 1224,143,1,0,0,0,1225,1234,5,109,0,0,1226,1227,5,123,0,0,1227,1234,7, + 12,0,0,1228,1229,5,111,0,0,1229,1231,5,123,0,0,1230,1232,7,12,0,0,1231, + 1230,1,0,0,0,1231,1232,1,0,0,0,1232,1234,1,0,0,0,1233,1225,1,0,0,0,1233, + 1226,1,0,0,0,1233,1228,1,0,0,0,1234,145,1,0,0,0,1235,1237,7,13,0,0,1236, + 1235,1,0,0,0,1236,1237,1,0,0,0,1237,1244,1,0,0,0,1238,1245,3,144,72,0, + 1239,1245,5,110,0,0,1240,1245,5,111,0,0,1241,1245,5,112,0,0,1242,1245, + 5,45,0,0,1243,1245,5,60,0,0,1244,1238,1,0,0,0,1244,1239,1,0,0,0,1244, + 1240,1,0,0,0,1244,1241,1,0,0,0,1244,1242,1,0,0,0,1244,1243,1,0,0,0,1245, + 147,1,0,0,0,1246,1250,3,146,73,0,1247,1250,5,113,0,0,1248,1250,5,62,0, + 0,1249,1246,1,0,0,0,1249,1247,1,0,0,0,1249,1248,1,0,0,0,1250,149,1,0, + 0,0,1251,1252,7,14,0,0,1252,151,1,0,0,0,1253,1254,7,15,0,0,1254,153,1, + 0,0,0,1255,1256,7,16,0,0,1256,155,1,0,0,0,1257,1260,5,108,0,0,1258,1260, + 3,154,77,0,1259,1257,1,0,0,0,1259,1258,1,0,0,0,1260,157,1,0,0,0,1261, + 1265,5,108,0,0,1262,1265,3,150,75,0,1263,1265,3,152,76,0,1264,1261,1, + 0,0,0,1264,1262,1,0,0,0,1264,1263,1,0,0,0,1265,159,1,0,0,0,1266,1267, + 3,164,82,0,1267,1268,5,125,0,0,1268,1269,3,146,73,0,1269,161,1,0,0,0, + 1270,1271,5,131,0,0,1271,1272,3,118,59,0,1272,1273,5,150,0,0,1273,163, + 1,0,0,0,1274,1277,5,113,0,0,1275,1277,3,166,83,0,1276,1274,1,0,0,0,1276, + 1275,1,0,0,0,1277,165,1,0,0,0,1278,1282,5,145,0,0,1279,1281,3,168,84, + 0,1280,1279,1,0,0,0,1281,1284,1,0,0,0,1282,1280,1,0,0,0,1282,1283,1,0, + 0,0,1283,1285,1,0,0,0,1284,1282,1,0,0,0,1285,1286,5,147,0,0,1286,167, + 1,0,0,0,1287,1288,5,160,0,0,1288,1289,3,118,59,0,1289,1290,5,150,0,0, + 1290,1293,1,0,0,0,1291,1293,5,159,0,0,1292,1287,1,0,0,0,1292,1291,1,0, + 0,0,1293,169,1,0,0,0,1294,1298,5,146,0,0,1295,1297,3,172,86,0,1296,1295, + 1,0,0,0,1297,1300,1,0,0,0,1298,1296,1,0,0,0,1298,1299,1,0,0,0,1299,1301, + 1,0,0,0,1300,1298,1,0,0,0,1301,1302,5,0,0,1,1302,171,1,0,0,0,1303,1304, + 5,162,0,0,1304,1305,3,118,59,0,1305,1306,5,150,0,0,1306,1309,1,0,0,0, + 1307,1309,5,161,0,0,1308,1303,1,0,0,0,1308,1307,1,0,0,0,1309,173,1,0, + 0,0,168,177,184,193,200,204,218,222,225,229,232,239,243,252,257,266,274, + 281,285,291,296,304,311,317,329,337,351,355,360,370,376,384,388,392,395, + 399,402,405,408,411,415,419,422,425,428,432,435,444,450,471,488,505,511, + 517,528,530,541,544,550,558,564,566,570,575,578,581,585,589,592,594,597, + 601,605,608,610,612,617,628,634,641,646,650,654,660,662,669,677,680,683, + 702,716,732,736,747,751,762,766,773,777,784,788,793,802,806,830,847,853, + 856,859,869,875,878,881,889,892,896,899,913,930,935,940,946,953,965,969, + 972,981,995,1011,1040,1048,1050,1052,1061,1065,1074,1078,1082,1087,1094, + 1105,1114,1121,1134,1141,1145,1157,1163,1166,1173,1185,1191,1195,1201, + 1208,1217,1221,1231,1233,1236,1244,1249,1259,1264,1276,1282,1292,1298, + 1308 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); @@ -693,20 +699,20 @@ HogQLParser::ProgramContext* HogQLParser::program() { }); try { enterOuterAlt(_localctx, 1); - setState(175); + setState(177); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -536887298) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986211001696255) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 4212759) != 0)) { - setState(172); + ((1ULL << _la) & -140738696331266) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944844006785023) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 4212759) != 0)) { + setState(174); declaration(); - setState(177); + setState(179); _errHandler->sync(this); _la = _input->LA(1); } - setState(178); + setState(180); match(HogQLParser::EOF); } @@ -758,12 +764,12 @@ HogQLParser::DeclarationContext* HogQLParser::declaration() { exitRule(); }); try { - setState(182); + setState(184); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LET: { enterOuterAlt(_localctx, 1); - setState(180); + setState(182); varDecl(); break; } @@ -886,7 +892,7 @@ HogQLParser::DeclarationContext* HogQLParser::declaration() { case HogQLParser::QUOTE_SINGLE_TEMPLATE: case HogQLParser::SEMICOLON: { enterOuterAlt(_localctx, 2); - setState(181); + setState(183); statement(); break; } @@ -941,7 +947,7 @@ HogQLParser::ExpressionContext* HogQLParser::expression() { }); try { enterOuterAlt(_localctx, 1); - setState(184); + setState(186); columnExpr(0); } @@ -1007,20 +1013,20 @@ HogQLParser::VarDeclContext* HogQLParser::varDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(186); + setState(188); match(HogQLParser::LET); - setState(187); + setState(189); identifier(); - setState(191); + setState(193); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COLON) { - setState(188); + setState(190); match(HogQLParser::COLON); - setState(189); + setState(191); match(HogQLParser::EQ_SINGLE); - setState(190); + setState(192); expression(); } @@ -1084,28 +1090,28 @@ HogQLParser::IdentifierListContext* HogQLParser::identifierList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(193); + setState(195); identifier(); - setState(198); + setState(200); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 3, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(194); + setState(196); match(HogQLParser::COMMA); - setState(195); + setState(197); identifier(); } - setState(200); + setState(202); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 3, _ctx); } - setState(202); + setState(204); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(201); + setState(203); match(HogQLParser::COMMA); } @@ -1198,89 +1204,89 @@ HogQLParser::StatementContext* HogQLParser::statement() { exitRule(); }); try { - setState(216); + setState(218); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 5, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(204); + setState(206); returnStmt(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(205); + setState(207); throwStmt(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(206); + setState(208); tryCatchStmt(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(207); + setState(209); ifStmt(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(208); + setState(210); whileStmt(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(209); + setState(211); forInStmt(); break; } case 7: { enterOuterAlt(_localctx, 7); - setState(210); + setState(212); forStmt(); break; } case 8: { enterOuterAlt(_localctx, 8); - setState(211); + setState(213); funcStmt(); break; } case 9: { enterOuterAlt(_localctx, 9); - setState(212); + setState(214); varAssignment(); break; } case 10: { enterOuterAlt(_localctx, 10); - setState(213); + setState(215); block(); break; } case 11: { enterOuterAlt(_localctx, 11); - setState(214); + setState(216); exprStmt(); break; } case 12: { enterOuterAlt(_localctx, 12); - setState(215); + setState(217); emptyStmt(); break; } @@ -1343,14 +1349,14 @@ HogQLParser::ReturnStmtContext* HogQLParser::returnStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(218); - match(HogQLParser::RETURN); setState(220); + match(HogQLParser::RETURN); + setState(222); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 6, _ctx)) { case 1: { - setState(219); + setState(221); expression(); break; } @@ -1358,12 +1364,12 @@ HogQLParser::ReturnStmtContext* HogQLParser::returnStmt() { default: break; } - setState(223); + setState(225); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 7, _ctx)) { case 1: { - setState(222); + setState(224); match(HogQLParser::SEMICOLON); break; } @@ -1426,14 +1432,14 @@ HogQLParser::ThrowStmtContext* HogQLParser::throwStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(225); - match(HogQLParser::THROW); setState(227); + match(HogQLParser::THROW); + setState(229); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 8, _ctx)) { case 1: { - setState(226); + setState(228); expression(); break; } @@ -1441,12 +1447,12 @@ HogQLParser::ThrowStmtContext* HogQLParser::throwStmt() { default: break; } - setState(230); + setState(232); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 9, _ctx)) { case 1: { - setState(229); + setState(231); match(HogQLParser::SEMICOLON); break; } @@ -1526,31 +1532,31 @@ HogQLParser::CatchBlockContext* HogQLParser::catchBlock() { }); try { enterOuterAlt(_localctx, 1); - setState(232); + setState(234); match(HogQLParser::CATCH); - setState(241); + setState(243); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::LPAREN) { - setState(233); + setState(235); match(HogQLParser::LPAREN); - setState(234); + setState(236); antlrcpp::downCast(_localctx)->catchVar = identifier(); - setState(237); + setState(239); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COLON) { - setState(235); + setState(237); match(HogQLParser::COLON); - setState(236); + setState(238); antlrcpp::downCast(_localctx)->catchType = identifier(); } - setState(239); + setState(241); match(HogQLParser::RPAREN); } - setState(243); + setState(245); antlrcpp::downCast(_localctx)->catchStmt = block(); } @@ -1620,28 +1626,28 @@ HogQLParser::TryCatchStmtContext* HogQLParser::tryCatchStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(245); + setState(247); match(HogQLParser::TRY); - setState(246); + setState(248); antlrcpp::downCast(_localctx)->tryStmt = block(); - setState(250); + setState(252); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::CATCH) { - setState(247); + setState(249); catchBlock(); - setState(252); + setState(254); _errHandler->sync(this); _la = _input->LA(1); } - setState(255); + setState(257); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::FINALLY) { - setState(253); + setState(255); match(HogQLParser::FINALLY); - setState(254); + setState(256); antlrcpp::downCast(_localctx)->finallyStmt = block(); } @@ -1715,24 +1721,24 @@ HogQLParser::IfStmtContext* HogQLParser::ifStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(257); + setState(259); match(HogQLParser::IF); - setState(258); + setState(260); match(HogQLParser::LPAREN); - setState(259); + setState(261); expression(); - setState(260); + setState(262); match(HogQLParser::RPAREN); - setState(261); + setState(263); statement(); - setState(264); + setState(266); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 14, _ctx)) { case 1: { - setState(262); + setState(264); match(HogQLParser::ELSE); - setState(263); + setState(265); statement(); break; } @@ -1807,22 +1813,22 @@ HogQLParser::WhileStmtContext* HogQLParser::whileStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(266); + setState(268); match(HogQLParser::WHILE); - setState(267); + setState(269); match(HogQLParser::LPAREN); - setState(268); + setState(270); expression(); - setState(269); + setState(271); match(HogQLParser::RPAREN); - setState(270); - statement(); setState(272); + statement(); + setState(274); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 15, _ctx)) { case 1: { - setState(271); + setState(273); match(HogQLParser::SEMICOLON); break; } @@ -1922,28 +1928,28 @@ HogQLParser::ForStmtContext* HogQLParser::forStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(274); + setState(276); match(HogQLParser::FOR); - setState(275); + setState(277); match(HogQLParser::LPAREN); - setState(279); + setState(281); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 16, _ctx)) { case 1: { - setState(276); + setState(278); antlrcpp::downCast(_localctx)->initializerVarDeclr = varDecl(); break; } case 2: { - setState(277); + setState(279); antlrcpp::downCast(_localctx)->initializerVarAssignment = varAssignment(); break; } case 3: { - setState(278); + setState(280); antlrcpp::downCast(_localctx)->initializerExpression = expression(); break; } @@ -1951,39 +1957,39 @@ HogQLParser::ForStmtContext* HogQLParser::forStmt() { default: break; } - setState(281); - match(HogQLParser::SEMICOLON); setState(283); + match(HogQLParser::SEMICOLON); + setState(285); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(282); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(284); antlrcpp::downCast(_localctx)->condition = expression(); } - setState(285); + setState(287); match(HogQLParser::SEMICOLON); - setState(289); + setState(291); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 18, _ctx)) { case 1: { - setState(286); + setState(288); antlrcpp::downCast(_localctx)->incrementVarDeclr = varDecl(); break; } case 2: { - setState(287); + setState(289); antlrcpp::downCast(_localctx)->incrementVarAssignment = varAssignment(); break; } case 3: { - setState(288); + setState(290); antlrcpp::downCast(_localctx)->incrementExpression = expression(); break; } @@ -1991,16 +1997,16 @@ HogQLParser::ForStmtContext* HogQLParser::forStmt() { default: break; } - setState(291); + setState(293); match(HogQLParser::RPAREN); - setState(292); - statement(); setState(294); + statement(); + setState(296); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 19, _ctx)) { case 1: { - setState(293); + setState(295); match(HogQLParser::SEMICOLON); break; } @@ -2096,38 +2102,38 @@ HogQLParser::ForInStmtContext* HogQLParser::forInStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(296); + setState(298); match(HogQLParser::FOR); - setState(297); + setState(299); match(HogQLParser::LPAREN); - setState(298); + setState(300); match(HogQLParser::LET); - setState(299); + setState(301); identifier(); - setState(302); + setState(304); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(300); + setState(302); match(HogQLParser::COMMA); - setState(301); + setState(303); identifier(); } - setState(304); + setState(306); match(HogQLParser::IN); - setState(305); + setState(307); expression(); - setState(306); + setState(308); match(HogQLParser::RPAREN); - setState(307); - statement(); setState(309); + statement(); + setState(311); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 21, _ctx)) { case 1: { - setState(308); + setState(310); match(HogQLParser::SEMICOLON); break; } @@ -2207,7 +2213,7 @@ HogQLParser::FuncStmtContext* HogQLParser::funcStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(311); + setState(313); _la = _input->LA(1); if (!(_la == HogQLParser::FN @@ -2218,23 +2224,23 @@ HogQLParser::FuncStmtContext* HogQLParser::funcStmt() { _errHandler->reportMatch(this); consume(); } - setState(312); + setState(314); identifier(); - setState(313); - match(HogQLParser::LPAREN); setState(315); + match(HogQLParser::LPAREN); + setState(317); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(314); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(316); identifierList(); } - setState(317); + setState(319); match(HogQLParser::RPAREN); - setState(318); + setState(320); block(); } @@ -2295,13 +2301,13 @@ HogQLParser::VarAssignmentContext* HogQLParser::varAssignment() { }); try { enterOuterAlt(_localctx, 1); - setState(320); + setState(322); expression(); - setState(321); + setState(323); match(HogQLParser::COLON); - setState(322); + setState(324); match(HogQLParser::EQ_SINGLE); - setState(323); + setState(325); expression(); } @@ -2354,14 +2360,14 @@ HogQLParser::ExprStmtContext* HogQLParser::exprStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(325); - expression(); setState(327); + expression(); + setState(329); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 23, _ctx)) { case 1: { - setState(326); + setState(328); match(HogQLParser::SEMICOLON); break; } @@ -2416,7 +2422,7 @@ HogQLParser::EmptyStmtContext* HogQLParser::emptyStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(329); + setState(331); match(HogQLParser::SEMICOLON); } @@ -2478,22 +2484,22 @@ HogQLParser::BlockContext* HogQLParser::block() { }); try { enterOuterAlt(_localctx, 1); - setState(331); + setState(333); match(HogQLParser::LBRACE); - setState(335); + setState(337); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -536887298) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986211001696255) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 4212759) != 0)) { - setState(332); + ((1ULL << _la) & -140738696331266) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944844006785023) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 4212759) != 0)) { + setState(334); declaration(); - setState(337); + setState(339); _errHandler->sync(this); _la = _input->LA(1); } - setState(338); + setState(340); match(HogQLParser::RBRACE); } @@ -2550,11 +2556,11 @@ HogQLParser::KvPairContext* HogQLParser::kvPair() { }); try { enterOuterAlt(_localctx, 1); - setState(340); + setState(342); expression(); - setState(341); + setState(343); match(HogQLParser::COLON); - setState(342); + setState(344); expression(); } @@ -2617,28 +2623,28 @@ HogQLParser::KvPairListContext* HogQLParser::kvPairList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(344); + setState(346); kvPair(); - setState(349); + setState(351); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 25, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(345); + setState(347); match(HogQLParser::COMMA); - setState(346); + setState(348); kvPair(); } - setState(351); + setState(353); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 25, _ctx); } - setState(353); + setState(355); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(352); + setState(354); match(HogQLParser::COMMA); } @@ -2662,8 +2668,8 @@ tree::TerminalNode* HogQLParser::SelectContext::EOF() { return getToken(HogQLParser::EOF, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::SelectContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::SelectContext::selectSetStmt() { + return getRuleContext(0); } HogQLParser::SelectStmtContext* HogQLParser::SelectContext::selectStmt() { @@ -2700,23 +2706,23 @@ HogQLParser::SelectContext* HogQLParser::select() { }); try { enterOuterAlt(_localctx, 1); - setState(358); + setState(360); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 27, _ctx)) { case 1: { - setState(355); - selectUnionStmt(); + setState(357); + selectSetStmt(); break; } case 2: { - setState(356); + setState(358); selectStmt(); break; } case 3: { - setState(357); + setState(359); hogqlxTagElement(); break; } @@ -2724,7 +2730,7 @@ HogQLParser::SelectContext* HogQLParser::select() { default: break; } - setState(360); + setState(362); match(HogQLParser::EOF); } @@ -2737,53 +2743,48 @@ HogQLParser::SelectContext* HogQLParser::select() { return _localctx; } -//----------------- SelectUnionStmtContext ------------------------------------------------------------------ +//----------------- SelectStmtWithParensContext ------------------------------------------------------------------ -HogQLParser::SelectUnionStmtContext::SelectUnionStmtContext(ParserRuleContext *parent, size_t invokingState) +HogQLParser::SelectStmtWithParensContext::SelectStmtWithParensContext(ParserRuleContext *parent, size_t invokingState) : ParserRuleContext(parent, invokingState) { } -std::vector HogQLParser::SelectUnionStmtContext::selectStmtWithParens() { - return getRuleContexts(); -} - -HogQLParser::SelectStmtWithParensContext* HogQLParser::SelectUnionStmtContext::selectStmtWithParens(size_t i) { - return getRuleContext(i); +HogQLParser::SelectStmtContext* HogQLParser::SelectStmtWithParensContext::selectStmt() { + return getRuleContext(0); } -std::vector HogQLParser::SelectUnionStmtContext::UNION() { - return getTokens(HogQLParser::UNION); +tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::LPAREN() { + return getToken(HogQLParser::LPAREN, 0); } -tree::TerminalNode* HogQLParser::SelectUnionStmtContext::UNION(size_t i) { - return getToken(HogQLParser::UNION, i); +HogQLParser::SelectSetStmtContext* HogQLParser::SelectStmtWithParensContext::selectSetStmt() { + return getRuleContext(0); } -std::vector HogQLParser::SelectUnionStmtContext::ALL() { - return getTokens(HogQLParser::ALL); +tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::RPAREN() { + return getToken(HogQLParser::RPAREN, 0); } -tree::TerminalNode* HogQLParser::SelectUnionStmtContext::ALL(size_t i) { - return getToken(HogQLParser::ALL, i); +HogQLParser::PlaceholderContext* HogQLParser::SelectStmtWithParensContext::placeholder() { + return getRuleContext(0); } -size_t HogQLParser::SelectUnionStmtContext::getRuleIndex() const { - return HogQLParser::RuleSelectUnionStmt; +size_t HogQLParser::SelectStmtWithParensContext::getRuleIndex() const { + return HogQLParser::RuleSelectStmtWithParens; } -std::any HogQLParser::SelectUnionStmtContext::accept(tree::ParseTreeVisitor *visitor) { +std::any HogQLParser::SelectStmtWithParensContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) - return parserVisitor->visitSelectUnionStmt(this); + return parserVisitor->visitSelectStmtWithParens(this); else return visitor->visitChildren(this); } -HogQLParser::SelectUnionStmtContext* HogQLParser::selectUnionStmt() { - SelectUnionStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 44, HogQLParser::RuleSelectUnionStmt); - size_t _la = 0; +HogQLParser::SelectStmtWithParensContext* HogQLParser::selectStmtWithParens() { + SelectStmtWithParensContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 44, HogQLParser::RuleSelectStmtWithParens); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2793,22 +2794,37 @@ HogQLParser::SelectUnionStmtContext* HogQLParser::selectUnionStmt() { exitRule(); }); try { - enterOuterAlt(_localctx, 1); - setState(362); - selectStmtWithParens(); - setState(368); + setState(370); _errHandler->sync(this); - _la = _input->LA(1); - while (_la == HogQLParser::UNION) { - setState(363); - match(HogQLParser::UNION); - setState(364); - match(HogQLParser::ALL); - setState(365); - selectStmtWithParens(); - setState(370); - _errHandler->sync(this); - _la = _input->LA(1); + switch (_input->LA(1)) { + case HogQLParser::SELECT: + case HogQLParser::WITH: { + enterOuterAlt(_localctx, 1); + setState(364); + selectStmt(); + break; + } + + case HogQLParser::LPAREN: { + enterOuterAlt(_localctx, 2); + setState(365); + match(HogQLParser::LPAREN); + setState(366); + selectSetStmt(); + setState(367); + match(HogQLParser::RPAREN); + break; + } + + case HogQLParser::LBRACE: { + enterOuterAlt(_localctx, 3); + setState(369); + placeholder(); + break; + } + + default: + throw NoViableAltException(this); } } @@ -2821,48 +2837,48 @@ HogQLParser::SelectUnionStmtContext* HogQLParser::selectUnionStmt() { return _localctx; } -//----------------- SelectStmtWithParensContext ------------------------------------------------------------------ +//----------------- SubsequentSelectSetClauseContext ------------------------------------------------------------------ -HogQLParser::SelectStmtWithParensContext::SelectStmtWithParensContext(ParserRuleContext *parent, size_t invokingState) +HogQLParser::SubsequentSelectSetClauseContext::SubsequentSelectSetClauseContext(ParserRuleContext *parent, size_t invokingState) : ParserRuleContext(parent, invokingState) { } -HogQLParser::SelectStmtContext* HogQLParser::SelectStmtWithParensContext::selectStmt() { - return getRuleContext(0); +HogQLParser::SelectStmtWithParensContext* HogQLParser::SubsequentSelectSetClauseContext::selectStmtWithParens() { + return getRuleContext(0); } -tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::LPAREN() { - return getToken(HogQLParser::LPAREN, 0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::EXCEPT() { + return getToken(HogQLParser::EXCEPT, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::SelectStmtWithParensContext::selectUnionStmt() { - return getRuleContext(0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::UNION() { + return getToken(HogQLParser::UNION, 0); } -tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::RPAREN() { - return getToken(HogQLParser::RPAREN, 0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::ALL() { + return getToken(HogQLParser::ALL, 0); } -HogQLParser::PlaceholderContext* HogQLParser::SelectStmtWithParensContext::placeholder() { - return getRuleContext(0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::INTERSECT() { + return getToken(HogQLParser::INTERSECT, 0); } -size_t HogQLParser::SelectStmtWithParensContext::getRuleIndex() const { - return HogQLParser::RuleSelectStmtWithParens; +size_t HogQLParser::SubsequentSelectSetClauseContext::getRuleIndex() const { + return HogQLParser::RuleSubsequentSelectSetClause; } -std::any HogQLParser::SelectStmtWithParensContext::accept(tree::ParseTreeVisitor *visitor) { +std::any HogQLParser::SubsequentSelectSetClauseContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) - return parserVisitor->visitSelectStmtWithParens(this); + return parserVisitor->visitSubsequentSelectSetClause(this); else return visitor->visitChildren(this); } -HogQLParser::SelectStmtWithParensContext* HogQLParser::selectStmtWithParens() { - SelectStmtWithParensContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 46, HogQLParser::RuleSelectStmtWithParens); +HogQLParser::SubsequentSelectSetClauseContext* HogQLParser::subsequentSelectSetClause() { + SubsequentSelectSetClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 46, HogQLParser::RuleSubsequentSelectSetClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2872,38 +2888,105 @@ HogQLParser::SelectStmtWithParensContext* HogQLParser::selectStmtWithParens() { exitRule(); }); try { - setState(377); + enterOuterAlt(_localctx, 1); + setState(376); _errHandler->sync(this); switch (_input->LA(1)) { - case HogQLParser::SELECT: - case HogQLParser::WITH: { - enterOuterAlt(_localctx, 1); - setState(371); - selectStmt(); + case HogQLParser::EXCEPT: { + setState(372); + match(HogQLParser::EXCEPT); break; } - case HogQLParser::LPAREN: { - enterOuterAlt(_localctx, 2); - setState(372); - match(HogQLParser::LPAREN); + case HogQLParser::UNION: { setState(373); - selectUnionStmt(); + match(HogQLParser::UNION); setState(374); - match(HogQLParser::RPAREN); + match(HogQLParser::ALL); break; } - case HogQLParser::LBRACE: { - enterOuterAlt(_localctx, 3); - setState(376); - placeholder(); + case HogQLParser::INTERSECT: { + setState(375); + match(HogQLParser::INTERSECT); break; } default: throw NoViableAltException(this); } + setState(378); + selectStmtWithParens(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- SelectSetStmtContext ------------------------------------------------------------------ + +HogQLParser::SelectSetStmtContext::SelectSetStmtContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +HogQLParser::SelectStmtWithParensContext* HogQLParser::SelectSetStmtContext::selectStmtWithParens() { + return getRuleContext(0); +} + +std::vector HogQLParser::SelectSetStmtContext::subsequentSelectSetClause() { + return getRuleContexts(); +} + +HogQLParser::SubsequentSelectSetClauseContext* HogQLParser::SelectSetStmtContext::subsequentSelectSetClause(size_t i) { + return getRuleContext(i); +} + + +size_t HogQLParser::SelectSetStmtContext::getRuleIndex() const { + return HogQLParser::RuleSelectSetStmt; +} + + +std::any HogQLParser::SelectSetStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitSelectSetStmt(this); + else + return visitor->visitChildren(this); +} + +HogQLParser::SelectSetStmtContext* HogQLParser::selectSetStmt() { + SelectSetStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 48, HogQLParser::RuleSelectSetStmt); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(380); + selectStmtWithParens(); + setState(384); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == HogQLParser::EXCEPT + + || _la == HogQLParser::INTERSECT || _la == HogQLParser::UNION) { + setState(381); + subsequentSelectSetClause(); + setState(386); + _errHandler->sync(this); + _la = _input->LA(1); + } } catch (RecognitionException &e) { @@ -3020,7 +3103,7 @@ std::any HogQLParser::SelectStmtContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { SelectStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 48, HogQLParser::RuleSelectStmt); + enterRule(_localctx, 50, HogQLParser::RuleSelectStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -3032,22 +3115,22 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(380); + setState(388); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WITH) { - setState(379); + setState(387); antlrcpp::downCast(_localctx)->with = withClause(); } - setState(382); + setState(390); match(HogQLParser::SELECT); - setState(384); + setState(392); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 31, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 32, _ctx)) { case 1: { - setState(383); + setState(391); match(HogQLParser::DISTINCT); break; } @@ -3055,12 +3138,12 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(387); + setState(395); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 32, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 33, _ctx)) { case 1: { - setState(386); + setState(394); topClause(); break; } @@ -3068,57 +3151,57 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(389); + setState(397); antlrcpp::downCast(_localctx)->columns = columnExprList(); - setState(391); + setState(399); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::FROM) { - setState(390); + setState(398); antlrcpp::downCast(_localctx)->from = fromClause(); } - setState(394); + setState(402); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 4538783999459360) != 0)) { - setState(393); + ((1ULL << _la) & 18084767253659680) != 0)) { + setState(401); arrayJoinClause(); } - setState(397); + setState(405); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::PREWHERE) { - setState(396); + setState(404); prewhereClause(); } - setState(400); + setState(408); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WHERE) { - setState(399); + setState(407); antlrcpp::downCast(_localctx)->where = whereClause(); } - setState(403); + setState(411); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::GROUP) { - setState(402); + setState(410); groupByClause(); } - setState(407); + setState(415); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 38, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 39, _ctx)) { case 1: { - setState(405); + setState(413); match(HogQLParser::WITH); - setState(406); + setState(414); _la = _input->LA(1); if (!(_la == HogQLParser::CUBE @@ -3135,56 +3218,58 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(411); + setState(419); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WITH) { - setState(409); + setState(417); match(HogQLParser::WITH); - setState(410); + setState(418); match(HogQLParser::TOTALS); } - setState(414); + setState(422); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::HAVING) { - setState(413); + setState(421); havingClause(); } - setState(417); + setState(425); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WINDOW) { - setState(416); + setState(424); windowClause(); } - setState(420); + setState(428); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ORDER) { - setState(419); + setState(427); orderByClause(); } - setState(424); + setState(432); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LIMIT: { - setState(422); + setState(430); limitAndOffsetClause(); break; } case HogQLParser::OFFSET: { - setState(423); + setState(431); offsetOnlyClause(); break; } case HogQLParser::EOF: + case HogQLParser::EXCEPT: + case HogQLParser::INTERSECT: case HogQLParser::SETTINGS: case HogQLParser::UNION: case HogQLParser::RPAREN: { @@ -3194,12 +3279,12 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(427); + setState(435); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::SETTINGS) { - setState(426); + setState(434); settingsClause(); } @@ -3242,7 +3327,7 @@ std::any HogQLParser::WithClauseContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::WithClauseContext* HogQLParser::withClause() { WithClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 50, HogQLParser::RuleWithClause); + enterRule(_localctx, 52, HogQLParser::RuleWithClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3253,9 +3338,9 @@ HogQLParser::WithClauseContext* HogQLParser::withClause() { }); try { enterOuterAlt(_localctx, 1); - setState(429); + setState(437); match(HogQLParser::WITH); - setState(430); + setState(438); withExprList(); } @@ -3305,7 +3390,7 @@ std::any HogQLParser::TopClauseContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::TopClauseContext* HogQLParser::topClause() { TopClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 52, HogQLParser::RuleTopClause); + enterRule(_localctx, 54, HogQLParser::RuleTopClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3316,18 +3401,18 @@ HogQLParser::TopClauseContext* HogQLParser::topClause() { }); try { enterOuterAlt(_localctx, 1); - setState(432); + setState(440); match(HogQLParser::TOP); - setState(433); + setState(441); match(HogQLParser::DECIMAL_LITERAL); - setState(436); + setState(444); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 45, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 46, _ctx)) { case 1: { - setState(434); + setState(442); match(HogQLParser::WITH); - setState(435); + setState(443); match(HogQLParser::TIES); break; } @@ -3375,7 +3460,7 @@ std::any HogQLParser::FromClauseContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::FromClauseContext* HogQLParser::fromClause() { FromClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 54, HogQLParser::RuleFromClause); + enterRule(_localctx, 56, HogQLParser::RuleFromClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3386,9 +3471,9 @@ HogQLParser::FromClauseContext* HogQLParser::fromClause() { }); try { enterOuterAlt(_localctx, 1); - setState(438); + setState(446); match(HogQLParser::FROM); - setState(439); + setState(447); joinExpr(0); } @@ -3442,7 +3527,7 @@ std::any HogQLParser::ArrayJoinClauseContext::accept(tree::ParseTreeVisitor *vis HogQLParser::ArrayJoinClauseContext* HogQLParser::arrayJoinClause() { ArrayJoinClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 56, HogQLParser::RuleArrayJoinClause); + enterRule(_localctx, 58, HogQLParser::RuleArrayJoinClause); size_t _la = 0; #if __cplusplus > 201703L @@ -3454,14 +3539,14 @@ HogQLParser::ArrayJoinClauseContext* HogQLParser::arrayJoinClause() { }); try { enterOuterAlt(_localctx, 1); - setState(442); + setState(450); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::INNER || _la == HogQLParser::LEFT) { - setState(441); + setState(449); _la = _input->LA(1); if (!(_la == HogQLParser::INNER @@ -3473,11 +3558,11 @@ HogQLParser::ArrayJoinClauseContext* HogQLParser::arrayJoinClause() { consume(); } } - setState(444); + setState(452); match(HogQLParser::ARRAY); - setState(445); + setState(453); match(HogQLParser::JOIN); - setState(446); + setState(454); columnExprList(); } @@ -3563,7 +3648,7 @@ std::any HogQLParser::WindowClauseContext::accept(tree::ParseTreeVisitor *visito HogQLParser::WindowClauseContext* HogQLParser::windowClause() { WindowClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 58, HogQLParser::RuleWindowClause); + enterRule(_localctx, 60, HogQLParser::RuleWindowClause); size_t _la = 0; #if __cplusplus > 201703L @@ -3575,35 +3660,35 @@ HogQLParser::WindowClauseContext* HogQLParser::windowClause() { }); try { enterOuterAlt(_localctx, 1); - setState(448); + setState(456); match(HogQLParser::WINDOW); - setState(449); + setState(457); identifier(); - setState(450); + setState(458); match(HogQLParser::AS); - setState(451); + setState(459); match(HogQLParser::LPAREN); - setState(452); + setState(460); windowExpr(); - setState(453); + setState(461); match(HogQLParser::RPAREN); - setState(463); + setState(471); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::COMMA) { - setState(454); + setState(462); match(HogQLParser::COMMA); - setState(455); + setState(463); identifier(); - setState(456); + setState(464); match(HogQLParser::AS); - setState(457); + setState(465); match(HogQLParser::LPAREN); - setState(458); + setState(466); windowExpr(); - setState(459); + setState(467); match(HogQLParser::RPAREN); - setState(465); + setState(473); _errHandler->sync(this); _la = _input->LA(1); } @@ -3647,7 +3732,7 @@ std::any HogQLParser::PrewhereClauseContext::accept(tree::ParseTreeVisitor *visi HogQLParser::PrewhereClauseContext* HogQLParser::prewhereClause() { PrewhereClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 60, HogQLParser::RulePrewhereClause); + enterRule(_localctx, 62, HogQLParser::RulePrewhereClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3658,9 +3743,9 @@ HogQLParser::PrewhereClauseContext* HogQLParser::prewhereClause() { }); try { enterOuterAlt(_localctx, 1); - setState(466); + setState(474); match(HogQLParser::PREWHERE); - setState(467); + setState(475); columnExpr(0); } @@ -3702,7 +3787,7 @@ std::any HogQLParser::WhereClauseContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::WhereClauseContext* HogQLParser::whereClause() { WhereClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 62, HogQLParser::RuleWhereClause); + enterRule(_localctx, 64, HogQLParser::RuleWhereClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3713,9 +3798,9 @@ HogQLParser::WhereClauseContext* HogQLParser::whereClause() { }); try { enterOuterAlt(_localctx, 1); - setState(469); + setState(477); match(HogQLParser::WHERE); - setState(470); + setState(478); columnExpr(0); } @@ -3777,7 +3862,7 @@ std::any HogQLParser::GroupByClauseContext::accept(tree::ParseTreeVisitor *visit HogQLParser::GroupByClauseContext* HogQLParser::groupByClause() { GroupByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 64, HogQLParser::RuleGroupByClause); + enterRule(_localctx, 66, HogQLParser::RuleGroupByClause); size_t _la = 0; #if __cplusplus > 201703L @@ -3789,15 +3874,15 @@ HogQLParser::GroupByClauseContext* HogQLParser::groupByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(472); + setState(480); match(HogQLParser::GROUP); - setState(473); + setState(481); match(HogQLParser::BY); - setState(480); + setState(488); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 48, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 49, _ctx)) { case 1: { - setState(474); + setState(482); _la = _input->LA(1); if (!(_la == HogQLParser::CUBE @@ -3808,17 +3893,17 @@ HogQLParser::GroupByClauseContext* HogQLParser::groupByClause() { _errHandler->reportMatch(this); consume(); } - setState(475); + setState(483); match(HogQLParser::LPAREN); - setState(476); + setState(484); columnExprList(); - setState(477); + setState(485); match(HogQLParser::RPAREN); break; } case 2: { - setState(479); + setState(487); columnExprList(); break; } @@ -3866,7 +3951,7 @@ std::any HogQLParser::HavingClauseContext::accept(tree::ParseTreeVisitor *visito HogQLParser::HavingClauseContext* HogQLParser::havingClause() { HavingClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 66, HogQLParser::RuleHavingClause); + enterRule(_localctx, 68, HogQLParser::RuleHavingClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3877,9 +3962,9 @@ HogQLParser::HavingClauseContext* HogQLParser::havingClause() { }); try { enterOuterAlt(_localctx, 1); - setState(482); + setState(490); match(HogQLParser::HAVING); - setState(483); + setState(491); columnExpr(0); } @@ -3925,7 +4010,7 @@ std::any HogQLParser::OrderByClauseContext::accept(tree::ParseTreeVisitor *visit HogQLParser::OrderByClauseContext* HogQLParser::orderByClause() { OrderByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 68, HogQLParser::RuleOrderByClause); + enterRule(_localctx, 70, HogQLParser::RuleOrderByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3936,11 +4021,11 @@ HogQLParser::OrderByClauseContext* HogQLParser::orderByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(485); + setState(493); match(HogQLParser::ORDER); - setState(486); + setState(494); match(HogQLParser::BY); - setState(487); + setState(495); orderExprList(); } @@ -3986,7 +4071,7 @@ std::any HogQLParser::ProjectionOrderByClauseContext::accept(tree::ParseTreeVisi HogQLParser::ProjectionOrderByClauseContext* HogQLParser::projectionOrderByClause() { ProjectionOrderByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 70, HogQLParser::RuleProjectionOrderByClause); + enterRule(_localctx, 72, HogQLParser::RuleProjectionOrderByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3997,11 +4082,11 @@ HogQLParser::ProjectionOrderByClauseContext* HogQLParser::projectionOrderByClaus }); try { enterOuterAlt(_localctx, 1); - setState(489); + setState(497); match(HogQLParser::ORDER); - setState(490); + setState(498); match(HogQLParser::BY); - setState(491); + setState(499); columnExprList(); } @@ -4071,7 +4156,7 @@ std::any HogQLParser::LimitAndOffsetClauseContext::accept(tree::ParseTreeVisitor HogQLParser::LimitAndOffsetClauseContext* HogQLParser::limitAndOffsetClause() { LimitAndOffsetClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 72, HogQLParser::RuleLimitAndOffsetClause); + enterRule(_localctx, 74, HogQLParser::RuleLimitAndOffsetClause); size_t _la = 0; #if __cplusplus > 201703L @@ -4082,45 +4167,47 @@ HogQLParser::LimitAndOffsetClauseContext* HogQLParser::limitAndOffsetClause() { exitRule(); }); try { - setState(522); + setState(530); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 53, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 54, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(493); + setState(501); match(HogQLParser::LIMIT); - setState(494); + setState(502); columnExpr(0); - setState(497); + setState(505); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(495); + setState(503); match(HogQLParser::COMMA); - setState(496); + setState(504); columnExpr(0); } - setState(503); + setState(511); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::WITH: { - setState(499); + setState(507); match(HogQLParser::WITH); - setState(500); + setState(508); match(HogQLParser::TIES); break; } case HogQLParser::BY: { - setState(501); + setState(509); match(HogQLParser::BY); - setState(502); + setState(510); columnExprList(); break; } case HogQLParser::EOF: + case HogQLParser::EXCEPT: + case HogQLParser::INTERSECT: case HogQLParser::SETTINGS: case HogQLParser::UNION: case HogQLParser::RPAREN: { @@ -4135,45 +4222,45 @@ HogQLParser::LimitAndOffsetClauseContext* HogQLParser::limitAndOffsetClause() { case 2: { enterOuterAlt(_localctx, 2); - setState(505); + setState(513); match(HogQLParser::LIMIT); - setState(506); + setState(514); columnExpr(0); - setState(509); + setState(517); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WITH) { - setState(507); + setState(515); match(HogQLParser::WITH); - setState(508); + setState(516); match(HogQLParser::TIES); } - setState(511); + setState(519); match(HogQLParser::OFFSET); - setState(512); + setState(520); columnExpr(0); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(514); + setState(522); match(HogQLParser::LIMIT); - setState(515); + setState(523); columnExpr(0); - setState(516); + setState(524); match(HogQLParser::OFFSET); - setState(517); + setState(525); columnExpr(0); - setState(520); + setState(528); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::BY) { - setState(518); + setState(526); match(HogQLParser::BY); - setState(519); + setState(527); columnExprList(); } break; @@ -4222,7 +4309,7 @@ std::any HogQLParser::OffsetOnlyClauseContext::accept(tree::ParseTreeVisitor *vi HogQLParser::OffsetOnlyClauseContext* HogQLParser::offsetOnlyClause() { OffsetOnlyClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 74, HogQLParser::RuleOffsetOnlyClause); + enterRule(_localctx, 76, HogQLParser::RuleOffsetOnlyClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4233,9 +4320,9 @@ HogQLParser::OffsetOnlyClauseContext* HogQLParser::offsetOnlyClause() { }); try { enterOuterAlt(_localctx, 1); - setState(524); + setState(532); match(HogQLParser::OFFSET); - setState(525); + setState(533); columnExpr(0); } @@ -4277,7 +4364,7 @@ std::any HogQLParser::SettingsClauseContext::accept(tree::ParseTreeVisitor *visi HogQLParser::SettingsClauseContext* HogQLParser::settingsClause() { SettingsClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 76, HogQLParser::RuleSettingsClause); + enterRule(_localctx, 78, HogQLParser::RuleSettingsClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4288,9 +4375,9 @@ HogQLParser::SettingsClauseContext* HogQLParser::settingsClause() { }); try { enterOuterAlt(_localctx, 1); - setState(527); + setState(535); match(HogQLParser::SETTINGS); - setState(528); + setState(536); settingExprList(); } @@ -4429,8 +4516,8 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { HogQLParser::JoinExprContext *_localctx = _tracker.createInstance(_ctx, parentState); HogQLParser::JoinExprContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 78; - enterRecursionRule(_localctx, 78, HogQLParser::RuleJoinExpr, precedence); + size_t startState = 80; + enterRecursionRule(_localctx, 80, HogQLParser::RuleJoinExpr, precedence); size_t _la = 0; @@ -4444,22 +4531,22 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(542); + setState(550); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 56, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 57, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(531); + setState(539); tableExpr(0); - setState(533); + setState(541); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 54, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 55, _ctx)) { case 1: { - setState(532); + setState(540); match(HogQLParser::FINAL); break; } @@ -4467,12 +4554,12 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { default: break; } - setState(536); + setState(544); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 55, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 56, _ctx)) { case 1: { - setState(535); + setState(543); sampleClause(); break; } @@ -4487,11 +4574,11 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(538); + setState(546); match(HogQLParser::LPAREN); - setState(539); + setState(547); joinExpr(0); - setState(540); + setState(548); match(HogQLParser::RPAREN); break; } @@ -4500,27 +4587,27 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(558); + setState(566); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 60, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) triggerExitRuleEvent(); previousContext = _localctx; - setState(556); + setState(564); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 58, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 59, _ctx)) { case 1: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleJoinExpr); - setState(544); + setState(552); if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(545); + setState(553); joinOpCross(); - setState(546); + setState(554); joinExpr(4); break; } @@ -4529,25 +4616,25 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleJoinExpr); - setState(548); + setState(556); if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(550); + setState(558); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 4538818359197978) != 0) || _la == HogQLParser::RIGHT + ((1ULL << _la) & 18084835973136666) != 0) || _la == HogQLParser::RIGHT || _la == HogQLParser::SEMI) { - setState(549); + setState(557); joinOp(); } - setState(552); + setState(560); match(HogQLParser::JOIN); - setState(553); + setState(561); joinExpr(0); - setState(554); + setState(562); joinConstraintClause(); break; } @@ -4556,9 +4643,9 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { break; } } - setState(560); + setState(568); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 60, _ctx); } } catch (RecognitionException &e) { @@ -4683,7 +4770,7 @@ std::any HogQLParser::JoinOpLeftRightContext::accept(tree::ParseTreeVisitor *vis } HogQLParser::JoinOpContext* HogQLParser::joinOp() { JoinOpContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 80, HogQLParser::RuleJoinOp); + enterRule(_localctx, 82, HogQLParser::RuleJoinOp); size_t _la = 0; #if __cplusplus > 201703L @@ -4694,23 +4781,23 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { exitRule(); }); try { - setState(604); + setState(612); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 73, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 74, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(570); + setState(578); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 62, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 63, _ctx)) { case 1: { - setState(562); + setState(570); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0)) { - setState(561); + setState(569); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0))) { @@ -4721,21 +4808,21 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { consume(); } } - setState(564); + setState(572); match(HogQLParser::INNER); break; } case 2: { - setState(565); + setState(573); match(HogQLParser::INNER); - setState(567); + setState(575); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0)) { - setState(566); + setState(574); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0))) { @@ -4750,7 +4837,7 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { } case 3: { - setState(569); + setState(577); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0))) { @@ -4772,17 +4859,17 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(586); + setState(594); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 67, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 68, _ctx)) { case 1: { - setState(573); + setState(581); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI) { - setState(572); + setState(580); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI)) { @@ -4793,7 +4880,7 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { consume(); } } - setState(575); + setState(583); _la = _input->LA(1); if (!(_la == HogQLParser::LEFT @@ -4804,19 +4891,19 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { _errHandler->reportMatch(this); consume(); } - setState(577); + setState(585); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(576); + setState(584); match(HogQLParser::OUTER); } break; } case 2: { - setState(579); + setState(587); _la = _input->LA(1); if (!(_la == HogQLParser::LEFT @@ -4827,21 +4914,21 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { _errHandler->reportMatch(this); consume(); } - setState(581); + setState(589); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(580); + setState(588); match(HogQLParser::OUTER); } - setState(584); + setState(592); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI) { - setState(583); + setState(591); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI)) { @@ -4864,18 +4951,18 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { case 3: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 3); - setState(602); + setState(610); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 72, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 73, _ctx)) { case 1: { - setState(589); + setState(597); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ALL || _la == HogQLParser::ANY) { - setState(588); + setState(596); _la = _input->LA(1); if (!(_la == HogQLParser::ALL @@ -4887,38 +4974,38 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { consume(); } } - setState(591); + setState(599); match(HogQLParser::FULL); - setState(593); + setState(601); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(592); + setState(600); match(HogQLParser::OUTER); } break; } case 2: { - setState(595); + setState(603); match(HogQLParser::FULL); - setState(597); + setState(605); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(596); + setState(604); match(HogQLParser::OUTER); } - setState(600); + setState(608); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ALL || _la == HogQLParser::ANY) { - setState(599); + setState(607); _la = _input->LA(1); if (!(_la == HogQLParser::ALL @@ -4986,7 +5073,7 @@ std::any HogQLParser::JoinOpCrossContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::JoinOpCrossContext* HogQLParser::joinOpCross() { JoinOpCrossContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 82, HogQLParser::RuleJoinOpCross); + enterRule(_localctx, 84, HogQLParser::RuleJoinOpCross); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4996,21 +5083,21 @@ HogQLParser::JoinOpCrossContext* HogQLParser::joinOpCross() { exitRule(); }); try { - setState(609); + setState(617); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::CROSS: { enterOuterAlt(_localctx, 1); - setState(606); + setState(614); match(HogQLParser::CROSS); - setState(607); + setState(615); match(HogQLParser::JOIN); break; } case HogQLParser::COMMA: { enterOuterAlt(_localctx, 2); - setState(608); + setState(616); match(HogQLParser::COMMA); break; } @@ -5070,7 +5157,7 @@ std::any HogQLParser::JoinConstraintClauseContext::accept(tree::ParseTreeVisitor HogQLParser::JoinConstraintClauseContext* HogQLParser::joinConstraintClause() { JoinConstraintClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 84, HogQLParser::RuleJoinConstraintClause); + enterRule(_localctx, 86, HogQLParser::RuleJoinConstraintClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5080,36 +5167,36 @@ HogQLParser::JoinConstraintClauseContext* HogQLParser::joinConstraintClause() { exitRule(); }); try { - setState(620); + setState(628); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 75, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 76, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(611); + setState(619); match(HogQLParser::ON); - setState(612); + setState(620); columnExprList(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(613); + setState(621); match(HogQLParser::USING); - setState(614); + setState(622); match(HogQLParser::LPAREN); - setState(615); + setState(623); columnExprList(); - setState(616); + setState(624); match(HogQLParser::RPAREN); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(618); + setState(626); match(HogQLParser::USING); - setState(619); + setState(627); columnExprList(); break; } @@ -5165,7 +5252,7 @@ std::any HogQLParser::SampleClauseContext::accept(tree::ParseTreeVisitor *visito HogQLParser::SampleClauseContext* HogQLParser::sampleClause() { SampleClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 86, HogQLParser::RuleSampleClause); + enterRule(_localctx, 88, HogQLParser::RuleSampleClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5176,18 +5263,18 @@ HogQLParser::SampleClauseContext* HogQLParser::sampleClause() { }); try { enterOuterAlt(_localctx, 1); - setState(622); + setState(630); match(HogQLParser::SAMPLE); - setState(623); + setState(631); ratioExpr(); - setState(626); + setState(634); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 76, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 77, _ctx)) { case 1: { - setState(624); + setState(632); match(HogQLParser::OFFSET); - setState(625); + setState(633); ratioExpr(); break; } @@ -5243,7 +5330,7 @@ std::any HogQLParser::OrderExprListContext::accept(tree::ParseTreeVisitor *visit HogQLParser::OrderExprListContext* HogQLParser::orderExprList() { OrderExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 88, HogQLParser::RuleOrderExprList); + enterRule(_localctx, 90, HogQLParser::RuleOrderExprList); size_t _la = 0; #if __cplusplus > 201703L @@ -5255,17 +5342,17 @@ HogQLParser::OrderExprListContext* HogQLParser::orderExprList() { }); try { enterOuterAlt(_localctx, 1); - setState(628); + setState(636); orderExpr(); - setState(633); + setState(641); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::COMMA) { - setState(629); + setState(637); match(HogQLParser::COMMA); - setState(630); + setState(638); orderExpr(); - setState(635); + setState(643); _errHandler->sync(this); _la = _input->LA(1); } @@ -5337,7 +5424,7 @@ std::any HogQLParser::OrderExprContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::OrderExprContext* HogQLParser::orderExpr() { OrderExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 90, HogQLParser::RuleOrderExpr); + enterRule(_localctx, 92, HogQLParser::RuleOrderExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -5349,15 +5436,15 @@ HogQLParser::OrderExprContext* HogQLParser::orderExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(636); + setState(644); columnExpr(0); - setState(638); + setState(646); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 12583040) != 0)) { - setState(637); + setState(645); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 12583040) != 0))) { @@ -5368,14 +5455,14 @@ HogQLParser::OrderExprContext* HogQLParser::orderExpr() { consume(); } } - setState(642); + setState(650); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NULLS) { - setState(640); + setState(648); match(HogQLParser::NULLS); - setState(641); + setState(649); _la = _input->LA(1); if (!(_la == HogQLParser::FIRST @@ -5387,14 +5474,14 @@ HogQLParser::OrderExprContext* HogQLParser::orderExpr() { consume(); } } - setState(646); + setState(654); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COLLATE) { - setState(644); + setState(652); match(HogQLParser::COLLATE); - setState(645); + setState(653); match(HogQLParser::STRING_LITERAL); } @@ -5445,7 +5532,7 @@ std::any HogQLParser::RatioExprContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::RatioExprContext* HogQLParser::ratioExpr() { RatioExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 92, HogQLParser::RuleRatioExpr); + enterRule(_localctx, 94, HogQLParser::RuleRatioExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5455,12 +5542,12 @@ HogQLParser::RatioExprContext* HogQLParser::ratioExpr() { exitRule(); }); try { - setState(654); + setState(662); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LBRACE: { enterOuterAlt(_localctx, 1); - setState(648); + setState(656); placeholder(); break; } @@ -5475,16 +5562,16 @@ HogQLParser::RatioExprContext* HogQLParser::ratioExpr() { case HogQLParser::DOT: case HogQLParser::PLUS: { enterOuterAlt(_localctx, 2); - setState(649); + setState(657); numberLiteral(); - setState(652); + setState(660); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 81, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 82, _ctx)) { case 1: { - setState(650); + setState(658); match(HogQLParser::SLASH); - setState(651); + setState(659); numberLiteral(); break; } @@ -5546,7 +5633,7 @@ std::any HogQLParser::SettingExprListContext::accept(tree::ParseTreeVisitor *vis HogQLParser::SettingExprListContext* HogQLParser::settingExprList() { SettingExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 94, HogQLParser::RuleSettingExprList); + enterRule(_localctx, 96, HogQLParser::RuleSettingExprList); size_t _la = 0; #if __cplusplus > 201703L @@ -5558,17 +5645,17 @@ HogQLParser::SettingExprListContext* HogQLParser::settingExprList() { }); try { enterOuterAlt(_localctx, 1); - setState(656); + setState(664); settingExpr(); - setState(661); + setState(669); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::COMMA) { - setState(657); + setState(665); match(HogQLParser::COMMA); - setState(658); + setState(666); settingExpr(); - setState(663); + setState(671); _errHandler->sync(this); _la = _input->LA(1); } @@ -5616,7 +5703,7 @@ std::any HogQLParser::SettingExprContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::SettingExprContext* HogQLParser::settingExpr() { SettingExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 96, HogQLParser::RuleSettingExpr); + enterRule(_localctx, 98, HogQLParser::RuleSettingExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5627,11 +5714,11 @@ HogQLParser::SettingExprContext* HogQLParser::settingExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(664); + setState(672); identifier(); - setState(665); + setState(673); match(HogQLParser::EQ_SINGLE); - setState(666); + setState(674); literal(); } @@ -5677,7 +5764,7 @@ std::any HogQLParser::WindowExprContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::WindowExprContext* HogQLParser::windowExpr() { WindowExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 98, HogQLParser::RuleWindowExpr); + enterRule(_localctx, 100, HogQLParser::RuleWindowExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -5689,30 +5776,30 @@ HogQLParser::WindowExprContext* HogQLParser::windowExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(669); + setState(677); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::PARTITION) { - setState(668); + setState(676); winPartitionByClause(); } - setState(672); + setState(680); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ORDER) { - setState(671); + setState(679); winOrderByClause(); } - setState(675); + setState(683); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::RANGE || _la == HogQLParser::ROWS) { - setState(674); + setState(682); winFrameClause(); } @@ -5759,7 +5846,7 @@ std::any HogQLParser::WinPartitionByClauseContext::accept(tree::ParseTreeVisitor HogQLParser::WinPartitionByClauseContext* HogQLParser::winPartitionByClause() { WinPartitionByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 100, HogQLParser::RuleWinPartitionByClause); + enterRule(_localctx, 102, HogQLParser::RuleWinPartitionByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5770,11 +5857,11 @@ HogQLParser::WinPartitionByClauseContext* HogQLParser::winPartitionByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(677); + setState(685); match(HogQLParser::PARTITION); - setState(678); + setState(686); match(HogQLParser::BY); - setState(679); + setState(687); columnExprList(); } @@ -5820,7 +5907,7 @@ std::any HogQLParser::WinOrderByClauseContext::accept(tree::ParseTreeVisitor *vi HogQLParser::WinOrderByClauseContext* HogQLParser::winOrderByClause() { WinOrderByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 102, HogQLParser::RuleWinOrderByClause); + enterRule(_localctx, 104, HogQLParser::RuleWinOrderByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5831,11 +5918,11 @@ HogQLParser::WinOrderByClauseContext* HogQLParser::winOrderByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(681); + setState(689); match(HogQLParser::ORDER); - setState(682); + setState(690); match(HogQLParser::BY); - setState(683); + setState(691); orderExprList(); } @@ -5881,7 +5968,7 @@ std::any HogQLParser::WinFrameClauseContext::accept(tree::ParseTreeVisitor *visi HogQLParser::WinFrameClauseContext* HogQLParser::winFrameClause() { WinFrameClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 104, HogQLParser::RuleWinFrameClause); + enterRule(_localctx, 106, HogQLParser::RuleWinFrameClause); size_t _la = 0; #if __cplusplus > 201703L @@ -5893,7 +5980,7 @@ HogQLParser::WinFrameClauseContext* HogQLParser::winFrameClause() { }); try { enterOuterAlt(_localctx, 1); - setState(685); + setState(693); _la = _input->LA(1); if (!(_la == HogQLParser::RANGE @@ -5904,7 +5991,7 @@ HogQLParser::WinFrameClauseContext* HogQLParser::winFrameClause() { _errHandler->reportMatch(this); consume(); } - setState(686); + setState(694); winFrameExtend(); } @@ -5976,7 +6063,7 @@ std::any HogQLParser::FrameBetweenContext::accept(tree::ParseTreeVisitor *visito } HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { WinFrameExtendContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 106, HogQLParser::RuleWinFrameExtend); + enterRule(_localctx, 108, HogQLParser::RuleWinFrameExtend); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5986,7 +6073,7 @@ HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { exitRule(); }); try { - setState(694); + setState(702); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::CURRENT: @@ -6002,7 +6089,7 @@ HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { case HogQLParser::PLUS: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(688); + setState(696); winFrameBound(); break; } @@ -6010,13 +6097,13 @@ HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { case HogQLParser::BETWEEN: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(689); + setState(697); match(HogQLParser::BETWEEN); - setState(690); + setState(698); winFrameBound(); - setState(691); + setState(699); match(HogQLParser::AND); - setState(692); + setState(700); winFrameBound(); break; } @@ -6080,7 +6167,7 @@ std::any HogQLParser::WinFrameBoundContext::accept(tree::ParseTreeVisitor *visit HogQLParser::WinFrameBoundContext* HogQLParser::winFrameBound() { WinFrameBoundContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 108, HogQLParser::RuleWinFrameBound); + enterRule(_localctx, 110, HogQLParser::RuleWinFrameBound); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6091,45 +6178,45 @@ HogQLParser::WinFrameBoundContext* HogQLParser::winFrameBound() { }); try { enterOuterAlt(_localctx, 1); - setState(708); + setState(716); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 88, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 89, _ctx)) { case 1: { - setState(696); + setState(704); match(HogQLParser::CURRENT); - setState(697); + setState(705); match(HogQLParser::ROW); break; } case 2: { - setState(698); + setState(706); match(HogQLParser::UNBOUNDED); - setState(699); + setState(707); match(HogQLParser::PRECEDING); break; } case 3: { - setState(700); + setState(708); match(HogQLParser::UNBOUNDED); - setState(701); + setState(709); match(HogQLParser::FOLLOWING); break; } case 4: { - setState(702); + setState(710); numberLiteral(); - setState(703); + setState(711); match(HogQLParser::PRECEDING); break; } case 5: { - setState(705); + setState(713); numberLiteral(); - setState(706); + setState(714); match(HogQLParser::FOLLOWING); break; } @@ -6177,7 +6264,7 @@ std::any HogQLParser::ExprContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::ExprContext* HogQLParser::expr() { ExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 110, HogQLParser::RuleExpr); + enterRule(_localctx, 112, HogQLParser::RuleExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6188,9 +6275,9 @@ HogQLParser::ExprContext* HogQLParser::expr() { }); try { enterOuterAlt(_localctx, 1); - setState(710); + setState(718); columnExpr(0); - setState(711); + setState(719); match(HogQLParser::EOF); } @@ -6383,7 +6470,7 @@ std::any HogQLParser::ColumnTypeExprEnumContext::accept(tree::ParseTreeVisitor * } HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { ColumnTypeExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 112, HogQLParser::RuleColumnTypeExpr); + enterRule(_localctx, 114, HogQLParser::RuleColumnTypeExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -6395,13 +6482,13 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { }); try { size_t alt; - setState(769); + setState(777); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 96, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 97, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(713); + setState(721); identifier(); break; } @@ -6409,39 +6496,39 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(714); + setState(722); identifier(); - setState(715); + setState(723); match(HogQLParser::LPAREN); - setState(716); + setState(724); identifier(); - setState(717); + setState(725); columnTypeExpr(); - setState(724); + setState(732); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 89, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 90, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(718); + setState(726); match(HogQLParser::COMMA); - setState(719); + setState(727); identifier(); - setState(720); + setState(728); columnTypeExpr(); } - setState(726); + setState(734); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 89, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 90, _ctx); } - setState(728); + setState(736); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(727); + setState(735); match(HogQLParser::COMMA); } - setState(730); + setState(738); match(HogQLParser::RPAREN); break; } @@ -6449,35 +6536,35 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 3: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 3); - setState(732); + setState(740); identifier(); - setState(733); + setState(741); match(HogQLParser::LPAREN); - setState(734); + setState(742); enumValue(); - setState(739); + setState(747); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 91, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 92, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(735); + setState(743); match(HogQLParser::COMMA); - setState(736); + setState(744); enumValue(); } - setState(741); + setState(749); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 91, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 92, _ctx); } - setState(743); + setState(751); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(742); + setState(750); match(HogQLParser::COMMA); } - setState(745); + setState(753); match(HogQLParser::RPAREN); break; } @@ -6485,35 +6572,35 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 4: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 4); - setState(747); + setState(755); identifier(); - setState(748); + setState(756); match(HogQLParser::LPAREN); - setState(749); + setState(757); columnTypeExpr(); - setState(754); + setState(762); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 93, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(750); + setState(758); match(HogQLParser::COMMA); - setState(751); + setState(759); columnTypeExpr(); } - setState(756); + setState(764); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 93, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); } - setState(758); + setState(766); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(757); + setState(765); match(HogQLParser::COMMA); } - setState(760); + setState(768); match(HogQLParser::RPAREN); break; } @@ -6521,22 +6608,22 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 5: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 5); - setState(762); + setState(770); identifier(); - setState(763); + setState(771); match(HogQLParser::LPAREN); - setState(765); + setState(773); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(764); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(772); columnExprList(); } - setState(767); + setState(775); match(HogQLParser::RPAREN); break; } @@ -6592,7 +6679,7 @@ std::any HogQLParser::ColumnExprListContext::accept(tree::ParseTreeVisitor *visi HogQLParser::ColumnExprListContext* HogQLParser::columnExprList() { ColumnExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 114, HogQLParser::RuleColumnExprList); + enterRule(_localctx, 116, HogQLParser::RuleColumnExprList); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6604,28 +6691,28 @@ HogQLParser::ColumnExprListContext* HogQLParser::columnExprList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(771); + setState(779); columnExpr(0); - setState(776); + setState(784); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 97, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 98, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(772); + setState(780); match(HogQLParser::COMMA); - setState(773); + setState(781); columnExpr(0); } - setState(778); + setState(786); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 97, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 98, _ctx); } - setState(780); + setState(788); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 98, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 99, _ctx)) { case 1: { - setState(779); + setState(787); match(HogQLParser::COMMA); break; } @@ -6761,8 +6848,8 @@ tree::TerminalNode* HogQLParser::ColumnExprSubqueryContext::LPAREN() { return getToken(HogQLParser::LPAREN, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::ColumnExprSubqueryContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::ColumnExprSubqueryContext::selectSetStmt() { + return getRuleContext(0); } tree::TerminalNode* HogQLParser::ColumnExprSubqueryContext::RPAREN() { @@ -7806,8 +7893,8 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { HogQLParser::ColumnExprContext *_localctx = _tracker.createInstance(_ctx, parentState); HogQLParser::ColumnExprContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 116; - enterRecursionRule(_localctx, 116, HogQLParser::RuleColumnExpr, precedence); + size_t startState = 118; + enterRecursionRule(_localctx, 118, HogQLParser::RuleColumnExpr, precedence); size_t _la = 0; @@ -7821,22 +7908,22 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(932); + setState(940); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 118, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 119, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(783); + setState(791); match(HogQLParser::CASE); - setState(785); + setState(793); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 99, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 100, _ctx)) { case 1: { - setState(784); + setState(792); antlrcpp::downCast(_localctx)->caseExpr = columnExpr(0); break; } @@ -7844,33 +7931,33 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(792); + setState(800); _errHandler->sync(this); _la = _input->LA(1); do { - setState(787); + setState(795); match(HogQLParser::WHEN); - setState(788); + setState(796); antlrcpp::downCast(_localctx)->whenExpr = columnExpr(0); - setState(789); + setState(797); match(HogQLParser::THEN); - setState(790); + setState(798); antlrcpp::downCast(_localctx)->thenExpr = columnExpr(0); - setState(794); + setState(802); _errHandler->sync(this); _la = _input->LA(1); } while (_la == HogQLParser::WHEN); - setState(798); + setState(806); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ELSE) { - setState(796); + setState(804); match(HogQLParser::ELSE); - setState(797); + setState(805); antlrcpp::downCast(_localctx)->elseExpr = columnExpr(0); } - setState(800); + setState(808); match(HogQLParser::END); break; } @@ -7879,17 +7966,17 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(802); + setState(810); match(HogQLParser::CAST); - setState(803); + setState(811); match(HogQLParser::LPAREN); - setState(804); + setState(812); columnExpr(0); - setState(805); + setState(813); match(HogQLParser::AS); - setState(806); + setState(814); columnTypeExpr(); - setState(807); + setState(815); match(HogQLParser::RPAREN); break; } @@ -7898,9 +7985,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(809); + setState(817); match(HogQLParser::DATE); - setState(810); + setState(818); match(HogQLParser::STRING_LITERAL); break; } @@ -7909,11 +7996,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(811); + setState(819); match(HogQLParser::INTERVAL); - setState(812); + setState(820); columnExpr(0); - setState(813); + setState(821); interval(); break; } @@ -7922,27 +8009,27 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(815); + setState(823); match(HogQLParser::SUBSTRING); - setState(816); + setState(824); match(HogQLParser::LPAREN); - setState(817); + setState(825); columnExpr(0); - setState(818); + setState(826); match(HogQLParser::FROM); - setState(819); + setState(827); columnExpr(0); - setState(822); + setState(830); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::FOR) { - setState(820); + setState(828); match(HogQLParser::FOR); - setState(821); + setState(829); columnExpr(0); } - setState(824); + setState(832); match(HogQLParser::RPAREN); break; } @@ -7951,9 +8038,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(826); + setState(834); match(HogQLParser::TIMESTAMP); - setState(827); + setState(835); match(HogQLParser::STRING_LITERAL); break; } @@ -7962,11 +8049,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(828); + setState(836); match(HogQLParser::TRIM); - setState(829); + setState(837); match(HogQLParser::LPAREN); - setState(830); + setState(838); _la = _input->LA(1); if (!(_la == HogQLParser::BOTH @@ -7977,13 +8064,13 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(831); + setState(839); string(); - setState(832); + setState(840); match(HogQLParser::FROM); - setState(833); + setState(841); columnExpr(0); - setState(834); + setState(842); match(HogQLParser::RPAREN); break; } @@ -7992,37 +8079,37 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(836); + setState(844); identifier(); - setState(837); + setState(845); match(HogQLParser::LPAREN); - setState(839); + setState(847); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(838); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(846); antlrcpp::downCast(_localctx)->columnExprs = columnExprList(); } - setState(841); + setState(849); match(HogQLParser::RPAREN); - setState(851); + setState(859); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::LPAREN) { - setState(843); + setState(851); match(HogQLParser::LPAREN); - setState(845); + setState(853); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 104, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 105, _ctx)) { case 1: { - setState(844); + setState(852); match(HogQLParser::DISTINCT); break; } @@ -8030,27 +8117,27 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(848); + setState(856); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(847); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(855); antlrcpp::downCast(_localctx)->columnArgList = columnExprList(); } - setState(850); + setState(858); match(HogQLParser::RPAREN); } - setState(853); + setState(861); match(HogQLParser::OVER); - setState(854); + setState(862); match(HogQLParser::LPAREN); - setState(855); + setState(863); windowExpr(); - setState(856); + setState(864); match(HogQLParser::RPAREN); break; } @@ -8059,37 +8146,37 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(858); + setState(866); identifier(); - setState(859); + setState(867); match(HogQLParser::LPAREN); - setState(861); + setState(869); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(860); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(868); antlrcpp::downCast(_localctx)->columnExprs = columnExprList(); } - setState(863); + setState(871); match(HogQLParser::RPAREN); - setState(873); + setState(881); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::LPAREN) { - setState(865); + setState(873); match(HogQLParser::LPAREN); - setState(867); + setState(875); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 108, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 109, _ctx)) { case 1: { - setState(866); + setState(874); match(HogQLParser::DISTINCT); break; } @@ -8097,23 +8184,23 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(870); + setState(878); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(869); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(877); antlrcpp::downCast(_localctx)->columnArgList = columnExprList(); } - setState(872); + setState(880); match(HogQLParser::RPAREN); } - setState(875); + setState(883); match(HogQLParser::OVER); - setState(876); + setState(884); identifier(); break; } @@ -8122,27 +8209,27 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(878); + setState(886); identifier(); - setState(884); + setState(892); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 112, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 113, _ctx)) { case 1: { - setState(879); + setState(887); match(HogQLParser::LPAREN); - setState(881); + setState(889); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(880); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(888); antlrcpp::downCast(_localctx)->columnExprs = columnExprList(); } - setState(883); + setState(891); match(HogQLParser::RPAREN); break; } @@ -8150,14 +8237,14 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(886); + setState(894); match(HogQLParser::LPAREN); - setState(888); + setState(896); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 113, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 114, _ctx)) { case 1: { - setState(887); + setState(895); match(HogQLParser::DISTINCT); break; } @@ -8165,18 +8252,18 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(891); + setState(899); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(890); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(898); antlrcpp::downCast(_localctx)->columnArgList = columnExprList(); } - setState(893); + setState(901); match(HogQLParser::RPAREN); break; } @@ -8185,7 +8272,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(895); + setState(903); hogqlxTagElement(); break; } @@ -8194,7 +8281,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(896); + setState(904); templateString(); break; } @@ -8203,7 +8290,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(897); + setState(905); literal(); break; } @@ -8212,9 +8299,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(898); + setState(906); match(HogQLParser::DASH); - setState(899); + setState(907); columnExpr(20); break; } @@ -8223,9 +8310,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(900); + setState(908); match(HogQLParser::NOT); - setState(901); + setState(909); columnExpr(14); break; } @@ -8234,19 +8321,19 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(905); + setState(913); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(902); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(910); tableIdentifier(); - setState(903); + setState(911); match(HogQLParser::DOT); } - setState(907); + setState(915); match(HogQLParser::ASTERISK); break; } @@ -8255,11 +8342,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(908); + setState(916); match(HogQLParser::LPAREN); - setState(909); - selectUnionStmt(); - setState(910); + setState(917); + selectSetStmt(); + setState(918); match(HogQLParser::RPAREN); break; } @@ -8268,11 +8355,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(912); + setState(920); match(HogQLParser::LPAREN); - setState(913); + setState(921); columnExpr(0); - setState(914); + setState(922); match(HogQLParser::RPAREN); break; } @@ -8281,11 +8368,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(916); + setState(924); match(HogQLParser::LPAREN); - setState(917); + setState(925); columnExprList(); - setState(918); + setState(926); match(HogQLParser::RPAREN); break; } @@ -8294,20 +8381,20 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(920); + setState(928); match(HogQLParser::LBRACKET); - setState(922); + setState(930); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(921); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(929); columnExprList(); } - setState(924); + setState(932); match(HogQLParser::RBRACKET); break; } @@ -8316,20 +8403,20 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(925); + setState(933); match(HogQLParser::LBRACE); - setState(927); + setState(935); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(926); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(934); kvPairList(); } - setState(929); + setState(937); match(HogQLParser::RBRACE); break; } @@ -8338,7 +8425,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(930); + setState(938); columnLambdaExpr(); break; } @@ -8347,7 +8434,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(931); + setState(939); columnIdentifier(); break; } @@ -8356,42 +8443,42 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(1044); + setState(1052); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 130, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) triggerExitRuleEvent(); previousContext = _localctx; - setState(1042); + setState(1050); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 129, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 130, _ctx)) { case 1: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; newContext->left = previousContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(934); + setState(942); if (!(precpred(_ctx, 19))) throw FailedPredicateException(this, "precpred(_ctx, 19)"); - setState(938); + setState(946); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::ASTERISK: { - setState(935); + setState(943); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::ASTERISK); break; } case HogQLParser::SLASH: { - setState(936); + setState(944); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::SLASH); break; } case HogQLParser::PERCENT: { - setState(937); + setState(945); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::PERCENT); break; } @@ -8399,7 +8486,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: throw NoViableAltException(this); } - setState(940); + setState(948); antlrcpp::downCast(_localctx)->right = columnExpr(20); break; } @@ -8409,26 +8496,26 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = newContext; newContext->left = previousContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(941); + setState(949); if (!(precpred(_ctx, 18))) throw FailedPredicateException(this, "precpred(_ctx, 18)"); - setState(945); + setState(953); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::PLUS: { - setState(942); + setState(950); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::PLUS); break; } case HogQLParser::DASH: { - setState(943); + setState(951); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::DASH); break; } case HogQLParser::CONCAT: { - setState(944); + setState(952); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::CONCAT); break; } @@ -8436,7 +8523,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: throw NoViableAltException(this); } - setState(947); + setState(955); antlrcpp::downCast(_localctx)->right = columnExpr(19); break; } @@ -8446,71 +8533,71 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = newContext; newContext->left = previousContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(948); + setState(956); if (!(precpred(_ctx, 17))) throw FailedPredicateException(this, "precpred(_ctx, 17)"); - setState(973); + setState(981); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 124, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 125, _ctx)) { case 1: { - setState(949); + setState(957); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::EQ_DOUBLE); break; } case 2: { - setState(950); + setState(958); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::EQ_SINGLE); break; } case 3: { - setState(951); + setState(959); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT_EQ); break; } case 4: { - setState(952); + setState(960); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::LT_EQ); break; } case 5: { - setState(953); + setState(961); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::LT); break; } case 6: { - setState(954); + setState(962); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::GT_EQ); break; } case 7: { - setState(955); + setState(963); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::GT); break; } case 8: { - setState(957); + setState(965); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(956); + setState(964); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT); } - setState(959); + setState(967); match(HogQLParser::IN); - setState(961); + setState(969); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 122, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 123, _ctx)) { case 1: { - setState(960); + setState(968); match(HogQLParser::COHORT); break; } @@ -8522,15 +8609,15 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { } case 9: { - setState(964); + setState(972); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(963); + setState(971); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT); } - setState(966); + setState(974); _la = _input->LA(1); if (!(_la == HogQLParser::ILIKE @@ -8545,37 +8632,37 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { } case 10: { - setState(967); + setState(975); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::REGEX_SINGLE); break; } case 11: { - setState(968); + setState(976); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::REGEX_DOUBLE); break; } case 12: { - setState(969); + setState(977); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT_REGEX); break; } case 13: { - setState(970); + setState(978); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::IREGEX_SINGLE); break; } case 14: { - setState(971); + setState(979); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::IREGEX_DOUBLE); break; } case 15: { - setState(972); + setState(980); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT_IREGEX); break; } @@ -8583,7 +8670,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(975); + setState(983); antlrcpp::downCast(_localctx)->right = columnExpr(18); break; } @@ -8592,12 +8679,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(976); + setState(984); if (!(precpred(_ctx, 15))) throw FailedPredicateException(this, "precpred(_ctx, 15)"); - setState(977); + setState(985); match(HogQLParser::NULLISH); - setState(978); + setState(986); columnExpr(16); break; } @@ -8606,12 +8693,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(979); + setState(987); if (!(precpred(_ctx, 13))) throw FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(980); + setState(988); match(HogQLParser::AND); - setState(981); + setState(989); columnExpr(14); break; } @@ -8620,12 +8707,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(982); + setState(990); if (!(precpred(_ctx, 12))) throw FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(983); + setState(991); match(HogQLParser::OR); - setState(984); + setState(992); columnExpr(13); break; } @@ -8634,24 +8721,24 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(985); + setState(993); if (!(precpred(_ctx, 11))) throw FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(987); + setState(995); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(986); + setState(994); match(HogQLParser::NOT); } - setState(989); + setState(997); match(HogQLParser::BETWEEN); - setState(990); + setState(998); columnExpr(0); - setState(991); + setState(999); match(HogQLParser::AND); - setState(992); + setState(1000); columnExpr(12); break; } @@ -8660,16 +8747,16 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(994); + setState(1002); if (!(precpred(_ctx, 10))) throw FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(995); + setState(1003); match(HogQLParser::QUERY); - setState(996); + setState(1004); columnExpr(0); - setState(997); + setState(1005); match(HogQLParser::COLON); - setState(998); + setState(1006); columnExpr(10); break; } @@ -8678,23 +8765,23 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1000); + setState(1008); if (!(precpred(_ctx, 30))) throw FailedPredicateException(this, "precpred(_ctx, 30)"); - setState(1001); + setState(1009); match(HogQLParser::LPAREN); - setState(1003); + setState(1011); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(1002); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(1010); columnExprList(); } - setState(1005); + setState(1013); match(HogQLParser::RPAREN); break; } @@ -8703,14 +8790,14 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1006); + setState(1014); if (!(precpred(_ctx, 26))) throw FailedPredicateException(this, "precpred(_ctx, 26)"); - setState(1007); + setState(1015); match(HogQLParser::LBRACKET); - setState(1008); + setState(1016); columnExpr(0); - setState(1009); + setState(1017); match(HogQLParser::RBRACKET); break; } @@ -8719,12 +8806,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1011); + setState(1019); if (!(precpred(_ctx, 25))) throw FailedPredicateException(this, "precpred(_ctx, 25)"); - setState(1012); + setState(1020); match(HogQLParser::DOT); - setState(1013); + setState(1021); match(HogQLParser::DECIMAL_LITERAL); break; } @@ -8733,12 +8820,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1014); + setState(1022); if (!(precpred(_ctx, 24))) throw FailedPredicateException(this, "precpred(_ctx, 24)"); - setState(1015); + setState(1023); match(HogQLParser::DOT); - setState(1016); + setState(1024); identifier(); break; } @@ -8747,16 +8834,16 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1017); + setState(1025); if (!(precpred(_ctx, 23))) throw FailedPredicateException(this, "precpred(_ctx, 23)"); - setState(1018); + setState(1026); match(HogQLParser::NULL_PROPERTY); - setState(1019); + setState(1027); match(HogQLParser::LBRACKET); - setState(1020); + setState(1028); columnExpr(0); - setState(1021); + setState(1029); match(HogQLParser::RBRACKET); break; } @@ -8765,12 +8852,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1023); + setState(1031); if (!(precpred(_ctx, 22))) throw FailedPredicateException(this, "precpred(_ctx, 22)"); - setState(1024); + setState(1032); match(HogQLParser::NULL_PROPERTY); - setState(1025); + setState(1033); match(HogQLParser::DECIMAL_LITERAL); break; } @@ -8779,12 +8866,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1026); + setState(1034); if (!(precpred(_ctx, 21))) throw FailedPredicateException(this, "precpred(_ctx, 21)"); - setState(1027); + setState(1035); match(HogQLParser::NULL_PROPERTY); - setState(1028); + setState(1036); identifier(); break; } @@ -8793,20 +8880,20 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1029); + setState(1037); if (!(precpred(_ctx, 16))) throw FailedPredicateException(this, "precpred(_ctx, 16)"); - setState(1030); + setState(1038); match(HogQLParser::IS); - setState(1032); + setState(1040); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(1031); + setState(1039); match(HogQLParser::NOT); } - setState(1034); + setState(1042); match(HogQLParser::NULL_SQL); break; } @@ -8815,24 +8902,24 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1035); + setState(1043); if (!(precpred(_ctx, 9))) throw FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1040); + setState(1048); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 128, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 129, _ctx)) { case 1: { - setState(1036); + setState(1044); match(HogQLParser::AS); - setState(1037); + setState(1045); identifier(); break; } case 2: { - setState(1038); + setState(1046); match(HogQLParser::AS); - setState(1039); + setState(1047); match(HogQLParser::STRING_LITERAL); break; } @@ -8847,9 +8934,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { break; } } - setState(1046); + setState(1054); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 130, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); } } catch (RecognitionException &e) { @@ -8917,7 +9004,7 @@ std::any HogQLParser::ColumnLambdaExprContext::accept(tree::ParseTreeVisitor *vi HogQLParser::ColumnLambdaExprContext* HogQLParser::columnLambdaExpr() { ColumnLambdaExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 118, HogQLParser::RuleColumnLambdaExpr); + enterRule(_localctx, 120, HogQLParser::RuleColumnLambdaExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -8930,73 +9017,73 @@ HogQLParser::ColumnLambdaExprContext* HogQLParser::columnLambdaExpr() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1074); + setState(1082); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 135, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 136, _ctx)) { case 1: { - setState(1047); + setState(1055); match(HogQLParser::LPAREN); - setState(1048); + setState(1056); identifier(); - setState(1053); + setState(1061); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 132, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1049); + setState(1057); match(HogQLParser::COMMA); - setState(1050); + setState(1058); identifier(); } - setState(1055); + setState(1063); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 132, _ctx); } - setState(1057); + setState(1065); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1056); + setState(1064); match(HogQLParser::COMMA); } - setState(1059); + setState(1067); match(HogQLParser::RPAREN); break; } case 2: { - setState(1061); + setState(1069); identifier(); - setState(1066); + setState(1074); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 133, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 134, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1062); + setState(1070); match(HogQLParser::COMMA); - setState(1063); + setState(1071); identifier(); } - setState(1068); + setState(1076); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 133, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 134, _ctx); } - setState(1070); + setState(1078); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1069); + setState(1077); match(HogQLParser::COMMA); } break; } case 3: { - setState(1072); + setState(1080); match(HogQLParser::LPAREN); - setState(1073); + setState(1081); match(HogQLParser::RPAREN); break; } @@ -9004,19 +9091,19 @@ HogQLParser::ColumnLambdaExprContext* HogQLParser::columnLambdaExpr() { default: break; } - setState(1076); + setState(1084); match(HogQLParser::ARROW); - setState(1079); + setState(1087); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 136, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 137, _ctx)) { case 1: { - setState(1077); + setState(1085); columnExpr(0); break; } case 2: { - setState(1078); + setState(1086); block(); break; } @@ -9150,7 +9237,7 @@ std::any HogQLParser::HogqlxTagElementNestedContext::accept(tree::ParseTreeVisit } HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { HogqlxTagElementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 120, HogQLParser::RuleHogqlxTagElement); + enterRule(_localctx, 122, HogQLParser::RuleHogqlxTagElement); size_t _la = 0; #if __cplusplus > 201703L @@ -9161,31 +9248,31 @@ HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { exitRule(); }); try { - setState(1113); + setState(1121); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 140, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 141, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(1081); + setState(1089); match(HogQLParser::LT); - setState(1082); + setState(1090); identifier(); - setState(1086); + setState(1094); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(1083); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(1091); hogqlxTagAttribute(); - setState(1088); + setState(1096); _errHandler->sync(this); _la = _input->LA(1); } - setState(1089); + setState(1097); match(HogQLParser::SLASH); - setState(1090); + setState(1098); match(HogQLParser::GT); break; } @@ -9193,40 +9280,40 @@ HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(1092); + setState(1100); match(HogQLParser::LT); - setState(1093); + setState(1101); identifier(); - setState(1097); + setState(1105); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(1094); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(1102); hogqlxTagAttribute(); - setState(1099); + setState(1107); _errHandler->sync(this); _la = _input->LA(1); } - setState(1100); + setState(1108); match(HogQLParser::GT); - setState(1106); + setState(1114); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 139, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 140, _ctx)) { case 1: { - setState(1101); + setState(1109); hogqlxTagElement(); break; } case 2: { - setState(1102); + setState(1110); match(HogQLParser::LBRACE); - setState(1103); + setState(1111); columnExpr(0); - setState(1104); + setState(1112); match(HogQLParser::RBRACE); break; } @@ -9234,13 +9321,13 @@ HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { default: break; } - setState(1108); + setState(1116); match(HogQLParser::LT); - setState(1109); + setState(1117); match(HogQLParser::SLASH); - setState(1110); + setState(1118); identifier(); - setState(1111); + setState(1119); match(HogQLParser::GT); break; } @@ -9304,7 +9391,7 @@ std::any HogQLParser::HogqlxTagAttributeContext::accept(tree::ParseTreeVisitor * HogQLParser::HogqlxTagAttributeContext* HogQLParser::hogqlxTagAttribute() { HogqlxTagAttributeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 122, HogQLParser::RuleHogqlxTagAttribute); + enterRule(_localctx, 124, HogQLParser::RuleHogqlxTagAttribute); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9314,38 +9401,38 @@ HogQLParser::HogqlxTagAttributeContext* HogQLParser::hogqlxTagAttribute() { exitRule(); }); try { - setState(1126); + setState(1134); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 141, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 142, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1115); + setState(1123); identifier(); - setState(1116); + setState(1124); match(HogQLParser::EQ_SINGLE); - setState(1117); + setState(1125); string(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1119); + setState(1127); identifier(); - setState(1120); + setState(1128); match(HogQLParser::EQ_SINGLE); - setState(1121); + setState(1129); match(HogQLParser::LBRACE); - setState(1122); + setState(1130); columnExpr(0); - setState(1123); + setState(1131); match(HogQLParser::RBRACE); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1125); + setState(1133); identifier(); break; } @@ -9401,7 +9488,7 @@ std::any HogQLParser::WithExprListContext::accept(tree::ParseTreeVisitor *visito HogQLParser::WithExprListContext* HogQLParser::withExprList() { WithExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 124, HogQLParser::RuleWithExprList); + enterRule(_localctx, 126, HogQLParser::RuleWithExprList); size_t _la = 0; #if __cplusplus > 201703L @@ -9414,28 +9501,28 @@ HogQLParser::WithExprListContext* HogQLParser::withExprList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1128); + setState(1136); withExpr(); - setState(1133); + setState(1141); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 142, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 143, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1129); + setState(1137); match(HogQLParser::COMMA); - setState(1130); + setState(1138); withExpr(); } - setState(1135); + setState(1143); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 142, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 143, _ctx); } - setState(1137); + setState(1145); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1136); + setState(1144); match(HogQLParser::COMMA); } @@ -9501,8 +9588,8 @@ tree::TerminalNode* HogQLParser::WithExprSubqueryContext::LPAREN() { return getToken(HogQLParser::LPAREN, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::WithExprSubqueryContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::WithExprSubqueryContext::selectSetStmt() { + return getRuleContext(0); } tree::TerminalNode* HogQLParser::WithExprSubqueryContext::RPAREN() { @@ -9520,7 +9607,7 @@ std::any HogQLParser::WithExprSubqueryContext::accept(tree::ParseTreeVisitor *vi } HogQLParser::WithExprContext* HogQLParser::withExpr() { WithExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 126, HogQLParser::RuleWithExpr); + enterRule(_localctx, 128, HogQLParser::RuleWithExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9530,21 +9617,21 @@ HogQLParser::WithExprContext* HogQLParser::withExpr() { exitRule(); }); try { - setState(1149); + setState(1157); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 144, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 145, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(1139); + setState(1147); identifier(); - setState(1140); + setState(1148); match(HogQLParser::AS); - setState(1141); + setState(1149); match(HogQLParser::LPAREN); - setState(1142); - selectUnionStmt(); - setState(1143); + setState(1150); + selectSetStmt(); + setState(1151); match(HogQLParser::RPAREN); break; } @@ -9552,11 +9639,11 @@ HogQLParser::WithExprContext* HogQLParser::withExpr() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(1145); + setState(1153); columnExpr(0); - setState(1146); + setState(1154); match(HogQLParser::AS); - setState(1147); + setState(1155); identifier(); break; } @@ -9612,7 +9699,7 @@ std::any HogQLParser::ColumnIdentifierContext::accept(tree::ParseTreeVisitor *vi HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { ColumnIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 128, HogQLParser::RuleColumnIdentifier); + enterRule(_localctx, 130, HogQLParser::RuleColumnIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9622,12 +9709,12 @@ HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { exitRule(); }); try { - setState(1158); + setState(1166); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LBRACE: { enterOuterAlt(_localctx, 1); - setState(1151); + setState(1159); placeholder(); break; } @@ -9727,14 +9814,14 @@ HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { case HogQLParser::YEAR: case HogQLParser::IDENTIFIER: { enterOuterAlt(_localctx, 2); - setState(1155); + setState(1163); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 145, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 146, _ctx)) { case 1: { - setState(1152); + setState(1160); tableIdentifier(); - setState(1153); + setState(1161); match(HogQLParser::DOT); break; } @@ -9742,7 +9829,7 @@ HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { default: break; } - setState(1157); + setState(1165); nestedIdentifier(); break; } @@ -9798,7 +9885,7 @@ std::any HogQLParser::NestedIdentifierContext::accept(tree::ParseTreeVisitor *vi HogQLParser::NestedIdentifierContext* HogQLParser::nestedIdentifier() { NestedIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 130, HogQLParser::RuleNestedIdentifier); + enterRule(_localctx, 132, HogQLParser::RuleNestedIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9810,21 +9897,21 @@ HogQLParser::NestedIdentifierContext* HogQLParser::nestedIdentifier() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1160); + setState(1168); identifier(); - setState(1165); + setState(1173); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 147, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 148, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1161); + setState(1169); match(HogQLParser::DOT); - setState(1162); + setState(1170); identifier(); } - setState(1167); + setState(1175); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 147, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 148, _ctx); } } @@ -9903,8 +9990,8 @@ tree::TerminalNode* HogQLParser::TableExprSubqueryContext::LPAREN() { return getToken(HogQLParser::LPAREN, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::TableExprSubqueryContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::TableExprSubqueryContext::selectSetStmt() { + return getRuleContext(0); } tree::TerminalNode* HogQLParser::TableExprSubqueryContext::RPAREN() { @@ -9973,8 +10060,8 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { HogQLParser::TableExprContext *_localctx = _tracker.createInstance(_ctx, parentState); HogQLParser::TableExprContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 132; - enterRecursionRule(_localctx, 132, HogQLParser::RuleTableExpr, precedence); + size_t startState = 134; + enterRecursionRule(_localctx, 134, HogQLParser::RuleTableExpr, precedence); @@ -9988,15 +10075,15 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1177); + setState(1185); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 148, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 149, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1169); + setState(1177); tableIdentifier(); break; } @@ -10005,7 +10092,7 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1170); + setState(1178); tableFunctionExpr(); break; } @@ -10014,11 +10101,11 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1171); + setState(1179); match(HogQLParser::LPAREN); - setState(1172); - selectUnionStmt(); - setState(1173); + setState(1180); + selectSetStmt(); + setState(1181); match(HogQLParser::RPAREN); break; } @@ -10027,7 +10114,7 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1175); + setState(1183); hogqlxTagElement(); break; } @@ -10036,7 +10123,7 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1176); + setState(1184); placeholder(); break; } @@ -10045,9 +10132,9 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(1187); + setState(1195); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 150, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 151, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) @@ -10056,10 +10143,10 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleTableExpr); - setState(1179); + setState(1187); if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1183); + setState(1191); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::DATE: @@ -10067,15 +10154,15 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { case HogQLParser::ID: case HogQLParser::KEY: case HogQLParser::IDENTIFIER: { - setState(1180); + setState(1188); alias(); break; } case HogQLParser::AS: { - setState(1181); + setState(1189); match(HogQLParser::AS); - setState(1182); + setState(1190); identifier(); break; } @@ -10084,9 +10171,9 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { throw NoViableAltException(this); } } - setState(1189); + setState(1197); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 150, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 151, _ctx); } } catch (RecognitionException &e) { @@ -10134,7 +10221,7 @@ std::any HogQLParser::TableFunctionExprContext::accept(tree::ParseTreeVisitor *v HogQLParser::TableFunctionExprContext* HogQLParser::tableFunctionExpr() { TableFunctionExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 134, HogQLParser::RuleTableFunctionExpr); + enterRule(_localctx, 136, HogQLParser::RuleTableFunctionExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -10146,22 +10233,22 @@ HogQLParser::TableFunctionExprContext* HogQLParser::tableFunctionExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(1190); + setState(1198); identifier(); - setState(1191); + setState(1199); match(HogQLParser::LPAREN); - setState(1193); + setState(1201); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(1192); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(1200); tableArgList(); } - setState(1195); + setState(1203); match(HogQLParser::RPAREN); } @@ -10207,7 +10294,7 @@ std::any HogQLParser::TableIdentifierContext::accept(tree::ParseTreeVisitor *vis HogQLParser::TableIdentifierContext* HogQLParser::tableIdentifier() { TableIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 136, HogQLParser::RuleTableIdentifier); + enterRule(_localctx, 138, HogQLParser::RuleTableIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10218,14 +10305,14 @@ HogQLParser::TableIdentifierContext* HogQLParser::tableIdentifier() { }); try { enterOuterAlt(_localctx, 1); - setState(1200); + setState(1208); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 152, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 153, _ctx)) { case 1: { - setState(1197); + setState(1205); databaseIdentifier(); - setState(1198); + setState(1206); match(HogQLParser::DOT); break; } @@ -10233,7 +10320,7 @@ HogQLParser::TableIdentifierContext* HogQLParser::tableIdentifier() { default: break; } - setState(1202); + setState(1210); identifier(); } @@ -10283,7 +10370,7 @@ std::any HogQLParser::TableArgListContext::accept(tree::ParseTreeVisitor *visito HogQLParser::TableArgListContext* HogQLParser::tableArgList() { TableArgListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 138, HogQLParser::RuleTableArgList); + enterRule(_localctx, 140, HogQLParser::RuleTableArgList); size_t _la = 0; #if __cplusplus > 201703L @@ -10296,28 +10383,28 @@ HogQLParser::TableArgListContext* HogQLParser::tableArgList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1204); + setState(1212); columnExpr(0); - setState(1209); + setState(1217); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 153, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 154, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1205); + setState(1213); match(HogQLParser::COMMA); - setState(1206); + setState(1214); columnExpr(0); } - setState(1211); + setState(1219); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 153, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 154, _ctx); } - setState(1213); + setState(1221); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1212); + setState(1220); match(HogQLParser::COMMA); } @@ -10356,7 +10443,7 @@ std::any HogQLParser::DatabaseIdentifierContext::accept(tree::ParseTreeVisitor * HogQLParser::DatabaseIdentifierContext* HogQLParser::databaseIdentifier() { DatabaseIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 140, HogQLParser::RuleDatabaseIdentifier); + enterRule(_localctx, 142, HogQLParser::RuleDatabaseIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10367,7 +10454,7 @@ HogQLParser::DatabaseIdentifierContext* HogQLParser::databaseIdentifier() { }); try { enterOuterAlt(_localctx, 1); - setState(1215); + setState(1223); identifier(); } @@ -10421,7 +10508,7 @@ std::any HogQLParser::FloatingLiteralContext::accept(tree::ParseTreeVisitor *vis HogQLParser::FloatingLiteralContext* HogQLParser::floatingLiteral() { FloatingLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 142, HogQLParser::RuleFloatingLiteral); + enterRule(_localctx, 144, HogQLParser::RuleFloatingLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -10432,21 +10519,21 @@ HogQLParser::FloatingLiteralContext* HogQLParser::floatingLiteral() { exitRule(); }); try { - setState(1225); + setState(1233); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::FLOATING_LITERAL: { enterOuterAlt(_localctx, 1); - setState(1217); + setState(1225); match(HogQLParser::FLOATING_LITERAL); break; } case HogQLParser::DOT: { enterOuterAlt(_localctx, 2); - setState(1218); + setState(1226); match(HogQLParser::DOT); - setState(1219); + setState(1227); _la = _input->LA(1); if (!(_la == HogQLParser::OCTAL_LITERAL @@ -10462,16 +10549,16 @@ HogQLParser::FloatingLiteralContext* HogQLParser::floatingLiteral() { case HogQLParser::DECIMAL_LITERAL: { enterOuterAlt(_localctx, 3); - setState(1220); + setState(1228); match(HogQLParser::DECIMAL_LITERAL); - setState(1221); + setState(1229); match(HogQLParser::DOT); - setState(1223); + setState(1231); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 155, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 156, _ctx)) { case 1: { - setState(1222); + setState(1230); _la = _input->LA(1); if (!(_la == HogQLParser::OCTAL_LITERAL @@ -10558,7 +10645,7 @@ std::any HogQLParser::NumberLiteralContext::accept(tree::ParseTreeVisitor *visit HogQLParser::NumberLiteralContext* HogQLParser::numberLiteral() { NumberLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 144, HogQLParser::RuleNumberLiteral); + enterRule(_localctx, 146, HogQLParser::RuleNumberLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -10570,14 +10657,14 @@ HogQLParser::NumberLiteralContext* HogQLParser::numberLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(1228); + setState(1236); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::DASH || _la == HogQLParser::PLUS) { - setState(1227); + setState(1235); _la = _input->LA(1); if (!(_la == HogQLParser::DASH @@ -10589,41 +10676,41 @@ HogQLParser::NumberLiteralContext* HogQLParser::numberLiteral() { consume(); } } - setState(1236); + setState(1244); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 158, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 159, _ctx)) { case 1: { - setState(1230); + setState(1238); floatingLiteral(); break; } case 2: { - setState(1231); + setState(1239); match(HogQLParser::OCTAL_LITERAL); break; } case 3: { - setState(1232); + setState(1240); match(HogQLParser::DECIMAL_LITERAL); break; } case 4: { - setState(1233); + setState(1241); match(HogQLParser::HEXADECIMAL_LITERAL); break; } case 5: { - setState(1234); + setState(1242); match(HogQLParser::INF); break; } case 6: { - setState(1235); + setState(1243); match(HogQLParser::NAN_SQL); break; } @@ -10675,7 +10762,7 @@ std::any HogQLParser::LiteralContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::LiteralContext* HogQLParser::literal() { LiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 146, HogQLParser::RuleLiteral); + enterRule(_localctx, 148, HogQLParser::RuleLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10685,7 +10772,7 @@ HogQLParser::LiteralContext* HogQLParser::literal() { exitRule(); }); try { - setState(1241); + setState(1249); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::INF: @@ -10698,21 +10785,21 @@ HogQLParser::LiteralContext* HogQLParser::literal() { case HogQLParser::DOT: case HogQLParser::PLUS: { enterOuterAlt(_localctx, 1); - setState(1238); + setState(1246); numberLiteral(); break; } case HogQLParser::STRING_LITERAL: { enterOuterAlt(_localctx, 2); - setState(1239); + setState(1247); match(HogQLParser::STRING_LITERAL); break; } case HogQLParser::NULL_SQL: { enterOuterAlt(_localctx, 3); - setState(1240); + setState(1248); match(HogQLParser::NULL_SQL); break; } @@ -10784,7 +10871,7 @@ std::any HogQLParser::IntervalContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::IntervalContext* HogQLParser::interval() { IntervalContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 148, HogQLParser::RuleInterval); + enterRule(_localctx, 150, HogQLParser::RuleInterval); size_t _la = 0; #if __cplusplus > 201703L @@ -10796,11 +10883,11 @@ HogQLParser::IntervalContext* HogQLParser::interval() { }); try { enterOuterAlt(_localctx, 1); - setState(1243); + setState(1251); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 216173331871694848) != 0) || ((((_la - 71) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 71)) & 8724152577) != 0))) { + ((1ULL << _la) & 864692227968860160) != 0) || ((((_la - 73) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 73)) & 8724152577) != 0))) { _errHandler->recoverInline(this); } else { @@ -11179,7 +11266,7 @@ std::any HogQLParser::KeywordContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::KeywordContext* HogQLParser::keyword() { KeywordContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 150, HogQLParser::RuleKeyword); + enterRule(_localctx, 152, HogQLParser::RuleKeyword); size_t _la = 0; #if __cplusplus > 201703L @@ -11191,11 +11278,11 @@ HogQLParser::KeywordContext* HogQLParser::keyword() { }); try { enterOuterAlt(_localctx, 1); - setState(1245); + setState(1253); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1666350075474886658) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 943816933247) != 0))) { + ((1ULL << _la) & -6665504612824399874) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 3775267732991) != 0))) { _errHandler->recoverInline(this); } else { @@ -11250,7 +11337,7 @@ std::any HogQLParser::KeywordForAliasContext::accept(tree::ParseTreeVisitor *vis HogQLParser::KeywordForAliasContext* HogQLParser::keywordForAlias() { KeywordForAliasContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 152, HogQLParser::RuleKeywordForAlias); + enterRule(_localctx, 154, HogQLParser::RuleKeywordForAlias); size_t _la = 0; #if __cplusplus > 201703L @@ -11262,10 +11349,10 @@ HogQLParser::KeywordForAliasContext* HogQLParser::keywordForAlias() { }); try { enterOuterAlt(_localctx, 1); - setState(1247); + setState(1255); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 564050539839488) != 0))) { + ((1ULL << _la) & 2254000985473024) != 0))) { _errHandler->recoverInline(this); } else { @@ -11312,7 +11399,7 @@ std::any HogQLParser::AliasContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::AliasContext* HogQLParser::alias() { AliasContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 154, HogQLParser::RuleAlias); + enterRule(_localctx, 156, HogQLParser::RuleAlias); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11322,12 +11409,12 @@ HogQLParser::AliasContext* HogQLParser::alias() { exitRule(); }); try { - setState(1251); + setState(1259); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::IDENTIFIER: { enterOuterAlt(_localctx, 1); - setState(1249); + setState(1257); match(HogQLParser::IDENTIFIER); break; } @@ -11337,7 +11424,7 @@ HogQLParser::AliasContext* HogQLParser::alias() { case HogQLParser::ID: case HogQLParser::KEY: { enterOuterAlt(_localctx, 2); - setState(1250); + setState(1258); keywordForAlias(); break; } @@ -11389,7 +11476,7 @@ std::any HogQLParser::IdentifierContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::IdentifierContext* HogQLParser::identifier() { IdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 156, HogQLParser::RuleIdentifier); + enterRule(_localctx, 158, HogQLParser::RuleIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11399,12 +11486,12 @@ HogQLParser::IdentifierContext* HogQLParser::identifier() { exitRule(); }); try { - setState(1256); + setState(1264); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::IDENTIFIER: { enterOuterAlt(_localctx, 1); - setState(1253); + setState(1261); match(HogQLParser::IDENTIFIER); break; } @@ -11418,7 +11505,7 @@ HogQLParser::IdentifierContext* HogQLParser::identifier() { case HogQLParser::WEEK: case HogQLParser::YEAR: { enterOuterAlt(_localctx, 2); - setState(1254); + setState(1262); interval(); break; } @@ -11509,7 +11596,7 @@ HogQLParser::IdentifierContext* HogQLParser::identifier() { case HogQLParser::WINDOW: case HogQLParser::WITH: { enterOuterAlt(_localctx, 3); - setState(1255); + setState(1263); keyword(); break; } @@ -11561,7 +11648,7 @@ std::any HogQLParser::EnumValueContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::EnumValueContext* HogQLParser::enumValue() { EnumValueContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 158, HogQLParser::RuleEnumValue); + enterRule(_localctx, 160, HogQLParser::RuleEnumValue); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11572,11 +11659,11 @@ HogQLParser::EnumValueContext* HogQLParser::enumValue() { }); try { enterOuterAlt(_localctx, 1); - setState(1258); + setState(1266); string(); - setState(1259); + setState(1267); match(HogQLParser::EQ_SINGLE); - setState(1260); + setState(1268); numberLiteral(); } @@ -11622,7 +11709,7 @@ std::any HogQLParser::PlaceholderContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::PlaceholderContext* HogQLParser::placeholder() { PlaceholderContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 160, HogQLParser::RulePlaceholder); + enterRule(_localctx, 162, HogQLParser::RulePlaceholder); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11633,11 +11720,11 @@ HogQLParser::PlaceholderContext* HogQLParser::placeholder() { }); try { enterOuterAlt(_localctx, 1); - setState(1262); + setState(1270); match(HogQLParser::LBRACE); - setState(1263); + setState(1271); columnExpr(0); - setState(1264); + setState(1272); match(HogQLParser::RBRACE); } @@ -11679,7 +11766,7 @@ std::any HogQLParser::StringContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::StringContext* HogQLParser::string() { StringContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 162, HogQLParser::RuleString); + enterRule(_localctx, 164, HogQLParser::RuleString); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11689,19 +11776,19 @@ HogQLParser::StringContext* HogQLParser::string() { exitRule(); }); try { - setState(1268); + setState(1276); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::STRING_LITERAL: { enterOuterAlt(_localctx, 1); - setState(1266); + setState(1274); match(HogQLParser::STRING_LITERAL); break; } case HogQLParser::QUOTE_SINGLE_TEMPLATE: { enterOuterAlt(_localctx, 2); - setState(1267); + setState(1275); templateString(); break; } @@ -11757,7 +11844,7 @@ std::any HogQLParser::TemplateStringContext::accept(tree::ParseTreeVisitor *visi HogQLParser::TemplateStringContext* HogQLParser::templateString() { TemplateStringContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 164, HogQLParser::RuleTemplateString); + enterRule(_localctx, 166, HogQLParser::RuleTemplateString); size_t _la = 0; #if __cplusplus > 201703L @@ -11769,21 +11856,21 @@ HogQLParser::TemplateStringContext* HogQLParser::templateString() { }); try { enterOuterAlt(_localctx, 1); - setState(1270); + setState(1278); match(HogQLParser::QUOTE_SINGLE_TEMPLATE); - setState(1274); + setState(1282); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::STRING_TEXT || _la == HogQLParser::STRING_ESCAPE_TRIGGER) { - setState(1271); + setState(1279); stringContents(); - setState(1276); + setState(1284); _errHandler->sync(this); _la = _input->LA(1); } - setState(1277); + setState(1285); match(HogQLParser::QUOTE_SINGLE); } @@ -11833,7 +11920,7 @@ std::any HogQLParser::StringContentsContext::accept(tree::ParseTreeVisitor *visi HogQLParser::StringContentsContext* HogQLParser::stringContents() { StringContentsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 166, HogQLParser::RuleStringContents); + enterRule(_localctx, 168, HogQLParser::RuleStringContents); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11843,23 +11930,23 @@ HogQLParser::StringContentsContext* HogQLParser::stringContents() { exitRule(); }); try { - setState(1284); + setState(1292); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::STRING_ESCAPE_TRIGGER: { enterOuterAlt(_localctx, 1); - setState(1279); + setState(1287); match(HogQLParser::STRING_ESCAPE_TRIGGER); - setState(1280); + setState(1288); columnExpr(0); - setState(1281); + setState(1289); match(HogQLParser::RBRACE); break; } case HogQLParser::STRING_TEXT: { enterOuterAlt(_localctx, 2); - setState(1283); + setState(1291); match(HogQLParser::STRING_TEXT); break; } @@ -11915,7 +12002,7 @@ std::any HogQLParser::FullTemplateStringContext::accept(tree::ParseTreeVisitor * HogQLParser::FullTemplateStringContext* HogQLParser::fullTemplateString() { FullTemplateStringContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 168, HogQLParser::RuleFullTemplateString); + enterRule(_localctx, 170, HogQLParser::RuleFullTemplateString); size_t _la = 0; #if __cplusplus > 201703L @@ -11927,21 +12014,21 @@ HogQLParser::FullTemplateStringContext* HogQLParser::fullTemplateString() { }); try { enterOuterAlt(_localctx, 1); - setState(1286); + setState(1294); match(HogQLParser::QUOTE_SINGLE_TEMPLATE_FULL); - setState(1290); + setState(1298); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::FULL_STRING_TEXT || _la == HogQLParser::FULL_STRING_ESCAPE_TRIGGER) { - setState(1287); + setState(1295); stringContentsFull(); - setState(1292); + setState(1300); _errHandler->sync(this); _la = _input->LA(1); } - setState(1293); + setState(1301); match(HogQLParser::EOF); } @@ -11991,7 +12078,7 @@ std::any HogQLParser::StringContentsFullContext::accept(tree::ParseTreeVisitor * HogQLParser::StringContentsFullContext* HogQLParser::stringContentsFull() { StringContentsFullContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 170, HogQLParser::RuleStringContentsFull); + enterRule(_localctx, 172, HogQLParser::RuleStringContentsFull); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12001,23 +12088,23 @@ HogQLParser::StringContentsFullContext* HogQLParser::stringContentsFull() { exitRule(); }); try { - setState(1300); + setState(1308); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::FULL_STRING_ESCAPE_TRIGGER: { enterOuterAlt(_localctx, 1); - setState(1295); + setState(1303); match(HogQLParser::FULL_STRING_ESCAPE_TRIGGER); - setState(1296); + setState(1304); columnExpr(0); - setState(1297); + setState(1305); match(HogQLParser::RBRACE); break; } case HogQLParser::FULL_STRING_TEXT: { enterOuterAlt(_localctx, 2); - setState(1299); + setState(1307); match(HogQLParser::FULL_STRING_TEXT); break; } @@ -12038,9 +12125,9 @@ HogQLParser::StringContentsFullContext* HogQLParser::stringContentsFull() { bool HogQLParser::sempred(RuleContext *context, size_t ruleIndex, size_t predicateIndex) { switch (ruleIndex) { - case 39: return joinExprSempred(antlrcpp::downCast(context), predicateIndex); - case 58: return columnExprSempred(antlrcpp::downCast(context), predicateIndex); - case 66: return tableExprSempred(antlrcpp::downCast(context), predicateIndex); + case 40: return joinExprSempred(antlrcpp::downCast(context), predicateIndex); + case 59: return columnExprSempred(antlrcpp::downCast(context), predicateIndex); + case 67: return tableExprSempred(antlrcpp::downCast(context), predicateIndex); default: break; diff --git a/hogql_parser/HogQLParser.h b/hogql_parser/HogQLParser.h index f607422676954..4c59a3bdc4209 100644 --- a/hogql_parser/HogQLParser.h +++ b/hogql_parser/HogQLParser.h @@ -16,32 +16,33 @@ class HogQLParser : public antlr4::Parser { ASOF = 8, BETWEEN = 9, BOTH = 10, BY = 11, CASE = 12, CAST = 13, CATCH = 14, COHORT = 15, COLLATE = 16, CROSS = 17, CUBE = 18, CURRENT = 19, DATE = 20, DAY = 21, DESC = 22, DESCENDING = 23, DISTINCT = 24, ELSE = 25, END = 26, - EXTRACT = 27, FINAL = 28, FINALLY = 29, FIRST = 30, FN = 31, FOLLOWING = 32, - FOR = 33, FROM = 34, FULL = 35, FUN = 36, GROUP = 37, HAVING = 38, HOUR = 39, - ID = 40, IF = 41, ILIKE = 42, IN = 43, INF = 44, INNER = 45, INTERVAL = 46, - IS = 47, JOIN = 48, KEY = 49, LAST = 50, LEADING = 51, LEFT = 52, LET = 53, - LIKE = 54, LIMIT = 55, MINUTE = 56, MONTH = 57, NAN_SQL = 58, NOT = 59, - NULL_SQL = 60, NULLS = 61, OFFSET = 62, ON = 63, OR = 64, ORDER = 65, - OUTER = 66, OVER = 67, PARTITION = 68, PRECEDING = 69, PREWHERE = 70, - QUARTER = 71, RANGE = 72, RETURN = 73, RIGHT = 74, ROLLUP = 75, ROW = 76, - ROWS = 77, SAMPLE = 78, SECOND = 79, SELECT = 80, SEMI = 81, SETTINGS = 82, - SUBSTRING = 83, THEN = 84, THROW = 85, TIES = 86, TIMESTAMP = 87, TO = 88, - TOP = 89, TOTALS = 90, TRAILING = 91, TRIM = 92, TRUNCATE = 93, TRY = 94, - UNBOUNDED = 95, UNION = 96, USING = 97, WEEK = 98, WHEN = 99, WHERE = 100, - WHILE = 101, WINDOW = 102, WITH = 103, YEAR = 104, ESCAPE_CHAR_COMMON = 105, - IDENTIFIER = 106, FLOATING_LITERAL = 107, OCTAL_LITERAL = 108, DECIMAL_LITERAL = 109, - HEXADECIMAL_LITERAL = 110, STRING_LITERAL = 111, ARROW = 112, ASTERISK = 113, - BACKQUOTE = 114, BACKSLASH = 115, COLON = 116, COMMA = 117, CONCAT = 118, - DASH = 119, DOLLAR = 120, DOT = 121, EQ_DOUBLE = 122, EQ_SINGLE = 123, - GT_EQ = 124, GT = 125, HASH = 126, IREGEX_SINGLE = 127, IREGEX_DOUBLE = 128, - LBRACE = 129, LBRACKET = 130, LPAREN = 131, LT_EQ = 132, LT = 133, NOT_EQ = 134, - NOT_IREGEX = 135, NOT_REGEX = 136, NULL_PROPERTY = 137, NULLISH = 138, - PERCENT = 139, PLUS = 140, QUERY = 141, QUOTE_DOUBLE = 142, QUOTE_SINGLE_TEMPLATE = 143, - QUOTE_SINGLE_TEMPLATE_FULL = 144, QUOTE_SINGLE = 145, REGEX_SINGLE = 146, - REGEX_DOUBLE = 147, RBRACE = 148, RBRACKET = 149, RPAREN = 150, SEMICOLON = 151, - SLASH = 152, UNDERSCORE = 153, MULTI_LINE_COMMENT = 154, SINGLE_LINE_COMMENT = 155, - WHITESPACE = 156, STRING_TEXT = 157, STRING_ESCAPE_TRIGGER = 158, FULL_STRING_TEXT = 159, - FULL_STRING_ESCAPE_TRIGGER = 160 + EXCEPT = 27, EXTRACT = 28, FINAL = 29, FINALLY = 30, FIRST = 31, FN = 32, + FOLLOWING = 33, FOR = 34, FROM = 35, FULL = 36, FUN = 37, GROUP = 38, + HAVING = 39, HOUR = 40, ID = 41, IF = 42, ILIKE = 43, IN = 44, INF = 45, + INNER = 46, INTERSECT = 47, INTERVAL = 48, IS = 49, JOIN = 50, KEY = 51, + LAST = 52, LEADING = 53, LEFT = 54, LET = 55, LIKE = 56, LIMIT = 57, + MINUTE = 58, MONTH = 59, NAN_SQL = 60, NOT = 61, NULL_SQL = 62, NULLS = 63, + OFFSET = 64, ON = 65, OR = 66, ORDER = 67, OUTER = 68, OVER = 69, PARTITION = 70, + PRECEDING = 71, PREWHERE = 72, QUARTER = 73, RANGE = 74, RETURN = 75, + RIGHT = 76, ROLLUP = 77, ROW = 78, ROWS = 79, SAMPLE = 80, SECOND = 81, + SELECT = 82, SEMI = 83, SETTINGS = 84, SUBSTRING = 85, THEN = 86, THROW = 87, + TIES = 88, TIMESTAMP = 89, TO = 90, TOP = 91, TOTALS = 92, TRAILING = 93, + TRIM = 94, TRUNCATE = 95, TRY = 96, UNBOUNDED = 97, UNION = 98, USING = 99, + WEEK = 100, WHEN = 101, WHERE = 102, WHILE = 103, WINDOW = 104, WITH = 105, + YEAR = 106, ESCAPE_CHAR_COMMON = 107, IDENTIFIER = 108, FLOATING_LITERAL = 109, + OCTAL_LITERAL = 110, DECIMAL_LITERAL = 111, HEXADECIMAL_LITERAL = 112, + STRING_LITERAL = 113, ARROW = 114, ASTERISK = 115, BACKQUOTE = 116, + BACKSLASH = 117, COLON = 118, COMMA = 119, CONCAT = 120, DASH = 121, + DOLLAR = 122, DOT = 123, EQ_DOUBLE = 124, EQ_SINGLE = 125, GT_EQ = 126, + GT = 127, HASH = 128, IREGEX_SINGLE = 129, IREGEX_DOUBLE = 130, LBRACE = 131, + LBRACKET = 132, LPAREN = 133, LT_EQ = 134, LT = 135, NOT_EQ = 136, NOT_IREGEX = 137, + NOT_REGEX = 138, NULL_PROPERTY = 139, NULLISH = 140, PERCENT = 141, + PLUS = 142, QUERY = 143, QUOTE_DOUBLE = 144, QUOTE_SINGLE_TEMPLATE = 145, + QUOTE_SINGLE_TEMPLATE_FULL = 146, QUOTE_SINGLE = 147, REGEX_SINGLE = 148, + REGEX_DOUBLE = 149, RBRACE = 150, RBRACKET = 151, RPAREN = 152, SEMICOLON = 153, + SLASH = 154, UNDERSCORE = 155, MULTI_LINE_COMMENT = 156, SINGLE_LINE_COMMENT = 157, + WHITESPACE = 158, STRING_TEXT = 159, STRING_ESCAPE_TRIGGER = 160, FULL_STRING_TEXT = 161, + FULL_STRING_ESCAPE_TRIGGER = 162 }; enum { @@ -50,26 +51,27 @@ class HogQLParser : public antlr4::Parser { RuleCatchBlock = 8, RuleTryCatchStmt = 9, RuleIfStmt = 10, RuleWhileStmt = 11, RuleForStmt = 12, RuleForInStmt = 13, RuleFuncStmt = 14, RuleVarAssignment = 15, RuleExprStmt = 16, RuleEmptyStmt = 17, RuleBlock = 18, RuleKvPair = 19, - RuleKvPairList = 20, RuleSelect = 21, RuleSelectUnionStmt = 22, RuleSelectStmtWithParens = 23, - RuleSelectStmt = 24, RuleWithClause = 25, RuleTopClause = 26, RuleFromClause = 27, - RuleArrayJoinClause = 28, RuleWindowClause = 29, RulePrewhereClause = 30, - RuleWhereClause = 31, RuleGroupByClause = 32, RuleHavingClause = 33, - RuleOrderByClause = 34, RuleProjectionOrderByClause = 35, RuleLimitAndOffsetClause = 36, - RuleOffsetOnlyClause = 37, RuleSettingsClause = 38, RuleJoinExpr = 39, - RuleJoinOp = 40, RuleJoinOpCross = 41, RuleJoinConstraintClause = 42, - RuleSampleClause = 43, RuleOrderExprList = 44, RuleOrderExpr = 45, RuleRatioExpr = 46, - RuleSettingExprList = 47, RuleSettingExpr = 48, RuleWindowExpr = 49, - RuleWinPartitionByClause = 50, RuleWinOrderByClause = 51, RuleWinFrameClause = 52, - RuleWinFrameExtend = 53, RuleWinFrameBound = 54, RuleExpr = 55, RuleColumnTypeExpr = 56, - RuleColumnExprList = 57, RuleColumnExpr = 58, RuleColumnLambdaExpr = 59, - RuleHogqlxTagElement = 60, RuleHogqlxTagAttribute = 61, RuleWithExprList = 62, - RuleWithExpr = 63, RuleColumnIdentifier = 64, RuleNestedIdentifier = 65, - RuleTableExpr = 66, RuleTableFunctionExpr = 67, RuleTableIdentifier = 68, - RuleTableArgList = 69, RuleDatabaseIdentifier = 70, RuleFloatingLiteral = 71, - RuleNumberLiteral = 72, RuleLiteral = 73, RuleInterval = 74, RuleKeyword = 75, - RuleKeywordForAlias = 76, RuleAlias = 77, RuleIdentifier = 78, RuleEnumValue = 79, - RulePlaceholder = 80, RuleString = 81, RuleTemplateString = 82, RuleStringContents = 83, - RuleFullTemplateString = 84, RuleStringContentsFull = 85 + RuleKvPairList = 20, RuleSelect = 21, RuleSelectStmtWithParens = 22, + RuleSubsequentSelectSetClause = 23, RuleSelectSetStmt = 24, RuleSelectStmt = 25, + RuleWithClause = 26, RuleTopClause = 27, RuleFromClause = 28, RuleArrayJoinClause = 29, + RuleWindowClause = 30, RulePrewhereClause = 31, RuleWhereClause = 32, + RuleGroupByClause = 33, RuleHavingClause = 34, RuleOrderByClause = 35, + RuleProjectionOrderByClause = 36, RuleLimitAndOffsetClause = 37, RuleOffsetOnlyClause = 38, + RuleSettingsClause = 39, RuleJoinExpr = 40, RuleJoinOp = 41, RuleJoinOpCross = 42, + RuleJoinConstraintClause = 43, RuleSampleClause = 44, RuleOrderExprList = 45, + RuleOrderExpr = 46, RuleRatioExpr = 47, RuleSettingExprList = 48, RuleSettingExpr = 49, + RuleWindowExpr = 50, RuleWinPartitionByClause = 51, RuleWinOrderByClause = 52, + RuleWinFrameClause = 53, RuleWinFrameExtend = 54, RuleWinFrameBound = 55, + RuleExpr = 56, RuleColumnTypeExpr = 57, RuleColumnExprList = 58, RuleColumnExpr = 59, + RuleColumnLambdaExpr = 60, RuleHogqlxTagElement = 61, RuleHogqlxTagAttribute = 62, + RuleWithExprList = 63, RuleWithExpr = 64, RuleColumnIdentifier = 65, + RuleNestedIdentifier = 66, RuleTableExpr = 67, RuleTableFunctionExpr = 68, + RuleTableIdentifier = 69, RuleTableArgList = 70, RuleDatabaseIdentifier = 71, + RuleFloatingLiteral = 72, RuleNumberLiteral = 73, RuleLiteral = 74, + RuleInterval = 75, RuleKeyword = 76, RuleKeywordForAlias = 77, RuleAlias = 78, + RuleIdentifier = 79, RuleEnumValue = 80, RulePlaceholder = 81, RuleString = 82, + RuleTemplateString = 83, RuleStringContents = 84, RuleFullTemplateString = 85, + RuleStringContentsFull = 86 }; explicit HogQLParser(antlr4::TokenStream *input); @@ -111,8 +113,9 @@ class HogQLParser : public antlr4::Parser { class KvPairContext; class KvPairListContext; class SelectContext; - class SelectUnionStmtContext; class SelectStmtWithParensContext; + class SubsequentSelectSetClauseContext; + class SelectSetStmtContext; class SelectStmtContext; class WithClauseContext; class TopClauseContext; @@ -552,7 +555,7 @@ class HogQLParser : public antlr4::Parser { SelectContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; antlr4::tree::TerminalNode *EOF(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); SelectStmtContext *selectStmt(); HogqlxTagElementContext *hogqlxTagElement(); @@ -563,40 +566,54 @@ class HogQLParser : public antlr4::Parser { SelectContext* select(); - class SelectUnionStmtContext : public antlr4::ParserRuleContext { + class SelectStmtWithParensContext : public antlr4::ParserRuleContext { public: - SelectUnionStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState); + SelectStmtWithParensContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; - std::vector selectStmtWithParens(); - SelectStmtWithParensContext* selectStmtWithParens(size_t i); - std::vector UNION(); - antlr4::tree::TerminalNode* UNION(size_t i); - std::vector ALL(); - antlr4::tree::TerminalNode* ALL(size_t i); + SelectStmtContext *selectStmt(); + antlr4::tree::TerminalNode *LPAREN(); + SelectSetStmtContext *selectSetStmt(); + antlr4::tree::TerminalNode *RPAREN(); + PlaceholderContext *placeholder(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; - SelectUnionStmtContext* selectUnionStmt(); + SelectStmtWithParensContext* selectStmtWithParens(); - class SelectStmtWithParensContext : public antlr4::ParserRuleContext { + class SubsequentSelectSetClauseContext : public antlr4::ParserRuleContext { public: - SelectStmtWithParensContext(antlr4::ParserRuleContext *parent, size_t invokingState); + SubsequentSelectSetClauseContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; - SelectStmtContext *selectStmt(); - antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); - antlr4::tree::TerminalNode *RPAREN(); - PlaceholderContext *placeholder(); + SelectStmtWithParensContext *selectStmtWithParens(); + antlr4::tree::TerminalNode *EXCEPT(); + antlr4::tree::TerminalNode *UNION(); + antlr4::tree::TerminalNode *ALL(); + antlr4::tree::TerminalNode *INTERSECT(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; - SelectStmtWithParensContext* selectStmtWithParens(); + SubsequentSelectSetClauseContext* subsequentSelectSetClause(); + + class SelectSetStmtContext : public antlr4::ParserRuleContext { + public: + SelectSetStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + SelectStmtWithParensContext *selectStmtWithParens(); + std::vector subsequentSelectSetClause(); + SubsequentSelectSetClauseContext* subsequentSelectSetClause(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + SelectSetStmtContext* selectSetStmt(); class SelectStmtContext : public antlr4::ParserRuleContext { public: @@ -1398,7 +1415,7 @@ class HogQLParser : public antlr4::Parser { ColumnExprSubqueryContext(ColumnExprContext *ctx); antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); antlr4::tree::TerminalNode *RPAREN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; @@ -1999,7 +2016,7 @@ class HogQLParser : public antlr4::Parser { IdentifierContext *identifier(); antlr4::tree::TerminalNode *AS(); antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); antlr4::tree::TerminalNode *RPAREN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; @@ -2084,7 +2101,7 @@ class HogQLParser : public antlr4::Parser { TableExprSubqueryContext(TableExprContext *ctx); antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); antlr4::tree::TerminalNode *RPAREN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; diff --git a/hogql_parser/HogQLParser.interp b/hogql_parser/HogQLParser.interp index 86b5777f1ff22..4308ee42ae9b9 100644 --- a/hogql_parser/HogQLParser.interp +++ b/hogql_parser/HogQLParser.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -347,8 +351,9 @@ block kvPair kvPairList select -selectUnionStmt selectStmtWithParens +subsequentSelectSetClause +selectSetStmt selectStmt withClause topClause @@ -414,4 +419,4 @@ stringContentsFull atn: -[4, 1, 160, 1303, 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, 1, 0, 5, 0, 174, 8, 0, 10, 0, 12, 0, 177, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 183, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 192, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 197, 8, 4, 10, 4, 12, 4, 200, 9, 4, 1, 4, 3, 4, 203, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 217, 8, 5, 1, 6, 1, 6, 3, 6, 221, 8, 6, 1, 6, 3, 6, 224, 8, 6, 1, 7, 1, 7, 3, 7, 228, 8, 7, 1, 7, 3, 7, 231, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 238, 8, 8, 1, 8, 1, 8, 3, 8, 242, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 249, 8, 9, 10, 9, 12, 9, 252, 9, 9, 1, 9, 1, 9, 3, 9, 256, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 265, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 273, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 280, 8, 12, 1, 12, 1, 12, 3, 12, 284, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 290, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 295, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 303, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 310, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 316, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 328, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 334, 8, 18, 10, 18, 12, 18, 337, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 348, 8, 20, 10, 20, 12, 20, 351, 9, 20, 1, 20, 3, 20, 354, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 359, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 367, 8, 22, 10, 22, 12, 22, 370, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 378, 8, 23, 1, 24, 3, 24, 381, 8, 24, 1, 24, 1, 24, 3, 24, 385, 8, 24, 1, 24, 3, 24, 388, 8, 24, 1, 24, 1, 24, 3, 24, 392, 8, 24, 1, 24, 3, 24, 395, 8, 24, 1, 24, 3, 24, 398, 8, 24, 1, 24, 3, 24, 401, 8, 24, 1, 24, 3, 24, 404, 8, 24, 1, 24, 1, 24, 3, 24, 408, 8, 24, 1, 24, 1, 24, 3, 24, 412, 8, 24, 1, 24, 3, 24, 415, 8, 24, 1, 24, 3, 24, 418, 8, 24, 1, 24, 3, 24, 421, 8, 24, 1, 24, 1, 24, 3, 24, 425, 8, 24, 1, 24, 3, 24, 428, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 437, 8, 26, 1, 27, 1, 27, 1, 27, 1, 28, 3, 28, 443, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 462, 8, 29, 10, 29, 12, 29, 465, 9, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 481, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 498, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 504, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 510, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 521, 8, 36, 3, 36, 523, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 534, 8, 39, 1, 39, 3, 39, 537, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 543, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 551, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 557, 8, 39, 10, 39, 12, 39, 560, 9, 39, 1, 40, 3, 40, 563, 8, 40, 1, 40, 1, 40, 1, 40, 3, 40, 568, 8, 40, 1, 40, 3, 40, 571, 8, 40, 1, 40, 3, 40, 574, 8, 40, 1, 40, 1, 40, 3, 40, 578, 8, 40, 1, 40, 1, 40, 3, 40, 582, 8, 40, 1, 40, 3, 40, 585, 8, 40, 3, 40, 587, 8, 40, 1, 40, 3, 40, 590, 8, 40, 1, 40, 1, 40, 3, 40, 594, 8, 40, 1, 40, 1, 40, 3, 40, 598, 8, 40, 1, 40, 3, 40, 601, 8, 40, 3, 40, 603, 8, 40, 3, 40, 605, 8, 40, 1, 41, 1, 41, 1, 41, 3, 41, 610, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 621, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 627, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 632, 8, 44, 10, 44, 12, 44, 635, 9, 44, 1, 45, 1, 45, 3, 45, 639, 8, 45, 1, 45, 1, 45, 3, 45, 643, 8, 45, 1, 45, 1, 45, 3, 45, 647, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 653, 8, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 5, 47, 660, 8, 47, 10, 47, 12, 47, 663, 9, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 3, 49, 670, 8, 49, 1, 49, 3, 49, 673, 8, 49, 1, 49, 3, 49, 676, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 695, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 709, 8, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 723, 8, 56, 10, 56, 12, 56, 726, 9, 56, 1, 56, 3, 56, 729, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 738, 8, 56, 10, 56, 12, 56, 741, 9, 56, 1, 56, 3, 56, 744, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 753, 8, 56, 10, 56, 12, 56, 756, 9, 56, 1, 56, 3, 56, 759, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 766, 8, 56, 1, 56, 1, 56, 3, 56, 770, 8, 56, 1, 57, 1, 57, 1, 57, 5, 57, 775, 8, 57, 10, 57, 12, 57, 778, 9, 57, 1, 57, 3, 57, 781, 8, 57, 1, 58, 1, 58, 1, 58, 3, 58, 786, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 793, 8, 58, 11, 58, 12, 58, 794, 1, 58, 1, 58, 3, 58, 799, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 823, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 840, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 846, 8, 58, 1, 58, 3, 58, 849, 8, 58, 1, 58, 3, 58, 852, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 862, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 868, 8, 58, 1, 58, 3, 58, 871, 8, 58, 1, 58, 3, 58, 874, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 882, 8, 58, 1, 58, 3, 58, 885, 8, 58, 1, 58, 1, 58, 3, 58, 889, 8, 58, 1, 58, 3, 58, 892, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 906, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 923, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 928, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 933, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 939, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 946, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 958, 8, 58, 1, 58, 1, 58, 3, 58, 962, 8, 58, 1, 58, 3, 58, 965, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 974, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 988, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1004, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1033, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1041, 8, 58, 5, 58, 1043, 8, 58, 10, 58, 12, 58, 1046, 9, 58, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1052, 8, 59, 10, 59, 12, 59, 1055, 9, 59, 1, 59, 3, 59, 1058, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1065, 8, 59, 10, 59, 12, 59, 1068, 9, 59, 1, 59, 3, 59, 1071, 8, 59, 1, 59, 1, 59, 3, 59, 1075, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1080, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 1085, 8, 60, 10, 60, 12, 60, 1088, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1096, 8, 60, 10, 60, 12, 60, 1099, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1107, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1114, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1127, 8, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1132, 8, 62, 10, 62, 12, 62, 1135, 9, 62, 1, 62, 3, 62, 1138, 8, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1150, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1156, 8, 64, 1, 64, 3, 64, 1159, 8, 64, 1, 65, 1, 65, 1, 65, 5, 65, 1164, 8, 65, 10, 65, 12, 65, 1167, 9, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1178, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1184, 8, 66, 5, 66, 1186, 8, 66, 10, 66, 12, 66, 1189, 9, 66, 1, 67, 1, 67, 1, 67, 3, 67, 1194, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1201, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 1208, 8, 69, 10, 69, 12, 69, 1211, 9, 69, 1, 69, 3, 69, 1214, 8, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1224, 8, 71, 3, 71, 1226, 8, 71, 1, 72, 3, 72, 1229, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1237, 8, 72, 1, 73, 1, 73, 1, 73, 3, 73, 1242, 8, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 3, 77, 1252, 8, 77, 1, 78, 1, 78, 1, 78, 3, 78, 1257, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 3, 81, 1269, 8, 81, 1, 82, 1, 82, 5, 82, 1273, 8, 82, 10, 82, 12, 82, 1276, 9, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1285, 8, 83, 1, 84, 1, 84, 5, 84, 1289, 8, 84, 10, 84, 12, 84, 1292, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 1301, 8, 85, 1, 85, 0, 3, 78, 116, 132, 86, 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, 0, 17, 2, 0, 31, 31, 36, 36, 2, 0, 18, 18, 75, 75, 2, 0, 45, 45, 52, 52, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 81, 81, 2, 0, 52, 52, 74, 74, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 30, 30, 50, 50, 2, 0, 72, 72, 77, 77, 3, 0, 10, 10, 51, 51, 91, 91, 2, 0, 42, 42, 54, 54, 1, 0, 108, 109, 2, 0, 119, 119, 140, 140, 7, 0, 21, 21, 39, 39, 56, 57, 71, 71, 79, 79, 98, 98, 104, 104, 17, 0, 1, 13, 15, 20, 22, 28, 30, 30, 32, 35, 37, 38, 40, 43, 45, 52, 54, 55, 59, 59, 61, 70, 72, 78, 80, 84, 86, 93, 95, 97, 99, 100, 102, 103, 4, 0, 20, 20, 30, 30, 40, 40, 49, 49, 1475, 0, 175, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 4, 184, 1, 0, 0, 0, 6, 186, 1, 0, 0, 0, 8, 193, 1, 0, 0, 0, 10, 216, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 225, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 245, 1, 0, 0, 0, 20, 257, 1, 0, 0, 0, 22, 266, 1, 0, 0, 0, 24, 274, 1, 0, 0, 0, 26, 296, 1, 0, 0, 0, 28, 311, 1, 0, 0, 0, 30, 320, 1, 0, 0, 0, 32, 325, 1, 0, 0, 0, 34, 329, 1, 0, 0, 0, 36, 331, 1, 0, 0, 0, 38, 340, 1, 0, 0, 0, 40, 344, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 362, 1, 0, 0, 0, 46, 377, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 429, 1, 0, 0, 0, 52, 432, 1, 0, 0, 0, 54, 438, 1, 0, 0, 0, 56, 442, 1, 0, 0, 0, 58, 448, 1, 0, 0, 0, 60, 466, 1, 0, 0, 0, 62, 469, 1, 0, 0, 0, 64, 472, 1, 0, 0, 0, 66, 482, 1, 0, 0, 0, 68, 485, 1, 0, 0, 0, 70, 489, 1, 0, 0, 0, 72, 522, 1, 0, 0, 0, 74, 524, 1, 0, 0, 0, 76, 527, 1, 0, 0, 0, 78, 542, 1, 0, 0, 0, 80, 604, 1, 0, 0, 0, 82, 609, 1, 0, 0, 0, 84, 620, 1, 0, 0, 0, 86, 622, 1, 0, 0, 0, 88, 628, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 654, 1, 0, 0, 0, 94, 656, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 669, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 681, 1, 0, 0, 0, 104, 685, 1, 0, 0, 0, 106, 694, 1, 0, 0, 0, 108, 708, 1, 0, 0, 0, 110, 710, 1, 0, 0, 0, 112, 769, 1, 0, 0, 0, 114, 771, 1, 0, 0, 0, 116, 932, 1, 0, 0, 0, 118, 1074, 1, 0, 0, 0, 120, 1113, 1, 0, 0, 0, 122, 1126, 1, 0, 0, 0, 124, 1128, 1, 0, 0, 0, 126, 1149, 1, 0, 0, 0, 128, 1158, 1, 0, 0, 0, 130, 1160, 1, 0, 0, 0, 132, 1177, 1, 0, 0, 0, 134, 1190, 1, 0, 0, 0, 136, 1200, 1, 0, 0, 0, 138, 1204, 1, 0, 0, 0, 140, 1215, 1, 0, 0, 0, 142, 1225, 1, 0, 0, 0, 144, 1228, 1, 0, 0, 0, 146, 1241, 1, 0, 0, 0, 148, 1243, 1, 0, 0, 0, 150, 1245, 1, 0, 0, 0, 152, 1247, 1, 0, 0, 0, 154, 1251, 1, 0, 0, 0, 156, 1256, 1, 0, 0, 0, 158, 1258, 1, 0, 0, 0, 160, 1262, 1, 0, 0, 0, 162, 1268, 1, 0, 0, 0, 164, 1270, 1, 0, 0, 0, 166, 1284, 1, 0, 0, 0, 168, 1286, 1, 0, 0, 0, 170, 1300, 1, 0, 0, 0, 172, 174, 3, 2, 1, 0, 173, 172, 1, 0, 0, 0, 174, 177, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 178, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 178, 179, 5, 0, 0, 1, 179, 1, 1, 0, 0, 0, 180, 183, 3, 6, 3, 0, 181, 183, 3, 10, 5, 0, 182, 180, 1, 0, 0, 0, 182, 181, 1, 0, 0, 0, 183, 3, 1, 0, 0, 0, 184, 185, 3, 116, 58, 0, 185, 5, 1, 0, 0, 0, 186, 187, 5, 53, 0, 0, 187, 191, 3, 156, 78, 0, 188, 189, 5, 116, 0, 0, 189, 190, 5, 123, 0, 0, 190, 192, 3, 4, 2, 0, 191, 188, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 7, 1, 0, 0, 0, 193, 198, 3, 156, 78, 0, 194, 195, 5, 117, 0, 0, 195, 197, 3, 156, 78, 0, 196, 194, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 203, 5, 117, 0, 0, 202, 201, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 217, 3, 12, 6, 0, 205, 217, 3, 14, 7, 0, 206, 217, 3, 18, 9, 0, 207, 217, 3, 20, 10, 0, 208, 217, 3, 22, 11, 0, 209, 217, 3, 26, 13, 0, 210, 217, 3, 24, 12, 0, 211, 217, 3, 28, 14, 0, 212, 217, 3, 30, 15, 0, 213, 217, 3, 36, 18, 0, 214, 217, 3, 32, 16, 0, 215, 217, 3, 34, 17, 0, 216, 204, 1, 0, 0, 0, 216, 205, 1, 0, 0, 0, 216, 206, 1, 0, 0, 0, 216, 207, 1, 0, 0, 0, 216, 208, 1, 0, 0, 0, 216, 209, 1, 0, 0, 0, 216, 210, 1, 0, 0, 0, 216, 211, 1, 0, 0, 0, 216, 212, 1, 0, 0, 0, 216, 213, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 215, 1, 0, 0, 0, 217, 11, 1, 0, 0, 0, 218, 220, 5, 73, 0, 0, 219, 221, 3, 4, 2, 0, 220, 219, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 223, 1, 0, 0, 0, 222, 224, 5, 151, 0, 0, 223, 222, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, 13, 1, 0, 0, 0, 225, 227, 5, 85, 0, 0, 226, 228, 3, 4, 2, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 230, 1, 0, 0, 0, 229, 231, 5, 151, 0, 0, 230, 229, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 15, 1, 0, 0, 0, 232, 241, 5, 14, 0, 0, 233, 234, 5, 131, 0, 0, 234, 237, 3, 156, 78, 0, 235, 236, 5, 116, 0, 0, 236, 238, 3, 156, 78, 0, 237, 235, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 5, 150, 0, 0, 240, 242, 1, 0, 0, 0, 241, 233, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 3, 36, 18, 0, 244, 17, 1, 0, 0, 0, 245, 246, 5, 94, 0, 0, 246, 250, 3, 36, 18, 0, 247, 249, 3, 16, 8, 0, 248, 247, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 255, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 254, 5, 29, 0, 0, 254, 256, 3, 36, 18, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 19, 1, 0, 0, 0, 257, 258, 5, 41, 0, 0, 258, 259, 5, 131, 0, 0, 259, 260, 3, 4, 2, 0, 260, 261, 5, 150, 0, 0, 261, 264, 3, 10, 5, 0, 262, 263, 5, 25, 0, 0, 263, 265, 3, 10, 5, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 21, 1, 0, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 131, 0, 0, 268, 269, 3, 4, 2, 0, 269, 270, 5, 150, 0, 0, 270, 272, 3, 10, 5, 0, 271, 273, 5, 151, 0, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 23, 1, 0, 0, 0, 274, 275, 5, 33, 0, 0, 275, 279, 5, 131, 0, 0, 276, 280, 3, 6, 3, 0, 277, 280, 3, 30, 15, 0, 278, 280, 3, 4, 2, 0, 279, 276, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 278, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 5, 151, 0, 0, 282, 284, 3, 4, 2, 0, 283, 282, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 289, 5, 151, 0, 0, 286, 290, 3, 6, 3, 0, 287, 290, 3, 30, 15, 0, 288, 290, 3, 4, 2, 0, 289, 286, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 5, 150, 0, 0, 292, 294, 3, 10, 5, 0, 293, 295, 5, 151, 0, 0, 294, 293, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 25, 1, 0, 0, 0, 296, 297, 5, 33, 0, 0, 297, 298, 5, 131, 0, 0, 298, 299, 5, 53, 0, 0, 299, 302, 3, 156, 78, 0, 300, 301, 5, 117, 0, 0, 301, 303, 3, 156, 78, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 305, 5, 43, 0, 0, 305, 306, 3, 4, 2, 0, 306, 307, 5, 150, 0, 0, 307, 309, 3, 10, 5, 0, 308, 310, 5, 151, 0, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 27, 1, 0, 0, 0, 311, 312, 7, 0, 0, 0, 312, 313, 3, 156, 78, 0, 313, 315, 5, 131, 0, 0, 314, 316, 3, 8, 4, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 318, 5, 150, 0, 0, 318, 319, 3, 36, 18, 0, 319, 29, 1, 0, 0, 0, 320, 321, 3, 4, 2, 0, 321, 322, 5, 116, 0, 0, 322, 323, 5, 123, 0, 0, 323, 324, 3, 4, 2, 0, 324, 31, 1, 0, 0, 0, 325, 327, 3, 4, 2, 0, 326, 328, 5, 151, 0, 0, 327, 326, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 33, 1, 0, 0, 0, 329, 330, 5, 151, 0, 0, 330, 35, 1, 0, 0, 0, 331, 335, 5, 129, 0, 0, 332, 334, 3, 2, 1, 0, 333, 332, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 148, 0, 0, 339, 37, 1, 0, 0, 0, 340, 341, 3, 4, 2, 0, 341, 342, 5, 116, 0, 0, 342, 343, 3, 4, 2, 0, 343, 39, 1, 0, 0, 0, 344, 349, 3, 38, 19, 0, 345, 346, 5, 117, 0, 0, 346, 348, 3, 38, 19, 0, 347, 345, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 354, 5, 117, 0, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 41, 1, 0, 0, 0, 355, 359, 3, 44, 22, 0, 356, 359, 3, 48, 24, 0, 357, 359, 3, 120, 60, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 5, 0, 0, 1, 361, 43, 1, 0, 0, 0, 362, 368, 3, 46, 23, 0, 363, 364, 5, 96, 0, 0, 364, 365, 5, 1, 0, 0, 365, 367, 3, 46, 23, 0, 366, 363, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 45, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 378, 3, 48, 24, 0, 372, 373, 5, 131, 0, 0, 373, 374, 3, 44, 22, 0, 374, 375, 5, 150, 0, 0, 375, 378, 1, 0, 0, 0, 376, 378, 3, 160, 80, 0, 377, 371, 1, 0, 0, 0, 377, 372, 1, 0, 0, 0, 377, 376, 1, 0, 0, 0, 378, 47, 1, 0, 0, 0, 379, 381, 3, 50, 25, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 384, 5, 80, 0, 0, 383, 385, 5, 24, 0, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 388, 3, 52, 26, 0, 387, 386, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 391, 3, 114, 57, 0, 390, 392, 3, 54, 27, 0, 391, 390, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 395, 3, 56, 28, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 398, 3, 60, 30, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 400, 1, 0, 0, 0, 399, 401, 3, 62, 31, 0, 400, 399, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 403, 1, 0, 0, 0, 402, 404, 3, 64, 32, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 407, 1, 0, 0, 0, 405, 406, 5, 103, 0, 0, 406, 408, 7, 1, 0, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 410, 5, 103, 0, 0, 410, 412, 5, 90, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 1, 0, 0, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 417, 1, 0, 0, 0, 416, 418, 3, 58, 29, 0, 417, 416, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 420, 1, 0, 0, 0, 419, 421, 3, 68, 34, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 424, 1, 0, 0, 0, 422, 425, 3, 72, 36, 0, 423, 425, 3, 74, 37, 0, 424, 422, 1, 0, 0, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 427, 1, 0, 0, 0, 426, 428, 3, 76, 38, 0, 427, 426, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 49, 1, 0, 0, 0, 429, 430, 5, 103, 0, 0, 430, 431, 3, 124, 62, 0, 431, 51, 1, 0, 0, 0, 432, 433, 5, 89, 0, 0, 433, 436, 5, 109, 0, 0, 434, 435, 5, 103, 0, 0, 435, 437, 5, 86, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 53, 1, 0, 0, 0, 438, 439, 5, 34, 0, 0, 439, 440, 3, 78, 39, 0, 440, 55, 1, 0, 0, 0, 441, 443, 7, 2, 0, 0, 442, 441, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 5, 5, 0, 0, 445, 446, 5, 48, 0, 0, 446, 447, 3, 114, 57, 0, 447, 57, 1, 0, 0, 0, 448, 449, 5, 102, 0, 0, 449, 450, 3, 156, 78, 0, 450, 451, 5, 6, 0, 0, 451, 452, 5, 131, 0, 0, 452, 453, 3, 98, 49, 0, 453, 463, 5, 150, 0, 0, 454, 455, 5, 117, 0, 0, 455, 456, 3, 156, 78, 0, 456, 457, 5, 6, 0, 0, 457, 458, 5, 131, 0, 0, 458, 459, 3, 98, 49, 0, 459, 460, 5, 150, 0, 0, 460, 462, 1, 0, 0, 0, 461, 454, 1, 0, 0, 0, 462, 465, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 59, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 466, 467, 5, 70, 0, 0, 467, 468, 3, 116, 58, 0, 468, 61, 1, 0, 0, 0, 469, 470, 5, 100, 0, 0, 470, 471, 3, 116, 58, 0, 471, 63, 1, 0, 0, 0, 472, 473, 5, 37, 0, 0, 473, 480, 5, 11, 0, 0, 474, 475, 7, 1, 0, 0, 475, 476, 5, 131, 0, 0, 476, 477, 3, 114, 57, 0, 477, 478, 5, 150, 0, 0, 478, 481, 1, 0, 0, 0, 479, 481, 3, 114, 57, 0, 480, 474, 1, 0, 0, 0, 480, 479, 1, 0, 0, 0, 481, 65, 1, 0, 0, 0, 482, 483, 5, 38, 0, 0, 483, 484, 3, 116, 58, 0, 484, 67, 1, 0, 0, 0, 485, 486, 5, 65, 0, 0, 486, 487, 5, 11, 0, 0, 487, 488, 3, 88, 44, 0, 488, 69, 1, 0, 0, 0, 489, 490, 5, 65, 0, 0, 490, 491, 5, 11, 0, 0, 491, 492, 3, 114, 57, 0, 492, 71, 1, 0, 0, 0, 493, 494, 5, 55, 0, 0, 494, 497, 3, 116, 58, 0, 495, 496, 5, 117, 0, 0, 496, 498, 3, 116, 58, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 503, 1, 0, 0, 0, 499, 500, 5, 103, 0, 0, 500, 504, 5, 86, 0, 0, 501, 502, 5, 11, 0, 0, 502, 504, 3, 114, 57, 0, 503, 499, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 55, 0, 0, 506, 509, 3, 116, 58, 0, 507, 508, 5, 103, 0, 0, 508, 510, 5, 86, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 62, 0, 0, 512, 513, 3, 116, 58, 0, 513, 523, 1, 0, 0, 0, 514, 515, 5, 55, 0, 0, 515, 516, 3, 116, 58, 0, 516, 517, 5, 62, 0, 0, 517, 520, 3, 116, 58, 0, 518, 519, 5, 11, 0, 0, 519, 521, 3, 114, 57, 0, 520, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 523, 1, 0, 0, 0, 522, 493, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 514, 1, 0, 0, 0, 523, 73, 1, 0, 0, 0, 524, 525, 5, 62, 0, 0, 525, 526, 3, 116, 58, 0, 526, 75, 1, 0, 0, 0, 527, 528, 5, 82, 0, 0, 528, 529, 3, 94, 47, 0, 529, 77, 1, 0, 0, 0, 530, 531, 6, 39, -1, 0, 531, 533, 3, 132, 66, 0, 532, 534, 5, 28, 0, 0, 533, 532, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 536, 1, 0, 0, 0, 535, 537, 3, 86, 43, 0, 536, 535, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 543, 1, 0, 0, 0, 538, 539, 5, 131, 0, 0, 539, 540, 3, 78, 39, 0, 540, 541, 5, 150, 0, 0, 541, 543, 1, 0, 0, 0, 542, 530, 1, 0, 0, 0, 542, 538, 1, 0, 0, 0, 543, 558, 1, 0, 0, 0, 544, 545, 10, 3, 0, 0, 545, 546, 3, 82, 41, 0, 546, 547, 3, 78, 39, 4, 547, 557, 1, 0, 0, 0, 548, 550, 10, 4, 0, 0, 549, 551, 3, 80, 40, 0, 550, 549, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 553, 5, 48, 0, 0, 553, 554, 3, 78, 39, 0, 554, 555, 3, 84, 42, 0, 555, 557, 1, 0, 0, 0, 556, 544, 1, 0, 0, 0, 556, 548, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 79, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 561, 563, 7, 3, 0, 0, 562, 561, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 571, 5, 45, 0, 0, 565, 567, 5, 45, 0, 0, 566, 568, 7, 3, 0, 0, 567, 566, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 571, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 562, 1, 0, 0, 0, 570, 565, 1, 0, 0, 0, 570, 569, 1, 0, 0, 0, 571, 605, 1, 0, 0, 0, 572, 574, 7, 4, 0, 0, 573, 572, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 577, 7, 5, 0, 0, 576, 578, 5, 66, 0, 0, 577, 576, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 587, 1, 0, 0, 0, 579, 581, 7, 5, 0, 0, 580, 582, 5, 66, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 584, 1, 0, 0, 0, 583, 585, 7, 4, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 587, 1, 0, 0, 0, 586, 573, 1, 0, 0, 0, 586, 579, 1, 0, 0, 0, 587, 605, 1, 0, 0, 0, 588, 590, 7, 6, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 593, 5, 35, 0, 0, 592, 594, 5, 66, 0, 0, 593, 592, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 603, 1, 0, 0, 0, 595, 597, 5, 35, 0, 0, 596, 598, 5, 66, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 600, 1, 0, 0, 0, 599, 601, 7, 6, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 603, 1, 0, 0, 0, 602, 589, 1, 0, 0, 0, 602, 595, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 570, 1, 0, 0, 0, 604, 586, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 81, 1, 0, 0, 0, 606, 607, 5, 17, 0, 0, 607, 610, 5, 48, 0, 0, 608, 610, 5, 117, 0, 0, 609, 606, 1, 0, 0, 0, 609, 608, 1, 0, 0, 0, 610, 83, 1, 0, 0, 0, 611, 612, 5, 63, 0, 0, 612, 621, 3, 114, 57, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 131, 0, 0, 615, 616, 3, 114, 57, 0, 616, 617, 5, 150, 0, 0, 617, 621, 1, 0, 0, 0, 618, 619, 5, 97, 0, 0, 619, 621, 3, 114, 57, 0, 620, 611, 1, 0, 0, 0, 620, 613, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 85, 1, 0, 0, 0, 622, 623, 5, 78, 0, 0, 623, 626, 3, 92, 46, 0, 624, 625, 5, 62, 0, 0, 625, 627, 3, 92, 46, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 87, 1, 0, 0, 0, 628, 633, 3, 90, 45, 0, 629, 630, 5, 117, 0, 0, 630, 632, 3, 90, 45, 0, 631, 629, 1, 0, 0, 0, 632, 635, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 89, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 636, 638, 3, 116, 58, 0, 637, 639, 7, 7, 0, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 642, 1, 0, 0, 0, 640, 641, 5, 61, 0, 0, 641, 643, 7, 8, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 646, 1, 0, 0, 0, 644, 645, 5, 16, 0, 0, 645, 647, 5, 111, 0, 0, 646, 644, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 91, 1, 0, 0, 0, 648, 655, 3, 160, 80, 0, 649, 652, 3, 144, 72, 0, 650, 651, 5, 152, 0, 0, 651, 653, 3, 144, 72, 0, 652, 650, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 648, 1, 0, 0, 0, 654, 649, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 661, 3, 96, 48, 0, 657, 658, 5, 117, 0, 0, 658, 660, 3, 96, 48, 0, 659, 657, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 95, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 3, 156, 78, 0, 665, 666, 5, 123, 0, 0, 666, 667, 3, 146, 73, 0, 667, 97, 1, 0, 0, 0, 668, 670, 3, 100, 50, 0, 669, 668, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 673, 3, 102, 51, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 676, 3, 104, 52, 0, 675, 674, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 99, 1, 0, 0, 0, 677, 678, 5, 68, 0, 0, 678, 679, 5, 11, 0, 0, 679, 680, 3, 114, 57, 0, 680, 101, 1, 0, 0, 0, 681, 682, 5, 65, 0, 0, 682, 683, 5, 11, 0, 0, 683, 684, 3, 88, 44, 0, 684, 103, 1, 0, 0, 0, 685, 686, 7, 9, 0, 0, 686, 687, 3, 106, 53, 0, 687, 105, 1, 0, 0, 0, 688, 695, 3, 108, 54, 0, 689, 690, 5, 9, 0, 0, 690, 691, 3, 108, 54, 0, 691, 692, 5, 2, 0, 0, 692, 693, 3, 108, 54, 0, 693, 695, 1, 0, 0, 0, 694, 688, 1, 0, 0, 0, 694, 689, 1, 0, 0, 0, 695, 107, 1, 0, 0, 0, 696, 697, 5, 19, 0, 0, 697, 709, 5, 76, 0, 0, 698, 699, 5, 95, 0, 0, 699, 709, 5, 69, 0, 0, 700, 701, 5, 95, 0, 0, 701, 709, 5, 32, 0, 0, 702, 703, 3, 144, 72, 0, 703, 704, 5, 69, 0, 0, 704, 709, 1, 0, 0, 0, 705, 706, 3, 144, 72, 0, 706, 707, 5, 32, 0, 0, 707, 709, 1, 0, 0, 0, 708, 696, 1, 0, 0, 0, 708, 698, 1, 0, 0, 0, 708, 700, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 705, 1, 0, 0, 0, 709, 109, 1, 0, 0, 0, 710, 711, 3, 116, 58, 0, 711, 712, 5, 0, 0, 1, 712, 111, 1, 0, 0, 0, 713, 770, 3, 156, 78, 0, 714, 715, 3, 156, 78, 0, 715, 716, 5, 131, 0, 0, 716, 717, 3, 156, 78, 0, 717, 724, 3, 112, 56, 0, 718, 719, 5, 117, 0, 0, 719, 720, 3, 156, 78, 0, 720, 721, 3, 112, 56, 0, 721, 723, 1, 0, 0, 0, 722, 718, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 729, 5, 117, 0, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 150, 0, 0, 731, 770, 1, 0, 0, 0, 732, 733, 3, 156, 78, 0, 733, 734, 5, 131, 0, 0, 734, 739, 3, 158, 79, 0, 735, 736, 5, 117, 0, 0, 736, 738, 3, 158, 79, 0, 737, 735, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 744, 5, 117, 0, 0, 743, 742, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 5, 150, 0, 0, 746, 770, 1, 0, 0, 0, 747, 748, 3, 156, 78, 0, 748, 749, 5, 131, 0, 0, 749, 754, 3, 112, 56, 0, 750, 751, 5, 117, 0, 0, 751, 753, 3, 112, 56, 0, 752, 750, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 759, 5, 117, 0, 0, 758, 757, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 761, 5, 150, 0, 0, 761, 770, 1, 0, 0, 0, 762, 763, 3, 156, 78, 0, 763, 765, 5, 131, 0, 0, 764, 766, 3, 114, 57, 0, 765, 764, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 5, 150, 0, 0, 768, 770, 1, 0, 0, 0, 769, 713, 1, 0, 0, 0, 769, 714, 1, 0, 0, 0, 769, 732, 1, 0, 0, 0, 769, 747, 1, 0, 0, 0, 769, 762, 1, 0, 0, 0, 770, 113, 1, 0, 0, 0, 771, 776, 3, 116, 58, 0, 772, 773, 5, 117, 0, 0, 773, 775, 3, 116, 58, 0, 774, 772, 1, 0, 0, 0, 775, 778, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 780, 1, 0, 0, 0, 778, 776, 1, 0, 0, 0, 779, 781, 5, 117, 0, 0, 780, 779, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 115, 1, 0, 0, 0, 782, 783, 6, 58, -1, 0, 783, 785, 5, 12, 0, 0, 784, 786, 3, 116, 58, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 792, 1, 0, 0, 0, 787, 788, 5, 99, 0, 0, 788, 789, 3, 116, 58, 0, 789, 790, 5, 84, 0, 0, 790, 791, 3, 116, 58, 0, 791, 793, 1, 0, 0, 0, 792, 787, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 798, 1, 0, 0, 0, 796, 797, 5, 25, 0, 0, 797, 799, 3, 116, 58, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 801, 5, 26, 0, 0, 801, 933, 1, 0, 0, 0, 802, 803, 5, 13, 0, 0, 803, 804, 5, 131, 0, 0, 804, 805, 3, 116, 58, 0, 805, 806, 5, 6, 0, 0, 806, 807, 3, 112, 56, 0, 807, 808, 5, 150, 0, 0, 808, 933, 1, 0, 0, 0, 809, 810, 5, 20, 0, 0, 810, 933, 5, 111, 0, 0, 811, 812, 5, 46, 0, 0, 812, 813, 3, 116, 58, 0, 813, 814, 3, 148, 74, 0, 814, 933, 1, 0, 0, 0, 815, 816, 5, 83, 0, 0, 816, 817, 5, 131, 0, 0, 817, 818, 3, 116, 58, 0, 818, 819, 5, 34, 0, 0, 819, 822, 3, 116, 58, 0, 820, 821, 5, 33, 0, 0, 821, 823, 3, 116, 58, 0, 822, 820, 1, 0, 0, 0, 822, 823, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 825, 5, 150, 0, 0, 825, 933, 1, 0, 0, 0, 826, 827, 5, 87, 0, 0, 827, 933, 5, 111, 0, 0, 828, 829, 5, 92, 0, 0, 829, 830, 5, 131, 0, 0, 830, 831, 7, 10, 0, 0, 831, 832, 3, 162, 81, 0, 832, 833, 5, 34, 0, 0, 833, 834, 3, 116, 58, 0, 834, 835, 5, 150, 0, 0, 835, 933, 1, 0, 0, 0, 836, 837, 3, 156, 78, 0, 837, 839, 5, 131, 0, 0, 838, 840, 3, 114, 57, 0, 839, 838, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 5, 150, 0, 0, 842, 851, 1, 0, 0, 0, 843, 845, 5, 131, 0, 0, 844, 846, 5, 24, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 848, 1, 0, 0, 0, 847, 849, 3, 114, 57, 0, 848, 847, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 852, 5, 150, 0, 0, 851, 843, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 67, 0, 0, 854, 855, 5, 131, 0, 0, 855, 856, 3, 98, 49, 0, 856, 857, 5, 150, 0, 0, 857, 933, 1, 0, 0, 0, 858, 859, 3, 156, 78, 0, 859, 861, 5, 131, 0, 0, 860, 862, 3, 114, 57, 0, 861, 860, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 864, 5, 150, 0, 0, 864, 873, 1, 0, 0, 0, 865, 867, 5, 131, 0, 0, 866, 868, 5, 24, 0, 0, 867, 866, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 870, 1, 0, 0, 0, 869, 871, 3, 114, 57, 0, 870, 869, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 874, 5, 150, 0, 0, 873, 865, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 876, 5, 67, 0, 0, 876, 877, 3, 156, 78, 0, 877, 933, 1, 0, 0, 0, 878, 884, 3, 156, 78, 0, 879, 881, 5, 131, 0, 0, 880, 882, 3, 114, 57, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 885, 5, 150, 0, 0, 884, 879, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 888, 5, 131, 0, 0, 887, 889, 5, 24, 0, 0, 888, 887, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 891, 1, 0, 0, 0, 890, 892, 3, 114, 57, 0, 891, 890, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 5, 150, 0, 0, 894, 933, 1, 0, 0, 0, 895, 933, 3, 120, 60, 0, 896, 933, 3, 164, 82, 0, 897, 933, 3, 146, 73, 0, 898, 899, 5, 119, 0, 0, 899, 933, 3, 116, 58, 20, 900, 901, 5, 59, 0, 0, 901, 933, 3, 116, 58, 14, 902, 903, 3, 136, 68, 0, 903, 904, 5, 121, 0, 0, 904, 906, 1, 0, 0, 0, 905, 902, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 933, 5, 113, 0, 0, 908, 909, 5, 131, 0, 0, 909, 910, 3, 44, 22, 0, 910, 911, 5, 150, 0, 0, 911, 933, 1, 0, 0, 0, 912, 913, 5, 131, 0, 0, 913, 914, 3, 116, 58, 0, 914, 915, 5, 150, 0, 0, 915, 933, 1, 0, 0, 0, 916, 917, 5, 131, 0, 0, 917, 918, 3, 114, 57, 0, 918, 919, 5, 150, 0, 0, 919, 933, 1, 0, 0, 0, 920, 922, 5, 130, 0, 0, 921, 923, 3, 114, 57, 0, 922, 921, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 933, 5, 149, 0, 0, 925, 927, 5, 129, 0, 0, 926, 928, 3, 40, 20, 0, 927, 926, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 933, 5, 148, 0, 0, 930, 933, 3, 118, 59, 0, 931, 933, 3, 128, 64, 0, 932, 782, 1, 0, 0, 0, 932, 802, 1, 0, 0, 0, 932, 809, 1, 0, 0, 0, 932, 811, 1, 0, 0, 0, 932, 815, 1, 0, 0, 0, 932, 826, 1, 0, 0, 0, 932, 828, 1, 0, 0, 0, 932, 836, 1, 0, 0, 0, 932, 858, 1, 0, 0, 0, 932, 878, 1, 0, 0, 0, 932, 895, 1, 0, 0, 0, 932, 896, 1, 0, 0, 0, 932, 897, 1, 0, 0, 0, 932, 898, 1, 0, 0, 0, 932, 900, 1, 0, 0, 0, 932, 905, 1, 0, 0, 0, 932, 908, 1, 0, 0, 0, 932, 912, 1, 0, 0, 0, 932, 916, 1, 0, 0, 0, 932, 920, 1, 0, 0, 0, 932, 925, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 932, 931, 1, 0, 0, 0, 933, 1044, 1, 0, 0, 0, 934, 938, 10, 19, 0, 0, 935, 939, 5, 113, 0, 0, 936, 939, 5, 152, 0, 0, 937, 939, 5, 139, 0, 0, 938, 935, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 1043, 3, 116, 58, 20, 941, 945, 10, 18, 0, 0, 942, 946, 5, 140, 0, 0, 943, 946, 5, 119, 0, 0, 944, 946, 5, 118, 0, 0, 945, 942, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 1043, 3, 116, 58, 19, 948, 973, 10, 17, 0, 0, 949, 974, 5, 122, 0, 0, 950, 974, 5, 123, 0, 0, 951, 974, 5, 134, 0, 0, 952, 974, 5, 132, 0, 0, 953, 974, 5, 133, 0, 0, 954, 974, 5, 124, 0, 0, 955, 974, 5, 125, 0, 0, 956, 958, 5, 59, 0, 0, 957, 956, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 961, 5, 43, 0, 0, 960, 962, 5, 15, 0, 0, 961, 960, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 974, 1, 0, 0, 0, 963, 965, 5, 59, 0, 0, 964, 963, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 974, 7, 11, 0, 0, 967, 974, 5, 146, 0, 0, 968, 974, 5, 147, 0, 0, 969, 974, 5, 136, 0, 0, 970, 974, 5, 127, 0, 0, 971, 974, 5, 128, 0, 0, 972, 974, 5, 135, 0, 0, 973, 949, 1, 0, 0, 0, 973, 950, 1, 0, 0, 0, 973, 951, 1, 0, 0, 0, 973, 952, 1, 0, 0, 0, 973, 953, 1, 0, 0, 0, 973, 954, 1, 0, 0, 0, 973, 955, 1, 0, 0, 0, 973, 957, 1, 0, 0, 0, 973, 964, 1, 0, 0, 0, 973, 967, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 969, 1, 0, 0, 0, 973, 970, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 973, 972, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 1043, 3, 116, 58, 18, 976, 977, 10, 15, 0, 0, 977, 978, 5, 138, 0, 0, 978, 1043, 3, 116, 58, 16, 979, 980, 10, 13, 0, 0, 980, 981, 5, 2, 0, 0, 981, 1043, 3, 116, 58, 14, 982, 983, 10, 12, 0, 0, 983, 984, 5, 64, 0, 0, 984, 1043, 3, 116, 58, 13, 985, 987, 10, 11, 0, 0, 986, 988, 5, 59, 0, 0, 987, 986, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 990, 5, 9, 0, 0, 990, 991, 3, 116, 58, 0, 991, 992, 5, 2, 0, 0, 992, 993, 3, 116, 58, 12, 993, 1043, 1, 0, 0, 0, 994, 995, 10, 10, 0, 0, 995, 996, 5, 141, 0, 0, 996, 997, 3, 116, 58, 0, 997, 998, 5, 116, 0, 0, 998, 999, 3, 116, 58, 10, 999, 1043, 1, 0, 0, 0, 1000, 1001, 10, 30, 0, 0, 1001, 1003, 5, 131, 0, 0, 1002, 1004, 3, 114, 57, 0, 1003, 1002, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1043, 5, 150, 0, 0, 1006, 1007, 10, 26, 0, 0, 1007, 1008, 5, 130, 0, 0, 1008, 1009, 3, 116, 58, 0, 1009, 1010, 5, 149, 0, 0, 1010, 1043, 1, 0, 0, 0, 1011, 1012, 10, 25, 0, 0, 1012, 1013, 5, 121, 0, 0, 1013, 1043, 5, 109, 0, 0, 1014, 1015, 10, 24, 0, 0, 1015, 1016, 5, 121, 0, 0, 1016, 1043, 3, 156, 78, 0, 1017, 1018, 10, 23, 0, 0, 1018, 1019, 5, 137, 0, 0, 1019, 1020, 5, 130, 0, 0, 1020, 1021, 3, 116, 58, 0, 1021, 1022, 5, 149, 0, 0, 1022, 1043, 1, 0, 0, 0, 1023, 1024, 10, 22, 0, 0, 1024, 1025, 5, 137, 0, 0, 1025, 1043, 5, 109, 0, 0, 1026, 1027, 10, 21, 0, 0, 1027, 1028, 5, 137, 0, 0, 1028, 1043, 3, 156, 78, 0, 1029, 1030, 10, 16, 0, 0, 1030, 1032, 5, 47, 0, 0, 1031, 1033, 5, 59, 0, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1043, 5, 60, 0, 0, 1035, 1040, 10, 9, 0, 0, 1036, 1037, 5, 6, 0, 0, 1037, 1041, 3, 156, 78, 0, 1038, 1039, 5, 6, 0, 0, 1039, 1041, 5, 111, 0, 0, 1040, 1036, 1, 0, 0, 0, 1040, 1038, 1, 0, 0, 0, 1041, 1043, 1, 0, 0, 0, 1042, 934, 1, 0, 0, 0, 1042, 941, 1, 0, 0, 0, 1042, 948, 1, 0, 0, 0, 1042, 976, 1, 0, 0, 0, 1042, 979, 1, 0, 0, 0, 1042, 982, 1, 0, 0, 0, 1042, 985, 1, 0, 0, 0, 1042, 994, 1, 0, 0, 0, 1042, 1000, 1, 0, 0, 0, 1042, 1006, 1, 0, 0, 0, 1042, 1011, 1, 0, 0, 0, 1042, 1014, 1, 0, 0, 0, 1042, 1017, 1, 0, 0, 0, 1042, 1023, 1, 0, 0, 0, 1042, 1026, 1, 0, 0, 0, 1042, 1029, 1, 0, 0, 0, 1042, 1035, 1, 0, 0, 0, 1043, 1046, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 117, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1047, 1048, 5, 131, 0, 0, 1048, 1053, 3, 156, 78, 0, 1049, 1050, 5, 117, 0, 0, 1050, 1052, 3, 156, 78, 0, 1051, 1049, 1, 0, 0, 0, 1052, 1055, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1057, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1056, 1058, 5, 117, 0, 0, 1057, 1056, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 5, 150, 0, 0, 1060, 1075, 1, 0, 0, 0, 1061, 1066, 3, 156, 78, 0, 1062, 1063, 5, 117, 0, 0, 1063, 1065, 3, 156, 78, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1068, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1069, 1071, 5, 117, 0, 0, 1070, 1069, 1, 0, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1075, 1, 0, 0, 0, 1072, 1073, 5, 131, 0, 0, 1073, 1075, 5, 150, 0, 0, 1074, 1047, 1, 0, 0, 0, 1074, 1061, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1079, 5, 112, 0, 0, 1077, 1080, 3, 116, 58, 0, 1078, 1080, 3, 36, 18, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1078, 1, 0, 0, 0, 1080, 119, 1, 0, 0, 0, 1081, 1082, 5, 133, 0, 0, 1082, 1086, 3, 156, 78, 0, 1083, 1085, 3, 122, 61, 0, 1084, 1083, 1, 0, 0, 0, 1085, 1088, 1, 0, 0, 0, 1086, 1084, 1, 0, 0, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1089, 1, 0, 0, 0, 1088, 1086, 1, 0, 0, 0, 1089, 1090, 5, 152, 0, 0, 1090, 1091, 5, 125, 0, 0, 1091, 1114, 1, 0, 0, 0, 1092, 1093, 5, 133, 0, 0, 1093, 1097, 3, 156, 78, 0, 1094, 1096, 3, 122, 61, 0, 1095, 1094, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1106, 5, 125, 0, 0, 1101, 1107, 3, 120, 60, 0, 1102, 1103, 5, 129, 0, 0, 1103, 1104, 3, 116, 58, 0, 1104, 1105, 5, 148, 0, 0, 1105, 1107, 1, 0, 0, 0, 1106, 1101, 1, 0, 0, 0, 1106, 1102, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 5, 133, 0, 0, 1109, 1110, 5, 152, 0, 0, 1110, 1111, 3, 156, 78, 0, 1111, 1112, 5, 125, 0, 0, 1112, 1114, 1, 0, 0, 0, 1113, 1081, 1, 0, 0, 0, 1113, 1092, 1, 0, 0, 0, 1114, 121, 1, 0, 0, 0, 1115, 1116, 3, 156, 78, 0, 1116, 1117, 5, 123, 0, 0, 1117, 1118, 3, 162, 81, 0, 1118, 1127, 1, 0, 0, 0, 1119, 1120, 3, 156, 78, 0, 1120, 1121, 5, 123, 0, 0, 1121, 1122, 5, 129, 0, 0, 1122, 1123, 3, 116, 58, 0, 1123, 1124, 5, 148, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1127, 3, 156, 78, 0, 1126, 1115, 1, 0, 0, 0, 1126, 1119, 1, 0, 0, 0, 1126, 1125, 1, 0, 0, 0, 1127, 123, 1, 0, 0, 0, 1128, 1133, 3, 126, 63, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1132, 3, 126, 63, 0, 1131, 1129, 1, 0, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1137, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1136, 1138, 5, 117, 0, 0, 1137, 1136, 1, 0, 0, 0, 1137, 1138, 1, 0, 0, 0, 1138, 125, 1, 0, 0, 0, 1139, 1140, 3, 156, 78, 0, 1140, 1141, 5, 6, 0, 0, 1141, 1142, 5, 131, 0, 0, 1142, 1143, 3, 44, 22, 0, 1143, 1144, 5, 150, 0, 0, 1144, 1150, 1, 0, 0, 0, 1145, 1146, 3, 116, 58, 0, 1146, 1147, 5, 6, 0, 0, 1147, 1148, 3, 156, 78, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1139, 1, 0, 0, 0, 1149, 1145, 1, 0, 0, 0, 1150, 127, 1, 0, 0, 0, 1151, 1159, 3, 160, 80, 0, 1152, 1153, 3, 136, 68, 0, 1153, 1154, 5, 121, 0, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1152, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 3, 130, 65, 0, 1158, 1151, 1, 0, 0, 0, 1158, 1155, 1, 0, 0, 0, 1159, 129, 1, 0, 0, 0, 1160, 1165, 3, 156, 78, 0, 1161, 1162, 5, 121, 0, 0, 1162, 1164, 3, 156, 78, 0, 1163, 1161, 1, 0, 0, 0, 1164, 1167, 1, 0, 0, 0, 1165, 1163, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 131, 1, 0, 0, 0, 1167, 1165, 1, 0, 0, 0, 1168, 1169, 6, 66, -1, 0, 1169, 1178, 3, 136, 68, 0, 1170, 1178, 3, 134, 67, 0, 1171, 1172, 5, 131, 0, 0, 1172, 1173, 3, 44, 22, 0, 1173, 1174, 5, 150, 0, 0, 1174, 1178, 1, 0, 0, 0, 1175, 1178, 3, 120, 60, 0, 1176, 1178, 3, 160, 80, 0, 1177, 1168, 1, 0, 0, 0, 1177, 1170, 1, 0, 0, 0, 1177, 1171, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1177, 1176, 1, 0, 0, 0, 1178, 1187, 1, 0, 0, 0, 1179, 1183, 10, 3, 0, 0, 1180, 1184, 3, 154, 77, 0, 1181, 1182, 5, 6, 0, 0, 1182, 1184, 3, 156, 78, 0, 1183, 1180, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1186, 1189, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 133, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1190, 1191, 3, 156, 78, 0, 1191, 1193, 5, 131, 0, 0, 1192, 1194, 3, 138, 69, 0, 1193, 1192, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 5, 150, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1198, 3, 140, 70, 0, 1198, 1199, 5, 121, 0, 0, 1199, 1201, 1, 0, 0, 0, 1200, 1197, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 3, 156, 78, 0, 1203, 137, 1, 0, 0, 0, 1204, 1209, 3, 116, 58, 0, 1205, 1206, 5, 117, 0, 0, 1206, 1208, 3, 116, 58, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1213, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1214, 5, 117, 0, 0, 1213, 1212, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 139, 1, 0, 0, 0, 1215, 1216, 3, 156, 78, 0, 1216, 141, 1, 0, 0, 0, 1217, 1226, 5, 107, 0, 0, 1218, 1219, 5, 121, 0, 0, 1219, 1226, 7, 12, 0, 0, 1220, 1221, 5, 109, 0, 0, 1221, 1223, 5, 121, 0, 0, 1222, 1224, 7, 12, 0, 0, 1223, 1222, 1, 0, 0, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1220, 1, 0, 0, 0, 1226, 143, 1, 0, 0, 0, 1227, 1229, 7, 13, 0, 0, 1228, 1227, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1236, 1, 0, 0, 0, 1230, 1237, 3, 142, 71, 0, 1231, 1237, 5, 108, 0, 0, 1232, 1237, 5, 109, 0, 0, 1233, 1237, 5, 110, 0, 0, 1234, 1237, 5, 44, 0, 0, 1235, 1237, 5, 58, 0, 0, 1236, 1230, 1, 0, 0, 0, 1236, 1231, 1, 0, 0, 0, 1236, 1232, 1, 0, 0, 0, 1236, 1233, 1, 0, 0, 0, 1236, 1234, 1, 0, 0, 0, 1236, 1235, 1, 0, 0, 0, 1237, 145, 1, 0, 0, 0, 1238, 1242, 3, 144, 72, 0, 1239, 1242, 5, 111, 0, 0, 1240, 1242, 5, 60, 0, 0, 1241, 1238, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1240, 1, 0, 0, 0, 1242, 147, 1, 0, 0, 0, 1243, 1244, 7, 14, 0, 0, 1244, 149, 1, 0, 0, 0, 1245, 1246, 7, 15, 0, 0, 1246, 151, 1, 0, 0, 0, 1247, 1248, 7, 16, 0, 0, 1248, 153, 1, 0, 0, 0, 1249, 1252, 5, 106, 0, 0, 1250, 1252, 3, 152, 76, 0, 1251, 1249, 1, 0, 0, 0, 1251, 1250, 1, 0, 0, 0, 1252, 155, 1, 0, 0, 0, 1253, 1257, 5, 106, 0, 0, 1254, 1257, 3, 148, 74, 0, 1255, 1257, 3, 150, 75, 0, 1256, 1253, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1255, 1, 0, 0, 0, 1257, 157, 1, 0, 0, 0, 1258, 1259, 3, 162, 81, 0, 1259, 1260, 5, 123, 0, 0, 1260, 1261, 3, 144, 72, 0, 1261, 159, 1, 0, 0, 0, 1262, 1263, 5, 129, 0, 0, 1263, 1264, 3, 116, 58, 0, 1264, 1265, 5, 148, 0, 0, 1265, 161, 1, 0, 0, 0, 1266, 1269, 5, 111, 0, 0, 1267, 1269, 3, 164, 82, 0, 1268, 1266, 1, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1269, 163, 1, 0, 0, 0, 1270, 1274, 5, 143, 0, 0, 1271, 1273, 3, 166, 83, 0, 1272, 1271, 1, 0, 0, 0, 1273, 1276, 1, 0, 0, 0, 1274, 1272, 1, 0, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1277, 1, 0, 0, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1278, 5, 145, 0, 0, 1278, 165, 1, 0, 0, 0, 1279, 1280, 5, 158, 0, 0, 1280, 1281, 3, 116, 58, 0, 1281, 1282, 5, 148, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1285, 5, 157, 0, 0, 1284, 1279, 1, 0, 0, 0, 1284, 1283, 1, 0, 0, 0, 1285, 167, 1, 0, 0, 0, 1286, 1290, 5, 144, 0, 0, 1287, 1289, 3, 170, 85, 0, 1288, 1287, 1, 0, 0, 0, 1289, 1292, 1, 0, 0, 0, 1290, 1288, 1, 0, 0, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1293, 1294, 5, 0, 0, 1, 1294, 169, 1, 0, 0, 0, 1295, 1296, 5, 160, 0, 0, 1296, 1297, 3, 116, 58, 0, 1297, 1298, 5, 148, 0, 0, 1298, 1301, 1, 0, 0, 0, 1299, 1301, 5, 159, 0, 0, 1300, 1295, 1, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 171, 1, 0, 0, 0, 167, 175, 182, 191, 198, 202, 216, 220, 223, 227, 230, 237, 241, 250, 255, 264, 272, 279, 283, 289, 294, 302, 309, 315, 327, 335, 349, 353, 358, 368, 377, 380, 384, 387, 391, 394, 397, 400, 403, 407, 411, 414, 417, 420, 424, 427, 436, 442, 463, 480, 497, 503, 509, 520, 522, 533, 536, 542, 550, 556, 558, 562, 567, 570, 573, 577, 581, 584, 586, 589, 593, 597, 600, 602, 604, 609, 620, 626, 633, 638, 642, 646, 652, 654, 661, 669, 672, 675, 694, 708, 724, 728, 739, 743, 754, 758, 765, 769, 776, 780, 785, 794, 798, 822, 839, 845, 848, 851, 861, 867, 870, 873, 881, 884, 888, 891, 905, 922, 927, 932, 938, 945, 957, 961, 964, 973, 987, 1003, 1032, 1040, 1042, 1044, 1053, 1057, 1066, 1070, 1074, 1079, 1086, 1097, 1106, 1113, 1126, 1133, 1137, 1149, 1155, 1158, 1165, 1177, 1183, 1187, 1193, 1200, 1209, 1213, 1223, 1225, 1228, 1236, 1241, 1251, 1256, 1268, 1274, 1284, 1290, 1300] \ No newline at end of file +[4, 1, 162, 1311, 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, 1, 0, 5, 0, 176, 8, 0, 10, 0, 12, 0, 179, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 185, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 194, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 199, 8, 4, 10, 4, 12, 4, 202, 9, 4, 1, 4, 3, 4, 205, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 219, 8, 5, 1, 6, 1, 6, 3, 6, 223, 8, 6, 1, 6, 3, 6, 226, 8, 6, 1, 7, 1, 7, 3, 7, 230, 8, 7, 1, 7, 3, 7, 233, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 240, 8, 8, 1, 8, 1, 8, 3, 8, 244, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 251, 8, 9, 10, 9, 12, 9, 254, 9, 9, 1, 9, 1, 9, 3, 9, 258, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 267, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 275, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 282, 8, 12, 1, 12, 1, 12, 3, 12, 286, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 292, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 305, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 312, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 318, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 330, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 336, 8, 18, 10, 18, 12, 18, 339, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 350, 8, 20, 10, 20, 12, 20, 353, 9, 20, 1, 20, 3, 20, 356, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 361, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 371, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 23, 1, 23, 1, 24, 1, 24, 5, 24, 383, 8, 24, 10, 24, 12, 24, 386, 9, 24, 1, 25, 3, 25, 389, 8, 25, 1, 25, 1, 25, 3, 25, 393, 8, 25, 1, 25, 3, 25, 396, 8, 25, 1, 25, 1, 25, 3, 25, 400, 8, 25, 1, 25, 3, 25, 403, 8, 25, 1, 25, 3, 25, 406, 8, 25, 1, 25, 3, 25, 409, 8, 25, 1, 25, 3, 25, 412, 8, 25, 1, 25, 1, 25, 3, 25, 416, 8, 25, 1, 25, 1, 25, 3, 25, 420, 8, 25, 1, 25, 3, 25, 423, 8, 25, 1, 25, 3, 25, 426, 8, 25, 1, 25, 3, 25, 429, 8, 25, 1, 25, 1, 25, 3, 25, 433, 8, 25, 1, 25, 3, 25, 436, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 445, 8, 27, 1, 28, 1, 28, 1, 28, 1, 29, 3, 29, 451, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 470, 8, 30, 10, 30, 12, 30, 473, 9, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 489, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 506, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 512, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 518, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 529, 8, 37, 3, 37, 531, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 542, 8, 40, 1, 40, 3, 40, 545, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 551, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 559, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 565, 8, 40, 10, 40, 12, 40, 568, 9, 40, 1, 41, 3, 41, 571, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 576, 8, 41, 1, 41, 3, 41, 579, 8, 41, 1, 41, 3, 41, 582, 8, 41, 1, 41, 1, 41, 3, 41, 586, 8, 41, 1, 41, 1, 41, 3, 41, 590, 8, 41, 1, 41, 3, 41, 593, 8, 41, 3, 41, 595, 8, 41, 1, 41, 3, 41, 598, 8, 41, 1, 41, 1, 41, 3, 41, 602, 8, 41, 1, 41, 1, 41, 3, 41, 606, 8, 41, 1, 41, 3, 41, 609, 8, 41, 3, 41, 611, 8, 41, 3, 41, 613, 8, 41, 1, 42, 1, 42, 1, 42, 3, 42, 618, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 629, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 635, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 640, 8, 45, 10, 45, 12, 45, 643, 9, 45, 1, 46, 1, 46, 3, 46, 647, 8, 46, 1, 46, 1, 46, 3, 46, 651, 8, 46, 1, 46, 1, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 661, 8, 47, 3, 47, 663, 8, 47, 1, 48, 1, 48, 1, 48, 5, 48, 668, 8, 48, 10, 48, 12, 48, 671, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 3, 50, 678, 8, 50, 1, 50, 3, 50, 681, 8, 50, 1, 50, 3, 50, 684, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 703, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 717, 8, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 731, 8, 57, 10, 57, 12, 57, 734, 9, 57, 1, 57, 3, 57, 737, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 746, 8, 57, 10, 57, 12, 57, 749, 9, 57, 1, 57, 3, 57, 752, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 761, 8, 57, 10, 57, 12, 57, 764, 9, 57, 1, 57, 3, 57, 767, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 774, 8, 57, 1, 57, 1, 57, 3, 57, 778, 8, 57, 1, 58, 1, 58, 1, 58, 5, 58, 783, 8, 58, 10, 58, 12, 58, 786, 9, 58, 1, 58, 3, 58, 789, 8, 58, 1, 59, 1, 59, 1, 59, 3, 59, 794, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 801, 8, 59, 11, 59, 12, 59, 802, 1, 59, 1, 59, 3, 59, 807, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 831, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 848, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 854, 8, 59, 1, 59, 3, 59, 857, 8, 59, 1, 59, 3, 59, 860, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 870, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 876, 8, 59, 1, 59, 3, 59, 879, 8, 59, 1, 59, 3, 59, 882, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 890, 8, 59, 1, 59, 3, 59, 893, 8, 59, 1, 59, 1, 59, 3, 59, 897, 8, 59, 1, 59, 3, 59, 900, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 914, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 931, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 936, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 947, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 954, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 966, 8, 59, 1, 59, 1, 59, 3, 59, 970, 8, 59, 1, 59, 3, 59, 973, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 982, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 996, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1012, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1041, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1049, 8, 59, 5, 59, 1051, 8, 59, 10, 59, 12, 59, 1054, 9, 59, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1060, 8, 60, 10, 60, 12, 60, 1063, 9, 60, 1, 60, 3, 60, 1066, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1073, 8, 60, 10, 60, 12, 60, 1076, 9, 60, 1, 60, 3, 60, 1079, 8, 60, 1, 60, 1, 60, 3, 60, 1083, 8, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1088, 8, 60, 1, 61, 1, 61, 1, 61, 5, 61, 1093, 8, 61, 10, 61, 12, 61, 1096, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1104, 8, 61, 10, 61, 12, 61, 1107, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1115, 8, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1122, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1135, 8, 62, 1, 63, 1, 63, 1, 63, 5, 63, 1140, 8, 63, 10, 63, 12, 63, 1143, 9, 63, 1, 63, 3, 63, 1146, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1158, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1164, 8, 65, 1, 65, 3, 65, 1167, 8, 65, 1, 66, 1, 66, 1, 66, 5, 66, 1172, 8, 66, 10, 66, 12, 66, 1175, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1186, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1192, 8, 67, 5, 67, 1194, 8, 67, 10, 67, 12, 67, 1197, 9, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1202, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 3, 69, 1209, 8, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1216, 8, 70, 10, 70, 12, 70, 1219, 9, 70, 1, 70, 3, 70, 1222, 8, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1232, 8, 72, 3, 72, 1234, 8, 72, 1, 73, 3, 73, 1237, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1245, 8, 73, 1, 74, 1, 74, 1, 74, 3, 74, 1250, 8, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 3, 78, 1260, 8, 78, 1, 79, 1, 79, 1, 79, 3, 79, 1265, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 3, 82, 1277, 8, 82, 1, 83, 1, 83, 5, 83, 1281, 8, 83, 10, 83, 12, 83, 1284, 9, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1293, 8, 84, 1, 85, 1, 85, 5, 85, 1297, 8, 85, 10, 85, 12, 85, 1300, 9, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1309, 8, 86, 1, 86, 0, 3, 80, 118, 134, 87, 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, 0, 17, 2, 0, 32, 32, 37, 37, 2, 0, 18, 18, 77, 77, 2, 0, 46, 46, 54, 54, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 83, 83, 2, 0, 54, 54, 76, 76, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 31, 31, 52, 52, 2, 0, 74, 74, 79, 79, 3, 0, 10, 10, 53, 53, 93, 93, 2, 0, 43, 43, 56, 56, 1, 0, 110, 111, 2, 0, 121, 121, 142, 142, 7, 0, 21, 21, 40, 40, 58, 59, 73, 73, 81, 81, 100, 100, 106, 106, 19, 0, 1, 13, 15, 20, 22, 26, 28, 29, 31, 31, 33, 36, 38, 39, 41, 44, 46, 46, 48, 54, 56, 57, 61, 61, 63, 72, 74, 80, 82, 86, 88, 95, 97, 99, 101, 102, 104, 105, 4, 0, 20, 20, 31, 31, 41, 41, 51, 51, 1484, 0, 177, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 6, 188, 1, 0, 0, 0, 8, 195, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 247, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 268, 1, 0, 0, 0, 24, 276, 1, 0, 0, 0, 26, 298, 1, 0, 0, 0, 28, 313, 1, 0, 0, 0, 30, 322, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 331, 1, 0, 0, 0, 36, 333, 1, 0, 0, 0, 38, 342, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 370, 1, 0, 0, 0, 46, 376, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 388, 1, 0, 0, 0, 52, 437, 1, 0, 0, 0, 54, 440, 1, 0, 0, 0, 56, 446, 1, 0, 0, 0, 58, 450, 1, 0, 0, 0, 60, 456, 1, 0, 0, 0, 62, 474, 1, 0, 0, 0, 64, 477, 1, 0, 0, 0, 66, 480, 1, 0, 0, 0, 68, 490, 1, 0, 0, 0, 70, 493, 1, 0, 0, 0, 72, 497, 1, 0, 0, 0, 74, 530, 1, 0, 0, 0, 76, 532, 1, 0, 0, 0, 78, 535, 1, 0, 0, 0, 80, 550, 1, 0, 0, 0, 82, 612, 1, 0, 0, 0, 84, 617, 1, 0, 0, 0, 86, 628, 1, 0, 0, 0, 88, 630, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 644, 1, 0, 0, 0, 94, 662, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 672, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 685, 1, 0, 0, 0, 104, 689, 1, 0, 0, 0, 106, 693, 1, 0, 0, 0, 108, 702, 1, 0, 0, 0, 110, 716, 1, 0, 0, 0, 112, 718, 1, 0, 0, 0, 114, 777, 1, 0, 0, 0, 116, 779, 1, 0, 0, 0, 118, 940, 1, 0, 0, 0, 120, 1082, 1, 0, 0, 0, 122, 1121, 1, 0, 0, 0, 124, 1134, 1, 0, 0, 0, 126, 1136, 1, 0, 0, 0, 128, 1157, 1, 0, 0, 0, 130, 1166, 1, 0, 0, 0, 132, 1168, 1, 0, 0, 0, 134, 1185, 1, 0, 0, 0, 136, 1198, 1, 0, 0, 0, 138, 1208, 1, 0, 0, 0, 140, 1212, 1, 0, 0, 0, 142, 1223, 1, 0, 0, 0, 144, 1233, 1, 0, 0, 0, 146, 1236, 1, 0, 0, 0, 148, 1249, 1, 0, 0, 0, 150, 1251, 1, 0, 0, 0, 152, 1253, 1, 0, 0, 0, 154, 1255, 1, 0, 0, 0, 156, 1259, 1, 0, 0, 0, 158, 1264, 1, 0, 0, 0, 160, 1266, 1, 0, 0, 0, 162, 1270, 1, 0, 0, 0, 164, 1276, 1, 0, 0, 0, 166, 1278, 1, 0, 0, 0, 168, 1292, 1, 0, 0, 0, 170, 1294, 1, 0, 0, 0, 172, 1308, 1, 0, 0, 0, 174, 176, 3, 2, 1, 0, 175, 174, 1, 0, 0, 0, 176, 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 180, 181, 5, 0, 0, 1, 181, 1, 1, 0, 0, 0, 182, 185, 3, 6, 3, 0, 183, 185, 3, 10, 5, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 3, 1, 0, 0, 0, 186, 187, 3, 118, 59, 0, 187, 5, 1, 0, 0, 0, 188, 189, 5, 55, 0, 0, 189, 193, 3, 158, 79, 0, 190, 191, 5, 118, 0, 0, 191, 192, 5, 125, 0, 0, 192, 194, 3, 4, 2, 0, 193, 190, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 7, 1, 0, 0, 0, 195, 200, 3, 158, 79, 0, 196, 197, 5, 119, 0, 0, 197, 199, 3, 158, 79, 0, 198, 196, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 203, 205, 5, 119, 0, 0, 204, 203, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 9, 1, 0, 0, 0, 206, 219, 3, 12, 6, 0, 207, 219, 3, 14, 7, 0, 208, 219, 3, 18, 9, 0, 209, 219, 3, 20, 10, 0, 210, 219, 3, 22, 11, 0, 211, 219, 3, 26, 13, 0, 212, 219, 3, 24, 12, 0, 213, 219, 3, 28, 14, 0, 214, 219, 3, 30, 15, 0, 215, 219, 3, 36, 18, 0, 216, 219, 3, 32, 16, 0, 217, 219, 3, 34, 17, 0, 218, 206, 1, 0, 0, 0, 218, 207, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 209, 1, 0, 0, 0, 218, 210, 1, 0, 0, 0, 218, 211, 1, 0, 0, 0, 218, 212, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 218, 214, 1, 0, 0, 0, 218, 215, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 217, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 222, 5, 75, 0, 0, 221, 223, 3, 4, 2, 0, 222, 221, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 225, 1, 0, 0, 0, 224, 226, 5, 153, 0, 0, 225, 224, 1, 0, 0, 0, 225, 226, 1, 0, 0, 0, 226, 13, 1, 0, 0, 0, 227, 229, 5, 87, 0, 0, 228, 230, 3, 4, 2, 0, 229, 228, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 233, 5, 153, 0, 0, 232, 231, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 15, 1, 0, 0, 0, 234, 243, 5, 14, 0, 0, 235, 236, 5, 133, 0, 0, 236, 239, 3, 158, 79, 0, 237, 238, 5, 118, 0, 0, 238, 240, 3, 158, 79, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 5, 152, 0, 0, 242, 244, 1, 0, 0, 0, 243, 235, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 246, 3, 36, 18, 0, 246, 17, 1, 0, 0, 0, 247, 248, 5, 96, 0, 0, 248, 252, 3, 36, 18, 0, 249, 251, 3, 16, 8, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 257, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 30, 0, 0, 256, 258, 3, 36, 18, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 19, 1, 0, 0, 0, 259, 260, 5, 42, 0, 0, 260, 261, 5, 133, 0, 0, 261, 262, 3, 4, 2, 0, 262, 263, 5, 152, 0, 0, 263, 266, 3, 10, 5, 0, 264, 265, 5, 25, 0, 0, 265, 267, 3, 10, 5, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 269, 5, 103, 0, 0, 269, 270, 5, 133, 0, 0, 270, 271, 3, 4, 2, 0, 271, 272, 5, 152, 0, 0, 272, 274, 3, 10, 5, 0, 273, 275, 5, 153, 0, 0, 274, 273, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 23, 1, 0, 0, 0, 276, 277, 5, 34, 0, 0, 277, 281, 5, 133, 0, 0, 278, 282, 3, 6, 3, 0, 279, 282, 3, 30, 15, 0, 280, 282, 3, 4, 2, 0, 281, 278, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 280, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 285, 5, 153, 0, 0, 284, 286, 3, 4, 2, 0, 285, 284, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 291, 5, 153, 0, 0, 288, 292, 3, 6, 3, 0, 289, 292, 3, 30, 15, 0, 290, 292, 3, 4, 2, 0, 291, 288, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 290, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 294, 5, 152, 0, 0, 294, 296, 3, 10, 5, 0, 295, 297, 5, 153, 0, 0, 296, 295, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 25, 1, 0, 0, 0, 298, 299, 5, 34, 0, 0, 299, 300, 5, 133, 0, 0, 300, 301, 5, 55, 0, 0, 301, 304, 3, 158, 79, 0, 302, 303, 5, 119, 0, 0, 303, 305, 3, 158, 79, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 307, 5, 44, 0, 0, 307, 308, 3, 4, 2, 0, 308, 309, 5, 152, 0, 0, 309, 311, 3, 10, 5, 0, 310, 312, 5, 153, 0, 0, 311, 310, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 27, 1, 0, 0, 0, 313, 314, 7, 0, 0, 0, 314, 315, 3, 158, 79, 0, 315, 317, 5, 133, 0, 0, 316, 318, 3, 8, 4, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 5, 152, 0, 0, 320, 321, 3, 36, 18, 0, 321, 29, 1, 0, 0, 0, 322, 323, 3, 4, 2, 0, 323, 324, 5, 118, 0, 0, 324, 325, 5, 125, 0, 0, 325, 326, 3, 4, 2, 0, 326, 31, 1, 0, 0, 0, 327, 329, 3, 4, 2, 0, 328, 330, 5, 153, 0, 0, 329, 328, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 33, 1, 0, 0, 0, 331, 332, 5, 153, 0, 0, 332, 35, 1, 0, 0, 0, 333, 337, 5, 131, 0, 0, 334, 336, 3, 2, 1, 0, 335, 334, 1, 0, 0, 0, 336, 339, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 340, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 340, 341, 5, 150, 0, 0, 341, 37, 1, 0, 0, 0, 342, 343, 3, 4, 2, 0, 343, 344, 5, 118, 0, 0, 344, 345, 3, 4, 2, 0, 345, 39, 1, 0, 0, 0, 346, 351, 3, 38, 19, 0, 347, 348, 5, 119, 0, 0, 348, 350, 3, 38, 19, 0, 349, 347, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 354, 356, 5, 119, 0, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 41, 1, 0, 0, 0, 357, 361, 3, 48, 24, 0, 358, 361, 3, 50, 25, 0, 359, 361, 3, 122, 61, 0, 360, 357, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 0, 0, 1, 363, 43, 1, 0, 0, 0, 364, 371, 3, 50, 25, 0, 365, 366, 5, 133, 0, 0, 366, 367, 3, 48, 24, 0, 367, 368, 5, 152, 0, 0, 368, 371, 1, 0, 0, 0, 369, 371, 3, 162, 81, 0, 370, 364, 1, 0, 0, 0, 370, 365, 1, 0, 0, 0, 370, 369, 1, 0, 0, 0, 371, 45, 1, 0, 0, 0, 372, 377, 5, 27, 0, 0, 373, 374, 5, 98, 0, 0, 374, 377, 5, 1, 0, 0, 375, 377, 5, 47, 0, 0, 376, 372, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 376, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 3, 44, 22, 0, 379, 47, 1, 0, 0, 0, 380, 384, 3, 44, 22, 0, 381, 383, 3, 46, 23, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 49, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 389, 3, 52, 26, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 5, 82, 0, 0, 391, 393, 5, 24, 0, 0, 392, 391, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 395, 1, 0, 0, 0, 394, 396, 3, 54, 27, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 3, 116, 58, 0, 398, 400, 3, 56, 28, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 403, 3, 58, 29, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 406, 3, 62, 31, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 409, 3, 64, 32, 0, 408, 407, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 411, 1, 0, 0, 0, 410, 412, 3, 66, 33, 0, 411, 410, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 415, 1, 0, 0, 0, 413, 414, 5, 105, 0, 0, 414, 416, 7, 1, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 418, 5, 105, 0, 0, 418, 420, 5, 92, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 423, 3, 68, 34, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 425, 1, 0, 0, 0, 424, 426, 3, 60, 30, 0, 425, 424, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 428, 1, 0, 0, 0, 427, 429, 3, 70, 35, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 433, 3, 74, 37, 0, 431, 433, 3, 76, 38, 0, 432, 430, 1, 0, 0, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 78, 39, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 51, 1, 0, 0, 0, 437, 438, 5, 105, 0, 0, 438, 439, 3, 126, 63, 0, 439, 53, 1, 0, 0, 0, 440, 441, 5, 91, 0, 0, 441, 444, 5, 111, 0, 0, 442, 443, 5, 105, 0, 0, 443, 445, 5, 88, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 55, 1, 0, 0, 0, 446, 447, 5, 35, 0, 0, 447, 448, 3, 80, 40, 0, 448, 57, 1, 0, 0, 0, 449, 451, 7, 2, 0, 0, 450, 449, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 5, 5, 0, 0, 453, 454, 5, 50, 0, 0, 454, 455, 3, 116, 58, 0, 455, 59, 1, 0, 0, 0, 456, 457, 5, 104, 0, 0, 457, 458, 3, 158, 79, 0, 458, 459, 5, 6, 0, 0, 459, 460, 5, 133, 0, 0, 460, 461, 3, 100, 50, 0, 461, 471, 5, 152, 0, 0, 462, 463, 5, 119, 0, 0, 463, 464, 3, 158, 79, 0, 464, 465, 5, 6, 0, 0, 465, 466, 5, 133, 0, 0, 466, 467, 3, 100, 50, 0, 467, 468, 5, 152, 0, 0, 468, 470, 1, 0, 0, 0, 469, 462, 1, 0, 0, 0, 470, 473, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 61, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 474, 475, 5, 72, 0, 0, 475, 476, 3, 118, 59, 0, 476, 63, 1, 0, 0, 0, 477, 478, 5, 102, 0, 0, 478, 479, 3, 118, 59, 0, 479, 65, 1, 0, 0, 0, 480, 481, 5, 38, 0, 0, 481, 488, 5, 11, 0, 0, 482, 483, 7, 1, 0, 0, 483, 484, 5, 133, 0, 0, 484, 485, 3, 116, 58, 0, 485, 486, 5, 152, 0, 0, 486, 489, 1, 0, 0, 0, 487, 489, 3, 116, 58, 0, 488, 482, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 67, 1, 0, 0, 0, 490, 491, 5, 39, 0, 0, 491, 492, 3, 118, 59, 0, 492, 69, 1, 0, 0, 0, 493, 494, 5, 67, 0, 0, 494, 495, 5, 11, 0, 0, 495, 496, 3, 90, 45, 0, 496, 71, 1, 0, 0, 0, 497, 498, 5, 67, 0, 0, 498, 499, 5, 11, 0, 0, 499, 500, 3, 116, 58, 0, 500, 73, 1, 0, 0, 0, 501, 502, 5, 57, 0, 0, 502, 505, 3, 118, 59, 0, 503, 504, 5, 119, 0, 0, 504, 506, 3, 118, 59, 0, 505, 503, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 511, 1, 0, 0, 0, 507, 508, 5, 105, 0, 0, 508, 512, 5, 88, 0, 0, 509, 510, 5, 11, 0, 0, 510, 512, 3, 116, 58, 0, 511, 507, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 531, 1, 0, 0, 0, 513, 514, 5, 57, 0, 0, 514, 517, 3, 118, 59, 0, 515, 516, 5, 105, 0, 0, 516, 518, 5, 88, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 64, 0, 0, 520, 521, 3, 118, 59, 0, 521, 531, 1, 0, 0, 0, 522, 523, 5, 57, 0, 0, 523, 524, 3, 118, 59, 0, 524, 525, 5, 64, 0, 0, 525, 528, 3, 118, 59, 0, 526, 527, 5, 11, 0, 0, 527, 529, 3, 116, 58, 0, 528, 526, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 531, 1, 0, 0, 0, 530, 501, 1, 0, 0, 0, 530, 513, 1, 0, 0, 0, 530, 522, 1, 0, 0, 0, 531, 75, 1, 0, 0, 0, 532, 533, 5, 64, 0, 0, 533, 534, 3, 118, 59, 0, 534, 77, 1, 0, 0, 0, 535, 536, 5, 84, 0, 0, 536, 537, 3, 96, 48, 0, 537, 79, 1, 0, 0, 0, 538, 539, 6, 40, -1, 0, 539, 541, 3, 134, 67, 0, 540, 542, 5, 29, 0, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 545, 3, 88, 44, 0, 544, 543, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 551, 1, 0, 0, 0, 546, 547, 5, 133, 0, 0, 547, 548, 3, 80, 40, 0, 548, 549, 5, 152, 0, 0, 549, 551, 1, 0, 0, 0, 550, 538, 1, 0, 0, 0, 550, 546, 1, 0, 0, 0, 551, 566, 1, 0, 0, 0, 552, 553, 10, 3, 0, 0, 553, 554, 3, 84, 42, 0, 554, 555, 3, 80, 40, 4, 555, 565, 1, 0, 0, 0, 556, 558, 10, 4, 0, 0, 557, 559, 3, 82, 41, 0, 558, 557, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 561, 5, 50, 0, 0, 561, 562, 3, 80, 40, 0, 562, 563, 3, 86, 43, 0, 563, 565, 1, 0, 0, 0, 564, 552, 1, 0, 0, 0, 564, 556, 1, 0, 0, 0, 565, 568, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 81, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 569, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 579, 5, 46, 0, 0, 573, 575, 5, 46, 0, 0, 574, 576, 7, 3, 0, 0, 575, 574, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 579, 1, 0, 0, 0, 577, 579, 7, 3, 0, 0, 578, 570, 1, 0, 0, 0, 578, 573, 1, 0, 0, 0, 578, 577, 1, 0, 0, 0, 579, 613, 1, 0, 0, 0, 580, 582, 7, 4, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 585, 7, 5, 0, 0, 584, 586, 5, 68, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 595, 1, 0, 0, 0, 587, 589, 7, 5, 0, 0, 588, 590, 5, 68, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 593, 7, 4, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 595, 1, 0, 0, 0, 594, 581, 1, 0, 0, 0, 594, 587, 1, 0, 0, 0, 595, 613, 1, 0, 0, 0, 596, 598, 7, 6, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 601, 5, 36, 0, 0, 600, 602, 5, 68, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 611, 1, 0, 0, 0, 603, 605, 5, 36, 0, 0, 604, 606, 5, 68, 0, 0, 605, 604, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 608, 1, 0, 0, 0, 607, 609, 7, 6, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 611, 1, 0, 0, 0, 610, 597, 1, 0, 0, 0, 610, 603, 1, 0, 0, 0, 611, 613, 1, 0, 0, 0, 612, 578, 1, 0, 0, 0, 612, 594, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 83, 1, 0, 0, 0, 614, 615, 5, 17, 0, 0, 615, 618, 5, 50, 0, 0, 616, 618, 5, 119, 0, 0, 617, 614, 1, 0, 0, 0, 617, 616, 1, 0, 0, 0, 618, 85, 1, 0, 0, 0, 619, 620, 5, 65, 0, 0, 620, 629, 3, 116, 58, 0, 621, 622, 5, 99, 0, 0, 622, 623, 5, 133, 0, 0, 623, 624, 3, 116, 58, 0, 624, 625, 5, 152, 0, 0, 625, 629, 1, 0, 0, 0, 626, 627, 5, 99, 0, 0, 627, 629, 3, 116, 58, 0, 628, 619, 1, 0, 0, 0, 628, 621, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 629, 87, 1, 0, 0, 0, 630, 631, 5, 80, 0, 0, 631, 634, 3, 94, 47, 0, 632, 633, 5, 64, 0, 0, 633, 635, 3, 94, 47, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 89, 1, 0, 0, 0, 636, 641, 3, 92, 46, 0, 637, 638, 5, 119, 0, 0, 638, 640, 3, 92, 46, 0, 639, 637, 1, 0, 0, 0, 640, 643, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 91, 1, 0, 0, 0, 643, 641, 1, 0, 0, 0, 644, 646, 3, 118, 59, 0, 645, 647, 7, 7, 0, 0, 646, 645, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 649, 5, 63, 0, 0, 649, 651, 7, 8, 0, 0, 650, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 654, 1, 0, 0, 0, 652, 653, 5, 16, 0, 0, 653, 655, 5, 113, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 663, 3, 162, 81, 0, 657, 660, 3, 146, 73, 0, 658, 659, 5, 154, 0, 0, 659, 661, 3, 146, 73, 0, 660, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 656, 1, 0, 0, 0, 662, 657, 1, 0, 0, 0, 663, 95, 1, 0, 0, 0, 664, 669, 3, 98, 49, 0, 665, 666, 5, 119, 0, 0, 666, 668, 3, 98, 49, 0, 667, 665, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 97, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 672, 673, 3, 158, 79, 0, 673, 674, 5, 125, 0, 0, 674, 675, 3, 148, 74, 0, 675, 99, 1, 0, 0, 0, 676, 678, 3, 102, 51, 0, 677, 676, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 680, 1, 0, 0, 0, 679, 681, 3, 104, 52, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 683, 1, 0, 0, 0, 682, 684, 3, 106, 53, 0, 683, 682, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 101, 1, 0, 0, 0, 685, 686, 5, 70, 0, 0, 686, 687, 5, 11, 0, 0, 687, 688, 3, 116, 58, 0, 688, 103, 1, 0, 0, 0, 689, 690, 5, 67, 0, 0, 690, 691, 5, 11, 0, 0, 691, 692, 3, 90, 45, 0, 692, 105, 1, 0, 0, 0, 693, 694, 7, 9, 0, 0, 694, 695, 3, 108, 54, 0, 695, 107, 1, 0, 0, 0, 696, 703, 3, 110, 55, 0, 697, 698, 5, 9, 0, 0, 698, 699, 3, 110, 55, 0, 699, 700, 5, 2, 0, 0, 700, 701, 3, 110, 55, 0, 701, 703, 1, 0, 0, 0, 702, 696, 1, 0, 0, 0, 702, 697, 1, 0, 0, 0, 703, 109, 1, 0, 0, 0, 704, 705, 5, 19, 0, 0, 705, 717, 5, 78, 0, 0, 706, 707, 5, 97, 0, 0, 707, 717, 5, 71, 0, 0, 708, 709, 5, 97, 0, 0, 709, 717, 5, 33, 0, 0, 710, 711, 3, 146, 73, 0, 711, 712, 5, 71, 0, 0, 712, 717, 1, 0, 0, 0, 713, 714, 3, 146, 73, 0, 714, 715, 5, 33, 0, 0, 715, 717, 1, 0, 0, 0, 716, 704, 1, 0, 0, 0, 716, 706, 1, 0, 0, 0, 716, 708, 1, 0, 0, 0, 716, 710, 1, 0, 0, 0, 716, 713, 1, 0, 0, 0, 717, 111, 1, 0, 0, 0, 718, 719, 3, 118, 59, 0, 719, 720, 5, 0, 0, 1, 720, 113, 1, 0, 0, 0, 721, 778, 3, 158, 79, 0, 722, 723, 3, 158, 79, 0, 723, 724, 5, 133, 0, 0, 724, 725, 3, 158, 79, 0, 725, 732, 3, 114, 57, 0, 726, 727, 5, 119, 0, 0, 727, 728, 3, 158, 79, 0, 728, 729, 3, 114, 57, 0, 729, 731, 1, 0, 0, 0, 730, 726, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 737, 5, 119, 0, 0, 736, 735, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 5, 152, 0, 0, 739, 778, 1, 0, 0, 0, 740, 741, 3, 158, 79, 0, 741, 742, 5, 133, 0, 0, 742, 747, 3, 160, 80, 0, 743, 744, 5, 119, 0, 0, 744, 746, 3, 160, 80, 0, 745, 743, 1, 0, 0, 0, 746, 749, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 751, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 750, 752, 5, 119, 0, 0, 751, 750, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 5, 152, 0, 0, 754, 778, 1, 0, 0, 0, 755, 756, 3, 158, 79, 0, 756, 757, 5, 133, 0, 0, 757, 762, 3, 114, 57, 0, 758, 759, 5, 119, 0, 0, 759, 761, 3, 114, 57, 0, 760, 758, 1, 0, 0, 0, 761, 764, 1, 0, 0, 0, 762, 760, 1, 0, 0, 0, 762, 763, 1, 0, 0, 0, 763, 766, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 767, 5, 119, 0, 0, 766, 765, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 5, 152, 0, 0, 769, 778, 1, 0, 0, 0, 770, 771, 3, 158, 79, 0, 771, 773, 5, 133, 0, 0, 772, 774, 3, 116, 58, 0, 773, 772, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 5, 152, 0, 0, 776, 778, 1, 0, 0, 0, 777, 721, 1, 0, 0, 0, 777, 722, 1, 0, 0, 0, 777, 740, 1, 0, 0, 0, 777, 755, 1, 0, 0, 0, 777, 770, 1, 0, 0, 0, 778, 115, 1, 0, 0, 0, 779, 784, 3, 118, 59, 0, 780, 781, 5, 119, 0, 0, 781, 783, 3, 118, 59, 0, 782, 780, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 782, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 787, 789, 5, 119, 0, 0, 788, 787, 1, 0, 0, 0, 788, 789, 1, 0, 0, 0, 789, 117, 1, 0, 0, 0, 790, 791, 6, 59, -1, 0, 791, 793, 5, 12, 0, 0, 792, 794, 3, 118, 59, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 800, 1, 0, 0, 0, 795, 796, 5, 101, 0, 0, 796, 797, 3, 118, 59, 0, 797, 798, 5, 86, 0, 0, 798, 799, 3, 118, 59, 0, 799, 801, 1, 0, 0, 0, 800, 795, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 25, 0, 0, 805, 807, 3, 118, 59, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 5, 26, 0, 0, 809, 941, 1, 0, 0, 0, 810, 811, 5, 13, 0, 0, 811, 812, 5, 133, 0, 0, 812, 813, 3, 118, 59, 0, 813, 814, 5, 6, 0, 0, 814, 815, 3, 114, 57, 0, 815, 816, 5, 152, 0, 0, 816, 941, 1, 0, 0, 0, 817, 818, 5, 20, 0, 0, 818, 941, 5, 113, 0, 0, 819, 820, 5, 48, 0, 0, 820, 821, 3, 118, 59, 0, 821, 822, 3, 150, 75, 0, 822, 941, 1, 0, 0, 0, 823, 824, 5, 85, 0, 0, 824, 825, 5, 133, 0, 0, 825, 826, 3, 118, 59, 0, 826, 827, 5, 35, 0, 0, 827, 830, 3, 118, 59, 0, 828, 829, 5, 34, 0, 0, 829, 831, 3, 118, 59, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 833, 5, 152, 0, 0, 833, 941, 1, 0, 0, 0, 834, 835, 5, 89, 0, 0, 835, 941, 5, 113, 0, 0, 836, 837, 5, 94, 0, 0, 837, 838, 5, 133, 0, 0, 838, 839, 7, 10, 0, 0, 839, 840, 3, 164, 82, 0, 840, 841, 5, 35, 0, 0, 841, 842, 3, 118, 59, 0, 842, 843, 5, 152, 0, 0, 843, 941, 1, 0, 0, 0, 844, 845, 3, 158, 79, 0, 845, 847, 5, 133, 0, 0, 846, 848, 3, 116, 58, 0, 847, 846, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 5, 152, 0, 0, 850, 859, 1, 0, 0, 0, 851, 853, 5, 133, 0, 0, 852, 854, 5, 24, 0, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 856, 1, 0, 0, 0, 855, 857, 3, 116, 58, 0, 856, 855, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 5, 152, 0, 0, 859, 851, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 69, 0, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 100, 50, 0, 864, 865, 5, 152, 0, 0, 865, 941, 1, 0, 0, 0, 866, 867, 3, 158, 79, 0, 867, 869, 5, 133, 0, 0, 868, 870, 3, 116, 58, 0, 869, 868, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 5, 152, 0, 0, 872, 881, 1, 0, 0, 0, 873, 875, 5, 133, 0, 0, 874, 876, 5, 24, 0, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 1, 0, 0, 0, 877, 879, 3, 116, 58, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 882, 5, 152, 0, 0, 881, 873, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 69, 0, 0, 884, 885, 3, 158, 79, 0, 885, 941, 1, 0, 0, 0, 886, 892, 3, 158, 79, 0, 887, 889, 5, 133, 0, 0, 888, 890, 3, 116, 58, 0, 889, 888, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 5, 152, 0, 0, 892, 887, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 896, 5, 133, 0, 0, 895, 897, 5, 24, 0, 0, 896, 895, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 899, 1, 0, 0, 0, 898, 900, 3, 116, 58, 0, 899, 898, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 5, 152, 0, 0, 902, 941, 1, 0, 0, 0, 903, 941, 3, 122, 61, 0, 904, 941, 3, 166, 83, 0, 905, 941, 3, 148, 74, 0, 906, 907, 5, 121, 0, 0, 907, 941, 3, 118, 59, 20, 908, 909, 5, 61, 0, 0, 909, 941, 3, 118, 59, 14, 910, 911, 3, 138, 69, 0, 911, 912, 5, 123, 0, 0, 912, 914, 1, 0, 0, 0, 913, 910, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 941, 5, 115, 0, 0, 916, 917, 5, 133, 0, 0, 917, 918, 3, 48, 24, 0, 918, 919, 5, 152, 0, 0, 919, 941, 1, 0, 0, 0, 920, 921, 5, 133, 0, 0, 921, 922, 3, 118, 59, 0, 922, 923, 5, 152, 0, 0, 923, 941, 1, 0, 0, 0, 924, 925, 5, 133, 0, 0, 925, 926, 3, 116, 58, 0, 926, 927, 5, 152, 0, 0, 927, 941, 1, 0, 0, 0, 928, 930, 5, 132, 0, 0, 929, 931, 3, 116, 58, 0, 930, 929, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 941, 5, 151, 0, 0, 933, 935, 5, 131, 0, 0, 934, 936, 3, 40, 20, 0, 935, 934, 1, 0, 0, 0, 935, 936, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 941, 5, 150, 0, 0, 938, 941, 3, 120, 60, 0, 939, 941, 3, 130, 65, 0, 940, 790, 1, 0, 0, 0, 940, 810, 1, 0, 0, 0, 940, 817, 1, 0, 0, 0, 940, 819, 1, 0, 0, 0, 940, 823, 1, 0, 0, 0, 940, 834, 1, 0, 0, 0, 940, 836, 1, 0, 0, 0, 940, 844, 1, 0, 0, 0, 940, 866, 1, 0, 0, 0, 940, 886, 1, 0, 0, 0, 940, 903, 1, 0, 0, 0, 940, 904, 1, 0, 0, 0, 940, 905, 1, 0, 0, 0, 940, 906, 1, 0, 0, 0, 940, 908, 1, 0, 0, 0, 940, 913, 1, 0, 0, 0, 940, 916, 1, 0, 0, 0, 940, 920, 1, 0, 0, 0, 940, 924, 1, 0, 0, 0, 940, 928, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 1052, 1, 0, 0, 0, 942, 946, 10, 19, 0, 0, 943, 947, 5, 115, 0, 0, 944, 947, 5, 154, 0, 0, 945, 947, 5, 141, 0, 0, 946, 943, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 1051, 3, 118, 59, 20, 949, 953, 10, 18, 0, 0, 950, 954, 5, 142, 0, 0, 951, 954, 5, 121, 0, 0, 952, 954, 5, 120, 0, 0, 953, 950, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 952, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 1051, 3, 118, 59, 19, 956, 981, 10, 17, 0, 0, 957, 982, 5, 124, 0, 0, 958, 982, 5, 125, 0, 0, 959, 982, 5, 136, 0, 0, 960, 982, 5, 134, 0, 0, 961, 982, 5, 135, 0, 0, 962, 982, 5, 126, 0, 0, 963, 982, 5, 127, 0, 0, 964, 966, 5, 61, 0, 0, 965, 964, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 969, 5, 44, 0, 0, 968, 970, 5, 15, 0, 0, 969, 968, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 982, 1, 0, 0, 0, 971, 973, 5, 61, 0, 0, 972, 971, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 982, 7, 11, 0, 0, 975, 982, 5, 148, 0, 0, 976, 982, 5, 149, 0, 0, 977, 982, 5, 138, 0, 0, 978, 982, 5, 129, 0, 0, 979, 982, 5, 130, 0, 0, 980, 982, 5, 137, 0, 0, 981, 957, 1, 0, 0, 0, 981, 958, 1, 0, 0, 0, 981, 959, 1, 0, 0, 0, 981, 960, 1, 0, 0, 0, 981, 961, 1, 0, 0, 0, 981, 962, 1, 0, 0, 0, 981, 963, 1, 0, 0, 0, 981, 965, 1, 0, 0, 0, 981, 972, 1, 0, 0, 0, 981, 975, 1, 0, 0, 0, 981, 976, 1, 0, 0, 0, 981, 977, 1, 0, 0, 0, 981, 978, 1, 0, 0, 0, 981, 979, 1, 0, 0, 0, 981, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 1051, 3, 118, 59, 18, 984, 985, 10, 15, 0, 0, 985, 986, 5, 140, 0, 0, 986, 1051, 3, 118, 59, 16, 987, 988, 10, 13, 0, 0, 988, 989, 5, 2, 0, 0, 989, 1051, 3, 118, 59, 14, 990, 991, 10, 12, 0, 0, 991, 992, 5, 66, 0, 0, 992, 1051, 3, 118, 59, 13, 993, 995, 10, 11, 0, 0, 994, 996, 5, 61, 0, 0, 995, 994, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 998, 5, 9, 0, 0, 998, 999, 3, 118, 59, 0, 999, 1000, 5, 2, 0, 0, 1000, 1001, 3, 118, 59, 12, 1001, 1051, 1, 0, 0, 0, 1002, 1003, 10, 10, 0, 0, 1003, 1004, 5, 143, 0, 0, 1004, 1005, 3, 118, 59, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 3, 118, 59, 10, 1007, 1051, 1, 0, 0, 0, 1008, 1009, 10, 30, 0, 0, 1009, 1011, 5, 133, 0, 0, 1010, 1012, 3, 116, 58, 0, 1011, 1010, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1051, 5, 152, 0, 0, 1014, 1015, 10, 26, 0, 0, 1015, 1016, 5, 132, 0, 0, 1016, 1017, 3, 118, 59, 0, 1017, 1018, 5, 151, 0, 0, 1018, 1051, 1, 0, 0, 0, 1019, 1020, 10, 25, 0, 0, 1020, 1021, 5, 123, 0, 0, 1021, 1051, 5, 111, 0, 0, 1022, 1023, 10, 24, 0, 0, 1023, 1024, 5, 123, 0, 0, 1024, 1051, 3, 158, 79, 0, 1025, 1026, 10, 23, 0, 0, 1026, 1027, 5, 139, 0, 0, 1027, 1028, 5, 132, 0, 0, 1028, 1029, 3, 118, 59, 0, 1029, 1030, 5, 151, 0, 0, 1030, 1051, 1, 0, 0, 0, 1031, 1032, 10, 22, 0, 0, 1032, 1033, 5, 139, 0, 0, 1033, 1051, 5, 111, 0, 0, 1034, 1035, 10, 21, 0, 0, 1035, 1036, 5, 139, 0, 0, 1036, 1051, 3, 158, 79, 0, 1037, 1038, 10, 16, 0, 0, 1038, 1040, 5, 49, 0, 0, 1039, 1041, 5, 61, 0, 0, 1040, 1039, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1051, 5, 62, 0, 0, 1043, 1048, 10, 9, 0, 0, 1044, 1045, 5, 6, 0, 0, 1045, 1049, 3, 158, 79, 0, 1046, 1047, 5, 6, 0, 0, 1047, 1049, 5, 113, 0, 0, 1048, 1044, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1051, 1, 0, 0, 0, 1050, 942, 1, 0, 0, 0, 1050, 949, 1, 0, 0, 0, 1050, 956, 1, 0, 0, 0, 1050, 984, 1, 0, 0, 0, 1050, 987, 1, 0, 0, 0, 1050, 990, 1, 0, 0, 0, 1050, 993, 1, 0, 0, 0, 1050, 1002, 1, 0, 0, 0, 1050, 1008, 1, 0, 0, 0, 1050, 1014, 1, 0, 0, 0, 1050, 1019, 1, 0, 0, 0, 1050, 1022, 1, 0, 0, 0, 1050, 1025, 1, 0, 0, 0, 1050, 1031, 1, 0, 0, 0, 1050, 1034, 1, 0, 0, 0, 1050, 1037, 1, 0, 0, 0, 1050, 1043, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 119, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1055, 1056, 5, 133, 0, 0, 1056, 1061, 3, 158, 79, 0, 1057, 1058, 5, 119, 0, 0, 1058, 1060, 3, 158, 79, 0, 1059, 1057, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1065, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1066, 5, 119, 0, 0, 1065, 1064, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 5, 152, 0, 0, 1068, 1083, 1, 0, 0, 0, 1069, 1074, 3, 158, 79, 0, 1070, 1071, 5, 119, 0, 0, 1071, 1073, 3, 158, 79, 0, 1072, 1070, 1, 0, 0, 0, 1073, 1076, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1077, 1079, 5, 119, 0, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1083, 1, 0, 0, 0, 1080, 1081, 5, 133, 0, 0, 1081, 1083, 5, 152, 0, 0, 1082, 1055, 1, 0, 0, 0, 1082, 1069, 1, 0, 0, 0, 1082, 1080, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1087, 5, 114, 0, 0, 1085, 1088, 3, 118, 59, 0, 1086, 1088, 3, 36, 18, 0, 1087, 1085, 1, 0, 0, 0, 1087, 1086, 1, 0, 0, 0, 1088, 121, 1, 0, 0, 0, 1089, 1090, 5, 135, 0, 0, 1090, 1094, 3, 158, 79, 0, 1091, 1093, 3, 124, 62, 0, 1092, 1091, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1098, 5, 154, 0, 0, 1098, 1099, 5, 127, 0, 0, 1099, 1122, 1, 0, 0, 0, 1100, 1101, 5, 135, 0, 0, 1101, 1105, 3, 158, 79, 0, 1102, 1104, 3, 124, 62, 0, 1103, 1102, 1, 0, 0, 0, 1104, 1107, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1108, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1108, 1114, 5, 127, 0, 0, 1109, 1115, 3, 122, 61, 0, 1110, 1111, 5, 131, 0, 0, 1111, 1112, 3, 118, 59, 0, 1112, 1113, 5, 150, 0, 0, 1113, 1115, 1, 0, 0, 0, 1114, 1109, 1, 0, 0, 0, 1114, 1110, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 5, 135, 0, 0, 1117, 1118, 5, 154, 0, 0, 1118, 1119, 3, 158, 79, 0, 1119, 1120, 5, 127, 0, 0, 1120, 1122, 1, 0, 0, 0, 1121, 1089, 1, 0, 0, 0, 1121, 1100, 1, 0, 0, 0, 1122, 123, 1, 0, 0, 0, 1123, 1124, 3, 158, 79, 0, 1124, 1125, 5, 125, 0, 0, 1125, 1126, 3, 164, 82, 0, 1126, 1135, 1, 0, 0, 0, 1127, 1128, 3, 158, 79, 0, 1128, 1129, 5, 125, 0, 0, 1129, 1130, 5, 131, 0, 0, 1130, 1131, 3, 118, 59, 0, 1131, 1132, 5, 150, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1135, 3, 158, 79, 0, 1134, 1123, 1, 0, 0, 0, 1134, 1127, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1135, 125, 1, 0, 0, 0, 1136, 1141, 3, 128, 64, 0, 1137, 1138, 5, 119, 0, 0, 1138, 1140, 3, 128, 64, 0, 1139, 1137, 1, 0, 0, 0, 1140, 1143, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1145, 1, 0, 0, 0, 1143, 1141, 1, 0, 0, 0, 1144, 1146, 5, 119, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 127, 1, 0, 0, 0, 1147, 1148, 3, 158, 79, 0, 1148, 1149, 5, 6, 0, 0, 1149, 1150, 5, 133, 0, 0, 1150, 1151, 3, 48, 24, 0, 1151, 1152, 5, 152, 0, 0, 1152, 1158, 1, 0, 0, 0, 1153, 1154, 3, 118, 59, 0, 1154, 1155, 5, 6, 0, 0, 1155, 1156, 3, 158, 79, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1147, 1, 0, 0, 0, 1157, 1153, 1, 0, 0, 0, 1158, 129, 1, 0, 0, 0, 1159, 1167, 3, 162, 81, 0, 1160, 1161, 3, 138, 69, 0, 1161, 1162, 5, 123, 0, 0, 1162, 1164, 1, 0, 0, 0, 1163, 1160, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1167, 3, 132, 66, 0, 1166, 1159, 1, 0, 0, 0, 1166, 1163, 1, 0, 0, 0, 1167, 131, 1, 0, 0, 0, 1168, 1173, 3, 158, 79, 0, 1169, 1170, 5, 123, 0, 0, 1170, 1172, 3, 158, 79, 0, 1171, 1169, 1, 0, 0, 0, 1172, 1175, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 133, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1176, 1177, 6, 67, -1, 0, 1177, 1186, 3, 138, 69, 0, 1178, 1186, 3, 136, 68, 0, 1179, 1180, 5, 133, 0, 0, 1180, 1181, 3, 48, 24, 0, 1181, 1182, 5, 152, 0, 0, 1182, 1186, 1, 0, 0, 0, 1183, 1186, 3, 122, 61, 0, 1184, 1186, 3, 162, 81, 0, 1185, 1176, 1, 0, 0, 0, 1185, 1178, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1184, 1, 0, 0, 0, 1186, 1195, 1, 0, 0, 0, 1187, 1191, 10, 3, 0, 0, 1188, 1192, 3, 156, 78, 0, 1189, 1190, 5, 6, 0, 0, 1190, 1192, 3, 158, 79, 0, 1191, 1188, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1194, 1, 0, 0, 0, 1193, 1187, 1, 0, 0, 0, 1194, 1197, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1195, 1196, 1, 0, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1195, 1, 0, 0, 0, 1198, 1199, 3, 158, 79, 0, 1199, 1201, 5, 133, 0, 0, 1200, 1202, 3, 140, 70, 0, 1201, 1200, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 5, 152, 0, 0, 1204, 137, 1, 0, 0, 0, 1205, 1206, 3, 142, 71, 0, 1206, 1207, 5, 123, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1205, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 3, 158, 79, 0, 1211, 139, 1, 0, 0, 0, 1212, 1217, 3, 118, 59, 0, 1213, 1214, 5, 119, 0, 0, 1214, 1216, 3, 118, 59, 0, 1215, 1213, 1, 0, 0, 0, 1216, 1219, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1221, 1, 0, 0, 0, 1219, 1217, 1, 0, 0, 0, 1220, 1222, 5, 119, 0, 0, 1221, 1220, 1, 0, 0, 0, 1221, 1222, 1, 0, 0, 0, 1222, 141, 1, 0, 0, 0, 1223, 1224, 3, 158, 79, 0, 1224, 143, 1, 0, 0, 0, 1225, 1234, 5, 109, 0, 0, 1226, 1227, 5, 123, 0, 0, 1227, 1234, 7, 12, 0, 0, 1228, 1229, 5, 111, 0, 0, 1229, 1231, 5, 123, 0, 0, 1230, 1232, 7, 12, 0, 0, 1231, 1230, 1, 0, 0, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1234, 1, 0, 0, 0, 1233, 1225, 1, 0, 0, 0, 1233, 1226, 1, 0, 0, 0, 1233, 1228, 1, 0, 0, 0, 1234, 145, 1, 0, 0, 0, 1235, 1237, 7, 13, 0, 0, 1236, 1235, 1, 0, 0, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1244, 1, 0, 0, 0, 1238, 1245, 3, 144, 72, 0, 1239, 1245, 5, 110, 0, 0, 1240, 1245, 5, 111, 0, 0, 1241, 1245, 5, 112, 0, 0, 1242, 1245, 5, 45, 0, 0, 1243, 1245, 5, 60, 0, 0, 1244, 1238, 1, 0, 0, 0, 1244, 1239, 1, 0, 0, 0, 1244, 1240, 1, 0, 0, 0, 1244, 1241, 1, 0, 0, 0, 1244, 1242, 1, 0, 0, 0, 1244, 1243, 1, 0, 0, 0, 1245, 147, 1, 0, 0, 0, 1246, 1250, 3, 146, 73, 0, 1247, 1250, 5, 113, 0, 0, 1248, 1250, 5, 62, 0, 0, 1249, 1246, 1, 0, 0, 0, 1249, 1247, 1, 0, 0, 0, 1249, 1248, 1, 0, 0, 0, 1250, 149, 1, 0, 0, 0, 1251, 1252, 7, 14, 0, 0, 1252, 151, 1, 0, 0, 0, 1253, 1254, 7, 15, 0, 0, 1254, 153, 1, 0, 0, 0, 1255, 1256, 7, 16, 0, 0, 1256, 155, 1, 0, 0, 0, 1257, 1260, 5, 108, 0, 0, 1258, 1260, 3, 154, 77, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1258, 1, 0, 0, 0, 1260, 157, 1, 0, 0, 0, 1261, 1265, 5, 108, 0, 0, 1262, 1265, 3, 150, 75, 0, 1263, 1265, 3, 152, 76, 0, 1264, 1261, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1263, 1, 0, 0, 0, 1265, 159, 1, 0, 0, 0, 1266, 1267, 3, 164, 82, 0, 1267, 1268, 5, 125, 0, 0, 1268, 1269, 3, 146, 73, 0, 1269, 161, 1, 0, 0, 0, 1270, 1271, 5, 131, 0, 0, 1271, 1272, 3, 118, 59, 0, 1272, 1273, 5, 150, 0, 0, 1273, 163, 1, 0, 0, 0, 1274, 1277, 5, 113, 0, 0, 1275, 1277, 3, 166, 83, 0, 1276, 1274, 1, 0, 0, 0, 1276, 1275, 1, 0, 0, 0, 1277, 165, 1, 0, 0, 0, 1278, 1282, 5, 145, 0, 0, 1279, 1281, 3, 168, 84, 0, 1280, 1279, 1, 0, 0, 0, 1281, 1284, 1, 0, 0, 0, 1282, 1280, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1285, 1, 0, 0, 0, 1284, 1282, 1, 0, 0, 0, 1285, 1286, 5, 147, 0, 0, 1286, 167, 1, 0, 0, 0, 1287, 1288, 5, 160, 0, 0, 1288, 1289, 3, 118, 59, 0, 1289, 1290, 5, 150, 0, 0, 1290, 1293, 1, 0, 0, 0, 1291, 1293, 5, 159, 0, 0, 1292, 1287, 1, 0, 0, 0, 1292, 1291, 1, 0, 0, 0, 1293, 169, 1, 0, 0, 0, 1294, 1298, 5, 146, 0, 0, 1295, 1297, 3, 172, 86, 0, 1296, 1295, 1, 0, 0, 0, 1297, 1300, 1, 0, 0, 0, 1298, 1296, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1301, 1, 0, 0, 0, 1300, 1298, 1, 0, 0, 0, 1301, 1302, 5, 0, 0, 1, 1302, 171, 1, 0, 0, 0, 1303, 1304, 5, 162, 0, 0, 1304, 1305, 3, 118, 59, 0, 1305, 1306, 5, 150, 0, 0, 1306, 1309, 1, 0, 0, 0, 1307, 1309, 5, 161, 0, 0, 1308, 1303, 1, 0, 0, 0, 1308, 1307, 1, 0, 0, 0, 1309, 173, 1, 0, 0, 0, 168, 177, 184, 193, 200, 204, 218, 222, 225, 229, 232, 239, 243, 252, 257, 266, 274, 281, 285, 291, 296, 304, 311, 317, 329, 337, 351, 355, 360, 370, 376, 384, 388, 392, 395, 399, 402, 405, 408, 411, 415, 419, 422, 425, 428, 432, 435, 444, 450, 471, 488, 505, 511, 517, 528, 530, 541, 544, 550, 558, 564, 566, 570, 575, 578, 581, 585, 589, 592, 594, 597, 601, 605, 608, 610, 612, 617, 628, 634, 641, 646, 650, 654, 660, 662, 669, 677, 680, 683, 702, 716, 732, 736, 747, 751, 762, 766, 773, 777, 784, 788, 793, 802, 806, 830, 847, 853, 856, 859, 869, 875, 878, 881, 889, 892, 896, 899, 913, 930, 935, 940, 946, 953, 965, 969, 972, 981, 995, 1011, 1040, 1048, 1050, 1052, 1061, 1065, 1074, 1078, 1082, 1087, 1094, 1105, 1114, 1121, 1134, 1141, 1145, 1157, 1163, 1166, 1173, 1185, 1191, 1195, 1201, 1208, 1217, 1221, 1231, 1233, 1236, 1244, 1249, 1259, 1264, 1276, 1282, 1292, 1298, 1308] \ No newline at end of file diff --git a/hogql_parser/HogQLParser.tokens b/hogql_parser/HogQLParser.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/hogql_parser/HogQLParser.tokens +++ b/hogql_parser/HogQLParser.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/hogql_parser/HogQLParserBaseVisitor.h b/hogql_parser/HogQLParserBaseVisitor.h index 80b4d5d487765..59f4a7883406e 100644 --- a/hogql_parser/HogQLParserBaseVisitor.h +++ b/hogql_parser/HogQLParserBaseVisitor.h @@ -103,11 +103,15 @@ class HogQLParserBaseVisitor : public HogQLParserVisitor { return visitChildren(ctx); } - virtual std::any visitSelectUnionStmt(HogQLParser::SelectUnionStmtContext *ctx) override { + virtual std::any visitSelectStmtWithParens(HogQLParser::SelectStmtWithParensContext *ctx) override { return visitChildren(ctx); } - virtual std::any visitSelectStmtWithParens(HogQLParser::SelectStmtWithParensContext *ctx) override { + virtual std::any visitSubsequentSelectSetClause(HogQLParser::SubsequentSelectSetClauseContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitSelectSetStmt(HogQLParser::SelectSetStmtContext *ctx) override { return visitChildren(ctx); } diff --git a/hogql_parser/HogQLParserVisitor.h b/hogql_parser/HogQLParserVisitor.h index 0b9e1797ad836..7e1728b26a1de 100644 --- a/hogql_parser/HogQLParserVisitor.h +++ b/hogql_parser/HogQLParserVisitor.h @@ -63,10 +63,12 @@ class HogQLParserVisitor : public antlr4::tree::AbstractParseTreeVisitor { virtual std::any visitSelect(HogQLParser::SelectContext *context) = 0; - virtual std::any visitSelectUnionStmt(HogQLParser::SelectUnionStmtContext *context) = 0; - virtual std::any visitSelectStmtWithParens(HogQLParser::SelectStmtWithParensContext *context) = 0; + virtual std::any visitSubsequentSelectSetClause(HogQLParser::SubsequentSelectSetClauseContext *context) = 0; + + virtual std::any visitSelectSetStmt(HogQLParser::SelectSetStmtContext *context) = 0; + virtual std::any visitSelectStmt(HogQLParser::SelectStmtContext *context) = 0; virtual std::any visitWithClause(HogQLParser::WithClauseContext *context) = 0; diff --git a/hogql_parser/__init__.pyi b/hogql_parser/__init__.pyi index 69734c92cc41f..e36c09e629fba 100644 --- a/hogql_parser/__init__.pyi +++ b/hogql_parser/__init__.pyi @@ -1,4 +1,4 @@ -from posthog.hogql.ast import SelectQuery, SelectUnionQuery, Program +from posthog.hogql.ast import SelectQuery, SelectSetQuery, Program from posthog.hogql.base import AST def parse_expr(expr: str, /, *, is_internal: bool = False) -> AST: @@ -15,7 +15,7 @@ def parse_order_expr(expr: str, /, *, is_internal: bool = False) -> AST: """ ... -def parse_select(expr: str, /, *, is_internal: bool = False) -> SelectQuery | SelectUnionQuery: +def parse_select(expr: str, /, *, is_internal: bool = False) -> SelectQuery | SelectSetQuery: """Parse the HogQL SELECT statement string into an AST. If the expr `is_internal`, spans and notices won't be included in the AST. diff --git a/hogql_parser/parser.cpp b/hogql_parser/parser.cpp index 128f7006db93b..177b4ec72b4b0 100644 --- a/hogql_parser/parser.cpp +++ b/hogql_parser/parser.cpp @@ -827,9 +827,9 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { // HogQL rules VISIT(Select) { - auto select_union_stmt_ctx = ctx->selectUnionStmt(); - if (select_union_stmt_ctx) { - return visit(select_union_stmt_ctx); + auto select_set_stmt_ctx = ctx->selectSetStmt(); + if (select_set_stmt_ctx) { + return visit(select_set_stmt_ctx); } auto select_stmt_ctx = ctx->selectStmt(); @@ -851,68 +851,48 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { return visitAsPyObject(placeholder_ctx); } - return visit(ctx->selectUnionStmt()); + return visit(ctx->selectSetStmt()); } - VISIT(SelectUnionStmt) { - // Using a vector of PyObjects atypically here, because this is a precursor of flattened_queries - vector select_queries; - auto select_stmt_with_parens_ctxs = ctx->selectStmtWithParens(); - select_queries.reserve(select_stmt_with_parens_ctxs.size()); - for (auto select_stmt_with_parens_ctx : select_stmt_with_parens_ctxs) { - try { - select_queries.push_back(visitAsPyObject(select_stmt_with_parens_ctx)); - } catch (...) { - X_Py_DECREF_ALL(select_queries); - throw; - } - } - PyObject* flattened_queries = PyList_New(0); - if (!flattened_queries) { - X_Py_DECREF_ALL(select_queries); + VISIT(SelectSetStmt) { + PyObject* initial_query = visitAsPyObject(ctx->selectStmtWithParens()); + PyObject* select_query = NULL; + PyObject* select_queries = PyList_New(0); + if (!select_queries) { throw PyInternalError(); } - for (auto query : select_queries) { - int is_select_query = is_ast_node_instance(query, "SelectQuery"); - if (is_select_query == -1) goto select_queries_loop_py_error; - if (is_ast_node_instance(query, "SelectQuery")) { - int append_code = PyList_Append(flattened_queries, query); - if (append_code == -1) goto select_queries_loop_py_error; - } else if (is_ast_node_instance(query, "SelectUnionQuery")) { - // Extend flattened_queries with sub_select_queries - PyObject* sub_select_queries = PyObject_GetAttrString(query, "select_queries"); - if (!sub_select_queries) goto select_queries_loop_py_error; - int extend_code = X_PyList_Extend(flattened_queries, sub_select_queries); - if (extend_code == -1) goto select_queries_loop_py_error; - Py_DECREF(sub_select_queries); - } else if (is_ast_node_instance(query, "Placeholder")) { - int append_code = PyList_Append(flattened_queries, query); - if (append_code == -1) goto select_queries_loop_py_error; - } else { - Py_DECREF(flattened_queries); - X_Py_DECREF_ALL(select_queries); - throw ParsingError("Unexpected query node type: " + string(Py_TYPE(query)->tp_name)); + + try { + for (auto subsequent : ctx->subsequentSelectSetClause()) { + char* set_operator; + if (subsequent->UNION() && subsequent->ALL()) { + set_operator = "UNION ALL"; + } else if (subsequent->INTERSECT()) { + set_operator = "INTERSECT"; + } else if (subsequent->EXCEPT()) { + set_operator = "EXCEPT"; + } else { + throw SyntaxError("Set operator must be one of UNION ALL, INTERSECT, and EXCEPT"); + } + select_query = visitAsPyObject(subsequent->selectStmtWithParens()); + PyObject* query = build_ast_node("SelectSetNode", "{s:N,s:N}", "select_query", select_query, "set_operator", PyUnicode_FromString(set_operator)); + if (!query) { + throw PyInternalError(); + } + PyList_Append(select_queries, query); } + } catch (...) { + Py_DECREF(select_queries); + Py_DECREF(initial_query); + throw; } - goto select_queries_loop_success; - select_queries_loop_py_error: - X_Py_DECREF_ALL(select_queries); - Py_DECREF(flattened_queries); - throw PyInternalError(); - select_queries_loop_success: - X_Py_DECREF_ALL(select_queries); - Py_ssize_t flattened_queries_size = PyList_Size(flattened_queries); - if (flattened_queries_size == -1) { - Py_DECREF(flattened_queries); - throw PyInternalError(); - } - if (flattened_queries_size == 1) { - PyObject* query = PyList_GET_ITEM(flattened_queries, 0); - Py_INCREF(query); - Py_DECREF(flattened_queries); - return query; + + if (PyList_Size(select_queries) == 0) { + Py_DECREF(select_queries); + return initial_query; } - RETURN_NEW_AST_NODE("SelectUnionQuery", "{s:N}", "select_queries", flattened_queries); + + RETURN_NEW_AST_NODE("SelectSetQuery", "{s:N, s:N}", "initial_select_query", initial_query, "subsequent_select_queries", select_queries); } VISIT(SelectStmt) { @@ -1632,7 +1612,7 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { RETURN_NEW_AST_NODE("ArithmeticOperation", "{s:N,s:N,s:N}", "left", left, "right", right, "op", op); } - VISIT(ColumnExprSubquery) { return visit(ctx->selectUnionStmt()); } + VISIT(ColumnExprSubquery) { return visit(ctx->selectSetStmt()); } VISIT(ColumnExprArray) { RETURN_NEW_AST_NODE("Array", "{s:N}", "exprs", visitAsPyObjectOrEmptyList(ctx->columnExprList())); @@ -2286,7 +2266,7 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { VISIT(WithExprSubquery) { string name = visitAsString(ctx->identifier()); RETURN_NEW_AST_NODE( - "CTE", "{s:s#,s:N,s:s}", "name", name.data(), name.size(), "expr", visitAsPyObject(ctx->selectUnionStmt()), + "CTE", "{s:s#,s:N,s:s}", "name", name.data(), name.size(), "expr", visitAsPyObject(ctx->selectSetStmt()), "cte_type", "subquery" ); } @@ -2332,7 +2312,7 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { RETURN_NEW_AST_NODE("Field", "{s:N}", "chain", X_PyList_FromStrings(chain)); } - VISIT(TableExprSubquery) { return visit(ctx->selectUnionStmt()); } + VISIT(TableExprSubquery) { return visit(ctx->selectSetStmt()); } VISIT(TableExprPlaceholder) { return visitAsPyObject(ctx->placeholder()); } diff --git a/hogql_parser/setup.py b/hogql_parser/setup.py index bd336c6fa6654..dd38c3371fb47 100644 --- a/hogql_parser/setup.py +++ b/hogql_parser/setup.py @@ -32,7 +32,7 @@ setup( name="hogql_parser", - version="1.0.45", + version="1.0.46", url="https://github.com/PostHog/posthog/tree/master/hogql_parser", author="PostHog Inc.", author_email="hey@posthog.com", diff --git a/mypy-baseline.txt b/mypy-baseline.txt index 57a7e095f6298..86c1857ca8e31 100644 --- a/mypy-baseline.txt +++ b/mypy-baseline.txt @@ -88,10 +88,10 @@ posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "OrderExpr", variable has type "CTE") [assignment] posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "CTE") [assignment] posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "WindowExpr", variable has type "CTE") [assignment] -posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "FieldAliasType", variable has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] -posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "Type", variable has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] +posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "FieldAliasType", variable has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] +posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "Type", variable has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] posthog/models/filters/mixins/simplify.py:0: error: Incompatible type for lookup 'pk': (got "str | int | list[str]", expected "str | int") [misc] -posthog/hogql/resolver_utils.py:0: error: Argument 1 to "lookup_field_by_name" has incompatible type "SelectQueryType | SelectUnionQueryType"; expected "SelectQueryType" [arg-type] +posthog/hogql/resolver_utils.py:0: error: Argument 1 to "lookup_field_by_name" has incompatible type "SelectQueryType | SelectSetQueryType"; expected "SelectQueryType" [arg-type] posthog/helpers/dashboard_templates.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str | Combinable") [assignment] posthog/hogql/parser.py:0: error: Item "None" of "list[Expr] | None" has no attribute "__iter__" (not iterable) [union-attr] posthog/hogql/parser.py:0: error: "None" has no attribute "text" [attr-defined] @@ -161,23 +161,22 @@ posthog/hogql_queries/utils/query_date_range.py:0: error: Incompatible default f posthog/hogql_queries/utils/query_date_range.py:0: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True posthog/hogql_queries/utils/query_date_range.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase posthog/hogql_queries/utils/query_date_range.py:0: error: Item "None" of "IntervalType | None" has no attribute "name" [union-attr] -posthog/hogql/resolver.py:0: error: List comprehension has incompatible type List[SelectQueryType | None]; expected List[SelectQueryType] [misc] posthog/hogql/resolver.py:0: error: Need type annotation for "columns_with_visible_alias" (hint: "columns_with_visible_alias: dict[, ] = ...") [var-annotated] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] -posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectUnionQuery | Field | None") [assignment] +posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectSetQuery | Field | None") [assignment] posthog/hogql/resolver.py:0: error: Item "None" of "Database | None" has no attribute "get_table" [union-attr] posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "TableType", variable has type "LazyTableType") [assignment] posthog/hogql/resolver.py:0: error: Argument "table_type" to "TableAliasType" has incompatible type "LazyTableType"; expected "TableType" [arg-type] posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "LazyTableType", variable has type "TableAliasType") [assignment] -posthog/hogql/resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectUnionQuery | Field | None"; expected "Expr" [arg-type] +posthog/hogql/resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectSetQuery | Field | None"; expected "Expr" [arg-type] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] posthog/hogql/resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "join_type" [union-attr] -posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectViewType" has incompatible type "SelectQueryType | None"; expected "SelectQueryType | SelectUnionQueryType" [arg-type] -posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectUnionQuery | Field | None" has no attribute "type" [union-attr] -posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectQueryAliasType" has incompatible type "Type | Any | None"; expected "SelectQueryType | SelectUnionQueryType" [arg-type] -posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectUnionQuery | Field | None" has no attribute "type" [union-attr] -posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Type | Any | None", variable has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None") [assignment] -posthog/hogql/resolver.py:0: error: Argument 1 to "append" of "list" has incompatible type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None"; expected "SelectQueryType | SelectUnionQueryType" [arg-type] +posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectViewType" has incompatible type "SelectQueryType | None"; expected "SelectQueryType | SelectSetQueryType" [arg-type] +posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectSetQuery | Field | None" has no attribute "type" [union-attr] +posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectQueryAliasType" has incompatible type "Type | Any | None"; expected "SelectQueryType | SelectSetQueryType" [arg-type] +posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectSetQuery | Field | None" has no attribute "type" [union-attr] +posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Type | Any | None", variable has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None") [assignment] +posthog/hogql/resolver.py:0: error: Argument 1 to "append" of "list" has incompatible type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None"; expected "SelectQueryType | SelectSetQueryType" [arg-type] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] posthog/hogql/resolver.py:0: error: Item "None" of "Type | None" has no attribute "resolve_constant_type" [union-attr] @@ -193,12 +192,12 @@ posthog/hogql_queries/insights/trends/aggregation_operations.py:0: note: "List" posthog/hogql_queries/insights/trends/aggregation_operations.py:0: note: Consider using "Sequence" instead, which is covariant posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: List item 1 has incompatible type "str | None"; expected "str" [list-item] posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Argument "chain" to "Field" has incompatible type "list[str | int] | list[str]"; expected "list[str | int]" [arg-type] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "group_by" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "group_by" [union-attr] posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "None" of "list[Expr] | None" has no attribute "append" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "group_by" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "group_by" [union-attr] posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "None" of "list[Expr] | Any | None" has no attribute "append" [union-attr] posthog/hogql/transforms/lazy_tables.py:0: error: Incompatible types in assignment (expression has type "dict[Never, Never]", variable has type "list[ConstraintOverride]") [assignment] posthog/hogql/transforms/lazy_tables.py:0: error: Non-overlapping equality check (left operand type: "TableType", right operand type: "LazyTableType") [comparison-overlap] @@ -206,7 +205,7 @@ posthog/hogql/transforms/lazy_tables.py:0: error: Non-overlapping equality check posthog/hogql/transforms/lazy_tables.py:0: error: Name "chain" already defined on line 0 [no-redef] posthog/hogql/transforms/lazy_tables.py:0: error: Subclass of "TableType" and "LazyTableType" cannot exist: would have incompatible method signatures [unreachable] posthog/hogql/transforms/lazy_tables.py:0: error: Statement is unreachable [unreachable] -posthog/hogql/transforms/lazy_tables.py:0: error: Incompatible types in assignment (expression has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType", variable has type "SelectQueryAliasType | None") [assignment] +posthog/hogql/transforms/lazy_tables.py:0: error: Incompatible types in assignment (expression has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType", variable has type "SelectQueryAliasType | None") [assignment] posthog/hogql/transforms/in_cohort.py:0: error: Incompatible default for argument "context" (default has type "None", argument has type "HogQLContext") [assignment] posthog/hogql/transforms/in_cohort.py:0: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True posthog/hogql/transforms/in_cohort.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase @@ -217,7 +216,7 @@ posthog/hogql/transforms/in_cohort.py:0: note: PEP 484 prohibits implicit Option posthog/hogql/transforms/in_cohort.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase posthog/hogql/transforms/in_cohort.py:0: error: Incompatible type for lookup 'team_id': (got "int | None", expected "str | int") [misc] posthog/hogql/transforms/in_cohort.py:0: error: Incompatible type for lookup 'team_id': (got "int | None", expected "str | int") [misc] -posthog/hogql/transforms/in_cohort.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Expr"; expected "SelectQuery | SelectUnionQuery | Field | None" [arg-type] +posthog/hogql/transforms/in_cohort.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Expr"; expected "SelectQuery | SelectSetQuery | Field | None" [arg-type] posthog/hogql/transforms/in_cohort.py:0: error: List item 0 has incompatible type "SelectQueryType | None"; expected "SelectQueryType" [list-item] posthog/hogql/transforms/in_cohort.py:0: error: Item "None" of "JoinConstraint | None" has no attribute "expr" [union-attr] posthog/hogql/transforms/in_cohort.py:0: error: Item "Expr" of "Expr | Any" has no attribute "left" [union-attr] @@ -332,17 +331,16 @@ posthog/hogql/filters.py:0: error: Incompatible default for argument "team" (def posthog/hogql/filters.py:0: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True posthog/hogql/filters.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase posthog/api/organization.py:0: error: Incompatible return value type (got "int | None", expected "Level | None") [return-value] -posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str | SelectQuery | SelectUnionQuery") [assignment] -posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectUnionQuery") [assignment] +posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str | SelectQuery | SelectSetQuery") [assignment] +posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectSetQuery") [assignment] posthog/hogql/query.py:0: error: Argument 1 to "get_default_limit_for_context" has incompatible type "LimitContext | None"; expected "LimitContext" [arg-type] -posthog/hogql/query.py:0: error: "SelectQuery" has no attribute "select_queries" [attr-defined] -posthog/hogql/query.py:0: error: Subclass of "SelectQuery" and "SelectUnionQuery" cannot exist: would have incompatible method signatures [unreachable] +posthog/hogql/query.py:0: error: Subclass of "SelectQuery" and "SelectSetQuery" cannot exist: would have incompatible method signatures [unreachable] posthog/queries/person_query.py:0: error: Incompatible type for lookup 'pk': (got "str | int | list[str]", expected "str | int") [misc] posthog/api/action.py:0: error: Argument 1 to has incompatible type "*tuple[str, ...]"; expected "type[BaseRenderer]" [arg-type] posthog/queries/event_query/event_query.py:0: error: Incompatible type for lookup 'pk': (got "str | int | list[str]", expected "str | int") [misc] posthog/hogql_queries/sessions_timeline_query_runner.py:0: error: Statement is unreachable [unreachable] posthog/hogql_queries/hogql_query_runner.py:0: error: Statement is unreachable [unreachable] -posthog/hogql_queries/hogql_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectUnionQuery", expected "SelectQuery") [return-value] +posthog/hogql_queries/hogql_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectSetQuery", expected "SelectQuery") [return-value] posthog/hogql_queries/events_query_runner.py:0: error: Statement is unreachable [unreachable] posthog/queries/breakdown_props.py:0: error: Argument 1 to "translate_hogql" has incompatible type "str | int"; expected "str" [arg-type] posthog/queries/breakdown_props.py:0: error: Incompatible type for lookup 'pk': (got "str | None", expected "str | int") [misc] @@ -386,15 +384,15 @@ posthog/hogql_queries/insights/stickiness_query_runner.py:0: error: Module "djan posthog/hogql_queries/insights/retention_query_runner.py:0: error: Item "None" of "JoinExpr | None" has no attribute "sample" [union-attr] posthog/hogql_queries/insights/retention_query_runner.py:0: error: Unsupported operand types for - ("int" and "None") [operator] posthog/hogql_queries/insights/retention_query_runner.py:0: note: Right operand is of type "int | None" -posthog/hogql_queries/insights/retention_query_runner.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/retention_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectUnionQuery", expected "SelectQuery") [return-value] +posthog/hogql_queries/insights/retention_query_runner.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/retention_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectSetQuery", expected "SelectQuery") [return-value] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "Constant") [assignment] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "Constant") [assignment] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Argument "exprs" to "And" has incompatible type "list[CompareOperation]"; expected "list[Expr]" [arg-type] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: note: "List" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance posthog/hogql_queries/insights/lifecycle_query_runner.py:0: note: Consider using "Sequence" instead, which is covariant -posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select_from" [union-attr] +posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select_from" [union-attr] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "None" of "JoinExpr | Any | None" has no attribute "sample" [union-attr] posthog/hogql_queries/insights/funnels/funnels_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/api/survey.py:0: error: Incompatible types in assignment (expression has type "Any | Sequence[Any] | None", variable has type "Survey | None") [assignment] @@ -503,19 +501,19 @@ posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinConstraint | A posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "next_join" [union-attr] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | Any | None" has no attribute "constraint" [union-attr] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinConstraint | Any | None" has no attribute "constraint_type" [union-attr] -posthog/hogql/test/test_resolver.py:0: error: Item "SelectUnionQueryType" of "SelectQueryType | SelectUnionQueryType | None" has no attribute "columns" [union-attr] -posthog/hogql/test/test_resolver.py:0: error: Item "None" of "SelectQueryType | SelectUnionQueryType | None" has no attribute "columns" [union-attr] +posthog/hogql/test/test_resolver.py:0: error: Item "SelectSetQueryType" of "SelectQueryType | SelectSetQueryType | None" has no attribute "columns" [union-attr] +posthog/hogql/test/test_resolver.py:0: error: Item "None" of "SelectQueryType | SelectSetQueryType | None" has no attribute "columns" [union-attr] posthog/hogql/test/test_resolver.py:0: error: "FieldOrTable" has no attribute "fields" [attr-defined] posthog/hogql/test/test_resolver.py:0: error: "FieldOrTable" has no attribute "fields" [attr-defined] posthog/hogql/test/test_resolver.py:0: error: "FieldOrTable" has no attribute "fields" [attr-defined] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] -posthog/hogql/test/test_resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectUnionQuery | Field | Any | None"; expected "Expr" [arg-type] +posthog/hogql/test/test_resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectSetQuery | Field | Any | None"; expected "Expr" [arg-type] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "alias" [union-attr] posthog/hogql/test/test_property.py:0: error: Argument 1 to "_property_to_expr" of "TestProperty" has incompatible type "HogQLPropertyFilter"; expected "PropertyGroup | Property | dict[Any, Any] | list[Any]" [arg-type] posthog/hogql/test/test_printer.py:0: error: Argument 2 to "Database" has incompatible type "int"; expected "WeekStartDay | None" [arg-type] posthog/hogql/test/test_printer.py:0: error: Argument 2 to "Database" has incompatible type "int"; expected "WeekStartDay | None" [arg-type] -posthog/hogql/test/test_printer.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "settings" [union-attr] -posthog/hogql/test/test_printer.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "settings" [union-attr] +posthog/hogql/test/test_printer.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "settings" [union-attr] +posthog/hogql/test/test_printer.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "settings" [union-attr] posthog/hogql/test/test_printer.py:0: error: "TestPrinter" has no attribute "snapshot" [attr-defined] posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] @@ -531,7 +529,7 @@ posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type fo posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] posthog/hogql/test/_test_parser.py:0: error: Invalid base class [misc] -posthog/hogql/test/_test_parser.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Placeholder"; expected "SelectQuery | SelectUnionQuery | Field | None" [arg-type] +posthog/hogql/test/_test_parser.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Placeholder"; expected "SelectQuery | SelectSetQuery | Field | None" [arg-type] posthog/hogql/test/_test_parser.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] posthog/hogql/test/_test_parser.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] posthog/hogql/test/_test_parser.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] diff --git a/posthog/api/test/test_plugin.py b/posthog/api/test/test_plugin.py index f92350045a38c..10967d63bb873 100644 --- a/posthog/api/test/test_plugin.py +++ b/posthog/api/test/test_plugin.py @@ -371,35 +371,36 @@ def test_update_plugin_auth(self, mock_sync_from_plugin_archive, mock_get, mock_ self.assertEqual(response.status_code, 403) self.assertEqual(mock_sync_from_plugin_archive.call_count, 2) # Not extracted on auth failure - @freeze_time("2021-08-25T22:09:14.252Z") def test_delete_plugin_auth(self, mock_get, mock_reload): - repo_url = "https://github.com/PostHog/helloworldplugin" - response = self.client.post("/api/organizations/@current/plugins/", {"url": repo_url}) - self.assertEqual(response.status_code, 201) + with freeze_time("2021-08-25T22:09:14.252Z"): + repo_url = "https://github.com/PostHog/helloworldplugin" + response = self.client.post("/api/organizations/@current/plugins/", {"url": repo_url}) + self.assertEqual(response.status_code, 201) - plugin_id = response.json()["id"] + with freeze_time("2021-08-25T22:09:14.253Z"): + plugin_id = response.json()["id"] - api_url = "/api/organizations/@current/plugins/{}".format(response.json()["id"]) + api_url = "/api/organizations/@current/plugins/{}".format(response.json()["id"]) - for level in ( - Organization.PluginsAccessLevel.NONE, - Organization.PluginsAccessLevel.CONFIG, - ): - self.organization.plugins_access_level = level + for level in ( + Organization.PluginsAccessLevel.NONE, + Organization.PluginsAccessLevel.CONFIG, + ): + self.organization.plugins_access_level = level + self.organization.save() + response = self.client.delete(api_url) + self.assertEqual(response.status_code, 403) + + self.organization.plugins_access_level = Organization.PluginsAccessLevel.INSTALL self.organization.save() response = self.client.delete(api_url) - self.assertEqual(response.status_code, 403) - - self.organization.plugins_access_level = Organization.PluginsAccessLevel.INSTALL - self.organization.save() - response = self.client.delete(api_url) self.assertEqual(response.status_code, 204) self.assert_plugin_activity( [ { "user": {"first_name": "", "email": "user1@posthog.com"}, - "activity": "installed", - "created_at": "2021-08-25T22:09:14.252000Z", + "activity": "uninstalled", + "created_at": "2021-08-25T22:09:14.253000Z", "scope": "Plugin", "item_id": str(plugin_id), "detail": { @@ -412,7 +413,7 @@ def test_delete_plugin_auth(self, mock_get, mock_reload): }, { "user": {"first_name": "", "email": "user1@posthog.com"}, - "activity": "uninstalled", + "activity": "installed", "created_at": "2021-08-25T22:09:14.252000Z", "scope": "Plugin", "item_id": str(plugin_id), diff --git a/posthog/batch_exports/http.py b/posthog/batch_exports/http.py index 5d2589065345a..72bc94adf03bd 100644 --- a/posthog/batch_exports/http.py +++ b/posthog/batch_exports/http.py @@ -183,7 +183,7 @@ def to_representation(self, instance: BatchExportDestination) -> dict: class HogQLSelectQueryField(serializers.Field): - def to_internal_value(self, data: str) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_internal_value(self, data: str) -> ast.SelectQuery | ast.SelectSetQuery: """Parse a HogQL SelectQuery from a string query.""" try: parsed_query = parse_select(data) @@ -329,7 +329,7 @@ def serialize_hogql_query_to_batch_export_schema(self, hogql_query: ast.SelectQu return batch_export_schema - def validate_hogql_query(self, hogql_query: ast.SelectQuery | ast.SelectUnionQuery) -> ast.SelectQuery: + def validate_hogql_query(self, hogql_query: ast.SelectQuery | ast.SelectSetQuery) -> ast.SelectQuery: """Validate a HogQLQuery being used for batch exports. This method essentially checks that a query is supported by batch exports: @@ -338,7 +338,7 @@ def validate_hogql_query(self, hogql_query: ast.SelectQuery | ast.SelectUnionQue 3. Query must SELECT FROM events, and only from events. """ - if isinstance(hogql_query, ast.SelectUnionQuery): + if isinstance(hogql_query, ast.SelectSetQuery): raise serializers.ValidationError("UNIONs are not supported") parsed = cast(ast.SelectQuery, hogql_query) diff --git a/posthog/hogql/ast.py b/posthog/hogql/ast.py index c5aef314244ed..11c7f001c50b9 100644 --- a/posthog/hogql/ast.py +++ b/posthog/hogql/ast.py @@ -1,5 +1,6 @@ from enum import StrEnum -from typing import Any, Literal, Optional, Union +from typing import Any, Literal, Optional, Union, get_args +from collections.abc import Sequence from dataclasses import dataclass, field from posthog.hogql.base import Type, Expr, CTE, ConstantType, UnknownType, AST @@ -173,7 +174,7 @@ def get_child(self, name: str, context: HogQLContext) -> Type: TableOrSelectType = Union[ - BaseTableType, "SelectUnionQueryType", "SelectQueryType", "SelectQueryAliasType", "SelectViewType" + BaseTableType, "SelectSetQueryType", "SelectQueryType", "SelectQueryAliasType", "SelectViewType" ] @@ -243,9 +244,9 @@ class SelectQueryType(Type): tables: dict[str, TableOrSelectType] = field(default_factory=dict) ctes: dict[str, CTE] = field(default_factory=dict) # all from and join subqueries without aliases - anonymous_tables: list[Union["SelectQueryType", "SelectUnionQueryType"]] = field(default_factory=list) + anonymous_tables: list[Union["SelectQueryType", "SelectSetQueryType"]] = field(default_factory=list) # the parent select query, if this is a lambda - parent: Optional[Union["SelectQueryType", "SelectUnionQueryType"]] = None + parent: Optional[Union["SelectQueryType", "SelectSetQueryType"]] = None def get_alias_for_table_type(self, table_type: TableOrSelectType) -> Optional[str]: for key, value in self.tables.items(): @@ -276,8 +277,8 @@ def resolve_constant_type(self, context: HogQLContext) -> "ConstantType": @dataclass(kw_only=True) -class SelectUnionQueryType(Type): - types: list[SelectQueryType] +class SelectSetQueryType(Type): + types: list[Union[SelectQueryType, "SelectSetQueryType"]] def get_alias_for_table_type(self, table_type: TableOrSelectType) -> Optional[str]: return self.types[0].get_alias_for_table_type(table_type) @@ -296,7 +297,7 @@ def resolve_column_constant_type(self, name: str, context: HogQLContext) -> "Con class SelectViewType(Type): view_name: str alias: str - select_query_type: SelectQueryType | SelectUnionQueryType + select_query_type: SelectQueryType | SelectSetQueryType def get_child(self, name: str, context: HogQLContext) -> Type: if name == "*": @@ -343,7 +344,7 @@ def resolve_column_constant_type(self, name: str, context: HogQLContext) -> "Con @dataclass(kw_only=True) class SelectQueryAliasType(Type): alias: str - select_query_type: SelectQueryType | SelectUnionQueryType + select_query_type: SelectQueryType | SelectSetQueryType def get_child(self, name: str, context: HogQLContext) -> Type: if name == "*": @@ -763,7 +764,7 @@ class JoinExpr(Expr): type: Optional[TableOrSelectType] = None join_type: Optional[str] = None - table: Optional[Union["SelectQuery", "SelectUnionQuery", Field]] = None + table: Optional[Union["SelectQuery", "SelectSetQuery", Field]] = None table_args: Optional[list[Expr]] = None alias: Optional[str] = None table_final: Optional[bool] = None @@ -820,10 +821,35 @@ class SelectQuery(Expr): view_name: Optional[str] = None +SetOperator = Literal["UNION ALL", "INTERSECT", "EXCEPT"] + + +@dataclass(kw_only=True) +class SelectSetNode: + select_query: Union[SelectQuery, "SelectSetQuery"] + set_operator: SetOperator + + def __post_init__(self): + if self.set_operator not in get_args(SetOperator): + raise ValueError("Invalid Set Operator") + + @dataclass(kw_only=True) -class SelectUnionQuery(Expr): - type: Optional[SelectUnionQueryType] = None - select_queries: list[SelectQuery] +class SelectSetQuery(Expr): + type: Optional[SelectSetQueryType] = None + initial_select_query: Union[SelectQuery, "SelectSetQuery"] + subsequent_select_queries: list[SelectSetNode] + + @classmethod + def create_from_queries( + cls, queries: Sequence[Union[SelectQuery, "SelectSetQuery"]], set_operator: SetOperator + ) -> "SelectSetQuery": + return SelectSetQuery( + initial_select_query=queries[0], + subsequent_select_queries=[ + SelectSetNode(select_query=query, set_operator=set_operator) for query in queries[1:] + ], + ) @dataclass(kw_only=True) diff --git a/posthog/hogql/autocomplete.py b/posthog/hogql/autocomplete.py index 433cdce356382..09b5af34be0b9 100644 --- a/posthog/hogql/autocomplete.py +++ b/posthog/hogql/autocomplete.py @@ -28,6 +28,7 @@ from posthog.hogql.timings import HogQLTimings from posthog.hogql.visitor import TraversingVisitor, clone_expr from posthog.hogql_queries.query_runner import get_query_runner +from posthog.hogql.resolver_utils import extract_select_queries from posthog.models.insight_variable import InsightVariable from posthog.models.property_definition import PropertyDefinition from posthog.models.team.team import Team @@ -475,8 +476,8 @@ def get_hogql_autocomplete( if isinstance(select_ast, ast.SelectQuery): ctes = select_ast.ctes - elif isinstance(select_ast, ast.SelectUnionQuery): - ctes = select_ast.select_queries[0].ctes + elif isinstance(select_ast, ast.SelectSetQuery): + ctes = next(extract_select_queries(select_ast)).ctes nearest_select = find_node.nearest_select_query or select_ast table_has_alias = ( diff --git a/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py b/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py index 3243f977415a4..73459b375879e 100644 --- a/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py +++ b/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py @@ -24,7 +24,7 @@ def _expr(s: Union[str, ast.Expr, None], placeholders: Optional[dict[str, ast.Ex def _select( s: str, placeholders: Optional[dict[str, ast.Expr]] = None, -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: parsed = parse_select(s, placeholders=placeholders) return parsed diff --git a/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py b/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py index b1076a60aeb4f..dc789e80d7458 100644 --- a/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py +++ b/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py @@ -26,7 +26,7 @@ def f(s: Union[str, ast.Expr, None], placeholders: Optional[dict[str, ast.Expr]] def parse( s: str, placeholders: Optional[dict[str, ast.Expr]] = None, -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: parsed = parse_select(s, placeholders=placeholders) return parsed @@ -363,7 +363,8 @@ def print_query(self, query: str) -> str: def test_select_with_timestamp(self): actual = self.print_query("SELECT session_id FROM sessions WHERE $start_timestamp > '2021-01-01'") - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT sessions.session_id AS session_id FROM @@ -381,7 +382,8 @@ def test_select_with_timestamp(self): WHERE ifNull(greater(sessions.`$start_timestamp`, %(hogql_val_2)s), 0) LIMIT 50000\ -""") +""" + ) def test_join_with_events(self): actual = self.print_query( @@ -396,7 +398,8 @@ def test_join_with_events(self): GROUP BY sessions.session_id """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT sessions.session_id AS session_id, uniq(events.uuid) @@ -417,7 +420,8 @@ def test_join_with_events(self): GROUP BY sessions.session_id LIMIT 50000\ -""") +""" + ) def test_union(self): actual = self.print_query( @@ -429,7 +433,8 @@ def test_union(self): WHERE events.timestamp < today() """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT 0 AS duration LIMIT 50000 @@ -451,7 +456,8 @@ def test_union(self): WHERE and(equals(events.team_id, ), less(toTimeZone(events.timestamp, %(hogql_val_4)s), today())) LIMIT 50000\ -""") +""" + ) def test_session_breakdown(self): actual = self.print_query( @@ -495,7 +501,8 @@ def test_session_breakdown(self): GROUP BY day_start, breakdown_value""" ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT count(DISTINCT e.`$session_id`) AS total, toStartOfDay(toTimeZone(e.timestamp, %(hogql_val_8)s)) AS day_start, @@ -535,7 +542,8 @@ def test_session_breakdown(self): day_start, breakdown_value LIMIT 50000\ -""") +""" + ) def test_session_replay_query(self): actual = self.print_query( @@ -548,7 +556,8 @@ def test_session_replay_query(self): GROUP BY session_id """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT s.session_id AS session_id, min(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s)) AS start_time @@ -569,7 +578,8 @@ def test_session_replay_query(self): GROUP BY s.session_id LIMIT 50000\ -""") +""" + ) def test_urls_in_sessions_in_timestamp_query(self): actual = self.print_query( @@ -582,7 +592,8 @@ def test_urls_in_sessions_in_timestamp_query(self): where `$start_timestamp` >= now() - toIntervalDay(7) """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT sessions.session_id AS session_id, sessions.`$urls` AS `$urls`, @@ -603,4 +614,5 @@ def test_urls_in_sessions_in_timestamp_query(self): WHERE ifNull(greaterOrEquals(sessions.`$start_timestamp`, minus(now64(6, %(hogql_val_2)s), toIntervalDay(7))), 0) LIMIT 50000\ -""") +""" + ) diff --git a/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py b/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py index b1304fc53510b..a514af84ae8a7 100644 --- a/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py +++ b/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py @@ -26,7 +26,7 @@ def f(s: Union[str, ast.Expr, None], placeholders: Optional[dict[str, ast.Expr]] def parse( s: str, placeholders: Optional[dict[str, ast.Expr]] = None, -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: parsed = parse_select(s, placeholders=placeholders) return parsed diff --git a/posthog/hogql/grammar/HogQLLexer.g4 b/posthog/hogql/grammar/HogQLLexer.g4 index 6241425a64f2c..f4caeaf8df056 100644 --- a/posthog/hogql/grammar/HogQLLexer.g4 +++ b/posthog/hogql/grammar/HogQLLexer.g4 @@ -30,6 +30,7 @@ DESCENDING: D E S C E N D I N G; DISTINCT: D I S T I N C T; ELSE: E L S E; END: E N D; +EXCEPT: E X C E P T; EXTRACT: E X T R A C T; FINAL: F I N A L; FINALLY: F I N A L L Y; @@ -49,6 +50,7 @@ ILIKE: I L I K E; IN: I N; INF: I N F | I N F I N I T Y; INNER: I N N E R; +INTERSECT: I N T E R S E C T; INTERVAL: I N T E R V A L; IS: I S; JOIN: J O I N; diff --git a/posthog/hogql/grammar/HogQLLexer.interp b/posthog/hogql/grammar/HogQLLexer.interp index dc4c26657342d..f461a8e011b30 100644 --- a/posthog/hogql/grammar/HogQLLexer.interp +++ b/posthog/hogql/grammar/HogQLLexer.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -351,6 +355,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -370,6 +375,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -527,4 +533,4 @@ IN_TEMPLATE_STRING IN_FULL_TEMPLATE_STRING atn: -[4, 0, 160, 1455, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 426, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 647, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1021, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1050, 8, 104, 1, 105, 1, 105, 1, 105, 3, 105, 1055, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1061, 8, 105, 10, 105, 12, 105, 1064, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1075, 8, 105, 10, 105, 12, 105, 1078, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1091, 8, 105, 10, 105, 12, 105, 1094, 9, 105, 1, 105, 1, 105, 3, 105, 1098, 8, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1103, 8, 106, 10, 106, 12, 106, 1106, 9, 106, 1, 106, 1, 106, 3, 106, 1110, 8, 106, 1, 106, 1, 106, 3, 106, 1114, 8, 106, 1, 106, 4, 106, 1117, 8, 106, 11, 106, 12, 106, 1118, 1, 106, 1, 106, 1, 106, 3, 106, 1124, 8, 106, 1, 106, 1, 106, 3, 106, 1128, 8, 106, 1, 106, 4, 106, 1131, 8, 106, 11, 106, 12, 106, 1132, 1, 106, 1, 106, 1, 106, 5, 106, 1138, 8, 106, 10, 106, 12, 106, 1141, 9, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1146, 8, 106, 1, 106, 4, 106, 1149, 8, 106, 11, 106, 12, 106, 1150, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1158, 8, 106, 1, 106, 4, 106, 1161, 8, 106, 11, 106, 12, 106, 1162, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1169, 8, 106, 1, 106, 4, 106, 1172, 8, 106, 11, 106, 12, 106, 1173, 3, 106, 1176, 8, 106, 1, 107, 1, 107, 4, 107, 1180, 8, 107, 11, 107, 12, 107, 1181, 1, 108, 4, 108, 1185, 8, 108, 11, 108, 12, 108, 1186, 1, 109, 1, 109, 1, 109, 4, 109, 1192, 8, 109, 11, 109, 12, 109, 1193, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1205, 8, 110, 10, 110, 12, 110, 1208, 9, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 3, 163, 1330, 8, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 5, 183, 1388, 8, 183, 10, 183, 12, 183, 1391, 9, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 1402, 8, 184, 1, 184, 5, 184, 1405, 8, 184, 10, 184, 12, 184, 1408, 9, 184, 1, 184, 3, 184, 1411, 8, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 4, 186, 1430, 8, 186, 11, 186, 12, 186, 1431, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 4, 189, 1448, 8, 189, 11, 189, 12, 189, 1449, 1, 190, 1, 190, 1, 190, 1, 190, 1, 1389, 0, 191, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 0, 227, 0, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 112, 287, 113, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 0, 381, 159, 383, 160, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1491, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 1, 375, 1, 0, 0, 0, 1, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 2, 381, 1, 0, 0, 0, 2, 383, 1, 0, 0, 0, 3, 385, 1, 0, 0, 0, 5, 389, 1, 0, 0, 0, 7, 393, 1, 0, 0, 0, 9, 398, 1, 0, 0, 0, 11, 402, 1, 0, 0, 0, 13, 408, 1, 0, 0, 0, 15, 425, 1, 0, 0, 0, 17, 427, 1, 0, 0, 0, 19, 432, 1, 0, 0, 0, 21, 440, 1, 0, 0, 0, 23, 445, 1, 0, 0, 0, 25, 448, 1, 0, 0, 0, 27, 453, 1, 0, 0, 0, 29, 458, 1, 0, 0, 0, 31, 464, 1, 0, 0, 0, 33, 471, 1, 0, 0, 0, 35, 479, 1, 0, 0, 0, 37, 485, 1, 0, 0, 0, 39, 490, 1, 0, 0, 0, 41, 498, 1, 0, 0, 0, 43, 503, 1, 0, 0, 0, 45, 507, 1, 0, 0, 0, 47, 512, 1, 0, 0, 0, 49, 523, 1, 0, 0, 0, 51, 532, 1, 0, 0, 0, 53, 537, 1, 0, 0, 0, 55, 541, 1, 0, 0, 0, 57, 549, 1, 0, 0, 0, 59, 555, 1, 0, 0, 0, 61, 563, 1, 0, 0, 0, 63, 569, 1, 0, 0, 0, 65, 572, 1, 0, 0, 0, 67, 582, 1, 0, 0, 0, 69, 586, 1, 0, 0, 0, 71, 591, 1, 0, 0, 0, 73, 596, 1, 0, 0, 0, 75, 600, 1, 0, 0, 0, 77, 606, 1, 0, 0, 0, 79, 613, 1, 0, 0, 0, 81, 618, 1, 0, 0, 0, 83, 621, 1, 0, 0, 0, 85, 624, 1, 0, 0, 0, 87, 630, 1, 0, 0, 0, 89, 646, 1, 0, 0, 0, 91, 648, 1, 0, 0, 0, 93, 654, 1, 0, 0, 0, 95, 663, 1, 0, 0, 0, 97, 666, 1, 0, 0, 0, 99, 671, 1, 0, 0, 0, 101, 675, 1, 0, 0, 0, 103, 680, 1, 0, 0, 0, 105, 688, 1, 0, 0, 0, 107, 693, 1, 0, 0, 0, 109, 697, 1, 0, 0, 0, 111, 702, 1, 0, 0, 0, 113, 708, 1, 0, 0, 0, 115, 715, 1, 0, 0, 0, 117, 721, 1, 0, 0, 0, 119, 725, 1, 0, 0, 0, 121, 729, 1, 0, 0, 0, 123, 734, 1, 0, 0, 0, 125, 740, 1, 0, 0, 0, 127, 747, 1, 0, 0, 0, 129, 750, 1, 0, 0, 0, 131, 753, 1, 0, 0, 0, 133, 759, 1, 0, 0, 0, 135, 765, 1, 0, 0, 0, 137, 770, 1, 0, 0, 0, 139, 780, 1, 0, 0, 0, 141, 790, 1, 0, 0, 0, 143, 799, 1, 0, 0, 0, 145, 807, 1, 0, 0, 0, 147, 813, 1, 0, 0, 0, 149, 820, 1, 0, 0, 0, 151, 826, 1, 0, 0, 0, 153, 833, 1, 0, 0, 0, 155, 837, 1, 0, 0, 0, 157, 842, 1, 0, 0, 0, 159, 849, 1, 0, 0, 0, 161, 856, 1, 0, 0, 0, 163, 863, 1, 0, 0, 0, 165, 868, 1, 0, 0, 0, 167, 877, 1, 0, 0, 0, 169, 887, 1, 0, 0, 0, 171, 892, 1, 0, 0, 0, 173, 898, 1, 0, 0, 0, 175, 903, 1, 0, 0, 0, 177, 913, 1, 0, 0, 0, 179, 916, 1, 0, 0, 0, 181, 920, 1, 0, 0, 0, 183, 927, 1, 0, 0, 0, 185, 936, 1, 0, 0, 0, 187, 941, 1, 0, 0, 0, 189, 950, 1, 0, 0, 0, 191, 954, 1, 0, 0, 0, 193, 964, 1, 0, 0, 0, 195, 970, 1, 0, 0, 0, 197, 976, 1, 0, 0, 0, 199, 981, 1, 0, 0, 0, 201, 986, 1, 0, 0, 0, 203, 992, 1, 0, 0, 0, 205, 998, 1, 0, 0, 0, 207, 1005, 1, 0, 0, 0, 209, 1020, 1, 0, 0, 0, 211, 1049, 1, 0, 0, 0, 213, 1097, 1, 0, 0, 0, 215, 1175, 1, 0, 0, 0, 217, 1177, 1, 0, 0, 0, 219, 1184, 1, 0, 0, 0, 221, 1188, 1, 0, 0, 0, 223, 1195, 1, 0, 0, 0, 225, 1211, 1, 0, 0, 0, 227, 1213, 1, 0, 0, 0, 229, 1215, 1, 0, 0, 0, 231, 1217, 1, 0, 0, 0, 233, 1219, 1, 0, 0, 0, 235, 1221, 1, 0, 0, 0, 237, 1223, 1, 0, 0, 0, 239, 1225, 1, 0, 0, 0, 241, 1227, 1, 0, 0, 0, 243, 1229, 1, 0, 0, 0, 245, 1231, 1, 0, 0, 0, 247, 1233, 1, 0, 0, 0, 249, 1235, 1, 0, 0, 0, 251, 1237, 1, 0, 0, 0, 253, 1239, 1, 0, 0, 0, 255, 1241, 1, 0, 0, 0, 257, 1243, 1, 0, 0, 0, 259, 1245, 1, 0, 0, 0, 261, 1247, 1, 0, 0, 0, 263, 1249, 1, 0, 0, 0, 265, 1251, 1, 0, 0, 0, 267, 1253, 1, 0, 0, 0, 269, 1255, 1, 0, 0, 0, 271, 1257, 1, 0, 0, 0, 273, 1259, 1, 0, 0, 0, 275, 1261, 1, 0, 0, 0, 277, 1263, 1, 0, 0, 0, 279, 1265, 1, 0, 0, 0, 281, 1267, 1, 0, 0, 0, 283, 1269, 1, 0, 0, 0, 285, 1271, 1, 0, 0, 0, 287, 1274, 1, 0, 0, 0, 289, 1276, 1, 0, 0, 0, 291, 1278, 1, 0, 0, 0, 293, 1280, 1, 0, 0, 0, 295, 1282, 1, 0, 0, 0, 297, 1284, 1, 0, 0, 0, 299, 1287, 1, 0, 0, 0, 301, 1289, 1, 0, 0, 0, 303, 1291, 1, 0, 0, 0, 305, 1293, 1, 0, 0, 0, 307, 1296, 1, 0, 0, 0, 309, 1298, 1, 0, 0, 0, 311, 1301, 1, 0, 0, 0, 313, 1303, 1, 0, 0, 0, 315, 1305, 1, 0, 0, 0, 317, 1308, 1, 0, 0, 0, 319, 1312, 1, 0, 0, 0, 321, 1316, 1, 0, 0, 0, 323, 1318, 1, 0, 0, 0, 325, 1320, 1, 0, 0, 0, 327, 1323, 1, 0, 0, 0, 329, 1329, 1, 0, 0, 0, 331, 1331, 1, 0, 0, 0, 333, 1335, 1, 0, 0, 0, 335, 1338, 1, 0, 0, 0, 337, 1341, 1, 0, 0, 0, 339, 1344, 1, 0, 0, 0, 341, 1346, 1, 0, 0, 0, 343, 1348, 1, 0, 0, 0, 345, 1350, 1, 0, 0, 0, 347, 1352, 1, 0, 0, 0, 349, 1357, 1, 0, 0, 0, 351, 1362, 1, 0, 0, 0, 353, 1364, 1, 0, 0, 0, 355, 1366, 1, 0, 0, 0, 357, 1369, 1, 0, 0, 0, 359, 1373, 1, 0, 0, 0, 361, 1375, 1, 0, 0, 0, 363, 1377, 1, 0, 0, 0, 365, 1379, 1, 0, 0, 0, 367, 1381, 1, 0, 0, 0, 369, 1383, 1, 0, 0, 0, 371, 1401, 1, 0, 0, 0, 373, 1414, 1, 0, 0, 0, 375, 1429, 1, 0, 0, 0, 377, 1433, 1, 0, 0, 0, 379, 1437, 1, 0, 0, 0, 381, 1447, 1, 0, 0, 0, 383, 1451, 1, 0, 0, 0, 385, 386, 3, 225, 111, 0, 386, 387, 3, 247, 122, 0, 387, 388, 3, 247, 122, 0, 388, 4, 1, 0, 0, 0, 389, 390, 3, 225, 111, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 231, 114, 0, 392, 6, 1, 0, 0, 0, 393, 394, 3, 225, 111, 0, 394, 395, 3, 251, 124, 0, 395, 396, 3, 263, 130, 0, 396, 397, 3, 241, 119, 0, 397, 8, 1, 0, 0, 0, 398, 399, 3, 225, 111, 0, 399, 400, 3, 251, 124, 0, 400, 401, 3, 273, 135, 0, 401, 10, 1, 0, 0, 0, 402, 403, 3, 225, 111, 0, 403, 404, 3, 259, 128, 0, 404, 405, 3, 259, 128, 0, 405, 406, 3, 225, 111, 0, 406, 407, 3, 273, 135, 0, 407, 12, 1, 0, 0, 0, 408, 409, 3, 225, 111, 0, 409, 410, 3, 261, 129, 0, 410, 14, 1, 0, 0, 0, 411, 412, 3, 225, 111, 0, 412, 413, 3, 261, 129, 0, 413, 414, 3, 229, 113, 0, 414, 426, 1, 0, 0, 0, 415, 416, 3, 225, 111, 0, 416, 417, 3, 261, 129, 0, 417, 418, 3, 229, 113, 0, 418, 419, 3, 233, 115, 0, 419, 420, 3, 251, 124, 0, 420, 421, 3, 231, 114, 0, 421, 422, 3, 241, 119, 0, 422, 423, 3, 251, 124, 0, 423, 424, 3, 237, 117, 0, 424, 426, 1, 0, 0, 0, 425, 411, 1, 0, 0, 0, 425, 415, 1, 0, 0, 0, 426, 16, 1, 0, 0, 0, 427, 428, 3, 225, 111, 0, 428, 429, 3, 261, 129, 0, 429, 430, 3, 253, 125, 0, 430, 431, 3, 235, 116, 0, 431, 18, 1, 0, 0, 0, 432, 433, 3, 227, 112, 0, 433, 434, 3, 233, 115, 0, 434, 435, 3, 263, 130, 0, 435, 436, 3, 269, 133, 0, 436, 437, 3, 233, 115, 0, 437, 438, 3, 233, 115, 0, 438, 439, 3, 251, 124, 0, 439, 20, 1, 0, 0, 0, 440, 441, 3, 227, 112, 0, 441, 442, 3, 253, 125, 0, 442, 443, 3, 263, 130, 0, 443, 444, 3, 239, 118, 0, 444, 22, 1, 0, 0, 0, 445, 446, 3, 227, 112, 0, 446, 447, 3, 273, 135, 0, 447, 24, 1, 0, 0, 0, 448, 449, 3, 229, 113, 0, 449, 450, 3, 225, 111, 0, 450, 451, 3, 261, 129, 0, 451, 452, 3, 233, 115, 0, 452, 26, 1, 0, 0, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 225, 111, 0, 455, 456, 3, 261, 129, 0, 456, 457, 3, 263, 130, 0, 457, 28, 1, 0, 0, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 225, 111, 0, 460, 461, 3, 263, 130, 0, 461, 462, 3, 229, 113, 0, 462, 463, 3, 239, 118, 0, 463, 30, 1, 0, 0, 0, 464, 465, 3, 229, 113, 0, 465, 466, 3, 253, 125, 0, 466, 467, 3, 239, 118, 0, 467, 468, 3, 253, 125, 0, 468, 469, 3, 259, 128, 0, 469, 470, 3, 263, 130, 0, 470, 32, 1, 0, 0, 0, 471, 472, 3, 229, 113, 0, 472, 473, 3, 253, 125, 0, 473, 474, 3, 247, 122, 0, 474, 475, 3, 247, 122, 0, 475, 476, 3, 225, 111, 0, 476, 477, 3, 263, 130, 0, 477, 478, 3, 233, 115, 0, 478, 34, 1, 0, 0, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 259, 128, 0, 481, 482, 3, 253, 125, 0, 482, 483, 3, 261, 129, 0, 483, 484, 3, 261, 129, 0, 484, 36, 1, 0, 0, 0, 485, 486, 3, 229, 113, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 227, 112, 0, 488, 489, 3, 233, 115, 0, 489, 38, 1, 0, 0, 0, 490, 491, 3, 229, 113, 0, 491, 492, 3, 265, 131, 0, 492, 493, 3, 259, 128, 0, 493, 494, 3, 259, 128, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 251, 124, 0, 496, 497, 3, 263, 130, 0, 497, 40, 1, 0, 0, 0, 498, 499, 3, 231, 114, 0, 499, 500, 3, 225, 111, 0, 500, 501, 3, 263, 130, 0, 501, 502, 3, 233, 115, 0, 502, 42, 1, 0, 0, 0, 503, 504, 3, 231, 114, 0, 504, 505, 3, 225, 111, 0, 505, 506, 3, 273, 135, 0, 506, 44, 1, 0, 0, 0, 507, 508, 3, 231, 114, 0, 508, 509, 3, 233, 115, 0, 509, 510, 3, 261, 129, 0, 510, 511, 3, 229, 113, 0, 511, 46, 1, 0, 0, 0, 512, 513, 3, 231, 114, 0, 513, 514, 3, 233, 115, 0, 514, 515, 3, 261, 129, 0, 515, 516, 3, 229, 113, 0, 516, 517, 3, 233, 115, 0, 517, 518, 3, 251, 124, 0, 518, 519, 3, 231, 114, 0, 519, 520, 3, 241, 119, 0, 520, 521, 3, 251, 124, 0, 521, 522, 3, 237, 117, 0, 522, 48, 1, 0, 0, 0, 523, 524, 3, 231, 114, 0, 524, 525, 3, 241, 119, 0, 525, 526, 3, 261, 129, 0, 526, 527, 3, 263, 130, 0, 527, 528, 3, 241, 119, 0, 528, 529, 3, 251, 124, 0, 529, 530, 3, 229, 113, 0, 530, 531, 3, 263, 130, 0, 531, 50, 1, 0, 0, 0, 532, 533, 3, 233, 115, 0, 533, 534, 3, 247, 122, 0, 534, 535, 3, 261, 129, 0, 535, 536, 3, 233, 115, 0, 536, 52, 1, 0, 0, 0, 537, 538, 3, 233, 115, 0, 538, 539, 3, 251, 124, 0, 539, 540, 3, 231, 114, 0, 540, 54, 1, 0, 0, 0, 541, 542, 3, 233, 115, 0, 542, 543, 3, 271, 134, 0, 543, 544, 3, 263, 130, 0, 544, 545, 3, 259, 128, 0, 545, 546, 3, 225, 111, 0, 546, 547, 3, 229, 113, 0, 547, 548, 3, 263, 130, 0, 548, 56, 1, 0, 0, 0, 549, 550, 3, 235, 116, 0, 550, 551, 3, 241, 119, 0, 551, 552, 3, 251, 124, 0, 552, 553, 3, 225, 111, 0, 553, 554, 3, 247, 122, 0, 554, 58, 1, 0, 0, 0, 555, 556, 3, 235, 116, 0, 556, 557, 3, 241, 119, 0, 557, 558, 3, 251, 124, 0, 558, 559, 3, 225, 111, 0, 559, 560, 3, 247, 122, 0, 560, 561, 3, 247, 122, 0, 561, 562, 3, 273, 135, 0, 562, 60, 1, 0, 0, 0, 563, 564, 3, 235, 116, 0, 564, 565, 3, 241, 119, 0, 565, 566, 3, 259, 128, 0, 566, 567, 3, 261, 129, 0, 567, 568, 3, 263, 130, 0, 568, 62, 1, 0, 0, 0, 569, 570, 3, 235, 116, 0, 570, 571, 3, 251, 124, 0, 571, 64, 1, 0, 0, 0, 572, 573, 3, 235, 116, 0, 573, 574, 3, 253, 125, 0, 574, 575, 3, 247, 122, 0, 575, 576, 3, 247, 122, 0, 576, 577, 3, 253, 125, 0, 577, 578, 3, 269, 133, 0, 578, 579, 3, 241, 119, 0, 579, 580, 3, 251, 124, 0, 580, 581, 3, 237, 117, 0, 581, 66, 1, 0, 0, 0, 582, 583, 3, 235, 116, 0, 583, 584, 3, 253, 125, 0, 584, 585, 3, 259, 128, 0, 585, 68, 1, 0, 0, 0, 586, 587, 3, 235, 116, 0, 587, 588, 3, 259, 128, 0, 588, 589, 3, 253, 125, 0, 589, 590, 3, 249, 123, 0, 590, 70, 1, 0, 0, 0, 591, 592, 3, 235, 116, 0, 592, 593, 3, 265, 131, 0, 593, 594, 3, 247, 122, 0, 594, 595, 3, 247, 122, 0, 595, 72, 1, 0, 0, 0, 596, 597, 3, 235, 116, 0, 597, 598, 3, 265, 131, 0, 598, 599, 3, 251, 124, 0, 599, 74, 1, 0, 0, 0, 600, 601, 3, 237, 117, 0, 601, 602, 3, 259, 128, 0, 602, 603, 3, 253, 125, 0, 603, 604, 3, 265, 131, 0, 604, 605, 3, 255, 126, 0, 605, 76, 1, 0, 0, 0, 606, 607, 3, 239, 118, 0, 607, 608, 3, 225, 111, 0, 608, 609, 3, 267, 132, 0, 609, 610, 3, 241, 119, 0, 610, 611, 3, 251, 124, 0, 611, 612, 3, 237, 117, 0, 612, 78, 1, 0, 0, 0, 613, 614, 3, 239, 118, 0, 614, 615, 3, 253, 125, 0, 615, 616, 3, 265, 131, 0, 616, 617, 3, 259, 128, 0, 617, 80, 1, 0, 0, 0, 618, 619, 3, 241, 119, 0, 619, 620, 3, 231, 114, 0, 620, 82, 1, 0, 0, 0, 621, 622, 3, 241, 119, 0, 622, 623, 3, 235, 116, 0, 623, 84, 1, 0, 0, 0, 624, 625, 3, 241, 119, 0, 625, 626, 3, 247, 122, 0, 626, 627, 3, 241, 119, 0, 627, 628, 3, 245, 121, 0, 628, 629, 3, 233, 115, 0, 629, 86, 1, 0, 0, 0, 630, 631, 3, 241, 119, 0, 631, 632, 3, 251, 124, 0, 632, 88, 1, 0, 0, 0, 633, 634, 3, 241, 119, 0, 634, 635, 3, 251, 124, 0, 635, 636, 3, 235, 116, 0, 636, 647, 1, 0, 0, 0, 637, 638, 3, 241, 119, 0, 638, 639, 3, 251, 124, 0, 639, 640, 3, 235, 116, 0, 640, 641, 3, 241, 119, 0, 641, 642, 3, 251, 124, 0, 642, 643, 3, 241, 119, 0, 643, 644, 3, 263, 130, 0, 644, 645, 3, 273, 135, 0, 645, 647, 1, 0, 0, 0, 646, 633, 1, 0, 0, 0, 646, 637, 1, 0, 0, 0, 647, 90, 1, 0, 0, 0, 648, 649, 3, 241, 119, 0, 649, 650, 3, 251, 124, 0, 650, 651, 3, 251, 124, 0, 651, 652, 3, 233, 115, 0, 652, 653, 3, 259, 128, 0, 653, 92, 1, 0, 0, 0, 654, 655, 3, 241, 119, 0, 655, 656, 3, 251, 124, 0, 656, 657, 3, 263, 130, 0, 657, 658, 3, 233, 115, 0, 658, 659, 3, 259, 128, 0, 659, 660, 3, 267, 132, 0, 660, 661, 3, 225, 111, 0, 661, 662, 3, 247, 122, 0, 662, 94, 1, 0, 0, 0, 663, 664, 3, 241, 119, 0, 664, 665, 3, 261, 129, 0, 665, 96, 1, 0, 0, 0, 666, 667, 3, 243, 120, 0, 667, 668, 3, 253, 125, 0, 668, 669, 3, 241, 119, 0, 669, 670, 3, 251, 124, 0, 670, 98, 1, 0, 0, 0, 671, 672, 3, 245, 121, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 273, 135, 0, 674, 100, 1, 0, 0, 0, 675, 676, 3, 247, 122, 0, 676, 677, 3, 225, 111, 0, 677, 678, 3, 261, 129, 0, 678, 679, 3, 263, 130, 0, 679, 102, 1, 0, 0, 0, 680, 681, 3, 247, 122, 0, 681, 682, 3, 233, 115, 0, 682, 683, 3, 225, 111, 0, 683, 684, 3, 231, 114, 0, 684, 685, 3, 241, 119, 0, 685, 686, 3, 251, 124, 0, 686, 687, 3, 237, 117, 0, 687, 104, 1, 0, 0, 0, 688, 689, 3, 247, 122, 0, 689, 690, 3, 233, 115, 0, 690, 691, 3, 235, 116, 0, 691, 692, 3, 263, 130, 0, 692, 106, 1, 0, 0, 0, 693, 694, 3, 247, 122, 0, 694, 695, 3, 233, 115, 0, 695, 696, 3, 263, 130, 0, 696, 108, 1, 0, 0, 0, 697, 698, 3, 247, 122, 0, 698, 699, 3, 241, 119, 0, 699, 700, 3, 245, 121, 0, 700, 701, 3, 233, 115, 0, 701, 110, 1, 0, 0, 0, 702, 703, 3, 247, 122, 0, 703, 704, 3, 241, 119, 0, 704, 705, 3, 249, 123, 0, 705, 706, 3, 241, 119, 0, 706, 707, 3, 263, 130, 0, 707, 112, 1, 0, 0, 0, 708, 709, 3, 249, 123, 0, 709, 710, 3, 241, 119, 0, 710, 711, 3, 251, 124, 0, 711, 712, 3, 265, 131, 0, 712, 713, 3, 263, 130, 0, 713, 714, 3, 233, 115, 0, 714, 114, 1, 0, 0, 0, 715, 716, 3, 249, 123, 0, 716, 717, 3, 253, 125, 0, 717, 718, 3, 251, 124, 0, 718, 719, 3, 263, 130, 0, 719, 720, 3, 239, 118, 0, 720, 116, 1, 0, 0, 0, 721, 722, 3, 251, 124, 0, 722, 723, 3, 225, 111, 0, 723, 724, 3, 251, 124, 0, 724, 118, 1, 0, 0, 0, 725, 726, 3, 251, 124, 0, 726, 727, 3, 253, 125, 0, 727, 728, 3, 263, 130, 0, 728, 120, 1, 0, 0, 0, 729, 730, 3, 251, 124, 0, 730, 731, 3, 265, 131, 0, 731, 732, 3, 247, 122, 0, 732, 733, 3, 247, 122, 0, 733, 122, 1, 0, 0, 0, 734, 735, 3, 251, 124, 0, 735, 736, 3, 265, 131, 0, 736, 737, 3, 247, 122, 0, 737, 738, 3, 247, 122, 0, 738, 739, 3, 261, 129, 0, 739, 124, 1, 0, 0, 0, 740, 741, 3, 253, 125, 0, 741, 742, 3, 235, 116, 0, 742, 743, 3, 235, 116, 0, 743, 744, 3, 261, 129, 0, 744, 745, 3, 233, 115, 0, 745, 746, 3, 263, 130, 0, 746, 126, 1, 0, 0, 0, 747, 748, 3, 253, 125, 0, 748, 749, 3, 251, 124, 0, 749, 128, 1, 0, 0, 0, 750, 751, 3, 253, 125, 0, 751, 752, 3, 259, 128, 0, 752, 130, 1, 0, 0, 0, 753, 754, 3, 253, 125, 0, 754, 755, 3, 259, 128, 0, 755, 756, 3, 231, 114, 0, 756, 757, 3, 233, 115, 0, 757, 758, 3, 259, 128, 0, 758, 132, 1, 0, 0, 0, 759, 760, 3, 253, 125, 0, 760, 761, 3, 265, 131, 0, 761, 762, 3, 263, 130, 0, 762, 763, 3, 233, 115, 0, 763, 764, 3, 259, 128, 0, 764, 134, 1, 0, 0, 0, 765, 766, 3, 253, 125, 0, 766, 767, 3, 267, 132, 0, 767, 768, 3, 233, 115, 0, 768, 769, 3, 259, 128, 0, 769, 136, 1, 0, 0, 0, 770, 771, 3, 255, 126, 0, 771, 772, 3, 225, 111, 0, 772, 773, 3, 259, 128, 0, 773, 774, 3, 263, 130, 0, 774, 775, 3, 241, 119, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 241, 119, 0, 777, 778, 3, 253, 125, 0, 778, 779, 3, 251, 124, 0, 779, 138, 1, 0, 0, 0, 780, 781, 3, 255, 126, 0, 781, 782, 3, 259, 128, 0, 782, 783, 3, 233, 115, 0, 783, 784, 3, 229, 113, 0, 784, 785, 3, 233, 115, 0, 785, 786, 3, 231, 114, 0, 786, 787, 3, 241, 119, 0, 787, 788, 3, 251, 124, 0, 788, 789, 3, 237, 117, 0, 789, 140, 1, 0, 0, 0, 790, 791, 3, 255, 126, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 233, 115, 0, 793, 794, 3, 269, 133, 0, 794, 795, 3, 239, 118, 0, 795, 796, 3, 233, 115, 0, 796, 797, 3, 259, 128, 0, 797, 798, 3, 233, 115, 0, 798, 142, 1, 0, 0, 0, 799, 800, 3, 257, 127, 0, 800, 801, 3, 265, 131, 0, 801, 802, 3, 225, 111, 0, 802, 803, 3, 259, 128, 0, 803, 804, 3, 263, 130, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 259, 128, 0, 806, 144, 1, 0, 0, 0, 807, 808, 3, 259, 128, 0, 808, 809, 3, 225, 111, 0, 809, 810, 3, 251, 124, 0, 810, 811, 3, 237, 117, 0, 811, 812, 3, 233, 115, 0, 812, 146, 1, 0, 0, 0, 813, 814, 3, 259, 128, 0, 814, 815, 3, 233, 115, 0, 815, 816, 3, 263, 130, 0, 816, 817, 3, 265, 131, 0, 817, 818, 3, 259, 128, 0, 818, 819, 3, 251, 124, 0, 819, 148, 1, 0, 0, 0, 820, 821, 3, 259, 128, 0, 821, 822, 3, 241, 119, 0, 822, 823, 3, 237, 117, 0, 823, 824, 3, 239, 118, 0, 824, 825, 3, 263, 130, 0, 825, 150, 1, 0, 0, 0, 826, 827, 3, 259, 128, 0, 827, 828, 3, 253, 125, 0, 828, 829, 3, 247, 122, 0, 829, 830, 3, 247, 122, 0, 830, 831, 3, 265, 131, 0, 831, 832, 3, 255, 126, 0, 832, 152, 1, 0, 0, 0, 833, 834, 3, 259, 128, 0, 834, 835, 3, 253, 125, 0, 835, 836, 3, 269, 133, 0, 836, 154, 1, 0, 0, 0, 837, 838, 3, 259, 128, 0, 838, 839, 3, 253, 125, 0, 839, 840, 3, 269, 133, 0, 840, 841, 3, 261, 129, 0, 841, 156, 1, 0, 0, 0, 842, 843, 3, 261, 129, 0, 843, 844, 3, 225, 111, 0, 844, 845, 3, 249, 123, 0, 845, 846, 3, 255, 126, 0, 846, 847, 3, 247, 122, 0, 847, 848, 3, 233, 115, 0, 848, 158, 1, 0, 0, 0, 849, 850, 3, 261, 129, 0, 850, 851, 3, 233, 115, 0, 851, 852, 3, 229, 113, 0, 852, 853, 3, 253, 125, 0, 853, 854, 3, 251, 124, 0, 854, 855, 3, 231, 114, 0, 855, 160, 1, 0, 0, 0, 856, 857, 3, 261, 129, 0, 857, 858, 3, 233, 115, 0, 858, 859, 3, 247, 122, 0, 859, 860, 3, 233, 115, 0, 860, 861, 3, 229, 113, 0, 861, 862, 3, 263, 130, 0, 862, 162, 1, 0, 0, 0, 863, 864, 3, 261, 129, 0, 864, 865, 3, 233, 115, 0, 865, 866, 3, 249, 123, 0, 866, 867, 3, 241, 119, 0, 867, 164, 1, 0, 0, 0, 868, 869, 3, 261, 129, 0, 869, 870, 3, 233, 115, 0, 870, 871, 3, 263, 130, 0, 871, 872, 3, 263, 130, 0, 872, 873, 3, 241, 119, 0, 873, 874, 3, 251, 124, 0, 874, 875, 3, 237, 117, 0, 875, 876, 3, 261, 129, 0, 876, 166, 1, 0, 0, 0, 877, 878, 3, 261, 129, 0, 878, 879, 3, 265, 131, 0, 879, 880, 3, 227, 112, 0, 880, 881, 3, 261, 129, 0, 881, 882, 3, 263, 130, 0, 882, 883, 3, 259, 128, 0, 883, 884, 3, 241, 119, 0, 884, 885, 3, 251, 124, 0, 885, 886, 3, 237, 117, 0, 886, 168, 1, 0, 0, 0, 887, 888, 3, 263, 130, 0, 888, 889, 3, 239, 118, 0, 889, 890, 3, 233, 115, 0, 890, 891, 3, 251, 124, 0, 891, 170, 1, 0, 0, 0, 892, 893, 3, 263, 130, 0, 893, 894, 3, 239, 118, 0, 894, 895, 3, 259, 128, 0, 895, 896, 3, 253, 125, 0, 896, 897, 3, 269, 133, 0, 897, 172, 1, 0, 0, 0, 898, 899, 3, 263, 130, 0, 899, 900, 3, 241, 119, 0, 900, 901, 3, 233, 115, 0, 901, 902, 3, 261, 129, 0, 902, 174, 1, 0, 0, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 241, 119, 0, 905, 906, 3, 249, 123, 0, 906, 907, 3, 233, 115, 0, 907, 908, 3, 261, 129, 0, 908, 909, 3, 263, 130, 0, 909, 910, 3, 225, 111, 0, 910, 911, 3, 249, 123, 0, 911, 912, 3, 255, 126, 0, 912, 176, 1, 0, 0, 0, 913, 914, 3, 263, 130, 0, 914, 915, 3, 253, 125, 0, 915, 178, 1, 0, 0, 0, 916, 917, 3, 263, 130, 0, 917, 918, 3, 253, 125, 0, 918, 919, 3, 255, 126, 0, 919, 180, 1, 0, 0, 0, 920, 921, 3, 263, 130, 0, 921, 922, 3, 253, 125, 0, 922, 923, 3, 263, 130, 0, 923, 924, 3, 225, 111, 0, 924, 925, 3, 247, 122, 0, 925, 926, 3, 261, 129, 0, 926, 182, 1, 0, 0, 0, 927, 928, 3, 263, 130, 0, 928, 929, 3, 259, 128, 0, 929, 930, 3, 225, 111, 0, 930, 931, 3, 241, 119, 0, 931, 932, 3, 247, 122, 0, 932, 933, 3, 241, 119, 0, 933, 934, 3, 251, 124, 0, 934, 935, 3, 237, 117, 0, 935, 184, 1, 0, 0, 0, 936, 937, 3, 263, 130, 0, 937, 938, 3, 259, 128, 0, 938, 939, 3, 241, 119, 0, 939, 940, 3, 249, 123, 0, 940, 186, 1, 0, 0, 0, 941, 942, 3, 263, 130, 0, 942, 943, 3, 259, 128, 0, 943, 944, 3, 265, 131, 0, 944, 945, 3, 251, 124, 0, 945, 946, 3, 229, 113, 0, 946, 947, 3, 225, 111, 0, 947, 948, 3, 263, 130, 0, 948, 949, 3, 233, 115, 0, 949, 188, 1, 0, 0, 0, 950, 951, 3, 263, 130, 0, 951, 952, 3, 259, 128, 0, 952, 953, 3, 273, 135, 0, 953, 190, 1, 0, 0, 0, 954, 955, 3, 265, 131, 0, 955, 956, 3, 251, 124, 0, 956, 957, 3, 227, 112, 0, 957, 958, 3, 253, 125, 0, 958, 959, 3, 265, 131, 0, 959, 960, 3, 251, 124, 0, 960, 961, 3, 231, 114, 0, 961, 962, 3, 233, 115, 0, 962, 963, 3, 231, 114, 0, 963, 192, 1, 0, 0, 0, 964, 965, 3, 265, 131, 0, 965, 966, 3, 251, 124, 0, 966, 967, 3, 241, 119, 0, 967, 968, 3, 253, 125, 0, 968, 969, 3, 251, 124, 0, 969, 194, 1, 0, 0, 0, 970, 971, 3, 265, 131, 0, 971, 972, 3, 261, 129, 0, 972, 973, 3, 241, 119, 0, 973, 974, 3, 251, 124, 0, 974, 975, 3, 237, 117, 0, 975, 196, 1, 0, 0, 0, 976, 977, 3, 269, 133, 0, 977, 978, 3, 233, 115, 0, 978, 979, 3, 233, 115, 0, 979, 980, 3, 245, 121, 0, 980, 198, 1, 0, 0, 0, 981, 982, 3, 269, 133, 0, 982, 983, 3, 239, 118, 0, 983, 984, 3, 233, 115, 0, 984, 985, 3, 251, 124, 0, 985, 200, 1, 0, 0, 0, 986, 987, 3, 269, 133, 0, 987, 988, 3, 239, 118, 0, 988, 989, 3, 233, 115, 0, 989, 990, 3, 259, 128, 0, 990, 991, 3, 233, 115, 0, 991, 202, 1, 0, 0, 0, 992, 993, 3, 269, 133, 0, 993, 994, 3, 239, 118, 0, 994, 995, 3, 241, 119, 0, 995, 996, 3, 247, 122, 0, 996, 997, 3, 233, 115, 0, 997, 204, 1, 0, 0, 0, 998, 999, 3, 269, 133, 0, 999, 1000, 3, 241, 119, 0, 1000, 1001, 3, 251, 124, 0, 1001, 1002, 3, 231, 114, 0, 1002, 1003, 3, 253, 125, 0, 1003, 1004, 3, 269, 133, 0, 1004, 206, 1, 0, 0, 0, 1005, 1006, 3, 269, 133, 0, 1006, 1007, 3, 241, 119, 0, 1007, 1008, 3, 263, 130, 0, 1008, 1009, 3, 239, 118, 0, 1009, 208, 1, 0, 0, 0, 1010, 1011, 3, 273, 135, 0, 1011, 1012, 3, 233, 115, 0, 1012, 1013, 3, 225, 111, 0, 1013, 1014, 3, 259, 128, 0, 1014, 1021, 1, 0, 0, 0, 1015, 1016, 3, 273, 135, 0, 1016, 1017, 3, 273, 135, 0, 1017, 1018, 3, 273, 135, 0, 1018, 1019, 3, 273, 135, 0, 1019, 1021, 1, 0, 0, 0, 1020, 1010, 1, 0, 0, 0, 1020, 1015, 1, 0, 0, 0, 1021, 210, 1, 0, 0, 0, 1022, 1023, 3, 291, 144, 0, 1023, 1024, 3, 227, 112, 0, 1024, 1050, 1, 0, 0, 0, 1025, 1026, 3, 291, 144, 0, 1026, 1027, 3, 235, 116, 0, 1027, 1050, 1, 0, 0, 0, 1028, 1029, 3, 291, 144, 0, 1029, 1030, 3, 259, 128, 0, 1030, 1050, 1, 0, 0, 0, 1031, 1032, 3, 291, 144, 0, 1032, 1033, 3, 251, 124, 0, 1033, 1050, 1, 0, 0, 0, 1034, 1035, 3, 291, 144, 0, 1035, 1036, 3, 263, 130, 0, 1036, 1050, 1, 0, 0, 0, 1037, 1038, 3, 291, 144, 0, 1038, 1039, 5, 48, 0, 0, 1039, 1050, 1, 0, 0, 0, 1040, 1041, 3, 291, 144, 0, 1041, 1042, 3, 225, 111, 0, 1042, 1050, 1, 0, 0, 0, 1043, 1044, 3, 291, 144, 0, 1044, 1045, 3, 267, 132, 0, 1045, 1050, 1, 0, 0, 0, 1046, 1047, 3, 291, 144, 0, 1047, 1048, 3, 291, 144, 0, 1048, 1050, 1, 0, 0, 0, 1049, 1022, 1, 0, 0, 0, 1049, 1025, 1, 0, 0, 0, 1049, 1028, 1, 0, 0, 0, 1049, 1031, 1, 0, 0, 0, 1049, 1034, 1, 0, 0, 0, 1049, 1037, 1, 0, 0, 0, 1049, 1040, 1, 0, 0, 0, 1049, 1043, 1, 0, 0, 0, 1049, 1046, 1, 0, 0, 0, 1050, 212, 1, 0, 0, 0, 1051, 1055, 3, 277, 137, 0, 1052, 1055, 3, 367, 182, 0, 1053, 1055, 3, 301, 149, 0, 1054, 1051, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1062, 1, 0, 0, 0, 1056, 1061, 3, 277, 137, 0, 1057, 1061, 3, 367, 182, 0, 1058, 1061, 3, 281, 139, 0, 1059, 1061, 3, 301, 149, 0, 1060, 1056, 1, 0, 0, 0, 1060, 1057, 1, 0, 0, 0, 1060, 1058, 1, 0, 0, 0, 1060, 1059, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1098, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1076, 3, 289, 143, 0, 1066, 1075, 8, 0, 0, 0, 1067, 1075, 3, 211, 104, 0, 1068, 1069, 3, 291, 144, 0, 1069, 1070, 3, 351, 174, 0, 1070, 1075, 1, 0, 0, 0, 1071, 1072, 3, 289, 143, 0, 1072, 1073, 3, 289, 143, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1066, 1, 0, 0, 0, 1074, 1067, 1, 0, 0, 0, 1074, 1068, 1, 0, 0, 0, 1074, 1071, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1079, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1079, 1080, 3, 289, 143, 0, 1080, 1098, 1, 0, 0, 0, 1081, 1092, 3, 345, 171, 0, 1082, 1091, 8, 1, 0, 0, 1083, 1091, 3, 211, 104, 0, 1084, 1085, 3, 291, 144, 0, 1085, 1086, 3, 345, 171, 0, 1086, 1091, 1, 0, 0, 0, 1087, 1088, 3, 345, 171, 0, 1088, 1089, 3, 345, 171, 0, 1089, 1091, 1, 0, 0, 0, 1090, 1082, 1, 0, 0, 0, 1090, 1083, 1, 0, 0, 0, 1090, 1084, 1, 0, 0, 0, 1090, 1087, 1, 0, 0, 0, 1091, 1094, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1095, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1095, 1096, 3, 345, 171, 0, 1096, 1098, 1, 0, 0, 0, 1097, 1054, 1, 0, 0, 0, 1097, 1065, 1, 0, 0, 0, 1097, 1081, 1, 0, 0, 0, 1098, 214, 1, 0, 0, 0, 1099, 1100, 3, 221, 109, 0, 1100, 1104, 3, 303, 150, 0, 1101, 1103, 3, 283, 140, 0, 1102, 1101, 1, 0, 0, 0, 1103, 1106, 1, 0, 0, 0, 1104, 1102, 1, 0, 0, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1109, 1, 0, 0, 0, 1106, 1104, 1, 0, 0, 0, 1107, 1110, 3, 255, 126, 0, 1108, 1110, 3, 233, 115, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1108, 1, 0, 0, 0, 1110, 1113, 1, 0, 0, 0, 1111, 1114, 3, 341, 169, 0, 1112, 1114, 3, 299, 148, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1117, 3, 281, 139, 0, 1116, 1115, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1116, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1176, 1, 0, 0, 0, 1120, 1123, 3, 221, 109, 0, 1121, 1124, 3, 255, 126, 0, 1122, 1124, 3, 233, 115, 0, 1123, 1121, 1, 0, 0, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1128, 3, 341, 169, 0, 1126, 1128, 3, 299, 148, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1126, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1130, 1, 0, 0, 0, 1129, 1131, 3, 281, 139, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1130, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1176, 1, 0, 0, 0, 1134, 1135, 3, 219, 108, 0, 1135, 1139, 3, 303, 150, 0, 1136, 1138, 3, 281, 139, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1141, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1142, 1145, 3, 233, 115, 0, 1143, 1146, 3, 341, 169, 0, 1144, 1146, 3, 299, 148, 0, 1145, 1143, 1, 0, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1148, 1, 0, 0, 0, 1147, 1149, 3, 281, 139, 0, 1148, 1147, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1176, 1, 0, 0, 0, 1152, 1153, 3, 303, 150, 0, 1153, 1154, 3, 219, 108, 0, 1154, 1157, 3, 233, 115, 0, 1155, 1158, 3, 341, 169, 0, 1156, 1158, 3, 299, 148, 0, 1157, 1155, 1, 0, 0, 0, 1157, 1156, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1160, 1, 0, 0, 0, 1159, 1161, 3, 281, 139, 0, 1160, 1159, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1176, 1, 0, 0, 0, 1164, 1165, 3, 219, 108, 0, 1165, 1168, 3, 233, 115, 0, 1166, 1169, 3, 341, 169, 0, 1167, 1169, 3, 299, 148, 0, 1168, 1166, 1, 0, 0, 0, 1168, 1167, 1, 0, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1171, 1, 0, 0, 0, 1170, 1172, 3, 281, 139, 0, 1171, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1099, 1, 0, 0, 0, 1175, 1120, 1, 0, 0, 0, 1175, 1134, 1, 0, 0, 0, 1175, 1152, 1, 0, 0, 0, 1175, 1164, 1, 0, 0, 0, 1176, 216, 1, 0, 0, 0, 1177, 1179, 5, 48, 0, 0, 1178, 1180, 3, 279, 138, 0, 1179, 1178, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1179, 1, 0, 0, 0, 1181, 1182, 1, 0, 0, 0, 1182, 218, 1, 0, 0, 0, 1183, 1185, 3, 281, 139, 0, 1184, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1184, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 220, 1, 0, 0, 0, 1188, 1189, 5, 48, 0, 0, 1189, 1191, 3, 271, 134, 0, 1190, 1192, 3, 283, 140, 0, 1191, 1190, 1, 0, 0, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 222, 1, 0, 0, 0, 1195, 1206, 3, 351, 174, 0, 1196, 1205, 8, 2, 0, 0, 1197, 1205, 3, 211, 104, 0, 1198, 1199, 3, 291, 144, 0, 1199, 1200, 3, 351, 174, 0, 1200, 1205, 1, 0, 0, 0, 1201, 1202, 3, 351, 174, 0, 1202, 1203, 3, 351, 174, 0, 1203, 1205, 1, 0, 0, 0, 1204, 1196, 1, 0, 0, 0, 1204, 1197, 1, 0, 0, 0, 1204, 1198, 1, 0, 0, 0, 1204, 1201, 1, 0, 0, 0, 1205, 1208, 1, 0, 0, 0, 1206, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1206, 1, 0, 0, 0, 1209, 1210, 3, 351, 174, 0, 1210, 224, 1, 0, 0, 0, 1211, 1212, 7, 3, 0, 0, 1212, 226, 1, 0, 0, 0, 1213, 1214, 7, 4, 0, 0, 1214, 228, 1, 0, 0, 0, 1215, 1216, 7, 5, 0, 0, 1216, 230, 1, 0, 0, 0, 1217, 1218, 7, 6, 0, 0, 1218, 232, 1, 0, 0, 0, 1219, 1220, 7, 7, 0, 0, 1220, 234, 1, 0, 0, 0, 1221, 1222, 7, 8, 0, 0, 1222, 236, 1, 0, 0, 0, 1223, 1224, 7, 9, 0, 0, 1224, 238, 1, 0, 0, 0, 1225, 1226, 7, 10, 0, 0, 1226, 240, 1, 0, 0, 0, 1227, 1228, 7, 11, 0, 0, 1228, 242, 1, 0, 0, 0, 1229, 1230, 7, 12, 0, 0, 1230, 244, 1, 0, 0, 0, 1231, 1232, 7, 13, 0, 0, 1232, 246, 1, 0, 0, 0, 1233, 1234, 7, 14, 0, 0, 1234, 248, 1, 0, 0, 0, 1235, 1236, 7, 15, 0, 0, 1236, 250, 1, 0, 0, 0, 1237, 1238, 7, 16, 0, 0, 1238, 252, 1, 0, 0, 0, 1239, 1240, 7, 17, 0, 0, 1240, 254, 1, 0, 0, 0, 1241, 1242, 7, 18, 0, 0, 1242, 256, 1, 0, 0, 0, 1243, 1244, 7, 19, 0, 0, 1244, 258, 1, 0, 0, 0, 1245, 1246, 7, 20, 0, 0, 1246, 260, 1, 0, 0, 0, 1247, 1248, 7, 21, 0, 0, 1248, 262, 1, 0, 0, 0, 1249, 1250, 7, 22, 0, 0, 1250, 264, 1, 0, 0, 0, 1251, 1252, 7, 23, 0, 0, 1252, 266, 1, 0, 0, 0, 1253, 1254, 7, 24, 0, 0, 1254, 268, 1, 0, 0, 0, 1255, 1256, 7, 25, 0, 0, 1256, 270, 1, 0, 0, 0, 1257, 1258, 7, 26, 0, 0, 1258, 272, 1, 0, 0, 0, 1259, 1260, 7, 27, 0, 0, 1260, 274, 1, 0, 0, 0, 1261, 1262, 7, 28, 0, 0, 1262, 276, 1, 0, 0, 0, 1263, 1264, 7, 29, 0, 0, 1264, 278, 1, 0, 0, 0, 1265, 1266, 7, 30, 0, 0, 1266, 280, 1, 0, 0, 0, 1267, 1268, 7, 31, 0, 0, 1268, 282, 1, 0, 0, 0, 1269, 1270, 7, 32, 0, 0, 1270, 284, 1, 0, 0, 0, 1271, 1272, 5, 45, 0, 0, 1272, 1273, 5, 62, 0, 0, 1273, 286, 1, 0, 0, 0, 1274, 1275, 5, 42, 0, 0, 1275, 288, 1, 0, 0, 0, 1276, 1277, 5, 96, 0, 0, 1277, 290, 1, 0, 0, 0, 1278, 1279, 5, 92, 0, 0, 1279, 292, 1, 0, 0, 0, 1280, 1281, 5, 58, 0, 0, 1281, 294, 1, 0, 0, 0, 1282, 1283, 5, 44, 0, 0, 1283, 296, 1, 0, 0, 0, 1284, 1285, 5, 124, 0, 0, 1285, 1286, 5, 124, 0, 0, 1286, 298, 1, 0, 0, 0, 1287, 1288, 5, 45, 0, 0, 1288, 300, 1, 0, 0, 0, 1289, 1290, 5, 36, 0, 0, 1290, 302, 1, 0, 0, 0, 1291, 1292, 5, 46, 0, 0, 1292, 304, 1, 0, 0, 0, 1293, 1294, 5, 61, 0, 0, 1294, 1295, 5, 61, 0, 0, 1295, 306, 1, 0, 0, 0, 1296, 1297, 5, 61, 0, 0, 1297, 308, 1, 0, 0, 0, 1298, 1299, 5, 62, 0, 0, 1299, 1300, 5, 61, 0, 0, 1300, 310, 1, 0, 0, 0, 1301, 1302, 5, 62, 0, 0, 1302, 312, 1, 0, 0, 0, 1303, 1304, 5, 35, 0, 0, 1304, 314, 1, 0, 0, 0, 1305, 1306, 5, 126, 0, 0, 1306, 1307, 5, 42, 0, 0, 1307, 316, 1, 0, 0, 0, 1308, 1309, 5, 61, 0, 0, 1309, 1310, 5, 126, 0, 0, 1310, 1311, 5, 42, 0, 0, 1311, 318, 1, 0, 0, 0, 1312, 1313, 5, 123, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 158, 0, 0, 1315, 320, 1, 0, 0, 0, 1316, 1317, 5, 91, 0, 0, 1317, 322, 1, 0, 0, 0, 1318, 1319, 5, 40, 0, 0, 1319, 324, 1, 0, 0, 0, 1320, 1321, 5, 60, 0, 0, 1321, 1322, 5, 61, 0, 0, 1322, 326, 1, 0, 0, 0, 1323, 1324, 5, 60, 0, 0, 1324, 328, 1, 0, 0, 0, 1325, 1326, 5, 33, 0, 0, 1326, 1330, 5, 61, 0, 0, 1327, 1328, 5, 60, 0, 0, 1328, 1330, 5, 62, 0, 0, 1329, 1325, 1, 0, 0, 0, 1329, 1327, 1, 0, 0, 0, 1330, 330, 1, 0, 0, 0, 1331, 1332, 5, 33, 0, 0, 1332, 1333, 5, 126, 0, 0, 1333, 1334, 5, 42, 0, 0, 1334, 332, 1, 0, 0, 0, 1335, 1336, 5, 33, 0, 0, 1336, 1337, 5, 126, 0, 0, 1337, 334, 1, 0, 0, 0, 1338, 1339, 5, 63, 0, 0, 1339, 1340, 5, 46, 0, 0, 1340, 336, 1, 0, 0, 0, 1341, 1342, 5, 63, 0, 0, 1342, 1343, 5, 63, 0, 0, 1343, 338, 1, 0, 0, 0, 1344, 1345, 5, 37, 0, 0, 1345, 340, 1, 0, 0, 0, 1346, 1347, 5, 43, 0, 0, 1347, 342, 1, 0, 0, 0, 1348, 1349, 5, 63, 0, 0, 1349, 344, 1, 0, 0, 0, 1350, 1351, 5, 34, 0, 0, 1351, 346, 1, 0, 0, 0, 1352, 1353, 5, 102, 0, 0, 1353, 1354, 5, 39, 0, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 172, 1, 0, 1356, 348, 1, 0, 0, 0, 1357, 1358, 5, 70, 0, 0, 1358, 1359, 5, 39, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1361, 6, 173, 2, 0, 1361, 350, 1, 0, 0, 0, 1362, 1363, 5, 39, 0, 0, 1363, 352, 1, 0, 0, 0, 1364, 1365, 5, 126, 0, 0, 1365, 354, 1, 0, 0, 0, 1366, 1367, 5, 61, 0, 0, 1367, 1368, 5, 126, 0, 0, 1368, 356, 1, 0, 0, 0, 1369, 1370, 5, 125, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 177, 3, 0, 1372, 358, 1, 0, 0, 0, 1373, 1374, 5, 93, 0, 0, 1374, 360, 1, 0, 0, 0, 1375, 1376, 5, 41, 0, 0, 1376, 362, 1, 0, 0, 0, 1377, 1378, 5, 59, 0, 0, 1378, 364, 1, 0, 0, 0, 1379, 1380, 5, 47, 0, 0, 1380, 366, 1, 0, 0, 0, 1381, 1382, 5, 95, 0, 0, 1382, 368, 1, 0, 0, 0, 1383, 1384, 5, 47, 0, 0, 1384, 1385, 5, 42, 0, 0, 1385, 1389, 1, 0, 0, 0, 1386, 1388, 9, 0, 0, 0, 1387, 1386, 1, 0, 0, 0, 1388, 1391, 1, 0, 0, 0, 1389, 1390, 1, 0, 0, 0, 1389, 1387, 1, 0, 0, 0, 1390, 1392, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1392, 1393, 5, 42, 0, 0, 1393, 1394, 5, 47, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 183, 4, 0, 1396, 370, 1, 0, 0, 0, 1397, 1398, 5, 45, 0, 0, 1398, 1402, 5, 45, 0, 0, 1399, 1400, 5, 47, 0, 0, 1400, 1402, 5, 47, 0, 0, 1401, 1397, 1, 0, 0, 0, 1401, 1399, 1, 0, 0, 0, 1402, 1406, 1, 0, 0, 0, 1403, 1405, 8, 33, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 1408, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1410, 1, 0, 0, 0, 1408, 1406, 1, 0, 0, 0, 1409, 1411, 7, 34, 0, 0, 1410, 1409, 1, 0, 0, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1413, 6, 184, 4, 0, 1413, 372, 1, 0, 0, 0, 1414, 1415, 7, 35, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 5, 0, 1417, 374, 1, 0, 0, 0, 1418, 1430, 8, 36, 0, 0, 1419, 1430, 3, 211, 104, 0, 1420, 1421, 3, 291, 144, 0, 1421, 1422, 3, 351, 174, 0, 1422, 1430, 1, 0, 0, 0, 1423, 1424, 3, 291, 144, 0, 1424, 1425, 3, 319, 158, 0, 1425, 1430, 1, 0, 0, 0, 1426, 1427, 3, 351, 174, 0, 1427, 1428, 3, 351, 174, 0, 1428, 1430, 1, 0, 0, 0, 1429, 1418, 1, 0, 0, 0, 1429, 1419, 1, 0, 0, 0, 1429, 1420, 1, 0, 0, 0, 1429, 1423, 1, 0, 0, 0, 1429, 1426, 1, 0, 0, 0, 1430, 1431, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1431, 1432, 1, 0, 0, 0, 1432, 376, 1, 0, 0, 0, 1433, 1434, 3, 319, 158, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 187, 0, 0, 1436, 378, 1, 0, 0, 0, 1437, 1438, 3, 351, 174, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1440, 6, 188, 6, 0, 1440, 1441, 6, 188, 3, 0, 1441, 380, 1, 0, 0, 0, 1442, 1448, 8, 37, 0, 0, 1443, 1448, 3, 211, 104, 0, 1444, 1445, 3, 291, 144, 0, 1445, 1446, 3, 319, 158, 0, 1446, 1448, 1, 0, 0, 0, 1447, 1442, 1, 0, 0, 0, 1447, 1443, 1, 0, 0, 0, 1447, 1444, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 382, 1, 0, 0, 0, 1451, 1452, 3, 319, 158, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 190, 0, 0, 1454, 384, 1, 0, 0, 0, 44, 0, 1, 2, 425, 646, 1020, 1049, 1054, 1060, 1062, 1074, 1076, 1090, 1092, 1097, 1104, 1109, 1113, 1118, 1123, 1127, 1132, 1139, 1145, 1150, 1157, 1162, 1168, 1173, 1175, 1181, 1186, 1193, 1204, 1206, 1329, 1389, 1401, 1406, 1410, 1429, 1431, 1447, 1449, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 145, 0] \ No newline at end of file +[4, 0, 162, 1476, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 430, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 658, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 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, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 1042, 8, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1071, 8, 106, 1, 107, 1, 107, 1, 107, 3, 107, 1076, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1082, 8, 107, 10, 107, 12, 107, 1085, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1096, 8, 107, 10, 107, 12, 107, 1099, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1112, 8, 107, 10, 107, 12, 107, 1115, 9, 107, 1, 107, 1, 107, 3, 107, 1119, 8, 107, 1, 108, 1, 108, 1, 108, 5, 108, 1124, 8, 108, 10, 108, 12, 108, 1127, 9, 108, 1, 108, 1, 108, 3, 108, 1131, 8, 108, 1, 108, 1, 108, 3, 108, 1135, 8, 108, 1, 108, 4, 108, 1138, 8, 108, 11, 108, 12, 108, 1139, 1, 108, 1, 108, 1, 108, 3, 108, 1145, 8, 108, 1, 108, 1, 108, 3, 108, 1149, 8, 108, 1, 108, 4, 108, 1152, 8, 108, 11, 108, 12, 108, 1153, 1, 108, 1, 108, 1, 108, 5, 108, 1159, 8, 108, 10, 108, 12, 108, 1162, 9, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1167, 8, 108, 1, 108, 4, 108, 1170, 8, 108, 11, 108, 12, 108, 1171, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1179, 8, 108, 1, 108, 4, 108, 1182, 8, 108, 11, 108, 12, 108, 1183, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1190, 8, 108, 1, 108, 4, 108, 1193, 8, 108, 11, 108, 12, 108, 1194, 3, 108, 1197, 8, 108, 1, 109, 1, 109, 4, 109, 1201, 8, 109, 11, 109, 12, 109, 1202, 1, 110, 4, 110, 1206, 8, 110, 11, 110, 12, 110, 1207, 1, 111, 1, 111, 1, 111, 4, 111, 1213, 8, 111, 11, 111, 12, 111, 1214, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 5, 112, 1226, 8, 112, 10, 112, 12, 112, 1229, 9, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 3, 165, 1351, 8, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 5, 185, 1409, 8, 185, 10, 185, 12, 185, 1412, 9, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 3, 186, 1423, 8, 186, 1, 186, 5, 186, 1426, 8, 186, 10, 186, 12, 186, 1429, 9, 186, 1, 186, 3, 186, 1432, 8, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 4, 188, 1451, 8, 188, 11, 188, 12, 188, 1452, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 4, 191, 1469, 8, 191, 11, 191, 12, 191, 1470, 1, 192, 1, 192, 1, 192, 1, 192, 1, 1410, 0, 193, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 112, 227, 113, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 159, 381, 160, 383, 0, 385, 161, 387, 162, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1512, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 1, 381, 1, 0, 0, 0, 1, 383, 1, 0, 0, 0, 2, 385, 1, 0, 0, 0, 2, 387, 1, 0, 0, 0, 3, 389, 1, 0, 0, 0, 5, 393, 1, 0, 0, 0, 7, 397, 1, 0, 0, 0, 9, 402, 1, 0, 0, 0, 11, 406, 1, 0, 0, 0, 13, 412, 1, 0, 0, 0, 15, 429, 1, 0, 0, 0, 17, 431, 1, 0, 0, 0, 19, 436, 1, 0, 0, 0, 21, 444, 1, 0, 0, 0, 23, 449, 1, 0, 0, 0, 25, 452, 1, 0, 0, 0, 27, 457, 1, 0, 0, 0, 29, 462, 1, 0, 0, 0, 31, 468, 1, 0, 0, 0, 33, 475, 1, 0, 0, 0, 35, 483, 1, 0, 0, 0, 37, 489, 1, 0, 0, 0, 39, 494, 1, 0, 0, 0, 41, 502, 1, 0, 0, 0, 43, 507, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 516, 1, 0, 0, 0, 49, 527, 1, 0, 0, 0, 51, 536, 1, 0, 0, 0, 53, 541, 1, 0, 0, 0, 55, 545, 1, 0, 0, 0, 57, 552, 1, 0, 0, 0, 59, 560, 1, 0, 0, 0, 61, 566, 1, 0, 0, 0, 63, 574, 1, 0, 0, 0, 65, 580, 1, 0, 0, 0, 67, 583, 1, 0, 0, 0, 69, 593, 1, 0, 0, 0, 71, 597, 1, 0, 0, 0, 73, 602, 1, 0, 0, 0, 75, 607, 1, 0, 0, 0, 77, 611, 1, 0, 0, 0, 79, 617, 1, 0, 0, 0, 81, 624, 1, 0, 0, 0, 83, 629, 1, 0, 0, 0, 85, 632, 1, 0, 0, 0, 87, 635, 1, 0, 0, 0, 89, 641, 1, 0, 0, 0, 91, 657, 1, 0, 0, 0, 93, 659, 1, 0, 0, 0, 95, 665, 1, 0, 0, 0, 97, 675, 1, 0, 0, 0, 99, 684, 1, 0, 0, 0, 101, 687, 1, 0, 0, 0, 103, 692, 1, 0, 0, 0, 105, 696, 1, 0, 0, 0, 107, 701, 1, 0, 0, 0, 109, 709, 1, 0, 0, 0, 111, 714, 1, 0, 0, 0, 113, 718, 1, 0, 0, 0, 115, 723, 1, 0, 0, 0, 117, 729, 1, 0, 0, 0, 119, 736, 1, 0, 0, 0, 121, 742, 1, 0, 0, 0, 123, 746, 1, 0, 0, 0, 125, 750, 1, 0, 0, 0, 127, 755, 1, 0, 0, 0, 129, 761, 1, 0, 0, 0, 131, 768, 1, 0, 0, 0, 133, 771, 1, 0, 0, 0, 135, 774, 1, 0, 0, 0, 137, 780, 1, 0, 0, 0, 139, 786, 1, 0, 0, 0, 141, 791, 1, 0, 0, 0, 143, 801, 1, 0, 0, 0, 145, 811, 1, 0, 0, 0, 147, 820, 1, 0, 0, 0, 149, 828, 1, 0, 0, 0, 151, 834, 1, 0, 0, 0, 153, 841, 1, 0, 0, 0, 155, 847, 1, 0, 0, 0, 157, 854, 1, 0, 0, 0, 159, 858, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 870, 1, 0, 0, 0, 165, 877, 1, 0, 0, 0, 167, 884, 1, 0, 0, 0, 169, 889, 1, 0, 0, 0, 171, 898, 1, 0, 0, 0, 173, 908, 1, 0, 0, 0, 175, 913, 1, 0, 0, 0, 177, 919, 1, 0, 0, 0, 179, 924, 1, 0, 0, 0, 181, 934, 1, 0, 0, 0, 183, 937, 1, 0, 0, 0, 185, 941, 1, 0, 0, 0, 187, 948, 1, 0, 0, 0, 189, 957, 1, 0, 0, 0, 191, 962, 1, 0, 0, 0, 193, 971, 1, 0, 0, 0, 195, 975, 1, 0, 0, 0, 197, 985, 1, 0, 0, 0, 199, 991, 1, 0, 0, 0, 201, 997, 1, 0, 0, 0, 203, 1002, 1, 0, 0, 0, 205, 1007, 1, 0, 0, 0, 207, 1013, 1, 0, 0, 0, 209, 1019, 1, 0, 0, 0, 211, 1026, 1, 0, 0, 0, 213, 1041, 1, 0, 0, 0, 215, 1070, 1, 0, 0, 0, 217, 1118, 1, 0, 0, 0, 219, 1196, 1, 0, 0, 0, 221, 1198, 1, 0, 0, 0, 223, 1205, 1, 0, 0, 0, 225, 1209, 1, 0, 0, 0, 227, 1216, 1, 0, 0, 0, 229, 1232, 1, 0, 0, 0, 231, 1234, 1, 0, 0, 0, 233, 1236, 1, 0, 0, 0, 235, 1238, 1, 0, 0, 0, 237, 1240, 1, 0, 0, 0, 239, 1242, 1, 0, 0, 0, 241, 1244, 1, 0, 0, 0, 243, 1246, 1, 0, 0, 0, 245, 1248, 1, 0, 0, 0, 247, 1250, 1, 0, 0, 0, 249, 1252, 1, 0, 0, 0, 251, 1254, 1, 0, 0, 0, 253, 1256, 1, 0, 0, 0, 255, 1258, 1, 0, 0, 0, 257, 1260, 1, 0, 0, 0, 259, 1262, 1, 0, 0, 0, 261, 1264, 1, 0, 0, 0, 263, 1266, 1, 0, 0, 0, 265, 1268, 1, 0, 0, 0, 267, 1270, 1, 0, 0, 0, 269, 1272, 1, 0, 0, 0, 271, 1274, 1, 0, 0, 0, 273, 1276, 1, 0, 0, 0, 275, 1278, 1, 0, 0, 0, 277, 1280, 1, 0, 0, 0, 279, 1282, 1, 0, 0, 0, 281, 1284, 1, 0, 0, 0, 283, 1286, 1, 0, 0, 0, 285, 1288, 1, 0, 0, 0, 287, 1290, 1, 0, 0, 0, 289, 1292, 1, 0, 0, 0, 291, 1295, 1, 0, 0, 0, 293, 1297, 1, 0, 0, 0, 295, 1299, 1, 0, 0, 0, 297, 1301, 1, 0, 0, 0, 299, 1303, 1, 0, 0, 0, 301, 1305, 1, 0, 0, 0, 303, 1308, 1, 0, 0, 0, 305, 1310, 1, 0, 0, 0, 307, 1312, 1, 0, 0, 0, 309, 1314, 1, 0, 0, 0, 311, 1317, 1, 0, 0, 0, 313, 1319, 1, 0, 0, 0, 315, 1322, 1, 0, 0, 0, 317, 1324, 1, 0, 0, 0, 319, 1326, 1, 0, 0, 0, 321, 1329, 1, 0, 0, 0, 323, 1333, 1, 0, 0, 0, 325, 1337, 1, 0, 0, 0, 327, 1339, 1, 0, 0, 0, 329, 1341, 1, 0, 0, 0, 331, 1344, 1, 0, 0, 0, 333, 1350, 1, 0, 0, 0, 335, 1352, 1, 0, 0, 0, 337, 1356, 1, 0, 0, 0, 339, 1359, 1, 0, 0, 0, 341, 1362, 1, 0, 0, 0, 343, 1365, 1, 0, 0, 0, 345, 1367, 1, 0, 0, 0, 347, 1369, 1, 0, 0, 0, 349, 1371, 1, 0, 0, 0, 351, 1373, 1, 0, 0, 0, 353, 1378, 1, 0, 0, 0, 355, 1383, 1, 0, 0, 0, 357, 1385, 1, 0, 0, 0, 359, 1387, 1, 0, 0, 0, 361, 1390, 1, 0, 0, 0, 363, 1394, 1, 0, 0, 0, 365, 1396, 1, 0, 0, 0, 367, 1398, 1, 0, 0, 0, 369, 1400, 1, 0, 0, 0, 371, 1402, 1, 0, 0, 0, 373, 1404, 1, 0, 0, 0, 375, 1422, 1, 0, 0, 0, 377, 1435, 1, 0, 0, 0, 379, 1450, 1, 0, 0, 0, 381, 1454, 1, 0, 0, 0, 383, 1458, 1, 0, 0, 0, 385, 1468, 1, 0, 0, 0, 387, 1472, 1, 0, 0, 0, 389, 390, 3, 229, 113, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 251, 124, 0, 392, 4, 1, 0, 0, 0, 393, 394, 3, 229, 113, 0, 394, 395, 3, 255, 126, 0, 395, 396, 3, 235, 116, 0, 396, 6, 1, 0, 0, 0, 397, 398, 3, 229, 113, 0, 398, 399, 3, 255, 126, 0, 399, 400, 3, 267, 132, 0, 400, 401, 3, 245, 121, 0, 401, 8, 1, 0, 0, 0, 402, 403, 3, 229, 113, 0, 403, 404, 3, 255, 126, 0, 404, 405, 3, 277, 137, 0, 405, 10, 1, 0, 0, 0, 406, 407, 3, 229, 113, 0, 407, 408, 3, 263, 130, 0, 408, 409, 3, 263, 130, 0, 409, 410, 3, 229, 113, 0, 410, 411, 3, 277, 137, 0, 411, 12, 1, 0, 0, 0, 412, 413, 3, 229, 113, 0, 413, 414, 3, 265, 131, 0, 414, 14, 1, 0, 0, 0, 415, 416, 3, 229, 113, 0, 416, 417, 3, 265, 131, 0, 417, 418, 3, 233, 115, 0, 418, 430, 1, 0, 0, 0, 419, 420, 3, 229, 113, 0, 420, 421, 3, 265, 131, 0, 421, 422, 3, 233, 115, 0, 422, 423, 3, 237, 117, 0, 423, 424, 3, 255, 126, 0, 424, 425, 3, 235, 116, 0, 425, 426, 3, 245, 121, 0, 426, 427, 3, 255, 126, 0, 427, 428, 3, 241, 119, 0, 428, 430, 1, 0, 0, 0, 429, 415, 1, 0, 0, 0, 429, 419, 1, 0, 0, 0, 430, 16, 1, 0, 0, 0, 431, 432, 3, 229, 113, 0, 432, 433, 3, 265, 131, 0, 433, 434, 3, 257, 127, 0, 434, 435, 3, 239, 118, 0, 435, 18, 1, 0, 0, 0, 436, 437, 3, 231, 114, 0, 437, 438, 3, 237, 117, 0, 438, 439, 3, 267, 132, 0, 439, 440, 3, 273, 135, 0, 440, 441, 3, 237, 117, 0, 441, 442, 3, 237, 117, 0, 442, 443, 3, 255, 126, 0, 443, 20, 1, 0, 0, 0, 444, 445, 3, 231, 114, 0, 445, 446, 3, 257, 127, 0, 446, 447, 3, 267, 132, 0, 447, 448, 3, 243, 120, 0, 448, 22, 1, 0, 0, 0, 449, 450, 3, 231, 114, 0, 450, 451, 3, 277, 137, 0, 451, 24, 1, 0, 0, 0, 452, 453, 3, 233, 115, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 265, 131, 0, 455, 456, 3, 237, 117, 0, 456, 26, 1, 0, 0, 0, 457, 458, 3, 233, 115, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 265, 131, 0, 460, 461, 3, 267, 132, 0, 461, 28, 1, 0, 0, 0, 462, 463, 3, 233, 115, 0, 463, 464, 3, 229, 113, 0, 464, 465, 3, 267, 132, 0, 465, 466, 3, 233, 115, 0, 466, 467, 3, 243, 120, 0, 467, 30, 1, 0, 0, 0, 468, 469, 3, 233, 115, 0, 469, 470, 3, 257, 127, 0, 470, 471, 3, 243, 120, 0, 471, 472, 3, 257, 127, 0, 472, 473, 3, 263, 130, 0, 473, 474, 3, 267, 132, 0, 474, 32, 1, 0, 0, 0, 475, 476, 3, 233, 115, 0, 476, 477, 3, 257, 127, 0, 477, 478, 3, 251, 124, 0, 478, 479, 3, 251, 124, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 267, 132, 0, 481, 482, 3, 237, 117, 0, 482, 34, 1, 0, 0, 0, 483, 484, 3, 233, 115, 0, 484, 485, 3, 263, 130, 0, 485, 486, 3, 257, 127, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 265, 131, 0, 488, 36, 1, 0, 0, 0, 489, 490, 3, 233, 115, 0, 490, 491, 3, 269, 133, 0, 491, 492, 3, 231, 114, 0, 492, 493, 3, 237, 117, 0, 493, 38, 1, 0, 0, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 269, 133, 0, 496, 497, 3, 263, 130, 0, 497, 498, 3, 263, 130, 0, 498, 499, 3, 237, 117, 0, 499, 500, 3, 255, 126, 0, 500, 501, 3, 267, 132, 0, 501, 40, 1, 0, 0, 0, 502, 503, 3, 235, 116, 0, 503, 504, 3, 229, 113, 0, 504, 505, 3, 267, 132, 0, 505, 506, 3, 237, 117, 0, 506, 42, 1, 0, 0, 0, 507, 508, 3, 235, 116, 0, 508, 509, 3, 229, 113, 0, 509, 510, 3, 277, 137, 0, 510, 44, 1, 0, 0, 0, 511, 512, 3, 235, 116, 0, 512, 513, 3, 237, 117, 0, 513, 514, 3, 265, 131, 0, 514, 515, 3, 233, 115, 0, 515, 46, 1, 0, 0, 0, 516, 517, 3, 235, 116, 0, 517, 518, 3, 237, 117, 0, 518, 519, 3, 265, 131, 0, 519, 520, 3, 233, 115, 0, 520, 521, 3, 237, 117, 0, 521, 522, 3, 255, 126, 0, 522, 523, 3, 235, 116, 0, 523, 524, 3, 245, 121, 0, 524, 525, 3, 255, 126, 0, 525, 526, 3, 241, 119, 0, 526, 48, 1, 0, 0, 0, 527, 528, 3, 235, 116, 0, 528, 529, 3, 245, 121, 0, 529, 530, 3, 265, 131, 0, 530, 531, 3, 267, 132, 0, 531, 532, 3, 245, 121, 0, 532, 533, 3, 255, 126, 0, 533, 534, 3, 233, 115, 0, 534, 535, 3, 267, 132, 0, 535, 50, 1, 0, 0, 0, 536, 537, 3, 237, 117, 0, 537, 538, 3, 251, 124, 0, 538, 539, 3, 265, 131, 0, 539, 540, 3, 237, 117, 0, 540, 52, 1, 0, 0, 0, 541, 542, 3, 237, 117, 0, 542, 543, 3, 255, 126, 0, 543, 544, 3, 235, 116, 0, 544, 54, 1, 0, 0, 0, 545, 546, 3, 237, 117, 0, 546, 547, 3, 275, 136, 0, 547, 548, 3, 233, 115, 0, 548, 549, 3, 237, 117, 0, 549, 550, 3, 259, 128, 0, 550, 551, 3, 267, 132, 0, 551, 56, 1, 0, 0, 0, 552, 553, 3, 237, 117, 0, 553, 554, 3, 275, 136, 0, 554, 555, 3, 267, 132, 0, 555, 556, 3, 263, 130, 0, 556, 557, 3, 229, 113, 0, 557, 558, 3, 233, 115, 0, 558, 559, 3, 267, 132, 0, 559, 58, 1, 0, 0, 0, 560, 561, 3, 239, 118, 0, 561, 562, 3, 245, 121, 0, 562, 563, 3, 255, 126, 0, 563, 564, 3, 229, 113, 0, 564, 565, 3, 251, 124, 0, 565, 60, 1, 0, 0, 0, 566, 567, 3, 239, 118, 0, 567, 568, 3, 245, 121, 0, 568, 569, 3, 255, 126, 0, 569, 570, 3, 229, 113, 0, 570, 571, 3, 251, 124, 0, 571, 572, 3, 251, 124, 0, 572, 573, 3, 277, 137, 0, 573, 62, 1, 0, 0, 0, 574, 575, 3, 239, 118, 0, 575, 576, 3, 245, 121, 0, 576, 577, 3, 263, 130, 0, 577, 578, 3, 265, 131, 0, 578, 579, 3, 267, 132, 0, 579, 64, 1, 0, 0, 0, 580, 581, 3, 239, 118, 0, 581, 582, 3, 255, 126, 0, 582, 66, 1, 0, 0, 0, 583, 584, 3, 239, 118, 0, 584, 585, 3, 257, 127, 0, 585, 586, 3, 251, 124, 0, 586, 587, 3, 251, 124, 0, 587, 588, 3, 257, 127, 0, 588, 589, 3, 273, 135, 0, 589, 590, 3, 245, 121, 0, 590, 591, 3, 255, 126, 0, 591, 592, 3, 241, 119, 0, 592, 68, 1, 0, 0, 0, 593, 594, 3, 239, 118, 0, 594, 595, 3, 257, 127, 0, 595, 596, 3, 263, 130, 0, 596, 70, 1, 0, 0, 0, 597, 598, 3, 239, 118, 0, 598, 599, 3, 263, 130, 0, 599, 600, 3, 257, 127, 0, 600, 601, 3, 253, 125, 0, 601, 72, 1, 0, 0, 0, 602, 603, 3, 239, 118, 0, 603, 604, 3, 269, 133, 0, 604, 605, 3, 251, 124, 0, 605, 606, 3, 251, 124, 0, 606, 74, 1, 0, 0, 0, 607, 608, 3, 239, 118, 0, 608, 609, 3, 269, 133, 0, 609, 610, 3, 255, 126, 0, 610, 76, 1, 0, 0, 0, 611, 612, 3, 241, 119, 0, 612, 613, 3, 263, 130, 0, 613, 614, 3, 257, 127, 0, 614, 615, 3, 269, 133, 0, 615, 616, 3, 259, 128, 0, 616, 78, 1, 0, 0, 0, 617, 618, 3, 243, 120, 0, 618, 619, 3, 229, 113, 0, 619, 620, 3, 271, 134, 0, 620, 621, 3, 245, 121, 0, 621, 622, 3, 255, 126, 0, 622, 623, 3, 241, 119, 0, 623, 80, 1, 0, 0, 0, 624, 625, 3, 243, 120, 0, 625, 626, 3, 257, 127, 0, 626, 627, 3, 269, 133, 0, 627, 628, 3, 263, 130, 0, 628, 82, 1, 0, 0, 0, 629, 630, 3, 245, 121, 0, 630, 631, 3, 235, 116, 0, 631, 84, 1, 0, 0, 0, 632, 633, 3, 245, 121, 0, 633, 634, 3, 239, 118, 0, 634, 86, 1, 0, 0, 0, 635, 636, 3, 245, 121, 0, 636, 637, 3, 251, 124, 0, 637, 638, 3, 245, 121, 0, 638, 639, 3, 249, 123, 0, 639, 640, 3, 237, 117, 0, 640, 88, 1, 0, 0, 0, 641, 642, 3, 245, 121, 0, 642, 643, 3, 255, 126, 0, 643, 90, 1, 0, 0, 0, 644, 645, 3, 245, 121, 0, 645, 646, 3, 255, 126, 0, 646, 647, 3, 239, 118, 0, 647, 658, 1, 0, 0, 0, 648, 649, 3, 245, 121, 0, 649, 650, 3, 255, 126, 0, 650, 651, 3, 239, 118, 0, 651, 652, 3, 245, 121, 0, 652, 653, 3, 255, 126, 0, 653, 654, 3, 245, 121, 0, 654, 655, 3, 267, 132, 0, 655, 656, 3, 277, 137, 0, 656, 658, 1, 0, 0, 0, 657, 644, 1, 0, 0, 0, 657, 648, 1, 0, 0, 0, 658, 92, 1, 0, 0, 0, 659, 660, 3, 245, 121, 0, 660, 661, 3, 255, 126, 0, 661, 662, 3, 255, 126, 0, 662, 663, 3, 237, 117, 0, 663, 664, 3, 263, 130, 0, 664, 94, 1, 0, 0, 0, 665, 666, 3, 245, 121, 0, 666, 667, 3, 255, 126, 0, 667, 668, 3, 267, 132, 0, 668, 669, 3, 237, 117, 0, 669, 670, 3, 263, 130, 0, 670, 671, 3, 265, 131, 0, 671, 672, 3, 237, 117, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 267, 132, 0, 674, 96, 1, 0, 0, 0, 675, 676, 3, 245, 121, 0, 676, 677, 3, 255, 126, 0, 677, 678, 3, 267, 132, 0, 678, 679, 3, 237, 117, 0, 679, 680, 3, 263, 130, 0, 680, 681, 3, 271, 134, 0, 681, 682, 3, 229, 113, 0, 682, 683, 3, 251, 124, 0, 683, 98, 1, 0, 0, 0, 684, 685, 3, 245, 121, 0, 685, 686, 3, 265, 131, 0, 686, 100, 1, 0, 0, 0, 687, 688, 3, 247, 122, 0, 688, 689, 3, 257, 127, 0, 689, 690, 3, 245, 121, 0, 690, 691, 3, 255, 126, 0, 691, 102, 1, 0, 0, 0, 692, 693, 3, 249, 123, 0, 693, 694, 3, 237, 117, 0, 694, 695, 3, 277, 137, 0, 695, 104, 1, 0, 0, 0, 696, 697, 3, 251, 124, 0, 697, 698, 3, 229, 113, 0, 698, 699, 3, 265, 131, 0, 699, 700, 3, 267, 132, 0, 700, 106, 1, 0, 0, 0, 701, 702, 3, 251, 124, 0, 702, 703, 3, 237, 117, 0, 703, 704, 3, 229, 113, 0, 704, 705, 3, 235, 116, 0, 705, 706, 3, 245, 121, 0, 706, 707, 3, 255, 126, 0, 707, 708, 3, 241, 119, 0, 708, 108, 1, 0, 0, 0, 709, 710, 3, 251, 124, 0, 710, 711, 3, 237, 117, 0, 711, 712, 3, 239, 118, 0, 712, 713, 3, 267, 132, 0, 713, 110, 1, 0, 0, 0, 714, 715, 3, 251, 124, 0, 715, 716, 3, 237, 117, 0, 716, 717, 3, 267, 132, 0, 717, 112, 1, 0, 0, 0, 718, 719, 3, 251, 124, 0, 719, 720, 3, 245, 121, 0, 720, 721, 3, 249, 123, 0, 721, 722, 3, 237, 117, 0, 722, 114, 1, 0, 0, 0, 723, 724, 3, 251, 124, 0, 724, 725, 3, 245, 121, 0, 725, 726, 3, 253, 125, 0, 726, 727, 3, 245, 121, 0, 727, 728, 3, 267, 132, 0, 728, 116, 1, 0, 0, 0, 729, 730, 3, 253, 125, 0, 730, 731, 3, 245, 121, 0, 731, 732, 3, 255, 126, 0, 732, 733, 3, 269, 133, 0, 733, 734, 3, 267, 132, 0, 734, 735, 3, 237, 117, 0, 735, 118, 1, 0, 0, 0, 736, 737, 3, 253, 125, 0, 737, 738, 3, 257, 127, 0, 738, 739, 3, 255, 126, 0, 739, 740, 3, 267, 132, 0, 740, 741, 3, 243, 120, 0, 741, 120, 1, 0, 0, 0, 742, 743, 3, 255, 126, 0, 743, 744, 3, 229, 113, 0, 744, 745, 3, 255, 126, 0, 745, 122, 1, 0, 0, 0, 746, 747, 3, 255, 126, 0, 747, 748, 3, 257, 127, 0, 748, 749, 3, 267, 132, 0, 749, 124, 1, 0, 0, 0, 750, 751, 3, 255, 126, 0, 751, 752, 3, 269, 133, 0, 752, 753, 3, 251, 124, 0, 753, 754, 3, 251, 124, 0, 754, 126, 1, 0, 0, 0, 755, 756, 3, 255, 126, 0, 756, 757, 3, 269, 133, 0, 757, 758, 3, 251, 124, 0, 758, 759, 3, 251, 124, 0, 759, 760, 3, 265, 131, 0, 760, 128, 1, 0, 0, 0, 761, 762, 3, 257, 127, 0, 762, 763, 3, 239, 118, 0, 763, 764, 3, 239, 118, 0, 764, 765, 3, 265, 131, 0, 765, 766, 3, 237, 117, 0, 766, 767, 3, 267, 132, 0, 767, 130, 1, 0, 0, 0, 768, 769, 3, 257, 127, 0, 769, 770, 3, 255, 126, 0, 770, 132, 1, 0, 0, 0, 771, 772, 3, 257, 127, 0, 772, 773, 3, 263, 130, 0, 773, 134, 1, 0, 0, 0, 774, 775, 3, 257, 127, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 235, 116, 0, 777, 778, 3, 237, 117, 0, 778, 779, 3, 263, 130, 0, 779, 136, 1, 0, 0, 0, 780, 781, 3, 257, 127, 0, 781, 782, 3, 269, 133, 0, 782, 783, 3, 267, 132, 0, 783, 784, 3, 237, 117, 0, 784, 785, 3, 263, 130, 0, 785, 138, 1, 0, 0, 0, 786, 787, 3, 257, 127, 0, 787, 788, 3, 271, 134, 0, 788, 789, 3, 237, 117, 0, 789, 790, 3, 263, 130, 0, 790, 140, 1, 0, 0, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 229, 113, 0, 793, 794, 3, 263, 130, 0, 794, 795, 3, 267, 132, 0, 795, 796, 3, 245, 121, 0, 796, 797, 3, 267, 132, 0, 797, 798, 3, 245, 121, 0, 798, 799, 3, 257, 127, 0, 799, 800, 3, 255, 126, 0, 800, 142, 1, 0, 0, 0, 801, 802, 3, 259, 128, 0, 802, 803, 3, 263, 130, 0, 803, 804, 3, 237, 117, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 237, 117, 0, 806, 807, 3, 235, 116, 0, 807, 808, 3, 245, 121, 0, 808, 809, 3, 255, 126, 0, 809, 810, 3, 241, 119, 0, 810, 144, 1, 0, 0, 0, 811, 812, 3, 259, 128, 0, 812, 813, 3, 263, 130, 0, 813, 814, 3, 237, 117, 0, 814, 815, 3, 273, 135, 0, 815, 816, 3, 243, 120, 0, 816, 817, 3, 237, 117, 0, 817, 818, 3, 263, 130, 0, 818, 819, 3, 237, 117, 0, 819, 146, 1, 0, 0, 0, 820, 821, 3, 261, 129, 0, 821, 822, 3, 269, 133, 0, 822, 823, 3, 229, 113, 0, 823, 824, 3, 263, 130, 0, 824, 825, 3, 267, 132, 0, 825, 826, 3, 237, 117, 0, 826, 827, 3, 263, 130, 0, 827, 148, 1, 0, 0, 0, 828, 829, 3, 263, 130, 0, 829, 830, 3, 229, 113, 0, 830, 831, 3, 255, 126, 0, 831, 832, 3, 241, 119, 0, 832, 833, 3, 237, 117, 0, 833, 150, 1, 0, 0, 0, 834, 835, 3, 263, 130, 0, 835, 836, 3, 237, 117, 0, 836, 837, 3, 267, 132, 0, 837, 838, 3, 269, 133, 0, 838, 839, 3, 263, 130, 0, 839, 840, 3, 255, 126, 0, 840, 152, 1, 0, 0, 0, 841, 842, 3, 263, 130, 0, 842, 843, 3, 245, 121, 0, 843, 844, 3, 241, 119, 0, 844, 845, 3, 243, 120, 0, 845, 846, 3, 267, 132, 0, 846, 154, 1, 0, 0, 0, 847, 848, 3, 263, 130, 0, 848, 849, 3, 257, 127, 0, 849, 850, 3, 251, 124, 0, 850, 851, 3, 251, 124, 0, 851, 852, 3, 269, 133, 0, 852, 853, 3, 259, 128, 0, 853, 156, 1, 0, 0, 0, 854, 855, 3, 263, 130, 0, 855, 856, 3, 257, 127, 0, 856, 857, 3, 273, 135, 0, 857, 158, 1, 0, 0, 0, 858, 859, 3, 263, 130, 0, 859, 860, 3, 257, 127, 0, 860, 861, 3, 273, 135, 0, 861, 862, 3, 265, 131, 0, 862, 160, 1, 0, 0, 0, 863, 864, 3, 265, 131, 0, 864, 865, 3, 229, 113, 0, 865, 866, 3, 253, 125, 0, 866, 867, 3, 259, 128, 0, 867, 868, 3, 251, 124, 0, 868, 869, 3, 237, 117, 0, 869, 162, 1, 0, 0, 0, 870, 871, 3, 265, 131, 0, 871, 872, 3, 237, 117, 0, 872, 873, 3, 233, 115, 0, 873, 874, 3, 257, 127, 0, 874, 875, 3, 255, 126, 0, 875, 876, 3, 235, 116, 0, 876, 164, 1, 0, 0, 0, 877, 878, 3, 265, 131, 0, 878, 879, 3, 237, 117, 0, 879, 880, 3, 251, 124, 0, 880, 881, 3, 237, 117, 0, 881, 882, 3, 233, 115, 0, 882, 883, 3, 267, 132, 0, 883, 166, 1, 0, 0, 0, 884, 885, 3, 265, 131, 0, 885, 886, 3, 237, 117, 0, 886, 887, 3, 253, 125, 0, 887, 888, 3, 245, 121, 0, 888, 168, 1, 0, 0, 0, 889, 890, 3, 265, 131, 0, 890, 891, 3, 237, 117, 0, 891, 892, 3, 267, 132, 0, 892, 893, 3, 267, 132, 0, 893, 894, 3, 245, 121, 0, 894, 895, 3, 255, 126, 0, 895, 896, 3, 241, 119, 0, 896, 897, 3, 265, 131, 0, 897, 170, 1, 0, 0, 0, 898, 899, 3, 265, 131, 0, 899, 900, 3, 269, 133, 0, 900, 901, 3, 231, 114, 0, 901, 902, 3, 265, 131, 0, 902, 903, 3, 267, 132, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 245, 121, 0, 905, 906, 3, 255, 126, 0, 906, 907, 3, 241, 119, 0, 907, 172, 1, 0, 0, 0, 908, 909, 3, 267, 132, 0, 909, 910, 3, 243, 120, 0, 910, 911, 3, 237, 117, 0, 911, 912, 3, 255, 126, 0, 912, 174, 1, 0, 0, 0, 913, 914, 3, 267, 132, 0, 914, 915, 3, 243, 120, 0, 915, 916, 3, 263, 130, 0, 916, 917, 3, 257, 127, 0, 917, 918, 3, 273, 135, 0, 918, 176, 1, 0, 0, 0, 919, 920, 3, 267, 132, 0, 920, 921, 3, 245, 121, 0, 921, 922, 3, 237, 117, 0, 922, 923, 3, 265, 131, 0, 923, 178, 1, 0, 0, 0, 924, 925, 3, 267, 132, 0, 925, 926, 3, 245, 121, 0, 926, 927, 3, 253, 125, 0, 927, 928, 3, 237, 117, 0, 928, 929, 3, 265, 131, 0, 929, 930, 3, 267, 132, 0, 930, 931, 3, 229, 113, 0, 931, 932, 3, 253, 125, 0, 932, 933, 3, 259, 128, 0, 933, 180, 1, 0, 0, 0, 934, 935, 3, 267, 132, 0, 935, 936, 3, 257, 127, 0, 936, 182, 1, 0, 0, 0, 937, 938, 3, 267, 132, 0, 938, 939, 3, 257, 127, 0, 939, 940, 3, 259, 128, 0, 940, 184, 1, 0, 0, 0, 941, 942, 3, 267, 132, 0, 942, 943, 3, 257, 127, 0, 943, 944, 3, 267, 132, 0, 944, 945, 3, 229, 113, 0, 945, 946, 3, 251, 124, 0, 946, 947, 3, 265, 131, 0, 947, 186, 1, 0, 0, 0, 948, 949, 3, 267, 132, 0, 949, 950, 3, 263, 130, 0, 950, 951, 3, 229, 113, 0, 951, 952, 3, 245, 121, 0, 952, 953, 3, 251, 124, 0, 953, 954, 3, 245, 121, 0, 954, 955, 3, 255, 126, 0, 955, 956, 3, 241, 119, 0, 956, 188, 1, 0, 0, 0, 957, 958, 3, 267, 132, 0, 958, 959, 3, 263, 130, 0, 959, 960, 3, 245, 121, 0, 960, 961, 3, 253, 125, 0, 961, 190, 1, 0, 0, 0, 962, 963, 3, 267, 132, 0, 963, 964, 3, 263, 130, 0, 964, 965, 3, 269, 133, 0, 965, 966, 3, 255, 126, 0, 966, 967, 3, 233, 115, 0, 967, 968, 3, 229, 113, 0, 968, 969, 3, 267, 132, 0, 969, 970, 3, 237, 117, 0, 970, 192, 1, 0, 0, 0, 971, 972, 3, 267, 132, 0, 972, 973, 3, 263, 130, 0, 973, 974, 3, 277, 137, 0, 974, 194, 1, 0, 0, 0, 975, 976, 3, 269, 133, 0, 976, 977, 3, 255, 126, 0, 977, 978, 3, 231, 114, 0, 978, 979, 3, 257, 127, 0, 979, 980, 3, 269, 133, 0, 980, 981, 3, 255, 126, 0, 981, 982, 3, 235, 116, 0, 982, 983, 3, 237, 117, 0, 983, 984, 3, 235, 116, 0, 984, 196, 1, 0, 0, 0, 985, 986, 3, 269, 133, 0, 986, 987, 3, 255, 126, 0, 987, 988, 3, 245, 121, 0, 988, 989, 3, 257, 127, 0, 989, 990, 3, 255, 126, 0, 990, 198, 1, 0, 0, 0, 991, 992, 3, 269, 133, 0, 992, 993, 3, 265, 131, 0, 993, 994, 3, 245, 121, 0, 994, 995, 3, 255, 126, 0, 995, 996, 3, 241, 119, 0, 996, 200, 1, 0, 0, 0, 997, 998, 3, 273, 135, 0, 998, 999, 3, 237, 117, 0, 999, 1000, 3, 237, 117, 0, 1000, 1001, 3, 249, 123, 0, 1001, 202, 1, 0, 0, 0, 1002, 1003, 3, 273, 135, 0, 1003, 1004, 3, 243, 120, 0, 1004, 1005, 3, 237, 117, 0, 1005, 1006, 3, 255, 126, 0, 1006, 204, 1, 0, 0, 0, 1007, 1008, 3, 273, 135, 0, 1008, 1009, 3, 243, 120, 0, 1009, 1010, 3, 237, 117, 0, 1010, 1011, 3, 263, 130, 0, 1011, 1012, 3, 237, 117, 0, 1012, 206, 1, 0, 0, 0, 1013, 1014, 3, 273, 135, 0, 1014, 1015, 3, 243, 120, 0, 1015, 1016, 3, 245, 121, 0, 1016, 1017, 3, 251, 124, 0, 1017, 1018, 3, 237, 117, 0, 1018, 208, 1, 0, 0, 0, 1019, 1020, 3, 273, 135, 0, 1020, 1021, 3, 245, 121, 0, 1021, 1022, 3, 255, 126, 0, 1022, 1023, 3, 235, 116, 0, 1023, 1024, 3, 257, 127, 0, 1024, 1025, 3, 273, 135, 0, 1025, 210, 1, 0, 0, 0, 1026, 1027, 3, 273, 135, 0, 1027, 1028, 3, 245, 121, 0, 1028, 1029, 3, 267, 132, 0, 1029, 1030, 3, 243, 120, 0, 1030, 212, 1, 0, 0, 0, 1031, 1032, 3, 277, 137, 0, 1032, 1033, 3, 237, 117, 0, 1033, 1034, 3, 229, 113, 0, 1034, 1035, 3, 263, 130, 0, 1035, 1042, 1, 0, 0, 0, 1036, 1037, 3, 277, 137, 0, 1037, 1038, 3, 277, 137, 0, 1038, 1039, 3, 277, 137, 0, 1039, 1040, 3, 277, 137, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1031, 1, 0, 0, 0, 1041, 1036, 1, 0, 0, 0, 1042, 214, 1, 0, 0, 0, 1043, 1044, 3, 295, 146, 0, 1044, 1045, 3, 231, 114, 0, 1045, 1071, 1, 0, 0, 0, 1046, 1047, 3, 295, 146, 0, 1047, 1048, 3, 239, 118, 0, 1048, 1071, 1, 0, 0, 0, 1049, 1050, 3, 295, 146, 0, 1050, 1051, 3, 263, 130, 0, 1051, 1071, 1, 0, 0, 0, 1052, 1053, 3, 295, 146, 0, 1053, 1054, 3, 255, 126, 0, 1054, 1071, 1, 0, 0, 0, 1055, 1056, 3, 295, 146, 0, 1056, 1057, 3, 267, 132, 0, 1057, 1071, 1, 0, 0, 0, 1058, 1059, 3, 295, 146, 0, 1059, 1060, 5, 48, 0, 0, 1060, 1071, 1, 0, 0, 0, 1061, 1062, 3, 295, 146, 0, 1062, 1063, 3, 229, 113, 0, 1063, 1071, 1, 0, 0, 0, 1064, 1065, 3, 295, 146, 0, 1065, 1066, 3, 271, 134, 0, 1066, 1071, 1, 0, 0, 0, 1067, 1068, 3, 295, 146, 0, 1068, 1069, 3, 295, 146, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1043, 1, 0, 0, 0, 1070, 1046, 1, 0, 0, 0, 1070, 1049, 1, 0, 0, 0, 1070, 1052, 1, 0, 0, 0, 1070, 1055, 1, 0, 0, 0, 1070, 1058, 1, 0, 0, 0, 1070, 1061, 1, 0, 0, 0, 1070, 1064, 1, 0, 0, 0, 1070, 1067, 1, 0, 0, 0, 1071, 216, 1, 0, 0, 0, 1072, 1076, 3, 281, 139, 0, 1073, 1076, 3, 371, 184, 0, 1074, 1076, 3, 305, 151, 0, 1075, 1072, 1, 0, 0, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1074, 1, 0, 0, 0, 1076, 1083, 1, 0, 0, 0, 1077, 1082, 3, 281, 139, 0, 1078, 1082, 3, 371, 184, 0, 1079, 1082, 3, 285, 141, 0, 1080, 1082, 3, 305, 151, 0, 1081, 1077, 1, 0, 0, 0, 1081, 1078, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 1085, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1119, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1086, 1097, 3, 293, 145, 0, 1087, 1096, 8, 0, 0, 0, 1088, 1096, 3, 215, 106, 0, 1089, 1090, 3, 295, 146, 0, 1090, 1091, 3, 355, 176, 0, 1091, 1096, 1, 0, 0, 0, 1092, 1093, 3, 293, 145, 0, 1093, 1094, 3, 293, 145, 0, 1094, 1096, 1, 0, 0, 0, 1095, 1087, 1, 0, 0, 0, 1095, 1088, 1, 0, 0, 0, 1095, 1089, 1, 0, 0, 0, 1095, 1092, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1101, 3, 293, 145, 0, 1101, 1119, 1, 0, 0, 0, 1102, 1113, 3, 349, 173, 0, 1103, 1112, 8, 1, 0, 0, 1104, 1112, 3, 215, 106, 0, 1105, 1106, 3, 295, 146, 0, 1106, 1107, 3, 349, 173, 0, 1107, 1112, 1, 0, 0, 0, 1108, 1109, 3, 349, 173, 0, 1109, 1110, 3, 349, 173, 0, 1110, 1112, 1, 0, 0, 0, 1111, 1103, 1, 0, 0, 0, 1111, 1104, 1, 0, 0, 0, 1111, 1105, 1, 0, 0, 0, 1111, 1108, 1, 0, 0, 0, 1112, 1115, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1113, 1, 0, 0, 0, 1116, 1117, 3, 349, 173, 0, 1117, 1119, 1, 0, 0, 0, 1118, 1075, 1, 0, 0, 0, 1118, 1086, 1, 0, 0, 0, 1118, 1102, 1, 0, 0, 0, 1119, 218, 1, 0, 0, 0, 1120, 1121, 3, 225, 111, 0, 1121, 1125, 3, 307, 152, 0, 1122, 1124, 3, 287, 142, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1123, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1130, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1128, 1131, 3, 259, 128, 0, 1129, 1131, 3, 237, 117, 0, 1130, 1128, 1, 0, 0, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1134, 1, 0, 0, 0, 1132, 1135, 3, 345, 171, 0, 1133, 1135, 3, 303, 150, 0, 1134, 1132, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1137, 1, 0, 0, 0, 1136, 1138, 3, 285, 141, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1197, 1, 0, 0, 0, 1141, 1144, 3, 225, 111, 0, 1142, 1145, 3, 259, 128, 0, 1143, 1145, 3, 237, 117, 0, 1144, 1142, 1, 0, 0, 0, 1144, 1143, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1149, 3, 345, 171, 0, 1147, 1149, 3, 303, 150, 0, 1148, 1146, 1, 0, 0, 0, 1148, 1147, 1, 0, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1151, 1, 0, 0, 0, 1150, 1152, 3, 285, 141, 0, 1151, 1150, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1197, 1, 0, 0, 0, 1155, 1156, 3, 223, 110, 0, 1156, 1160, 3, 307, 152, 0, 1157, 1159, 3, 285, 141, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1162, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1163, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1163, 1166, 3, 237, 117, 0, 1164, 1167, 3, 345, 171, 0, 1165, 1167, 3, 303, 150, 0, 1166, 1164, 1, 0, 0, 0, 1166, 1165, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1169, 1, 0, 0, 0, 1168, 1170, 3, 285, 141, 0, 1169, 1168, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1169, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1197, 1, 0, 0, 0, 1173, 1174, 3, 307, 152, 0, 1174, 1175, 3, 223, 110, 0, 1175, 1178, 3, 237, 117, 0, 1176, 1179, 3, 345, 171, 0, 1177, 1179, 3, 303, 150, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1181, 1, 0, 0, 0, 1180, 1182, 3, 285, 141, 0, 1181, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1197, 1, 0, 0, 0, 1185, 1186, 3, 223, 110, 0, 1186, 1189, 3, 237, 117, 0, 1187, 1190, 3, 345, 171, 0, 1188, 1190, 3, 303, 150, 0, 1189, 1187, 1, 0, 0, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1193, 3, 285, 141, 0, 1192, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1192, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1197, 1, 0, 0, 0, 1196, 1120, 1, 0, 0, 0, 1196, 1141, 1, 0, 0, 0, 1196, 1155, 1, 0, 0, 0, 1196, 1173, 1, 0, 0, 0, 1196, 1185, 1, 0, 0, 0, 1197, 220, 1, 0, 0, 0, 1198, 1200, 5, 48, 0, 0, 1199, 1201, 3, 283, 140, 0, 1200, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 222, 1, 0, 0, 0, 1204, 1206, 3, 285, 141, 0, 1205, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1207, 1208, 1, 0, 0, 0, 1208, 224, 1, 0, 0, 0, 1209, 1210, 5, 48, 0, 0, 1210, 1212, 3, 275, 136, 0, 1211, 1213, 3, 287, 142, 0, 1212, 1211, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1212, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 226, 1, 0, 0, 0, 1216, 1227, 3, 355, 176, 0, 1217, 1226, 8, 2, 0, 0, 1218, 1226, 3, 215, 106, 0, 1219, 1220, 3, 295, 146, 0, 1220, 1221, 3, 355, 176, 0, 1221, 1226, 1, 0, 0, 0, 1222, 1223, 3, 355, 176, 0, 1223, 1224, 3, 355, 176, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1219, 1, 0, 0, 0, 1225, 1222, 1, 0, 0, 0, 1226, 1229, 1, 0, 0, 0, 1227, 1225, 1, 0, 0, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1230, 1231, 3, 355, 176, 0, 1231, 228, 1, 0, 0, 0, 1232, 1233, 7, 3, 0, 0, 1233, 230, 1, 0, 0, 0, 1234, 1235, 7, 4, 0, 0, 1235, 232, 1, 0, 0, 0, 1236, 1237, 7, 5, 0, 0, 1237, 234, 1, 0, 0, 0, 1238, 1239, 7, 6, 0, 0, 1239, 236, 1, 0, 0, 0, 1240, 1241, 7, 7, 0, 0, 1241, 238, 1, 0, 0, 0, 1242, 1243, 7, 8, 0, 0, 1243, 240, 1, 0, 0, 0, 1244, 1245, 7, 9, 0, 0, 1245, 242, 1, 0, 0, 0, 1246, 1247, 7, 10, 0, 0, 1247, 244, 1, 0, 0, 0, 1248, 1249, 7, 11, 0, 0, 1249, 246, 1, 0, 0, 0, 1250, 1251, 7, 12, 0, 0, 1251, 248, 1, 0, 0, 0, 1252, 1253, 7, 13, 0, 0, 1253, 250, 1, 0, 0, 0, 1254, 1255, 7, 14, 0, 0, 1255, 252, 1, 0, 0, 0, 1256, 1257, 7, 15, 0, 0, 1257, 254, 1, 0, 0, 0, 1258, 1259, 7, 16, 0, 0, 1259, 256, 1, 0, 0, 0, 1260, 1261, 7, 17, 0, 0, 1261, 258, 1, 0, 0, 0, 1262, 1263, 7, 18, 0, 0, 1263, 260, 1, 0, 0, 0, 1264, 1265, 7, 19, 0, 0, 1265, 262, 1, 0, 0, 0, 1266, 1267, 7, 20, 0, 0, 1267, 264, 1, 0, 0, 0, 1268, 1269, 7, 21, 0, 0, 1269, 266, 1, 0, 0, 0, 1270, 1271, 7, 22, 0, 0, 1271, 268, 1, 0, 0, 0, 1272, 1273, 7, 23, 0, 0, 1273, 270, 1, 0, 0, 0, 1274, 1275, 7, 24, 0, 0, 1275, 272, 1, 0, 0, 0, 1276, 1277, 7, 25, 0, 0, 1277, 274, 1, 0, 0, 0, 1278, 1279, 7, 26, 0, 0, 1279, 276, 1, 0, 0, 0, 1280, 1281, 7, 27, 0, 0, 1281, 278, 1, 0, 0, 0, 1282, 1283, 7, 28, 0, 0, 1283, 280, 1, 0, 0, 0, 1284, 1285, 7, 29, 0, 0, 1285, 282, 1, 0, 0, 0, 1286, 1287, 7, 30, 0, 0, 1287, 284, 1, 0, 0, 0, 1288, 1289, 7, 31, 0, 0, 1289, 286, 1, 0, 0, 0, 1290, 1291, 7, 32, 0, 0, 1291, 288, 1, 0, 0, 0, 1292, 1293, 5, 45, 0, 0, 1293, 1294, 5, 62, 0, 0, 1294, 290, 1, 0, 0, 0, 1295, 1296, 5, 42, 0, 0, 1296, 292, 1, 0, 0, 0, 1297, 1298, 5, 96, 0, 0, 1298, 294, 1, 0, 0, 0, 1299, 1300, 5, 92, 0, 0, 1300, 296, 1, 0, 0, 0, 1301, 1302, 5, 58, 0, 0, 1302, 298, 1, 0, 0, 0, 1303, 1304, 5, 44, 0, 0, 1304, 300, 1, 0, 0, 0, 1305, 1306, 5, 124, 0, 0, 1306, 1307, 5, 124, 0, 0, 1307, 302, 1, 0, 0, 0, 1308, 1309, 5, 45, 0, 0, 1309, 304, 1, 0, 0, 0, 1310, 1311, 5, 36, 0, 0, 1311, 306, 1, 0, 0, 0, 1312, 1313, 5, 46, 0, 0, 1313, 308, 1, 0, 0, 0, 1314, 1315, 5, 61, 0, 0, 1315, 1316, 5, 61, 0, 0, 1316, 310, 1, 0, 0, 0, 1317, 1318, 5, 61, 0, 0, 1318, 312, 1, 0, 0, 0, 1319, 1320, 5, 62, 0, 0, 1320, 1321, 5, 61, 0, 0, 1321, 314, 1, 0, 0, 0, 1322, 1323, 5, 62, 0, 0, 1323, 316, 1, 0, 0, 0, 1324, 1325, 5, 35, 0, 0, 1325, 318, 1, 0, 0, 0, 1326, 1327, 5, 126, 0, 0, 1327, 1328, 5, 42, 0, 0, 1328, 320, 1, 0, 0, 0, 1329, 1330, 5, 61, 0, 0, 1330, 1331, 5, 126, 0, 0, 1331, 1332, 5, 42, 0, 0, 1332, 322, 1, 0, 0, 0, 1333, 1334, 5, 123, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 6, 160, 0, 0, 1336, 324, 1, 0, 0, 0, 1337, 1338, 5, 91, 0, 0, 1338, 326, 1, 0, 0, 0, 1339, 1340, 5, 40, 0, 0, 1340, 328, 1, 0, 0, 0, 1341, 1342, 5, 60, 0, 0, 1342, 1343, 5, 61, 0, 0, 1343, 330, 1, 0, 0, 0, 1344, 1345, 5, 60, 0, 0, 1345, 332, 1, 0, 0, 0, 1346, 1347, 5, 33, 0, 0, 1347, 1351, 5, 61, 0, 0, 1348, 1349, 5, 60, 0, 0, 1349, 1351, 5, 62, 0, 0, 1350, 1346, 1, 0, 0, 0, 1350, 1348, 1, 0, 0, 0, 1351, 334, 1, 0, 0, 0, 1352, 1353, 5, 33, 0, 0, 1353, 1354, 5, 126, 0, 0, 1354, 1355, 5, 42, 0, 0, 1355, 336, 1, 0, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 1358, 5, 126, 0, 0, 1358, 338, 1, 0, 0, 0, 1359, 1360, 5, 63, 0, 0, 1360, 1361, 5, 46, 0, 0, 1361, 340, 1, 0, 0, 0, 1362, 1363, 5, 63, 0, 0, 1363, 1364, 5, 63, 0, 0, 1364, 342, 1, 0, 0, 0, 1365, 1366, 5, 37, 0, 0, 1366, 344, 1, 0, 0, 0, 1367, 1368, 5, 43, 0, 0, 1368, 346, 1, 0, 0, 0, 1369, 1370, 5, 63, 0, 0, 1370, 348, 1, 0, 0, 0, 1371, 1372, 5, 34, 0, 0, 1372, 350, 1, 0, 0, 0, 1373, 1374, 5, 102, 0, 0, 1374, 1375, 5, 39, 0, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 174, 1, 0, 1377, 352, 1, 0, 0, 0, 1378, 1379, 5, 70, 0, 0, 1379, 1380, 5, 39, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 175, 2, 0, 1382, 354, 1, 0, 0, 0, 1383, 1384, 5, 39, 0, 0, 1384, 356, 1, 0, 0, 0, 1385, 1386, 5, 126, 0, 0, 1386, 358, 1, 0, 0, 0, 1387, 1388, 5, 61, 0, 0, 1388, 1389, 5, 126, 0, 0, 1389, 360, 1, 0, 0, 0, 1390, 1391, 5, 125, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 179, 3, 0, 1393, 362, 1, 0, 0, 0, 1394, 1395, 5, 93, 0, 0, 1395, 364, 1, 0, 0, 0, 1396, 1397, 5, 41, 0, 0, 1397, 366, 1, 0, 0, 0, 1398, 1399, 5, 59, 0, 0, 1399, 368, 1, 0, 0, 0, 1400, 1401, 5, 47, 0, 0, 1401, 370, 1, 0, 0, 0, 1402, 1403, 5, 95, 0, 0, 1403, 372, 1, 0, 0, 0, 1404, 1405, 5, 47, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1410, 1, 0, 0, 0, 1407, 1409, 9, 0, 0, 0, 1408, 1407, 1, 0, 0, 0, 1409, 1412, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1413, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1413, 1414, 5, 42, 0, 0, 1414, 1415, 5, 47, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 4, 0, 1417, 374, 1, 0, 0, 0, 1418, 1419, 5, 45, 0, 0, 1419, 1423, 5, 45, 0, 0, 1420, 1421, 5, 47, 0, 0, 1421, 1423, 5, 47, 0, 0, 1422, 1418, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1427, 1, 0, 0, 0, 1424, 1426, 8, 33, 0, 0, 1425, 1424, 1, 0, 0, 0, 1426, 1429, 1, 0, 0, 0, 1427, 1425, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1430, 1432, 7, 34, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 6, 186, 4, 0, 1434, 376, 1, 0, 0, 0, 1435, 1436, 7, 35, 0, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1438, 6, 187, 5, 0, 1438, 378, 1, 0, 0, 0, 1439, 1451, 8, 36, 0, 0, 1440, 1451, 3, 215, 106, 0, 1441, 1442, 3, 295, 146, 0, 1442, 1443, 3, 355, 176, 0, 1443, 1451, 1, 0, 0, 0, 1444, 1445, 3, 295, 146, 0, 1445, 1446, 3, 323, 160, 0, 1446, 1451, 1, 0, 0, 0, 1447, 1448, 3, 355, 176, 0, 1448, 1449, 3, 355, 176, 0, 1449, 1451, 1, 0, 0, 0, 1450, 1439, 1, 0, 0, 0, 1450, 1440, 1, 0, 0, 0, 1450, 1441, 1, 0, 0, 0, 1450, 1444, 1, 0, 0, 0, 1450, 1447, 1, 0, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1450, 1, 0, 0, 0, 1452, 1453, 1, 0, 0, 0, 1453, 380, 1, 0, 0, 0, 1454, 1455, 3, 323, 160, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1457, 6, 189, 0, 0, 1457, 382, 1, 0, 0, 0, 1458, 1459, 3, 355, 176, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 190, 6, 0, 1461, 1462, 6, 190, 3, 0, 1462, 384, 1, 0, 0, 0, 1463, 1469, 8, 37, 0, 0, 1464, 1469, 3, 215, 106, 0, 1465, 1466, 3, 295, 146, 0, 1466, 1467, 3, 323, 160, 0, 1467, 1469, 1, 0, 0, 0, 1468, 1463, 1, 0, 0, 0, 1468, 1464, 1, 0, 0, 0, 1468, 1465, 1, 0, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1468, 1, 0, 0, 0, 1470, 1471, 1, 0, 0, 0, 1471, 386, 1, 0, 0, 0, 1472, 1473, 3, 323, 160, 0, 1473, 1474, 1, 0, 0, 0, 1474, 1475, 6, 192, 0, 0, 1475, 388, 1, 0, 0, 0, 44, 0, 1, 2, 429, 657, 1041, 1070, 1075, 1081, 1083, 1095, 1097, 1111, 1113, 1118, 1125, 1130, 1134, 1139, 1144, 1148, 1153, 1160, 1166, 1171, 1178, 1183, 1189, 1194, 1196, 1202, 1207, 1214, 1225, 1227, 1350, 1410, 1422, 1427, 1431, 1450, 1452, 1468, 1470, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 147, 0] \ No newline at end of file diff --git a/posthog/hogql/grammar/HogQLLexer.py b/posthog/hogql/grammar/HogQLLexer.py index f234dd38975d8..2fced647ff922 100644 --- a/posthog/hogql/grammar/HogQLLexer.py +++ b/posthog/hogql/grammar/HogQLLexer.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,0,160,1455,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4, + 4,0,162,1476,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4, 7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11, 2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18, 7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24, @@ -42,548 +42,557 @@ def serializedATN(): 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,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,1, - 3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1, - 6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,426,8,6,1,7,1,7,1,7,1, - 7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1, - 10,1,10,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,13,1, - 13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1, - 15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1, - 17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1, - 19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1, - 21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1, - 25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1, - 27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, - 29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1, - 31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1, - 33,1,33,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1, - 36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1, - 38,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1, - 41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1, - 43,1,43,1,43,1,43,1,43,3,43,647,8,43,1,44,1,44,1,44,1,44,1,44,1, - 44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1, - 47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1, - 49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1, - 51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1, - 54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1, - 56,1,56,1,56,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,59,1,59,1, - 59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1, - 61,1,61,1,61,1,62,1,62,1,62,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1, - 64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1, - 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1, - 68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1, - 69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1, - 71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1, - 73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1, - 75,1,75,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1, - 77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1, - 79,1,79,1,80,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1, - 81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1, - 83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1, - 85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1, - 87,1,87,1,87,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,89,1,89,1, - 89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1, - 91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1, - 93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1, - 95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1, - 97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1, - 99,1,100,1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1, - 101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103, - 1,103,1,103,1,103,1,103,1,103,1,103,1,103,3,103,1021,8,103,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,3,104,1050,8,104,1,105,1,105,1,105,3,105, - 1055,8,105,1,105,1,105,1,105,1,105,5,105,1061,8,105,10,105,12,105, - 1064,9,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105, - 5,105,1075,8,105,10,105,12,105,1078,9,105,1,105,1,105,1,105,1,105, - 1,105,1,105,1,105,1,105,1,105,1,105,1,105,5,105,1091,8,105,10,105, - 12,105,1094,9,105,1,105,1,105,3,105,1098,8,105,1,106,1,106,1,106, - 5,106,1103,8,106,10,106,12,106,1106,9,106,1,106,1,106,3,106,1110, - 8,106,1,106,1,106,3,106,1114,8,106,1,106,4,106,1117,8,106,11,106, - 12,106,1118,1,106,1,106,1,106,3,106,1124,8,106,1,106,1,106,3,106, - 1128,8,106,1,106,4,106,1131,8,106,11,106,12,106,1132,1,106,1,106, - 1,106,5,106,1138,8,106,10,106,12,106,1141,9,106,1,106,1,106,1,106, - 3,106,1146,8,106,1,106,4,106,1149,8,106,11,106,12,106,1150,1,106, - 1,106,1,106,1,106,1,106,3,106,1158,8,106,1,106,4,106,1161,8,106, - 11,106,12,106,1162,1,106,1,106,1,106,1,106,3,106,1169,8,106,1,106, - 4,106,1172,8,106,11,106,12,106,1173,3,106,1176,8,106,1,107,1,107, - 4,107,1180,8,107,11,107,12,107,1181,1,108,4,108,1185,8,108,11,108, - 12,108,1186,1,109,1,109,1,109,4,109,1192,8,109,11,109,12,109,1193, - 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,5,110,1205, - 8,110,10,110,12,110,1208,9,110,1,110,1,110,1,111,1,111,1,112,1,112, - 1,113,1,113,1,114,1,114,1,115,1,115,1,116,1,116,1,117,1,117,1,118, - 1,118,1,119,1,119,1,120,1,120,1,121,1,121,1,122,1,122,1,123,1,123, - 1,124,1,124,1,125,1,125,1,126,1,126,1,127,1,127,1,128,1,128,1,129, - 1,129,1,130,1,130,1,131,1,131,1,132,1,132,1,133,1,133,1,134,1,134, - 1,135,1,135,1,136,1,136,1,137,1,137,1,138,1,138,1,139,1,139,1,140, - 1,140,1,141,1,141,1,141,1,142,1,142,1,143,1,143,1,144,1,144,1,145, - 1,145,1,146,1,146,1,147,1,147,1,147,1,148,1,148,1,149,1,149,1,150, - 1,150,1,151,1,151,1,151,1,152,1,152,1,153,1,153,1,153,1,154,1,154, - 1,155,1,155,1,156,1,156,1,156,1,157,1,157,1,157,1,157,1,158,1,158, - 1,158,1,158,1,159,1,159,1,160,1,160,1,161,1,161,1,161,1,162,1,162, - 1,163,1,163,1,163,1,163,3,163,1330,8,163,1,164,1,164,1,164,1,164, - 1,165,1,165,1,165,1,166,1,166,1,166,1,167,1,167,1,167,1,168,1,168, - 1,169,1,169,1,170,1,170,1,171,1,171,1,172,1,172,1,172,1,172,1,172, - 1,173,1,173,1,173,1,173,1,173,1,174,1,174,1,175,1,175,1,176,1,176, - 1,176,1,177,1,177,1,177,1,177,1,178,1,178,1,179,1,179,1,180,1,180, - 1,181,1,181,1,182,1,182,1,183,1,183,1,183,1,183,5,183,1388,8,183, - 10,183,12,183,1391,9,183,1,183,1,183,1,183,1,183,1,183,1,184,1,184, - 1,184,1,184,3,184,1402,8,184,1,184,5,184,1405,8,184,10,184,12,184, - 1408,9,184,1,184,3,184,1411,8,184,1,184,1,184,1,185,1,185,1,185, - 1,185,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186, - 1,186,4,186,1430,8,186,11,186,12,186,1431,1,187,1,187,1,187,1,187, - 1,188,1,188,1,188,1,188,1,188,1,189,1,189,1,189,1,189,1,189,4,189, - 1448,8,189,11,189,12,189,1449,1,190,1,190,1,190,1,190,1,1389,0,191, - 3,1,5,2,7,3,9,4,11,5,13,6,15,7,17,8,19,9,21,10,23,11,25,12,27,13, - 29,14,31,15,33,16,35,17,37,18,39,19,41,20,43,21,45,22,47,23,49,24, - 51,25,53,26,55,27,57,28,59,29,61,30,63,31,65,32,67,33,69,34,71,35, - 73,36,75,37,77,38,79,39,81,40,83,41,85,42,87,43,89,44,91,45,93,46, - 95,47,97,48,99,49,101,50,103,51,105,52,107,53,109,54,111,55,113, - 56,115,57,117,58,119,59,121,60,123,61,125,62,127,63,129,64,131,65, - 133,66,135,67,137,68,139,69,141,70,143,71,145,72,147,73,149,74,151, - 75,153,76,155,77,157,78,159,79,161,80,163,81,165,82,167,83,169,84, - 171,85,173,86,175,87,177,88,179,89,181,90,183,91,185,92,187,93,189, - 94,191,95,193,96,195,97,197,98,199,99,201,100,203,101,205,102,207, - 103,209,104,211,105,213,106,215,107,217,108,219,109,221,110,223, - 111,225,0,227,0,229,0,231,0,233,0,235,0,237,0,239,0,241,0,243,0, - 245,0,247,0,249,0,251,0,253,0,255,0,257,0,259,0,261,0,263,0,265, - 0,267,0,269,0,271,0,273,0,275,0,277,0,279,0,281,0,283,0,285,112, - 287,113,289,114,291,115,293,116,295,117,297,118,299,119,301,120, - 303,121,305,122,307,123,309,124,311,125,313,126,315,127,317,128, - 319,129,321,130,323,131,325,132,327,133,329,134,331,135,333,136, - 335,137,337,138,339,139,341,140,343,141,345,142,347,143,349,144, - 351,145,353,146,355,147,357,148,359,149,361,150,363,151,365,152, - 367,153,369,154,371,155,373,156,375,157,377,158,379,0,381,159,383, - 160,3,0,1,2,38,2,0,92,92,96,96,2,0,34,34,92,92,2,0,39,39,92,92,2, - 0,65,65,97,97,2,0,66,66,98,98,2,0,67,67,99,99,2,0,68,68,100,100, - 2,0,69,69,101,101,2,0,70,70,102,102,2,0,71,71,103,103,2,0,72,72, - 104,104,2,0,73,73,105,105,2,0,74,74,106,106,2,0,75,75,107,107,2, - 0,76,76,108,108,2,0,77,77,109,109,2,0,78,78,110,110,2,0,79,79,111, - 111,2,0,80,80,112,112,2,0,81,81,113,113,2,0,82,82,114,114,2,0,83, - 83,115,115,2,0,84,84,116,116,2,0,85,85,117,117,2,0,86,86,118,118, - 2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121,121,2,0,90,90, - 122,122,2,0,65,90,97,122,1,0,48,55,1,0,48,57,3,0,48,57,65,70,97, - 102,2,0,10,10,13,13,2,1,10,10,13,13,2,0,9,13,32,32,3,0,39,39,92, - 92,123,123,1,0,123,123,1491,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0, - 0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0, - 0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0, - 0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0, - 0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0, - 0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0, - 0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0, - 0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0, - 0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0, - 0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0, - 0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0, - 0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117, - 1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0, - 0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1, - 0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0, - 145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0, - 0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163, - 1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0, - 0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1, - 0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0, - 191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0, - 0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209, - 1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0, - 0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,285,1,0,0,0,0,287,1, - 0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0, - 297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1,0, - 0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0,315, - 1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0,323,1,0,0,0, - 0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,331,1,0,0,0,0,333,1, - 0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,0,0,0, - 343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1,0, - 0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0,361, - 1,0,0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0,369,1,0,0,0, - 0,371,1,0,0,0,0,373,1,0,0,0,1,375,1,0,0,0,1,377,1,0,0,0,1,379,1, - 0,0,0,2,381,1,0,0,0,2,383,1,0,0,0,3,385,1,0,0,0,5,389,1,0,0,0,7, - 393,1,0,0,0,9,398,1,0,0,0,11,402,1,0,0,0,13,408,1,0,0,0,15,425,1, - 0,0,0,17,427,1,0,0,0,19,432,1,0,0,0,21,440,1,0,0,0,23,445,1,0,0, - 0,25,448,1,0,0,0,27,453,1,0,0,0,29,458,1,0,0,0,31,464,1,0,0,0,33, - 471,1,0,0,0,35,479,1,0,0,0,37,485,1,0,0,0,39,490,1,0,0,0,41,498, - 1,0,0,0,43,503,1,0,0,0,45,507,1,0,0,0,47,512,1,0,0,0,49,523,1,0, - 0,0,51,532,1,0,0,0,53,537,1,0,0,0,55,541,1,0,0,0,57,549,1,0,0,0, - 59,555,1,0,0,0,61,563,1,0,0,0,63,569,1,0,0,0,65,572,1,0,0,0,67,582, - 1,0,0,0,69,586,1,0,0,0,71,591,1,0,0,0,73,596,1,0,0,0,75,600,1,0, - 0,0,77,606,1,0,0,0,79,613,1,0,0,0,81,618,1,0,0,0,83,621,1,0,0,0, - 85,624,1,0,0,0,87,630,1,0,0,0,89,646,1,0,0,0,91,648,1,0,0,0,93,654, - 1,0,0,0,95,663,1,0,0,0,97,666,1,0,0,0,99,671,1,0,0,0,101,675,1,0, - 0,0,103,680,1,0,0,0,105,688,1,0,0,0,107,693,1,0,0,0,109,697,1,0, - 0,0,111,702,1,0,0,0,113,708,1,0,0,0,115,715,1,0,0,0,117,721,1,0, - 0,0,119,725,1,0,0,0,121,729,1,0,0,0,123,734,1,0,0,0,125,740,1,0, - 0,0,127,747,1,0,0,0,129,750,1,0,0,0,131,753,1,0,0,0,133,759,1,0, - 0,0,135,765,1,0,0,0,137,770,1,0,0,0,139,780,1,0,0,0,141,790,1,0, - 0,0,143,799,1,0,0,0,145,807,1,0,0,0,147,813,1,0,0,0,149,820,1,0, - 0,0,151,826,1,0,0,0,153,833,1,0,0,0,155,837,1,0,0,0,157,842,1,0, - 0,0,159,849,1,0,0,0,161,856,1,0,0,0,163,863,1,0,0,0,165,868,1,0, - 0,0,167,877,1,0,0,0,169,887,1,0,0,0,171,892,1,0,0,0,173,898,1,0, - 0,0,175,903,1,0,0,0,177,913,1,0,0,0,179,916,1,0,0,0,181,920,1,0, - 0,0,183,927,1,0,0,0,185,936,1,0,0,0,187,941,1,0,0,0,189,950,1,0, - 0,0,191,954,1,0,0,0,193,964,1,0,0,0,195,970,1,0,0,0,197,976,1,0, - 0,0,199,981,1,0,0,0,201,986,1,0,0,0,203,992,1,0,0,0,205,998,1,0, - 0,0,207,1005,1,0,0,0,209,1020,1,0,0,0,211,1049,1,0,0,0,213,1097, - 1,0,0,0,215,1175,1,0,0,0,217,1177,1,0,0,0,219,1184,1,0,0,0,221,1188, - 1,0,0,0,223,1195,1,0,0,0,225,1211,1,0,0,0,227,1213,1,0,0,0,229,1215, - 1,0,0,0,231,1217,1,0,0,0,233,1219,1,0,0,0,235,1221,1,0,0,0,237,1223, - 1,0,0,0,239,1225,1,0,0,0,241,1227,1,0,0,0,243,1229,1,0,0,0,245,1231, - 1,0,0,0,247,1233,1,0,0,0,249,1235,1,0,0,0,251,1237,1,0,0,0,253,1239, - 1,0,0,0,255,1241,1,0,0,0,257,1243,1,0,0,0,259,1245,1,0,0,0,261,1247, - 1,0,0,0,263,1249,1,0,0,0,265,1251,1,0,0,0,267,1253,1,0,0,0,269,1255, - 1,0,0,0,271,1257,1,0,0,0,273,1259,1,0,0,0,275,1261,1,0,0,0,277,1263, - 1,0,0,0,279,1265,1,0,0,0,281,1267,1,0,0,0,283,1269,1,0,0,0,285,1271, - 1,0,0,0,287,1274,1,0,0,0,289,1276,1,0,0,0,291,1278,1,0,0,0,293,1280, - 1,0,0,0,295,1282,1,0,0,0,297,1284,1,0,0,0,299,1287,1,0,0,0,301,1289, - 1,0,0,0,303,1291,1,0,0,0,305,1293,1,0,0,0,307,1296,1,0,0,0,309,1298, - 1,0,0,0,311,1301,1,0,0,0,313,1303,1,0,0,0,315,1305,1,0,0,0,317,1308, - 1,0,0,0,319,1312,1,0,0,0,321,1316,1,0,0,0,323,1318,1,0,0,0,325,1320, - 1,0,0,0,327,1323,1,0,0,0,329,1329,1,0,0,0,331,1331,1,0,0,0,333,1335, - 1,0,0,0,335,1338,1,0,0,0,337,1341,1,0,0,0,339,1344,1,0,0,0,341,1346, - 1,0,0,0,343,1348,1,0,0,0,345,1350,1,0,0,0,347,1352,1,0,0,0,349,1357, - 1,0,0,0,351,1362,1,0,0,0,353,1364,1,0,0,0,355,1366,1,0,0,0,357,1369, - 1,0,0,0,359,1373,1,0,0,0,361,1375,1,0,0,0,363,1377,1,0,0,0,365,1379, - 1,0,0,0,367,1381,1,0,0,0,369,1383,1,0,0,0,371,1401,1,0,0,0,373,1414, - 1,0,0,0,375,1429,1,0,0,0,377,1433,1,0,0,0,379,1437,1,0,0,0,381,1447, - 1,0,0,0,383,1451,1,0,0,0,385,386,3,225,111,0,386,387,3,247,122,0, - 387,388,3,247,122,0,388,4,1,0,0,0,389,390,3,225,111,0,390,391,3, - 251,124,0,391,392,3,231,114,0,392,6,1,0,0,0,393,394,3,225,111,0, - 394,395,3,251,124,0,395,396,3,263,130,0,396,397,3,241,119,0,397, - 8,1,0,0,0,398,399,3,225,111,0,399,400,3,251,124,0,400,401,3,273, - 135,0,401,10,1,0,0,0,402,403,3,225,111,0,403,404,3,259,128,0,404, - 405,3,259,128,0,405,406,3,225,111,0,406,407,3,273,135,0,407,12,1, - 0,0,0,408,409,3,225,111,0,409,410,3,261,129,0,410,14,1,0,0,0,411, - 412,3,225,111,0,412,413,3,261,129,0,413,414,3,229,113,0,414,426, - 1,0,0,0,415,416,3,225,111,0,416,417,3,261,129,0,417,418,3,229,113, - 0,418,419,3,233,115,0,419,420,3,251,124,0,420,421,3,231,114,0,421, - 422,3,241,119,0,422,423,3,251,124,0,423,424,3,237,117,0,424,426, - 1,0,0,0,425,411,1,0,0,0,425,415,1,0,0,0,426,16,1,0,0,0,427,428,3, - 225,111,0,428,429,3,261,129,0,429,430,3,253,125,0,430,431,3,235, - 116,0,431,18,1,0,0,0,432,433,3,227,112,0,433,434,3,233,115,0,434, - 435,3,263,130,0,435,436,3,269,133,0,436,437,3,233,115,0,437,438, - 3,233,115,0,438,439,3,251,124,0,439,20,1,0,0,0,440,441,3,227,112, - 0,441,442,3,253,125,0,442,443,3,263,130,0,443,444,3,239,118,0,444, - 22,1,0,0,0,445,446,3,227,112,0,446,447,3,273,135,0,447,24,1,0,0, - 0,448,449,3,229,113,0,449,450,3,225,111,0,450,451,3,261,129,0,451, - 452,3,233,115,0,452,26,1,0,0,0,453,454,3,229,113,0,454,455,3,225, - 111,0,455,456,3,261,129,0,456,457,3,263,130,0,457,28,1,0,0,0,458, - 459,3,229,113,0,459,460,3,225,111,0,460,461,3,263,130,0,461,462, - 3,229,113,0,462,463,3,239,118,0,463,30,1,0,0,0,464,465,3,229,113, - 0,465,466,3,253,125,0,466,467,3,239,118,0,467,468,3,253,125,0,468, - 469,3,259,128,0,469,470,3,263,130,0,470,32,1,0,0,0,471,472,3,229, - 113,0,472,473,3,253,125,0,473,474,3,247,122,0,474,475,3,247,122, - 0,475,476,3,225,111,0,476,477,3,263,130,0,477,478,3,233,115,0,478, - 34,1,0,0,0,479,480,3,229,113,0,480,481,3,259,128,0,481,482,3,253, - 125,0,482,483,3,261,129,0,483,484,3,261,129,0,484,36,1,0,0,0,485, - 486,3,229,113,0,486,487,3,265,131,0,487,488,3,227,112,0,488,489, - 3,233,115,0,489,38,1,0,0,0,490,491,3,229,113,0,491,492,3,265,131, - 0,492,493,3,259,128,0,493,494,3,259,128,0,494,495,3,233,115,0,495, - 496,3,251,124,0,496,497,3,263,130,0,497,40,1,0,0,0,498,499,3,231, - 114,0,499,500,3,225,111,0,500,501,3,263,130,0,501,502,3,233,115, - 0,502,42,1,0,0,0,503,504,3,231,114,0,504,505,3,225,111,0,505,506, - 3,273,135,0,506,44,1,0,0,0,507,508,3,231,114,0,508,509,3,233,115, - 0,509,510,3,261,129,0,510,511,3,229,113,0,511,46,1,0,0,0,512,513, - 3,231,114,0,513,514,3,233,115,0,514,515,3,261,129,0,515,516,3,229, - 113,0,516,517,3,233,115,0,517,518,3,251,124,0,518,519,3,231,114, - 0,519,520,3,241,119,0,520,521,3,251,124,0,521,522,3,237,117,0,522, - 48,1,0,0,0,523,524,3,231,114,0,524,525,3,241,119,0,525,526,3,261, - 129,0,526,527,3,263,130,0,527,528,3,241,119,0,528,529,3,251,124, - 0,529,530,3,229,113,0,530,531,3,263,130,0,531,50,1,0,0,0,532,533, - 3,233,115,0,533,534,3,247,122,0,534,535,3,261,129,0,535,536,3,233, - 115,0,536,52,1,0,0,0,537,538,3,233,115,0,538,539,3,251,124,0,539, - 540,3,231,114,0,540,54,1,0,0,0,541,542,3,233,115,0,542,543,3,271, - 134,0,543,544,3,263,130,0,544,545,3,259,128,0,545,546,3,225,111, - 0,546,547,3,229,113,0,547,548,3,263,130,0,548,56,1,0,0,0,549,550, - 3,235,116,0,550,551,3,241,119,0,551,552,3,251,124,0,552,553,3,225, - 111,0,553,554,3,247,122,0,554,58,1,0,0,0,555,556,3,235,116,0,556, - 557,3,241,119,0,557,558,3,251,124,0,558,559,3,225,111,0,559,560, - 3,247,122,0,560,561,3,247,122,0,561,562,3,273,135,0,562,60,1,0,0, - 0,563,564,3,235,116,0,564,565,3,241,119,0,565,566,3,259,128,0,566, - 567,3,261,129,0,567,568,3,263,130,0,568,62,1,0,0,0,569,570,3,235, - 116,0,570,571,3,251,124,0,571,64,1,0,0,0,572,573,3,235,116,0,573, - 574,3,253,125,0,574,575,3,247,122,0,575,576,3,247,122,0,576,577, - 3,253,125,0,577,578,3,269,133,0,578,579,3,241,119,0,579,580,3,251, - 124,0,580,581,3,237,117,0,581,66,1,0,0,0,582,583,3,235,116,0,583, - 584,3,253,125,0,584,585,3,259,128,0,585,68,1,0,0,0,586,587,3,235, - 116,0,587,588,3,259,128,0,588,589,3,253,125,0,589,590,3,249,123, - 0,590,70,1,0,0,0,591,592,3,235,116,0,592,593,3,265,131,0,593,594, - 3,247,122,0,594,595,3,247,122,0,595,72,1,0,0,0,596,597,3,235,116, - 0,597,598,3,265,131,0,598,599,3,251,124,0,599,74,1,0,0,0,600,601, - 3,237,117,0,601,602,3,259,128,0,602,603,3,253,125,0,603,604,3,265, - 131,0,604,605,3,255,126,0,605,76,1,0,0,0,606,607,3,239,118,0,607, - 608,3,225,111,0,608,609,3,267,132,0,609,610,3,241,119,0,610,611, - 3,251,124,0,611,612,3,237,117,0,612,78,1,0,0,0,613,614,3,239,118, - 0,614,615,3,253,125,0,615,616,3,265,131,0,616,617,3,259,128,0,617, - 80,1,0,0,0,618,619,3,241,119,0,619,620,3,231,114,0,620,82,1,0,0, - 0,621,622,3,241,119,0,622,623,3,235,116,0,623,84,1,0,0,0,624,625, - 3,241,119,0,625,626,3,247,122,0,626,627,3,241,119,0,627,628,3,245, - 121,0,628,629,3,233,115,0,629,86,1,0,0,0,630,631,3,241,119,0,631, - 632,3,251,124,0,632,88,1,0,0,0,633,634,3,241,119,0,634,635,3,251, - 124,0,635,636,3,235,116,0,636,647,1,0,0,0,637,638,3,241,119,0,638, - 639,3,251,124,0,639,640,3,235,116,0,640,641,3,241,119,0,641,642, - 3,251,124,0,642,643,3,241,119,0,643,644,3,263,130,0,644,645,3,273, - 135,0,645,647,1,0,0,0,646,633,1,0,0,0,646,637,1,0,0,0,647,90,1,0, - 0,0,648,649,3,241,119,0,649,650,3,251,124,0,650,651,3,251,124,0, - 651,652,3,233,115,0,652,653,3,259,128,0,653,92,1,0,0,0,654,655,3, - 241,119,0,655,656,3,251,124,0,656,657,3,263,130,0,657,658,3,233, - 115,0,658,659,3,259,128,0,659,660,3,267,132,0,660,661,3,225,111, - 0,661,662,3,247,122,0,662,94,1,0,0,0,663,664,3,241,119,0,664,665, - 3,261,129,0,665,96,1,0,0,0,666,667,3,243,120,0,667,668,3,253,125, - 0,668,669,3,241,119,0,669,670,3,251,124,0,670,98,1,0,0,0,671,672, - 3,245,121,0,672,673,3,233,115,0,673,674,3,273,135,0,674,100,1,0, - 0,0,675,676,3,247,122,0,676,677,3,225,111,0,677,678,3,261,129,0, - 678,679,3,263,130,0,679,102,1,0,0,0,680,681,3,247,122,0,681,682, - 3,233,115,0,682,683,3,225,111,0,683,684,3,231,114,0,684,685,3,241, - 119,0,685,686,3,251,124,0,686,687,3,237,117,0,687,104,1,0,0,0,688, - 689,3,247,122,0,689,690,3,233,115,0,690,691,3,235,116,0,691,692, - 3,263,130,0,692,106,1,0,0,0,693,694,3,247,122,0,694,695,3,233,115, - 0,695,696,3,263,130,0,696,108,1,0,0,0,697,698,3,247,122,0,698,699, - 3,241,119,0,699,700,3,245,121,0,700,701,3,233,115,0,701,110,1,0, - 0,0,702,703,3,247,122,0,703,704,3,241,119,0,704,705,3,249,123,0, - 705,706,3,241,119,0,706,707,3,263,130,0,707,112,1,0,0,0,708,709, - 3,249,123,0,709,710,3,241,119,0,710,711,3,251,124,0,711,712,3,265, - 131,0,712,713,3,263,130,0,713,714,3,233,115,0,714,114,1,0,0,0,715, - 716,3,249,123,0,716,717,3,253,125,0,717,718,3,251,124,0,718,719, - 3,263,130,0,719,720,3,239,118,0,720,116,1,0,0,0,721,722,3,251,124, - 0,722,723,3,225,111,0,723,724,3,251,124,0,724,118,1,0,0,0,725,726, - 3,251,124,0,726,727,3,253,125,0,727,728,3,263,130,0,728,120,1,0, - 0,0,729,730,3,251,124,0,730,731,3,265,131,0,731,732,3,247,122,0, - 732,733,3,247,122,0,733,122,1,0,0,0,734,735,3,251,124,0,735,736, - 3,265,131,0,736,737,3,247,122,0,737,738,3,247,122,0,738,739,3,261, - 129,0,739,124,1,0,0,0,740,741,3,253,125,0,741,742,3,235,116,0,742, - 743,3,235,116,0,743,744,3,261,129,0,744,745,3,233,115,0,745,746, - 3,263,130,0,746,126,1,0,0,0,747,748,3,253,125,0,748,749,3,251,124, - 0,749,128,1,0,0,0,750,751,3,253,125,0,751,752,3,259,128,0,752,130, - 1,0,0,0,753,754,3,253,125,0,754,755,3,259,128,0,755,756,3,231,114, - 0,756,757,3,233,115,0,757,758,3,259,128,0,758,132,1,0,0,0,759,760, - 3,253,125,0,760,761,3,265,131,0,761,762,3,263,130,0,762,763,3,233, - 115,0,763,764,3,259,128,0,764,134,1,0,0,0,765,766,3,253,125,0,766, - 767,3,267,132,0,767,768,3,233,115,0,768,769,3,259,128,0,769,136, - 1,0,0,0,770,771,3,255,126,0,771,772,3,225,111,0,772,773,3,259,128, - 0,773,774,3,263,130,0,774,775,3,241,119,0,775,776,3,263,130,0,776, - 777,3,241,119,0,777,778,3,253,125,0,778,779,3,251,124,0,779,138, - 1,0,0,0,780,781,3,255,126,0,781,782,3,259,128,0,782,783,3,233,115, - 0,783,784,3,229,113,0,784,785,3,233,115,0,785,786,3,231,114,0,786, - 787,3,241,119,0,787,788,3,251,124,0,788,789,3,237,117,0,789,140, - 1,0,0,0,790,791,3,255,126,0,791,792,3,259,128,0,792,793,3,233,115, - 0,793,794,3,269,133,0,794,795,3,239,118,0,795,796,3,233,115,0,796, - 797,3,259,128,0,797,798,3,233,115,0,798,142,1,0,0,0,799,800,3,257, - 127,0,800,801,3,265,131,0,801,802,3,225,111,0,802,803,3,259,128, - 0,803,804,3,263,130,0,804,805,3,233,115,0,805,806,3,259,128,0,806, - 144,1,0,0,0,807,808,3,259,128,0,808,809,3,225,111,0,809,810,3,251, - 124,0,810,811,3,237,117,0,811,812,3,233,115,0,812,146,1,0,0,0,813, - 814,3,259,128,0,814,815,3,233,115,0,815,816,3,263,130,0,816,817, - 3,265,131,0,817,818,3,259,128,0,818,819,3,251,124,0,819,148,1,0, - 0,0,820,821,3,259,128,0,821,822,3,241,119,0,822,823,3,237,117,0, - 823,824,3,239,118,0,824,825,3,263,130,0,825,150,1,0,0,0,826,827, - 3,259,128,0,827,828,3,253,125,0,828,829,3,247,122,0,829,830,3,247, - 122,0,830,831,3,265,131,0,831,832,3,255,126,0,832,152,1,0,0,0,833, - 834,3,259,128,0,834,835,3,253,125,0,835,836,3,269,133,0,836,154, - 1,0,0,0,837,838,3,259,128,0,838,839,3,253,125,0,839,840,3,269,133, - 0,840,841,3,261,129,0,841,156,1,0,0,0,842,843,3,261,129,0,843,844, - 3,225,111,0,844,845,3,249,123,0,845,846,3,255,126,0,846,847,3,247, - 122,0,847,848,3,233,115,0,848,158,1,0,0,0,849,850,3,261,129,0,850, - 851,3,233,115,0,851,852,3,229,113,0,852,853,3,253,125,0,853,854, - 3,251,124,0,854,855,3,231,114,0,855,160,1,0,0,0,856,857,3,261,129, - 0,857,858,3,233,115,0,858,859,3,247,122,0,859,860,3,233,115,0,860, - 861,3,229,113,0,861,862,3,263,130,0,862,162,1,0,0,0,863,864,3,261, - 129,0,864,865,3,233,115,0,865,866,3,249,123,0,866,867,3,241,119, - 0,867,164,1,0,0,0,868,869,3,261,129,0,869,870,3,233,115,0,870,871, - 3,263,130,0,871,872,3,263,130,0,872,873,3,241,119,0,873,874,3,251, - 124,0,874,875,3,237,117,0,875,876,3,261,129,0,876,166,1,0,0,0,877, - 878,3,261,129,0,878,879,3,265,131,0,879,880,3,227,112,0,880,881, - 3,261,129,0,881,882,3,263,130,0,882,883,3,259,128,0,883,884,3,241, - 119,0,884,885,3,251,124,0,885,886,3,237,117,0,886,168,1,0,0,0,887, - 888,3,263,130,0,888,889,3,239,118,0,889,890,3,233,115,0,890,891, - 3,251,124,0,891,170,1,0,0,0,892,893,3,263,130,0,893,894,3,239,118, - 0,894,895,3,259,128,0,895,896,3,253,125,0,896,897,3,269,133,0,897, - 172,1,0,0,0,898,899,3,263,130,0,899,900,3,241,119,0,900,901,3,233, - 115,0,901,902,3,261,129,0,902,174,1,0,0,0,903,904,3,263,130,0,904, - 905,3,241,119,0,905,906,3,249,123,0,906,907,3,233,115,0,907,908, - 3,261,129,0,908,909,3,263,130,0,909,910,3,225,111,0,910,911,3,249, - 123,0,911,912,3,255,126,0,912,176,1,0,0,0,913,914,3,263,130,0,914, - 915,3,253,125,0,915,178,1,0,0,0,916,917,3,263,130,0,917,918,3,253, - 125,0,918,919,3,255,126,0,919,180,1,0,0,0,920,921,3,263,130,0,921, - 922,3,253,125,0,922,923,3,263,130,0,923,924,3,225,111,0,924,925, - 3,247,122,0,925,926,3,261,129,0,926,182,1,0,0,0,927,928,3,263,130, - 0,928,929,3,259,128,0,929,930,3,225,111,0,930,931,3,241,119,0,931, - 932,3,247,122,0,932,933,3,241,119,0,933,934,3,251,124,0,934,935, - 3,237,117,0,935,184,1,0,0,0,936,937,3,263,130,0,937,938,3,259,128, - 0,938,939,3,241,119,0,939,940,3,249,123,0,940,186,1,0,0,0,941,942, - 3,263,130,0,942,943,3,259,128,0,943,944,3,265,131,0,944,945,3,251, - 124,0,945,946,3,229,113,0,946,947,3,225,111,0,947,948,3,263,130, - 0,948,949,3,233,115,0,949,188,1,0,0,0,950,951,3,263,130,0,951,952, - 3,259,128,0,952,953,3,273,135,0,953,190,1,0,0,0,954,955,3,265,131, - 0,955,956,3,251,124,0,956,957,3,227,112,0,957,958,3,253,125,0,958, - 959,3,265,131,0,959,960,3,251,124,0,960,961,3,231,114,0,961,962, - 3,233,115,0,962,963,3,231,114,0,963,192,1,0,0,0,964,965,3,265,131, - 0,965,966,3,251,124,0,966,967,3,241,119,0,967,968,3,253,125,0,968, - 969,3,251,124,0,969,194,1,0,0,0,970,971,3,265,131,0,971,972,3,261, - 129,0,972,973,3,241,119,0,973,974,3,251,124,0,974,975,3,237,117, - 0,975,196,1,0,0,0,976,977,3,269,133,0,977,978,3,233,115,0,978,979, - 3,233,115,0,979,980,3,245,121,0,980,198,1,0,0,0,981,982,3,269,133, - 0,982,983,3,239,118,0,983,984,3,233,115,0,984,985,3,251,124,0,985, - 200,1,0,0,0,986,987,3,269,133,0,987,988,3,239,118,0,988,989,3,233, - 115,0,989,990,3,259,128,0,990,991,3,233,115,0,991,202,1,0,0,0,992, - 993,3,269,133,0,993,994,3,239,118,0,994,995,3,241,119,0,995,996, - 3,247,122,0,996,997,3,233,115,0,997,204,1,0,0,0,998,999,3,269,133, - 0,999,1000,3,241,119,0,1000,1001,3,251,124,0,1001,1002,3,231,114, - 0,1002,1003,3,253,125,0,1003,1004,3,269,133,0,1004,206,1,0,0,0,1005, - 1006,3,269,133,0,1006,1007,3,241,119,0,1007,1008,3,263,130,0,1008, - 1009,3,239,118,0,1009,208,1,0,0,0,1010,1011,3,273,135,0,1011,1012, - 3,233,115,0,1012,1013,3,225,111,0,1013,1014,3,259,128,0,1014,1021, - 1,0,0,0,1015,1016,3,273,135,0,1016,1017,3,273,135,0,1017,1018,3, - 273,135,0,1018,1019,3,273,135,0,1019,1021,1,0,0,0,1020,1010,1,0, - 0,0,1020,1015,1,0,0,0,1021,210,1,0,0,0,1022,1023,3,291,144,0,1023, - 1024,3,227,112,0,1024,1050,1,0,0,0,1025,1026,3,291,144,0,1026,1027, - 3,235,116,0,1027,1050,1,0,0,0,1028,1029,3,291,144,0,1029,1030,3, - 259,128,0,1030,1050,1,0,0,0,1031,1032,3,291,144,0,1032,1033,3,251, - 124,0,1033,1050,1,0,0,0,1034,1035,3,291,144,0,1035,1036,3,263,130, - 0,1036,1050,1,0,0,0,1037,1038,3,291,144,0,1038,1039,5,48,0,0,1039, - 1050,1,0,0,0,1040,1041,3,291,144,0,1041,1042,3,225,111,0,1042,1050, - 1,0,0,0,1043,1044,3,291,144,0,1044,1045,3,267,132,0,1045,1050,1, - 0,0,0,1046,1047,3,291,144,0,1047,1048,3,291,144,0,1048,1050,1,0, - 0,0,1049,1022,1,0,0,0,1049,1025,1,0,0,0,1049,1028,1,0,0,0,1049,1031, - 1,0,0,0,1049,1034,1,0,0,0,1049,1037,1,0,0,0,1049,1040,1,0,0,0,1049, - 1043,1,0,0,0,1049,1046,1,0,0,0,1050,212,1,0,0,0,1051,1055,3,277, - 137,0,1052,1055,3,367,182,0,1053,1055,3,301,149,0,1054,1051,1,0, - 0,0,1054,1052,1,0,0,0,1054,1053,1,0,0,0,1055,1062,1,0,0,0,1056,1061, - 3,277,137,0,1057,1061,3,367,182,0,1058,1061,3,281,139,0,1059,1061, - 3,301,149,0,1060,1056,1,0,0,0,1060,1057,1,0,0,0,1060,1058,1,0,0, - 0,1060,1059,1,0,0,0,1061,1064,1,0,0,0,1062,1060,1,0,0,0,1062,1063, - 1,0,0,0,1063,1098,1,0,0,0,1064,1062,1,0,0,0,1065,1076,3,289,143, - 0,1066,1075,8,0,0,0,1067,1075,3,211,104,0,1068,1069,3,291,144,0, - 1069,1070,3,351,174,0,1070,1075,1,0,0,0,1071,1072,3,289,143,0,1072, - 1073,3,289,143,0,1073,1075,1,0,0,0,1074,1066,1,0,0,0,1074,1067,1, - 0,0,0,1074,1068,1,0,0,0,1074,1071,1,0,0,0,1075,1078,1,0,0,0,1076, - 1074,1,0,0,0,1076,1077,1,0,0,0,1077,1079,1,0,0,0,1078,1076,1,0,0, - 0,1079,1080,3,289,143,0,1080,1098,1,0,0,0,1081,1092,3,345,171,0, - 1082,1091,8,1,0,0,1083,1091,3,211,104,0,1084,1085,3,291,144,0,1085, - 1086,3,345,171,0,1086,1091,1,0,0,0,1087,1088,3,345,171,0,1088,1089, - 3,345,171,0,1089,1091,1,0,0,0,1090,1082,1,0,0,0,1090,1083,1,0,0, - 0,1090,1084,1,0,0,0,1090,1087,1,0,0,0,1091,1094,1,0,0,0,1092,1090, - 1,0,0,0,1092,1093,1,0,0,0,1093,1095,1,0,0,0,1094,1092,1,0,0,0,1095, - 1096,3,345,171,0,1096,1098,1,0,0,0,1097,1054,1,0,0,0,1097,1065,1, - 0,0,0,1097,1081,1,0,0,0,1098,214,1,0,0,0,1099,1100,3,221,109,0,1100, - 1104,3,303,150,0,1101,1103,3,283,140,0,1102,1101,1,0,0,0,1103,1106, - 1,0,0,0,1104,1102,1,0,0,0,1104,1105,1,0,0,0,1105,1109,1,0,0,0,1106, - 1104,1,0,0,0,1107,1110,3,255,126,0,1108,1110,3,233,115,0,1109,1107, - 1,0,0,0,1109,1108,1,0,0,0,1110,1113,1,0,0,0,1111,1114,3,341,169, - 0,1112,1114,3,299,148,0,1113,1111,1,0,0,0,1113,1112,1,0,0,0,1113, - 1114,1,0,0,0,1114,1116,1,0,0,0,1115,1117,3,281,139,0,1116,1115,1, - 0,0,0,1117,1118,1,0,0,0,1118,1116,1,0,0,0,1118,1119,1,0,0,0,1119, - 1176,1,0,0,0,1120,1123,3,221,109,0,1121,1124,3,255,126,0,1122,1124, - 3,233,115,0,1123,1121,1,0,0,0,1123,1122,1,0,0,0,1124,1127,1,0,0, - 0,1125,1128,3,341,169,0,1126,1128,3,299,148,0,1127,1125,1,0,0,0, - 1127,1126,1,0,0,0,1127,1128,1,0,0,0,1128,1130,1,0,0,0,1129,1131, - 3,281,139,0,1130,1129,1,0,0,0,1131,1132,1,0,0,0,1132,1130,1,0,0, - 0,1132,1133,1,0,0,0,1133,1176,1,0,0,0,1134,1135,3,219,108,0,1135, - 1139,3,303,150,0,1136,1138,3,281,139,0,1137,1136,1,0,0,0,1138,1141, - 1,0,0,0,1139,1137,1,0,0,0,1139,1140,1,0,0,0,1140,1142,1,0,0,0,1141, - 1139,1,0,0,0,1142,1145,3,233,115,0,1143,1146,3,341,169,0,1144,1146, - 3,299,148,0,1145,1143,1,0,0,0,1145,1144,1,0,0,0,1145,1146,1,0,0, - 0,1146,1148,1,0,0,0,1147,1149,3,281,139,0,1148,1147,1,0,0,0,1149, - 1150,1,0,0,0,1150,1148,1,0,0,0,1150,1151,1,0,0,0,1151,1176,1,0,0, - 0,1152,1153,3,303,150,0,1153,1154,3,219,108,0,1154,1157,3,233,115, - 0,1155,1158,3,341,169,0,1156,1158,3,299,148,0,1157,1155,1,0,0,0, - 1157,1156,1,0,0,0,1157,1158,1,0,0,0,1158,1160,1,0,0,0,1159,1161, - 3,281,139,0,1160,1159,1,0,0,0,1161,1162,1,0,0,0,1162,1160,1,0,0, - 0,1162,1163,1,0,0,0,1163,1176,1,0,0,0,1164,1165,3,219,108,0,1165, - 1168,3,233,115,0,1166,1169,3,341,169,0,1167,1169,3,299,148,0,1168, - 1166,1,0,0,0,1168,1167,1,0,0,0,1168,1169,1,0,0,0,1169,1171,1,0,0, - 0,1170,1172,3,281,139,0,1171,1170,1,0,0,0,1172,1173,1,0,0,0,1173, - 1171,1,0,0,0,1173,1174,1,0,0,0,1174,1176,1,0,0,0,1175,1099,1,0,0, - 0,1175,1120,1,0,0,0,1175,1134,1,0,0,0,1175,1152,1,0,0,0,1175,1164, - 1,0,0,0,1176,216,1,0,0,0,1177,1179,5,48,0,0,1178,1180,3,279,138, - 0,1179,1178,1,0,0,0,1180,1181,1,0,0,0,1181,1179,1,0,0,0,1181,1182, - 1,0,0,0,1182,218,1,0,0,0,1183,1185,3,281,139,0,1184,1183,1,0,0,0, - 1185,1186,1,0,0,0,1186,1184,1,0,0,0,1186,1187,1,0,0,0,1187,220,1, - 0,0,0,1188,1189,5,48,0,0,1189,1191,3,271,134,0,1190,1192,3,283,140, - 0,1191,1190,1,0,0,0,1192,1193,1,0,0,0,1193,1191,1,0,0,0,1193,1194, - 1,0,0,0,1194,222,1,0,0,0,1195,1206,3,351,174,0,1196,1205,8,2,0,0, - 1197,1205,3,211,104,0,1198,1199,3,291,144,0,1199,1200,3,351,174, - 0,1200,1205,1,0,0,0,1201,1202,3,351,174,0,1202,1203,3,351,174,0, - 1203,1205,1,0,0,0,1204,1196,1,0,0,0,1204,1197,1,0,0,0,1204,1198, - 1,0,0,0,1204,1201,1,0,0,0,1205,1208,1,0,0,0,1206,1204,1,0,0,0,1206, - 1207,1,0,0,0,1207,1209,1,0,0,0,1208,1206,1,0,0,0,1209,1210,3,351, - 174,0,1210,224,1,0,0,0,1211,1212,7,3,0,0,1212,226,1,0,0,0,1213,1214, - 7,4,0,0,1214,228,1,0,0,0,1215,1216,7,5,0,0,1216,230,1,0,0,0,1217, - 1218,7,6,0,0,1218,232,1,0,0,0,1219,1220,7,7,0,0,1220,234,1,0,0,0, - 1221,1222,7,8,0,0,1222,236,1,0,0,0,1223,1224,7,9,0,0,1224,238,1, - 0,0,0,1225,1226,7,10,0,0,1226,240,1,0,0,0,1227,1228,7,11,0,0,1228, - 242,1,0,0,0,1229,1230,7,12,0,0,1230,244,1,0,0,0,1231,1232,7,13,0, - 0,1232,246,1,0,0,0,1233,1234,7,14,0,0,1234,248,1,0,0,0,1235,1236, - 7,15,0,0,1236,250,1,0,0,0,1237,1238,7,16,0,0,1238,252,1,0,0,0,1239, - 1240,7,17,0,0,1240,254,1,0,0,0,1241,1242,7,18,0,0,1242,256,1,0,0, - 0,1243,1244,7,19,0,0,1244,258,1,0,0,0,1245,1246,7,20,0,0,1246,260, - 1,0,0,0,1247,1248,7,21,0,0,1248,262,1,0,0,0,1249,1250,7,22,0,0,1250, - 264,1,0,0,0,1251,1252,7,23,0,0,1252,266,1,0,0,0,1253,1254,7,24,0, - 0,1254,268,1,0,0,0,1255,1256,7,25,0,0,1256,270,1,0,0,0,1257,1258, - 7,26,0,0,1258,272,1,0,0,0,1259,1260,7,27,0,0,1260,274,1,0,0,0,1261, - 1262,7,28,0,0,1262,276,1,0,0,0,1263,1264,7,29,0,0,1264,278,1,0,0, - 0,1265,1266,7,30,0,0,1266,280,1,0,0,0,1267,1268,7,31,0,0,1268,282, - 1,0,0,0,1269,1270,7,32,0,0,1270,284,1,0,0,0,1271,1272,5,45,0,0,1272, - 1273,5,62,0,0,1273,286,1,0,0,0,1274,1275,5,42,0,0,1275,288,1,0,0, - 0,1276,1277,5,96,0,0,1277,290,1,0,0,0,1278,1279,5,92,0,0,1279,292, - 1,0,0,0,1280,1281,5,58,0,0,1281,294,1,0,0,0,1282,1283,5,44,0,0,1283, - 296,1,0,0,0,1284,1285,5,124,0,0,1285,1286,5,124,0,0,1286,298,1,0, - 0,0,1287,1288,5,45,0,0,1288,300,1,0,0,0,1289,1290,5,36,0,0,1290, - 302,1,0,0,0,1291,1292,5,46,0,0,1292,304,1,0,0,0,1293,1294,5,61,0, - 0,1294,1295,5,61,0,0,1295,306,1,0,0,0,1296,1297,5,61,0,0,1297,308, - 1,0,0,0,1298,1299,5,62,0,0,1299,1300,5,61,0,0,1300,310,1,0,0,0,1301, - 1302,5,62,0,0,1302,312,1,0,0,0,1303,1304,5,35,0,0,1304,314,1,0,0, - 0,1305,1306,5,126,0,0,1306,1307,5,42,0,0,1307,316,1,0,0,0,1308,1309, - 5,61,0,0,1309,1310,5,126,0,0,1310,1311,5,42,0,0,1311,318,1,0,0,0, - 1312,1313,5,123,0,0,1313,1314,1,0,0,0,1314,1315,6,158,0,0,1315,320, - 1,0,0,0,1316,1317,5,91,0,0,1317,322,1,0,0,0,1318,1319,5,40,0,0,1319, - 324,1,0,0,0,1320,1321,5,60,0,0,1321,1322,5,61,0,0,1322,326,1,0,0, - 0,1323,1324,5,60,0,0,1324,328,1,0,0,0,1325,1326,5,33,0,0,1326,1330, - 5,61,0,0,1327,1328,5,60,0,0,1328,1330,5,62,0,0,1329,1325,1,0,0,0, - 1329,1327,1,0,0,0,1330,330,1,0,0,0,1331,1332,5,33,0,0,1332,1333, - 5,126,0,0,1333,1334,5,42,0,0,1334,332,1,0,0,0,1335,1336,5,33,0,0, - 1336,1337,5,126,0,0,1337,334,1,0,0,0,1338,1339,5,63,0,0,1339,1340, - 5,46,0,0,1340,336,1,0,0,0,1341,1342,5,63,0,0,1342,1343,5,63,0,0, - 1343,338,1,0,0,0,1344,1345,5,37,0,0,1345,340,1,0,0,0,1346,1347,5, - 43,0,0,1347,342,1,0,0,0,1348,1349,5,63,0,0,1349,344,1,0,0,0,1350, - 1351,5,34,0,0,1351,346,1,0,0,0,1352,1353,5,102,0,0,1353,1354,5,39, - 0,0,1354,1355,1,0,0,0,1355,1356,6,172,1,0,1356,348,1,0,0,0,1357, - 1358,5,70,0,0,1358,1359,5,39,0,0,1359,1360,1,0,0,0,1360,1361,6,173, - 2,0,1361,350,1,0,0,0,1362,1363,5,39,0,0,1363,352,1,0,0,0,1364,1365, - 5,126,0,0,1365,354,1,0,0,0,1366,1367,5,61,0,0,1367,1368,5,126,0, - 0,1368,356,1,0,0,0,1369,1370,5,125,0,0,1370,1371,1,0,0,0,1371,1372, - 6,177,3,0,1372,358,1,0,0,0,1373,1374,5,93,0,0,1374,360,1,0,0,0,1375, - 1376,5,41,0,0,1376,362,1,0,0,0,1377,1378,5,59,0,0,1378,364,1,0,0, - 0,1379,1380,5,47,0,0,1380,366,1,0,0,0,1381,1382,5,95,0,0,1382,368, - 1,0,0,0,1383,1384,5,47,0,0,1384,1385,5,42,0,0,1385,1389,1,0,0,0, - 1386,1388,9,0,0,0,1387,1386,1,0,0,0,1388,1391,1,0,0,0,1389,1390, - 1,0,0,0,1389,1387,1,0,0,0,1390,1392,1,0,0,0,1391,1389,1,0,0,0,1392, - 1393,5,42,0,0,1393,1394,5,47,0,0,1394,1395,1,0,0,0,1395,1396,6,183, - 4,0,1396,370,1,0,0,0,1397,1398,5,45,0,0,1398,1402,5,45,0,0,1399, - 1400,5,47,0,0,1400,1402,5,47,0,0,1401,1397,1,0,0,0,1401,1399,1,0, - 0,0,1402,1406,1,0,0,0,1403,1405,8,33,0,0,1404,1403,1,0,0,0,1405, - 1408,1,0,0,0,1406,1404,1,0,0,0,1406,1407,1,0,0,0,1407,1410,1,0,0, - 0,1408,1406,1,0,0,0,1409,1411,7,34,0,0,1410,1409,1,0,0,0,1411,1412, - 1,0,0,0,1412,1413,6,184,4,0,1413,372,1,0,0,0,1414,1415,7,35,0,0, - 1415,1416,1,0,0,0,1416,1417,6,185,5,0,1417,374,1,0,0,0,1418,1430, - 8,36,0,0,1419,1430,3,211,104,0,1420,1421,3,291,144,0,1421,1422,3, - 351,174,0,1422,1430,1,0,0,0,1423,1424,3,291,144,0,1424,1425,3,319, - 158,0,1425,1430,1,0,0,0,1426,1427,3,351,174,0,1427,1428,3,351,174, - 0,1428,1430,1,0,0,0,1429,1418,1,0,0,0,1429,1419,1,0,0,0,1429,1420, - 1,0,0,0,1429,1423,1,0,0,0,1429,1426,1,0,0,0,1430,1431,1,0,0,0,1431, - 1429,1,0,0,0,1431,1432,1,0,0,0,1432,376,1,0,0,0,1433,1434,3,319, - 158,0,1434,1435,1,0,0,0,1435,1436,6,187,0,0,1436,378,1,0,0,0,1437, - 1438,3,351,174,0,1438,1439,1,0,0,0,1439,1440,6,188,6,0,1440,1441, - 6,188,3,0,1441,380,1,0,0,0,1442,1448,8,37,0,0,1443,1448,3,211,104, - 0,1444,1445,3,291,144,0,1445,1446,3,319,158,0,1446,1448,1,0,0,0, - 1447,1442,1,0,0,0,1447,1443,1,0,0,0,1447,1444,1,0,0,0,1448,1449, - 1,0,0,0,1449,1447,1,0,0,0,1449,1450,1,0,0,0,1450,382,1,0,0,0,1451, - 1452,3,319,158,0,1452,1453,1,0,0,0,1453,1454,6,190,0,0,1454,384, - 1,0,0,0,44,0,1,2,425,646,1020,1049,1054,1060,1062,1074,1076,1090, - 1092,1097,1104,1109,1113,1118,1123,1127,1132,1139,1145,1150,1157, - 1162,1168,1173,1175,1181,1186,1193,1204,1206,1329,1389,1401,1406, - 1410,1429,1431,1447,1449,7,5,0,0,5,1,0,5,2,0,4,0,0,6,0,0,0,1,0,7, - 145,0 + 7,190,2,191,7,191,2,192,7,192,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1, + 2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1, + 5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3, + 6,430,8,6,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1, + 9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,12,1, + 12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1, + 14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1, + 16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1, + 18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1, + 20,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1, + 22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, + 24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1, + 26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1, + 28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1, + 30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1, + 34,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1, + 37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1, + 39,1,39,1,40,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1, + 42,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1, + 44,1,44,1,44,1,44,3,44,658,8,44,1,45,1,45,1,45,1,45,1,45,1,45,1, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1, + 47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1, + 49,1,50,1,50,1,50,1,50,1,51,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,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1, + 54,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1, + 57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1, + 59,1,59,1,59,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1, + 62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1, + 64,1,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1, + 67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1, + 69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1, + 70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1, + 72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1, + 74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1, + 76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,78,1,78,1, + 78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1, + 80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1, + 82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1, + 84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1, + 85,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,88,1, + 88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,90,1, + 90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1, + 92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1, + 94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1, + 96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1, + 97,1,98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,100, + 1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,102, + 1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103, + 1,103,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105, + 1,105,1,105,1,105,1,105,1,105,3,105,1042,8,105,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,3,106,1071,8,106,1,107,1,107,1,107,3,107,1076,8,107, + 1,107,1,107,1,107,1,107,5,107,1082,8,107,10,107,12,107,1085,9,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,5,107,1096, + 8,107,10,107,12,107,1099,9,107,1,107,1,107,1,107,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,5,107,1112,8,107,10,107,12,107,1115, + 9,107,1,107,1,107,3,107,1119,8,107,1,108,1,108,1,108,5,108,1124, + 8,108,10,108,12,108,1127,9,108,1,108,1,108,3,108,1131,8,108,1,108, + 1,108,3,108,1135,8,108,1,108,4,108,1138,8,108,11,108,12,108,1139, + 1,108,1,108,1,108,3,108,1145,8,108,1,108,1,108,3,108,1149,8,108, + 1,108,4,108,1152,8,108,11,108,12,108,1153,1,108,1,108,1,108,5,108, + 1159,8,108,10,108,12,108,1162,9,108,1,108,1,108,1,108,3,108,1167, + 8,108,1,108,4,108,1170,8,108,11,108,12,108,1171,1,108,1,108,1,108, + 1,108,1,108,3,108,1179,8,108,1,108,4,108,1182,8,108,11,108,12,108, + 1183,1,108,1,108,1,108,1,108,3,108,1190,8,108,1,108,4,108,1193,8, + 108,11,108,12,108,1194,3,108,1197,8,108,1,109,1,109,4,109,1201,8, + 109,11,109,12,109,1202,1,110,4,110,1206,8,110,11,110,12,110,1207, + 1,111,1,111,1,111,4,111,1213,8,111,11,111,12,111,1214,1,112,1,112, + 1,112,1,112,1,112,1,112,1,112,1,112,1,112,5,112,1226,8,112,10,112, + 12,112,1229,9,112,1,112,1,112,1,113,1,113,1,114,1,114,1,115,1,115, + 1,116,1,116,1,117,1,117,1,118,1,118,1,119,1,119,1,120,1,120,1,121, + 1,121,1,122,1,122,1,123,1,123,1,124,1,124,1,125,1,125,1,126,1,126, + 1,127,1,127,1,128,1,128,1,129,1,129,1,130,1,130,1,131,1,131,1,132, + 1,132,1,133,1,133,1,134,1,134,1,135,1,135,1,136,1,136,1,137,1,137, + 1,138,1,138,1,139,1,139,1,140,1,140,1,141,1,141,1,142,1,142,1,143, + 1,143,1,143,1,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147,1,148, + 1,148,1,149,1,149,1,149,1,150,1,150,1,151,1,151,1,152,1,152,1,153, + 1,153,1,153,1,154,1,154,1,155,1,155,1,155,1,156,1,156,1,157,1,157, + 1,158,1,158,1,158,1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160, + 1,161,1,161,1,162,1,162,1,163,1,163,1,163,1,164,1,164,1,165,1,165, + 1,165,1,165,3,165,1351,8,165,1,166,1,166,1,166,1,166,1,167,1,167, + 1,167,1,168,1,168,1,168,1,169,1,169,1,169,1,170,1,170,1,171,1,171, + 1,172,1,172,1,173,1,173,1,174,1,174,1,174,1,174,1,174,1,175,1,175, + 1,175,1,175,1,175,1,176,1,176,1,177,1,177,1,178,1,178,1,178,1,179, + 1,179,1,179,1,179,1,180,1,180,1,181,1,181,1,182,1,182,1,183,1,183, + 1,184,1,184,1,185,1,185,1,185,1,185,5,185,1409,8,185,10,185,12,185, + 1412,9,185,1,185,1,185,1,185,1,185,1,185,1,186,1,186,1,186,1,186, + 3,186,1423,8,186,1,186,5,186,1426,8,186,10,186,12,186,1429,9,186, + 1,186,3,186,1432,8,186,1,186,1,186,1,187,1,187,1,187,1,187,1,188, + 1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,4,188, + 1451,8,188,11,188,12,188,1452,1,189,1,189,1,189,1,189,1,190,1,190, + 1,190,1,190,1,190,1,191,1,191,1,191,1,191,1,191,4,191,1469,8,191, + 11,191,12,191,1470,1,192,1,192,1,192,1,192,1,1410,0,193,3,1,5,2, + 7,3,9,4,11,5,13,6,15,7,17,8,19,9,21,10,23,11,25,12,27,13,29,14,31, + 15,33,16,35,17,37,18,39,19,41,20,43,21,45,22,47,23,49,24,51,25,53, + 26,55,27,57,28,59,29,61,30,63,31,65,32,67,33,69,34,71,35,73,36,75, + 37,77,38,79,39,81,40,83,41,85,42,87,43,89,44,91,45,93,46,95,47,97, + 48,99,49,101,50,103,51,105,52,107,53,109,54,111,55,113,56,115,57, + 117,58,119,59,121,60,123,61,125,62,127,63,129,64,131,65,133,66,135, + 67,137,68,139,69,141,70,143,71,145,72,147,73,149,74,151,75,153,76, + 155,77,157,78,159,79,161,80,163,81,165,82,167,83,169,84,171,85,173, + 86,175,87,177,88,179,89,181,90,183,91,185,92,187,93,189,94,191,95, + 193,96,195,97,197,98,199,99,201,100,203,101,205,102,207,103,209, + 104,211,105,213,106,215,107,217,108,219,109,221,110,223,111,225, + 112,227,113,229,0,231,0,233,0,235,0,237,0,239,0,241,0,243,0,245, + 0,247,0,249,0,251,0,253,0,255,0,257,0,259,0,261,0,263,0,265,0,267, + 0,269,0,271,0,273,0,275,0,277,0,279,0,281,0,283,0,285,0,287,0,289, + 114,291,115,293,116,295,117,297,118,299,119,301,120,303,121,305, + 122,307,123,309,124,311,125,313,126,315,127,317,128,319,129,321, + 130,323,131,325,132,327,133,329,134,331,135,333,136,335,137,337, + 138,339,139,341,140,343,141,345,142,347,143,349,144,351,145,353, + 146,355,147,357,148,359,149,361,150,363,151,365,152,367,153,369, + 154,371,155,373,156,375,157,377,158,379,159,381,160,383,0,385,161, + 387,162,3,0,1,2,38,2,0,92,92,96,96,2,0,34,34,92,92,2,0,39,39,92, + 92,2,0,65,65,97,97,2,0,66,66,98,98,2,0,67,67,99,99,2,0,68,68,100, + 100,2,0,69,69,101,101,2,0,70,70,102,102,2,0,71,71,103,103,2,0,72, + 72,104,104,2,0,73,73,105,105,2,0,74,74,106,106,2,0,75,75,107,107, + 2,0,76,76,108,108,2,0,77,77,109,109,2,0,78,78,110,110,2,0,79,79, + 111,111,2,0,80,80,112,112,2,0,81,81,113,113,2,0,82,82,114,114,2, + 0,83,83,115,115,2,0,84,84,116,116,2,0,85,85,117,117,2,0,86,86,118, + 118,2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121,121,2,0,90, + 90,122,122,2,0,65,90,97,122,1,0,48,55,1,0,48,57,3,0,48,57,65,70, + 97,102,2,0,10,10,13,13,2,1,10,10,13,13,2,0,9,13,32,32,3,0,39,39, + 92,92,123,123,1,0,123,123,1512,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0, + 0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0, + 0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0, + 0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0, + 0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0, + 0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0, + 0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0, + 0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0, + 0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0, + 0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0, + 0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1, + 0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0, + 117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0, + 0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135, + 1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0, + 0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1, + 0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0, + 163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0, + 0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181, + 1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0, + 0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1, + 0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0, + 209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0, + 0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227, + 1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0, + 0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1, + 0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0, + 315,1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0,323,1,0, + 0,0,0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,331,1,0,0,0,0,333, + 1,0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,0,0, + 0,343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1, + 0,0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0, + 361,1,0,0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0,369,1,0, + 0,0,0,371,1,0,0,0,0,373,1,0,0,0,0,375,1,0,0,0,0,377,1,0,0,0,1,379, + 1,0,0,0,1,381,1,0,0,0,1,383,1,0,0,0,2,385,1,0,0,0,2,387,1,0,0,0, + 3,389,1,0,0,0,5,393,1,0,0,0,7,397,1,0,0,0,9,402,1,0,0,0,11,406,1, + 0,0,0,13,412,1,0,0,0,15,429,1,0,0,0,17,431,1,0,0,0,19,436,1,0,0, + 0,21,444,1,0,0,0,23,449,1,0,0,0,25,452,1,0,0,0,27,457,1,0,0,0,29, + 462,1,0,0,0,31,468,1,0,0,0,33,475,1,0,0,0,35,483,1,0,0,0,37,489, + 1,0,0,0,39,494,1,0,0,0,41,502,1,0,0,0,43,507,1,0,0,0,45,511,1,0, + 0,0,47,516,1,0,0,0,49,527,1,0,0,0,51,536,1,0,0,0,53,541,1,0,0,0, + 55,545,1,0,0,0,57,552,1,0,0,0,59,560,1,0,0,0,61,566,1,0,0,0,63,574, + 1,0,0,0,65,580,1,0,0,0,67,583,1,0,0,0,69,593,1,0,0,0,71,597,1,0, + 0,0,73,602,1,0,0,0,75,607,1,0,0,0,77,611,1,0,0,0,79,617,1,0,0,0, + 81,624,1,0,0,0,83,629,1,0,0,0,85,632,1,0,0,0,87,635,1,0,0,0,89,641, + 1,0,0,0,91,657,1,0,0,0,93,659,1,0,0,0,95,665,1,0,0,0,97,675,1,0, + 0,0,99,684,1,0,0,0,101,687,1,0,0,0,103,692,1,0,0,0,105,696,1,0,0, + 0,107,701,1,0,0,0,109,709,1,0,0,0,111,714,1,0,0,0,113,718,1,0,0, + 0,115,723,1,0,0,0,117,729,1,0,0,0,119,736,1,0,0,0,121,742,1,0,0, + 0,123,746,1,0,0,0,125,750,1,0,0,0,127,755,1,0,0,0,129,761,1,0,0, + 0,131,768,1,0,0,0,133,771,1,0,0,0,135,774,1,0,0,0,137,780,1,0,0, + 0,139,786,1,0,0,0,141,791,1,0,0,0,143,801,1,0,0,0,145,811,1,0,0, + 0,147,820,1,0,0,0,149,828,1,0,0,0,151,834,1,0,0,0,153,841,1,0,0, + 0,155,847,1,0,0,0,157,854,1,0,0,0,159,858,1,0,0,0,161,863,1,0,0, + 0,163,870,1,0,0,0,165,877,1,0,0,0,167,884,1,0,0,0,169,889,1,0,0, + 0,171,898,1,0,0,0,173,908,1,0,0,0,175,913,1,0,0,0,177,919,1,0,0, + 0,179,924,1,0,0,0,181,934,1,0,0,0,183,937,1,0,0,0,185,941,1,0,0, + 0,187,948,1,0,0,0,189,957,1,0,0,0,191,962,1,0,0,0,193,971,1,0,0, + 0,195,975,1,0,0,0,197,985,1,0,0,0,199,991,1,0,0,0,201,997,1,0,0, + 0,203,1002,1,0,0,0,205,1007,1,0,0,0,207,1013,1,0,0,0,209,1019,1, + 0,0,0,211,1026,1,0,0,0,213,1041,1,0,0,0,215,1070,1,0,0,0,217,1118, + 1,0,0,0,219,1196,1,0,0,0,221,1198,1,0,0,0,223,1205,1,0,0,0,225,1209, + 1,0,0,0,227,1216,1,0,0,0,229,1232,1,0,0,0,231,1234,1,0,0,0,233,1236, + 1,0,0,0,235,1238,1,0,0,0,237,1240,1,0,0,0,239,1242,1,0,0,0,241,1244, + 1,0,0,0,243,1246,1,0,0,0,245,1248,1,0,0,0,247,1250,1,0,0,0,249,1252, + 1,0,0,0,251,1254,1,0,0,0,253,1256,1,0,0,0,255,1258,1,0,0,0,257,1260, + 1,0,0,0,259,1262,1,0,0,0,261,1264,1,0,0,0,263,1266,1,0,0,0,265,1268, + 1,0,0,0,267,1270,1,0,0,0,269,1272,1,0,0,0,271,1274,1,0,0,0,273,1276, + 1,0,0,0,275,1278,1,0,0,0,277,1280,1,0,0,0,279,1282,1,0,0,0,281,1284, + 1,0,0,0,283,1286,1,0,0,0,285,1288,1,0,0,0,287,1290,1,0,0,0,289,1292, + 1,0,0,0,291,1295,1,0,0,0,293,1297,1,0,0,0,295,1299,1,0,0,0,297,1301, + 1,0,0,0,299,1303,1,0,0,0,301,1305,1,0,0,0,303,1308,1,0,0,0,305,1310, + 1,0,0,0,307,1312,1,0,0,0,309,1314,1,0,0,0,311,1317,1,0,0,0,313,1319, + 1,0,0,0,315,1322,1,0,0,0,317,1324,1,0,0,0,319,1326,1,0,0,0,321,1329, + 1,0,0,0,323,1333,1,0,0,0,325,1337,1,0,0,0,327,1339,1,0,0,0,329,1341, + 1,0,0,0,331,1344,1,0,0,0,333,1350,1,0,0,0,335,1352,1,0,0,0,337,1356, + 1,0,0,0,339,1359,1,0,0,0,341,1362,1,0,0,0,343,1365,1,0,0,0,345,1367, + 1,0,0,0,347,1369,1,0,0,0,349,1371,1,0,0,0,351,1373,1,0,0,0,353,1378, + 1,0,0,0,355,1383,1,0,0,0,357,1385,1,0,0,0,359,1387,1,0,0,0,361,1390, + 1,0,0,0,363,1394,1,0,0,0,365,1396,1,0,0,0,367,1398,1,0,0,0,369,1400, + 1,0,0,0,371,1402,1,0,0,0,373,1404,1,0,0,0,375,1422,1,0,0,0,377,1435, + 1,0,0,0,379,1450,1,0,0,0,381,1454,1,0,0,0,383,1458,1,0,0,0,385,1468, + 1,0,0,0,387,1472,1,0,0,0,389,390,3,229,113,0,390,391,3,251,124,0, + 391,392,3,251,124,0,392,4,1,0,0,0,393,394,3,229,113,0,394,395,3, + 255,126,0,395,396,3,235,116,0,396,6,1,0,0,0,397,398,3,229,113,0, + 398,399,3,255,126,0,399,400,3,267,132,0,400,401,3,245,121,0,401, + 8,1,0,0,0,402,403,3,229,113,0,403,404,3,255,126,0,404,405,3,277, + 137,0,405,10,1,0,0,0,406,407,3,229,113,0,407,408,3,263,130,0,408, + 409,3,263,130,0,409,410,3,229,113,0,410,411,3,277,137,0,411,12,1, + 0,0,0,412,413,3,229,113,0,413,414,3,265,131,0,414,14,1,0,0,0,415, + 416,3,229,113,0,416,417,3,265,131,0,417,418,3,233,115,0,418,430, + 1,0,0,0,419,420,3,229,113,0,420,421,3,265,131,0,421,422,3,233,115, + 0,422,423,3,237,117,0,423,424,3,255,126,0,424,425,3,235,116,0,425, + 426,3,245,121,0,426,427,3,255,126,0,427,428,3,241,119,0,428,430, + 1,0,0,0,429,415,1,0,0,0,429,419,1,0,0,0,430,16,1,0,0,0,431,432,3, + 229,113,0,432,433,3,265,131,0,433,434,3,257,127,0,434,435,3,239, + 118,0,435,18,1,0,0,0,436,437,3,231,114,0,437,438,3,237,117,0,438, + 439,3,267,132,0,439,440,3,273,135,0,440,441,3,237,117,0,441,442, + 3,237,117,0,442,443,3,255,126,0,443,20,1,0,0,0,444,445,3,231,114, + 0,445,446,3,257,127,0,446,447,3,267,132,0,447,448,3,243,120,0,448, + 22,1,0,0,0,449,450,3,231,114,0,450,451,3,277,137,0,451,24,1,0,0, + 0,452,453,3,233,115,0,453,454,3,229,113,0,454,455,3,265,131,0,455, + 456,3,237,117,0,456,26,1,0,0,0,457,458,3,233,115,0,458,459,3,229, + 113,0,459,460,3,265,131,0,460,461,3,267,132,0,461,28,1,0,0,0,462, + 463,3,233,115,0,463,464,3,229,113,0,464,465,3,267,132,0,465,466, + 3,233,115,0,466,467,3,243,120,0,467,30,1,0,0,0,468,469,3,233,115, + 0,469,470,3,257,127,0,470,471,3,243,120,0,471,472,3,257,127,0,472, + 473,3,263,130,0,473,474,3,267,132,0,474,32,1,0,0,0,475,476,3,233, + 115,0,476,477,3,257,127,0,477,478,3,251,124,0,478,479,3,251,124, + 0,479,480,3,229,113,0,480,481,3,267,132,0,481,482,3,237,117,0,482, + 34,1,0,0,0,483,484,3,233,115,0,484,485,3,263,130,0,485,486,3,257, + 127,0,486,487,3,265,131,0,487,488,3,265,131,0,488,36,1,0,0,0,489, + 490,3,233,115,0,490,491,3,269,133,0,491,492,3,231,114,0,492,493, + 3,237,117,0,493,38,1,0,0,0,494,495,3,233,115,0,495,496,3,269,133, + 0,496,497,3,263,130,0,497,498,3,263,130,0,498,499,3,237,117,0,499, + 500,3,255,126,0,500,501,3,267,132,0,501,40,1,0,0,0,502,503,3,235, + 116,0,503,504,3,229,113,0,504,505,3,267,132,0,505,506,3,237,117, + 0,506,42,1,0,0,0,507,508,3,235,116,0,508,509,3,229,113,0,509,510, + 3,277,137,0,510,44,1,0,0,0,511,512,3,235,116,0,512,513,3,237,117, + 0,513,514,3,265,131,0,514,515,3,233,115,0,515,46,1,0,0,0,516,517, + 3,235,116,0,517,518,3,237,117,0,518,519,3,265,131,0,519,520,3,233, + 115,0,520,521,3,237,117,0,521,522,3,255,126,0,522,523,3,235,116, + 0,523,524,3,245,121,0,524,525,3,255,126,0,525,526,3,241,119,0,526, + 48,1,0,0,0,527,528,3,235,116,0,528,529,3,245,121,0,529,530,3,265, + 131,0,530,531,3,267,132,0,531,532,3,245,121,0,532,533,3,255,126, + 0,533,534,3,233,115,0,534,535,3,267,132,0,535,50,1,0,0,0,536,537, + 3,237,117,0,537,538,3,251,124,0,538,539,3,265,131,0,539,540,3,237, + 117,0,540,52,1,0,0,0,541,542,3,237,117,0,542,543,3,255,126,0,543, + 544,3,235,116,0,544,54,1,0,0,0,545,546,3,237,117,0,546,547,3,275, + 136,0,547,548,3,233,115,0,548,549,3,237,117,0,549,550,3,259,128, + 0,550,551,3,267,132,0,551,56,1,0,0,0,552,553,3,237,117,0,553,554, + 3,275,136,0,554,555,3,267,132,0,555,556,3,263,130,0,556,557,3,229, + 113,0,557,558,3,233,115,0,558,559,3,267,132,0,559,58,1,0,0,0,560, + 561,3,239,118,0,561,562,3,245,121,0,562,563,3,255,126,0,563,564, + 3,229,113,0,564,565,3,251,124,0,565,60,1,0,0,0,566,567,3,239,118, + 0,567,568,3,245,121,0,568,569,3,255,126,0,569,570,3,229,113,0,570, + 571,3,251,124,0,571,572,3,251,124,0,572,573,3,277,137,0,573,62,1, + 0,0,0,574,575,3,239,118,0,575,576,3,245,121,0,576,577,3,263,130, + 0,577,578,3,265,131,0,578,579,3,267,132,0,579,64,1,0,0,0,580,581, + 3,239,118,0,581,582,3,255,126,0,582,66,1,0,0,0,583,584,3,239,118, + 0,584,585,3,257,127,0,585,586,3,251,124,0,586,587,3,251,124,0,587, + 588,3,257,127,0,588,589,3,273,135,0,589,590,3,245,121,0,590,591, + 3,255,126,0,591,592,3,241,119,0,592,68,1,0,0,0,593,594,3,239,118, + 0,594,595,3,257,127,0,595,596,3,263,130,0,596,70,1,0,0,0,597,598, + 3,239,118,0,598,599,3,263,130,0,599,600,3,257,127,0,600,601,3,253, + 125,0,601,72,1,0,0,0,602,603,3,239,118,0,603,604,3,269,133,0,604, + 605,3,251,124,0,605,606,3,251,124,0,606,74,1,0,0,0,607,608,3,239, + 118,0,608,609,3,269,133,0,609,610,3,255,126,0,610,76,1,0,0,0,611, + 612,3,241,119,0,612,613,3,263,130,0,613,614,3,257,127,0,614,615, + 3,269,133,0,615,616,3,259,128,0,616,78,1,0,0,0,617,618,3,243,120, + 0,618,619,3,229,113,0,619,620,3,271,134,0,620,621,3,245,121,0,621, + 622,3,255,126,0,622,623,3,241,119,0,623,80,1,0,0,0,624,625,3,243, + 120,0,625,626,3,257,127,0,626,627,3,269,133,0,627,628,3,263,130, + 0,628,82,1,0,0,0,629,630,3,245,121,0,630,631,3,235,116,0,631,84, + 1,0,0,0,632,633,3,245,121,0,633,634,3,239,118,0,634,86,1,0,0,0,635, + 636,3,245,121,0,636,637,3,251,124,0,637,638,3,245,121,0,638,639, + 3,249,123,0,639,640,3,237,117,0,640,88,1,0,0,0,641,642,3,245,121, + 0,642,643,3,255,126,0,643,90,1,0,0,0,644,645,3,245,121,0,645,646, + 3,255,126,0,646,647,3,239,118,0,647,658,1,0,0,0,648,649,3,245,121, + 0,649,650,3,255,126,0,650,651,3,239,118,0,651,652,3,245,121,0,652, + 653,3,255,126,0,653,654,3,245,121,0,654,655,3,267,132,0,655,656, + 3,277,137,0,656,658,1,0,0,0,657,644,1,0,0,0,657,648,1,0,0,0,658, + 92,1,0,0,0,659,660,3,245,121,0,660,661,3,255,126,0,661,662,3,255, + 126,0,662,663,3,237,117,0,663,664,3,263,130,0,664,94,1,0,0,0,665, + 666,3,245,121,0,666,667,3,255,126,0,667,668,3,267,132,0,668,669, + 3,237,117,0,669,670,3,263,130,0,670,671,3,265,131,0,671,672,3,237, + 117,0,672,673,3,233,115,0,673,674,3,267,132,0,674,96,1,0,0,0,675, + 676,3,245,121,0,676,677,3,255,126,0,677,678,3,267,132,0,678,679, + 3,237,117,0,679,680,3,263,130,0,680,681,3,271,134,0,681,682,3,229, + 113,0,682,683,3,251,124,0,683,98,1,0,0,0,684,685,3,245,121,0,685, + 686,3,265,131,0,686,100,1,0,0,0,687,688,3,247,122,0,688,689,3,257, + 127,0,689,690,3,245,121,0,690,691,3,255,126,0,691,102,1,0,0,0,692, + 693,3,249,123,0,693,694,3,237,117,0,694,695,3,277,137,0,695,104, + 1,0,0,0,696,697,3,251,124,0,697,698,3,229,113,0,698,699,3,265,131, + 0,699,700,3,267,132,0,700,106,1,0,0,0,701,702,3,251,124,0,702,703, + 3,237,117,0,703,704,3,229,113,0,704,705,3,235,116,0,705,706,3,245, + 121,0,706,707,3,255,126,0,707,708,3,241,119,0,708,108,1,0,0,0,709, + 710,3,251,124,0,710,711,3,237,117,0,711,712,3,239,118,0,712,713, + 3,267,132,0,713,110,1,0,0,0,714,715,3,251,124,0,715,716,3,237,117, + 0,716,717,3,267,132,0,717,112,1,0,0,0,718,719,3,251,124,0,719,720, + 3,245,121,0,720,721,3,249,123,0,721,722,3,237,117,0,722,114,1,0, + 0,0,723,724,3,251,124,0,724,725,3,245,121,0,725,726,3,253,125,0, + 726,727,3,245,121,0,727,728,3,267,132,0,728,116,1,0,0,0,729,730, + 3,253,125,0,730,731,3,245,121,0,731,732,3,255,126,0,732,733,3,269, + 133,0,733,734,3,267,132,0,734,735,3,237,117,0,735,118,1,0,0,0,736, + 737,3,253,125,0,737,738,3,257,127,0,738,739,3,255,126,0,739,740, + 3,267,132,0,740,741,3,243,120,0,741,120,1,0,0,0,742,743,3,255,126, + 0,743,744,3,229,113,0,744,745,3,255,126,0,745,122,1,0,0,0,746,747, + 3,255,126,0,747,748,3,257,127,0,748,749,3,267,132,0,749,124,1,0, + 0,0,750,751,3,255,126,0,751,752,3,269,133,0,752,753,3,251,124,0, + 753,754,3,251,124,0,754,126,1,0,0,0,755,756,3,255,126,0,756,757, + 3,269,133,0,757,758,3,251,124,0,758,759,3,251,124,0,759,760,3,265, + 131,0,760,128,1,0,0,0,761,762,3,257,127,0,762,763,3,239,118,0,763, + 764,3,239,118,0,764,765,3,265,131,0,765,766,3,237,117,0,766,767, + 3,267,132,0,767,130,1,0,0,0,768,769,3,257,127,0,769,770,3,255,126, + 0,770,132,1,0,0,0,771,772,3,257,127,0,772,773,3,263,130,0,773,134, + 1,0,0,0,774,775,3,257,127,0,775,776,3,263,130,0,776,777,3,235,116, + 0,777,778,3,237,117,0,778,779,3,263,130,0,779,136,1,0,0,0,780,781, + 3,257,127,0,781,782,3,269,133,0,782,783,3,267,132,0,783,784,3,237, + 117,0,784,785,3,263,130,0,785,138,1,0,0,0,786,787,3,257,127,0,787, + 788,3,271,134,0,788,789,3,237,117,0,789,790,3,263,130,0,790,140, + 1,0,0,0,791,792,3,259,128,0,792,793,3,229,113,0,793,794,3,263,130, + 0,794,795,3,267,132,0,795,796,3,245,121,0,796,797,3,267,132,0,797, + 798,3,245,121,0,798,799,3,257,127,0,799,800,3,255,126,0,800,142, + 1,0,0,0,801,802,3,259,128,0,802,803,3,263,130,0,803,804,3,237,117, + 0,804,805,3,233,115,0,805,806,3,237,117,0,806,807,3,235,116,0,807, + 808,3,245,121,0,808,809,3,255,126,0,809,810,3,241,119,0,810,144, + 1,0,0,0,811,812,3,259,128,0,812,813,3,263,130,0,813,814,3,237,117, + 0,814,815,3,273,135,0,815,816,3,243,120,0,816,817,3,237,117,0,817, + 818,3,263,130,0,818,819,3,237,117,0,819,146,1,0,0,0,820,821,3,261, + 129,0,821,822,3,269,133,0,822,823,3,229,113,0,823,824,3,263,130, + 0,824,825,3,267,132,0,825,826,3,237,117,0,826,827,3,263,130,0,827, + 148,1,0,0,0,828,829,3,263,130,0,829,830,3,229,113,0,830,831,3,255, + 126,0,831,832,3,241,119,0,832,833,3,237,117,0,833,150,1,0,0,0,834, + 835,3,263,130,0,835,836,3,237,117,0,836,837,3,267,132,0,837,838, + 3,269,133,0,838,839,3,263,130,0,839,840,3,255,126,0,840,152,1,0, + 0,0,841,842,3,263,130,0,842,843,3,245,121,0,843,844,3,241,119,0, + 844,845,3,243,120,0,845,846,3,267,132,0,846,154,1,0,0,0,847,848, + 3,263,130,0,848,849,3,257,127,0,849,850,3,251,124,0,850,851,3,251, + 124,0,851,852,3,269,133,0,852,853,3,259,128,0,853,156,1,0,0,0,854, + 855,3,263,130,0,855,856,3,257,127,0,856,857,3,273,135,0,857,158, + 1,0,0,0,858,859,3,263,130,0,859,860,3,257,127,0,860,861,3,273,135, + 0,861,862,3,265,131,0,862,160,1,0,0,0,863,864,3,265,131,0,864,865, + 3,229,113,0,865,866,3,253,125,0,866,867,3,259,128,0,867,868,3,251, + 124,0,868,869,3,237,117,0,869,162,1,0,0,0,870,871,3,265,131,0,871, + 872,3,237,117,0,872,873,3,233,115,0,873,874,3,257,127,0,874,875, + 3,255,126,0,875,876,3,235,116,0,876,164,1,0,0,0,877,878,3,265,131, + 0,878,879,3,237,117,0,879,880,3,251,124,0,880,881,3,237,117,0,881, + 882,3,233,115,0,882,883,3,267,132,0,883,166,1,0,0,0,884,885,3,265, + 131,0,885,886,3,237,117,0,886,887,3,253,125,0,887,888,3,245,121, + 0,888,168,1,0,0,0,889,890,3,265,131,0,890,891,3,237,117,0,891,892, + 3,267,132,0,892,893,3,267,132,0,893,894,3,245,121,0,894,895,3,255, + 126,0,895,896,3,241,119,0,896,897,3,265,131,0,897,170,1,0,0,0,898, + 899,3,265,131,0,899,900,3,269,133,0,900,901,3,231,114,0,901,902, + 3,265,131,0,902,903,3,267,132,0,903,904,3,263,130,0,904,905,3,245, + 121,0,905,906,3,255,126,0,906,907,3,241,119,0,907,172,1,0,0,0,908, + 909,3,267,132,0,909,910,3,243,120,0,910,911,3,237,117,0,911,912, + 3,255,126,0,912,174,1,0,0,0,913,914,3,267,132,0,914,915,3,243,120, + 0,915,916,3,263,130,0,916,917,3,257,127,0,917,918,3,273,135,0,918, + 176,1,0,0,0,919,920,3,267,132,0,920,921,3,245,121,0,921,922,3,237, + 117,0,922,923,3,265,131,0,923,178,1,0,0,0,924,925,3,267,132,0,925, + 926,3,245,121,0,926,927,3,253,125,0,927,928,3,237,117,0,928,929, + 3,265,131,0,929,930,3,267,132,0,930,931,3,229,113,0,931,932,3,253, + 125,0,932,933,3,259,128,0,933,180,1,0,0,0,934,935,3,267,132,0,935, + 936,3,257,127,0,936,182,1,0,0,0,937,938,3,267,132,0,938,939,3,257, + 127,0,939,940,3,259,128,0,940,184,1,0,0,0,941,942,3,267,132,0,942, + 943,3,257,127,0,943,944,3,267,132,0,944,945,3,229,113,0,945,946, + 3,251,124,0,946,947,3,265,131,0,947,186,1,0,0,0,948,949,3,267,132, + 0,949,950,3,263,130,0,950,951,3,229,113,0,951,952,3,245,121,0,952, + 953,3,251,124,0,953,954,3,245,121,0,954,955,3,255,126,0,955,956, + 3,241,119,0,956,188,1,0,0,0,957,958,3,267,132,0,958,959,3,263,130, + 0,959,960,3,245,121,0,960,961,3,253,125,0,961,190,1,0,0,0,962,963, + 3,267,132,0,963,964,3,263,130,0,964,965,3,269,133,0,965,966,3,255, + 126,0,966,967,3,233,115,0,967,968,3,229,113,0,968,969,3,267,132, + 0,969,970,3,237,117,0,970,192,1,0,0,0,971,972,3,267,132,0,972,973, + 3,263,130,0,973,974,3,277,137,0,974,194,1,0,0,0,975,976,3,269,133, + 0,976,977,3,255,126,0,977,978,3,231,114,0,978,979,3,257,127,0,979, + 980,3,269,133,0,980,981,3,255,126,0,981,982,3,235,116,0,982,983, + 3,237,117,0,983,984,3,235,116,0,984,196,1,0,0,0,985,986,3,269,133, + 0,986,987,3,255,126,0,987,988,3,245,121,0,988,989,3,257,127,0,989, + 990,3,255,126,0,990,198,1,0,0,0,991,992,3,269,133,0,992,993,3,265, + 131,0,993,994,3,245,121,0,994,995,3,255,126,0,995,996,3,241,119, + 0,996,200,1,0,0,0,997,998,3,273,135,0,998,999,3,237,117,0,999,1000, + 3,237,117,0,1000,1001,3,249,123,0,1001,202,1,0,0,0,1002,1003,3,273, + 135,0,1003,1004,3,243,120,0,1004,1005,3,237,117,0,1005,1006,3,255, + 126,0,1006,204,1,0,0,0,1007,1008,3,273,135,0,1008,1009,3,243,120, + 0,1009,1010,3,237,117,0,1010,1011,3,263,130,0,1011,1012,3,237,117, + 0,1012,206,1,0,0,0,1013,1014,3,273,135,0,1014,1015,3,243,120,0,1015, + 1016,3,245,121,0,1016,1017,3,251,124,0,1017,1018,3,237,117,0,1018, + 208,1,0,0,0,1019,1020,3,273,135,0,1020,1021,3,245,121,0,1021,1022, + 3,255,126,0,1022,1023,3,235,116,0,1023,1024,3,257,127,0,1024,1025, + 3,273,135,0,1025,210,1,0,0,0,1026,1027,3,273,135,0,1027,1028,3,245, + 121,0,1028,1029,3,267,132,0,1029,1030,3,243,120,0,1030,212,1,0,0, + 0,1031,1032,3,277,137,0,1032,1033,3,237,117,0,1033,1034,3,229,113, + 0,1034,1035,3,263,130,0,1035,1042,1,0,0,0,1036,1037,3,277,137,0, + 1037,1038,3,277,137,0,1038,1039,3,277,137,0,1039,1040,3,277,137, + 0,1040,1042,1,0,0,0,1041,1031,1,0,0,0,1041,1036,1,0,0,0,1042,214, + 1,0,0,0,1043,1044,3,295,146,0,1044,1045,3,231,114,0,1045,1071,1, + 0,0,0,1046,1047,3,295,146,0,1047,1048,3,239,118,0,1048,1071,1,0, + 0,0,1049,1050,3,295,146,0,1050,1051,3,263,130,0,1051,1071,1,0,0, + 0,1052,1053,3,295,146,0,1053,1054,3,255,126,0,1054,1071,1,0,0,0, + 1055,1056,3,295,146,0,1056,1057,3,267,132,0,1057,1071,1,0,0,0,1058, + 1059,3,295,146,0,1059,1060,5,48,0,0,1060,1071,1,0,0,0,1061,1062, + 3,295,146,0,1062,1063,3,229,113,0,1063,1071,1,0,0,0,1064,1065,3, + 295,146,0,1065,1066,3,271,134,0,1066,1071,1,0,0,0,1067,1068,3,295, + 146,0,1068,1069,3,295,146,0,1069,1071,1,0,0,0,1070,1043,1,0,0,0, + 1070,1046,1,0,0,0,1070,1049,1,0,0,0,1070,1052,1,0,0,0,1070,1055, + 1,0,0,0,1070,1058,1,0,0,0,1070,1061,1,0,0,0,1070,1064,1,0,0,0,1070, + 1067,1,0,0,0,1071,216,1,0,0,0,1072,1076,3,281,139,0,1073,1076,3, + 371,184,0,1074,1076,3,305,151,0,1075,1072,1,0,0,0,1075,1073,1,0, + 0,0,1075,1074,1,0,0,0,1076,1083,1,0,0,0,1077,1082,3,281,139,0,1078, + 1082,3,371,184,0,1079,1082,3,285,141,0,1080,1082,3,305,151,0,1081, + 1077,1,0,0,0,1081,1078,1,0,0,0,1081,1079,1,0,0,0,1081,1080,1,0,0, + 0,1082,1085,1,0,0,0,1083,1081,1,0,0,0,1083,1084,1,0,0,0,1084,1119, + 1,0,0,0,1085,1083,1,0,0,0,1086,1097,3,293,145,0,1087,1096,8,0,0, + 0,1088,1096,3,215,106,0,1089,1090,3,295,146,0,1090,1091,3,355,176, + 0,1091,1096,1,0,0,0,1092,1093,3,293,145,0,1093,1094,3,293,145,0, + 1094,1096,1,0,0,0,1095,1087,1,0,0,0,1095,1088,1,0,0,0,1095,1089, + 1,0,0,0,1095,1092,1,0,0,0,1096,1099,1,0,0,0,1097,1095,1,0,0,0,1097, + 1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097,1,0,0,0,1100,1101,3,293, + 145,0,1101,1119,1,0,0,0,1102,1113,3,349,173,0,1103,1112,8,1,0,0, + 1104,1112,3,215,106,0,1105,1106,3,295,146,0,1106,1107,3,349,173, + 0,1107,1112,1,0,0,0,1108,1109,3,349,173,0,1109,1110,3,349,173,0, + 1110,1112,1,0,0,0,1111,1103,1,0,0,0,1111,1104,1,0,0,0,1111,1105, + 1,0,0,0,1111,1108,1,0,0,0,1112,1115,1,0,0,0,1113,1111,1,0,0,0,1113, + 1114,1,0,0,0,1114,1116,1,0,0,0,1115,1113,1,0,0,0,1116,1117,3,349, + 173,0,1117,1119,1,0,0,0,1118,1075,1,0,0,0,1118,1086,1,0,0,0,1118, + 1102,1,0,0,0,1119,218,1,0,0,0,1120,1121,3,225,111,0,1121,1125,3, + 307,152,0,1122,1124,3,287,142,0,1123,1122,1,0,0,0,1124,1127,1,0, + 0,0,1125,1123,1,0,0,0,1125,1126,1,0,0,0,1126,1130,1,0,0,0,1127,1125, + 1,0,0,0,1128,1131,3,259,128,0,1129,1131,3,237,117,0,1130,1128,1, + 0,0,0,1130,1129,1,0,0,0,1131,1134,1,0,0,0,1132,1135,3,345,171,0, + 1133,1135,3,303,150,0,1134,1132,1,0,0,0,1134,1133,1,0,0,0,1134,1135, + 1,0,0,0,1135,1137,1,0,0,0,1136,1138,3,285,141,0,1137,1136,1,0,0, + 0,1138,1139,1,0,0,0,1139,1137,1,0,0,0,1139,1140,1,0,0,0,1140,1197, + 1,0,0,0,1141,1144,3,225,111,0,1142,1145,3,259,128,0,1143,1145,3, + 237,117,0,1144,1142,1,0,0,0,1144,1143,1,0,0,0,1145,1148,1,0,0,0, + 1146,1149,3,345,171,0,1147,1149,3,303,150,0,1148,1146,1,0,0,0,1148, + 1147,1,0,0,0,1148,1149,1,0,0,0,1149,1151,1,0,0,0,1150,1152,3,285, + 141,0,1151,1150,1,0,0,0,1152,1153,1,0,0,0,1153,1151,1,0,0,0,1153, + 1154,1,0,0,0,1154,1197,1,0,0,0,1155,1156,3,223,110,0,1156,1160,3, + 307,152,0,1157,1159,3,285,141,0,1158,1157,1,0,0,0,1159,1162,1,0, + 0,0,1160,1158,1,0,0,0,1160,1161,1,0,0,0,1161,1163,1,0,0,0,1162,1160, + 1,0,0,0,1163,1166,3,237,117,0,1164,1167,3,345,171,0,1165,1167,3, + 303,150,0,1166,1164,1,0,0,0,1166,1165,1,0,0,0,1166,1167,1,0,0,0, + 1167,1169,1,0,0,0,1168,1170,3,285,141,0,1169,1168,1,0,0,0,1170,1171, + 1,0,0,0,1171,1169,1,0,0,0,1171,1172,1,0,0,0,1172,1197,1,0,0,0,1173, + 1174,3,307,152,0,1174,1175,3,223,110,0,1175,1178,3,237,117,0,1176, + 1179,3,345,171,0,1177,1179,3,303,150,0,1178,1176,1,0,0,0,1178,1177, + 1,0,0,0,1178,1179,1,0,0,0,1179,1181,1,0,0,0,1180,1182,3,285,141, + 0,1181,1180,1,0,0,0,1182,1183,1,0,0,0,1183,1181,1,0,0,0,1183,1184, + 1,0,0,0,1184,1197,1,0,0,0,1185,1186,3,223,110,0,1186,1189,3,237, + 117,0,1187,1190,3,345,171,0,1188,1190,3,303,150,0,1189,1187,1,0, + 0,0,1189,1188,1,0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1193, + 3,285,141,0,1192,1191,1,0,0,0,1193,1194,1,0,0,0,1194,1192,1,0,0, + 0,1194,1195,1,0,0,0,1195,1197,1,0,0,0,1196,1120,1,0,0,0,1196,1141, + 1,0,0,0,1196,1155,1,0,0,0,1196,1173,1,0,0,0,1196,1185,1,0,0,0,1197, + 220,1,0,0,0,1198,1200,5,48,0,0,1199,1201,3,283,140,0,1200,1199,1, + 0,0,0,1201,1202,1,0,0,0,1202,1200,1,0,0,0,1202,1203,1,0,0,0,1203, + 222,1,0,0,0,1204,1206,3,285,141,0,1205,1204,1,0,0,0,1206,1207,1, + 0,0,0,1207,1205,1,0,0,0,1207,1208,1,0,0,0,1208,224,1,0,0,0,1209, + 1210,5,48,0,0,1210,1212,3,275,136,0,1211,1213,3,287,142,0,1212,1211, + 1,0,0,0,1213,1214,1,0,0,0,1214,1212,1,0,0,0,1214,1215,1,0,0,0,1215, + 226,1,0,0,0,1216,1227,3,355,176,0,1217,1226,8,2,0,0,1218,1226,3, + 215,106,0,1219,1220,3,295,146,0,1220,1221,3,355,176,0,1221,1226, + 1,0,0,0,1222,1223,3,355,176,0,1223,1224,3,355,176,0,1224,1226,1, + 0,0,0,1225,1217,1,0,0,0,1225,1218,1,0,0,0,1225,1219,1,0,0,0,1225, + 1222,1,0,0,0,1226,1229,1,0,0,0,1227,1225,1,0,0,0,1227,1228,1,0,0, + 0,1228,1230,1,0,0,0,1229,1227,1,0,0,0,1230,1231,3,355,176,0,1231, + 228,1,0,0,0,1232,1233,7,3,0,0,1233,230,1,0,0,0,1234,1235,7,4,0,0, + 1235,232,1,0,0,0,1236,1237,7,5,0,0,1237,234,1,0,0,0,1238,1239,7, + 6,0,0,1239,236,1,0,0,0,1240,1241,7,7,0,0,1241,238,1,0,0,0,1242,1243, + 7,8,0,0,1243,240,1,0,0,0,1244,1245,7,9,0,0,1245,242,1,0,0,0,1246, + 1247,7,10,0,0,1247,244,1,0,0,0,1248,1249,7,11,0,0,1249,246,1,0,0, + 0,1250,1251,7,12,0,0,1251,248,1,0,0,0,1252,1253,7,13,0,0,1253,250, + 1,0,0,0,1254,1255,7,14,0,0,1255,252,1,0,0,0,1256,1257,7,15,0,0,1257, + 254,1,0,0,0,1258,1259,7,16,0,0,1259,256,1,0,0,0,1260,1261,7,17,0, + 0,1261,258,1,0,0,0,1262,1263,7,18,0,0,1263,260,1,0,0,0,1264,1265, + 7,19,0,0,1265,262,1,0,0,0,1266,1267,7,20,0,0,1267,264,1,0,0,0,1268, + 1269,7,21,0,0,1269,266,1,0,0,0,1270,1271,7,22,0,0,1271,268,1,0,0, + 0,1272,1273,7,23,0,0,1273,270,1,0,0,0,1274,1275,7,24,0,0,1275,272, + 1,0,0,0,1276,1277,7,25,0,0,1277,274,1,0,0,0,1278,1279,7,26,0,0,1279, + 276,1,0,0,0,1280,1281,7,27,0,0,1281,278,1,0,0,0,1282,1283,7,28,0, + 0,1283,280,1,0,0,0,1284,1285,7,29,0,0,1285,282,1,0,0,0,1286,1287, + 7,30,0,0,1287,284,1,0,0,0,1288,1289,7,31,0,0,1289,286,1,0,0,0,1290, + 1291,7,32,0,0,1291,288,1,0,0,0,1292,1293,5,45,0,0,1293,1294,5,62, + 0,0,1294,290,1,0,0,0,1295,1296,5,42,0,0,1296,292,1,0,0,0,1297,1298, + 5,96,0,0,1298,294,1,0,0,0,1299,1300,5,92,0,0,1300,296,1,0,0,0,1301, + 1302,5,58,0,0,1302,298,1,0,0,0,1303,1304,5,44,0,0,1304,300,1,0,0, + 0,1305,1306,5,124,0,0,1306,1307,5,124,0,0,1307,302,1,0,0,0,1308, + 1309,5,45,0,0,1309,304,1,0,0,0,1310,1311,5,36,0,0,1311,306,1,0,0, + 0,1312,1313,5,46,0,0,1313,308,1,0,0,0,1314,1315,5,61,0,0,1315,1316, + 5,61,0,0,1316,310,1,0,0,0,1317,1318,5,61,0,0,1318,312,1,0,0,0,1319, + 1320,5,62,0,0,1320,1321,5,61,0,0,1321,314,1,0,0,0,1322,1323,5,62, + 0,0,1323,316,1,0,0,0,1324,1325,5,35,0,0,1325,318,1,0,0,0,1326,1327, + 5,126,0,0,1327,1328,5,42,0,0,1328,320,1,0,0,0,1329,1330,5,61,0,0, + 1330,1331,5,126,0,0,1331,1332,5,42,0,0,1332,322,1,0,0,0,1333,1334, + 5,123,0,0,1334,1335,1,0,0,0,1335,1336,6,160,0,0,1336,324,1,0,0,0, + 1337,1338,5,91,0,0,1338,326,1,0,0,0,1339,1340,5,40,0,0,1340,328, + 1,0,0,0,1341,1342,5,60,0,0,1342,1343,5,61,0,0,1343,330,1,0,0,0,1344, + 1345,5,60,0,0,1345,332,1,0,0,0,1346,1347,5,33,0,0,1347,1351,5,61, + 0,0,1348,1349,5,60,0,0,1349,1351,5,62,0,0,1350,1346,1,0,0,0,1350, + 1348,1,0,0,0,1351,334,1,0,0,0,1352,1353,5,33,0,0,1353,1354,5,126, + 0,0,1354,1355,5,42,0,0,1355,336,1,0,0,0,1356,1357,5,33,0,0,1357, + 1358,5,126,0,0,1358,338,1,0,0,0,1359,1360,5,63,0,0,1360,1361,5,46, + 0,0,1361,340,1,0,0,0,1362,1363,5,63,0,0,1363,1364,5,63,0,0,1364, + 342,1,0,0,0,1365,1366,5,37,0,0,1366,344,1,0,0,0,1367,1368,5,43,0, + 0,1368,346,1,0,0,0,1369,1370,5,63,0,0,1370,348,1,0,0,0,1371,1372, + 5,34,0,0,1372,350,1,0,0,0,1373,1374,5,102,0,0,1374,1375,5,39,0,0, + 1375,1376,1,0,0,0,1376,1377,6,174,1,0,1377,352,1,0,0,0,1378,1379, + 5,70,0,0,1379,1380,5,39,0,0,1380,1381,1,0,0,0,1381,1382,6,175,2, + 0,1382,354,1,0,0,0,1383,1384,5,39,0,0,1384,356,1,0,0,0,1385,1386, + 5,126,0,0,1386,358,1,0,0,0,1387,1388,5,61,0,0,1388,1389,5,126,0, + 0,1389,360,1,0,0,0,1390,1391,5,125,0,0,1391,1392,1,0,0,0,1392,1393, + 6,179,3,0,1393,362,1,0,0,0,1394,1395,5,93,0,0,1395,364,1,0,0,0,1396, + 1397,5,41,0,0,1397,366,1,0,0,0,1398,1399,5,59,0,0,1399,368,1,0,0, + 0,1400,1401,5,47,0,0,1401,370,1,0,0,0,1402,1403,5,95,0,0,1403,372, + 1,0,0,0,1404,1405,5,47,0,0,1405,1406,5,42,0,0,1406,1410,1,0,0,0, + 1407,1409,9,0,0,0,1408,1407,1,0,0,0,1409,1412,1,0,0,0,1410,1411, + 1,0,0,0,1410,1408,1,0,0,0,1411,1413,1,0,0,0,1412,1410,1,0,0,0,1413, + 1414,5,42,0,0,1414,1415,5,47,0,0,1415,1416,1,0,0,0,1416,1417,6,185, + 4,0,1417,374,1,0,0,0,1418,1419,5,45,0,0,1419,1423,5,45,0,0,1420, + 1421,5,47,0,0,1421,1423,5,47,0,0,1422,1418,1,0,0,0,1422,1420,1,0, + 0,0,1423,1427,1,0,0,0,1424,1426,8,33,0,0,1425,1424,1,0,0,0,1426, + 1429,1,0,0,0,1427,1425,1,0,0,0,1427,1428,1,0,0,0,1428,1431,1,0,0, + 0,1429,1427,1,0,0,0,1430,1432,7,34,0,0,1431,1430,1,0,0,0,1432,1433, + 1,0,0,0,1433,1434,6,186,4,0,1434,376,1,0,0,0,1435,1436,7,35,0,0, + 1436,1437,1,0,0,0,1437,1438,6,187,5,0,1438,378,1,0,0,0,1439,1451, + 8,36,0,0,1440,1451,3,215,106,0,1441,1442,3,295,146,0,1442,1443,3, + 355,176,0,1443,1451,1,0,0,0,1444,1445,3,295,146,0,1445,1446,3,323, + 160,0,1446,1451,1,0,0,0,1447,1448,3,355,176,0,1448,1449,3,355,176, + 0,1449,1451,1,0,0,0,1450,1439,1,0,0,0,1450,1440,1,0,0,0,1450,1441, + 1,0,0,0,1450,1444,1,0,0,0,1450,1447,1,0,0,0,1451,1452,1,0,0,0,1452, + 1450,1,0,0,0,1452,1453,1,0,0,0,1453,380,1,0,0,0,1454,1455,3,323, + 160,0,1455,1456,1,0,0,0,1456,1457,6,189,0,0,1457,382,1,0,0,0,1458, + 1459,3,355,176,0,1459,1460,1,0,0,0,1460,1461,6,190,6,0,1461,1462, + 6,190,3,0,1462,384,1,0,0,0,1463,1469,8,37,0,0,1464,1469,3,215,106, + 0,1465,1466,3,295,146,0,1466,1467,3,323,160,0,1467,1469,1,0,0,0, + 1468,1463,1,0,0,0,1468,1464,1,0,0,0,1468,1465,1,0,0,0,1469,1470, + 1,0,0,0,1470,1468,1,0,0,0,1470,1471,1,0,0,0,1471,386,1,0,0,0,1472, + 1473,3,323,160,0,1473,1474,1,0,0,0,1474,1475,6,192,0,0,1475,388, + 1,0,0,0,44,0,1,2,429,657,1041,1070,1075,1081,1083,1095,1097,1111, + 1113,1118,1125,1130,1134,1139,1144,1148,1153,1160,1166,1171,1178, + 1183,1189,1194,1196,1202,1207,1214,1225,1227,1350,1410,1422,1427, + 1431,1450,1452,1468,1470,7,5,0,0,5,1,0,5,2,0,4,0,0,6,0,0,0,1,0,7, + 147,0 ] class HogQLLexer(Lexer): @@ -621,140 +630,142 @@ class HogQLLexer(Lexer): DISTINCT = 24 ELSE = 25 END = 26 - EXTRACT = 27 - FINAL = 28 - FINALLY = 29 - FIRST = 30 - FN = 31 - FOLLOWING = 32 - FOR = 33 - FROM = 34 - FULL = 35 - FUN = 36 - GROUP = 37 - HAVING = 38 - HOUR = 39 - ID = 40 - IF = 41 - ILIKE = 42 - IN = 43 - INF = 44 - INNER = 45 - INTERVAL = 46 - IS = 47 - JOIN = 48 - KEY = 49 - LAST = 50 - LEADING = 51 - LEFT = 52 - LET = 53 - LIKE = 54 - LIMIT = 55 - MINUTE = 56 - MONTH = 57 - NAN_SQL = 58 - NOT = 59 - NULL_SQL = 60 - NULLS = 61 - OFFSET = 62 - ON = 63 - OR = 64 - ORDER = 65 - OUTER = 66 - OVER = 67 - PARTITION = 68 - PRECEDING = 69 - PREWHERE = 70 - QUARTER = 71 - RANGE = 72 - RETURN = 73 - RIGHT = 74 - ROLLUP = 75 - ROW = 76 - ROWS = 77 - SAMPLE = 78 - SECOND = 79 - SELECT = 80 - SEMI = 81 - SETTINGS = 82 - SUBSTRING = 83 - THEN = 84 - THROW = 85 - TIES = 86 - TIMESTAMP = 87 - TO = 88 - TOP = 89 - TOTALS = 90 - TRAILING = 91 - TRIM = 92 - TRUNCATE = 93 - TRY = 94 - UNBOUNDED = 95 - UNION = 96 - USING = 97 - WEEK = 98 - WHEN = 99 - WHERE = 100 - WHILE = 101 - WINDOW = 102 - WITH = 103 - YEAR = 104 - ESCAPE_CHAR_COMMON = 105 - IDENTIFIER = 106 - FLOATING_LITERAL = 107 - OCTAL_LITERAL = 108 - DECIMAL_LITERAL = 109 - HEXADECIMAL_LITERAL = 110 - STRING_LITERAL = 111 - ARROW = 112 - ASTERISK = 113 - BACKQUOTE = 114 - BACKSLASH = 115 - COLON = 116 - COMMA = 117 - CONCAT = 118 - DASH = 119 - DOLLAR = 120 - DOT = 121 - EQ_DOUBLE = 122 - EQ_SINGLE = 123 - GT_EQ = 124 - GT = 125 - HASH = 126 - IREGEX_SINGLE = 127 - IREGEX_DOUBLE = 128 - LBRACE = 129 - LBRACKET = 130 - LPAREN = 131 - LT_EQ = 132 - LT = 133 - NOT_EQ = 134 - NOT_IREGEX = 135 - NOT_REGEX = 136 - NULL_PROPERTY = 137 - NULLISH = 138 - PERCENT = 139 - PLUS = 140 - QUERY = 141 - QUOTE_DOUBLE = 142 - QUOTE_SINGLE_TEMPLATE = 143 - QUOTE_SINGLE_TEMPLATE_FULL = 144 - QUOTE_SINGLE = 145 - REGEX_SINGLE = 146 - REGEX_DOUBLE = 147 - RBRACE = 148 - RBRACKET = 149 - RPAREN = 150 - SEMICOLON = 151 - SLASH = 152 - UNDERSCORE = 153 - MULTI_LINE_COMMENT = 154 - SINGLE_LINE_COMMENT = 155 - WHITESPACE = 156 - STRING_TEXT = 157 - STRING_ESCAPE_TRIGGER = 158 - FULL_STRING_TEXT = 159 - FULL_STRING_ESCAPE_TRIGGER = 160 + EXCEPT = 27 + EXTRACT = 28 + FINAL = 29 + FINALLY = 30 + FIRST = 31 + FN = 32 + FOLLOWING = 33 + FOR = 34 + FROM = 35 + FULL = 36 + FUN = 37 + GROUP = 38 + HAVING = 39 + HOUR = 40 + ID = 41 + IF = 42 + ILIKE = 43 + IN = 44 + INF = 45 + INNER = 46 + INTERSECT = 47 + INTERVAL = 48 + IS = 49 + JOIN = 50 + KEY = 51 + LAST = 52 + LEADING = 53 + LEFT = 54 + LET = 55 + LIKE = 56 + LIMIT = 57 + MINUTE = 58 + MONTH = 59 + NAN_SQL = 60 + NOT = 61 + NULL_SQL = 62 + NULLS = 63 + OFFSET = 64 + ON = 65 + OR = 66 + ORDER = 67 + OUTER = 68 + OVER = 69 + PARTITION = 70 + PRECEDING = 71 + PREWHERE = 72 + QUARTER = 73 + RANGE = 74 + RETURN = 75 + RIGHT = 76 + ROLLUP = 77 + ROW = 78 + ROWS = 79 + SAMPLE = 80 + SECOND = 81 + SELECT = 82 + SEMI = 83 + SETTINGS = 84 + SUBSTRING = 85 + THEN = 86 + THROW = 87 + TIES = 88 + TIMESTAMP = 89 + TO = 90 + TOP = 91 + TOTALS = 92 + TRAILING = 93 + TRIM = 94 + TRUNCATE = 95 + TRY = 96 + UNBOUNDED = 97 + UNION = 98 + USING = 99 + WEEK = 100 + WHEN = 101 + WHERE = 102 + WHILE = 103 + WINDOW = 104 + WITH = 105 + YEAR = 106 + ESCAPE_CHAR_COMMON = 107 + IDENTIFIER = 108 + FLOATING_LITERAL = 109 + OCTAL_LITERAL = 110 + DECIMAL_LITERAL = 111 + HEXADECIMAL_LITERAL = 112 + STRING_LITERAL = 113 + ARROW = 114 + ASTERISK = 115 + BACKQUOTE = 116 + BACKSLASH = 117 + COLON = 118 + COMMA = 119 + CONCAT = 120 + DASH = 121 + DOLLAR = 122 + DOT = 123 + EQ_DOUBLE = 124 + EQ_SINGLE = 125 + GT_EQ = 126 + GT = 127 + HASH = 128 + IREGEX_SINGLE = 129 + IREGEX_DOUBLE = 130 + LBRACE = 131 + LBRACKET = 132 + LPAREN = 133 + LT_EQ = 134 + LT = 135 + NOT_EQ = 136 + NOT_IREGEX = 137 + NOT_REGEX = 138 + NULL_PROPERTY = 139 + NULLISH = 140 + PERCENT = 141 + PLUS = 142 + QUERY = 143 + QUOTE_DOUBLE = 144 + QUOTE_SINGLE_TEMPLATE = 145 + QUOTE_SINGLE_TEMPLATE_FULL = 146 + QUOTE_SINGLE = 147 + REGEX_SINGLE = 148 + REGEX_DOUBLE = 149 + RBRACE = 150 + RBRACKET = 151 + RPAREN = 152 + SEMICOLON = 153 + SLASH = 154 + UNDERSCORE = 155 + MULTI_LINE_COMMENT = 156 + SINGLE_LINE_COMMENT = 157 + WHITESPACE = 158 + STRING_TEXT = 159 + STRING_ESCAPE_TRIGGER = 160 + FULL_STRING_TEXT = 161 + FULL_STRING_ESCAPE_TRIGGER = 162 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -771,64 +782,64 @@ class HogQLLexer(Lexer): "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", - "DESCENDING", "DISTINCT", "ELSE", "END", "EXTRACT", "FINAL", - "FINALLY", "FIRST", "FN", "FOLLOWING", "FOR", "FROM", "FULL", - "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", "ILIKE", "IN", - "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", "LEADING", - "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", - "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", - "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", - "TRUNCATE", "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", - "WHERE", "WHILE", "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", - "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", - "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", "ASTERISK", - "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", - "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", - "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", - "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", - "NULLISH", "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", - "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", - "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", - "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", - "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", "FULL_STRING_TEXT", - "FULL_STRING_ESCAPE_TRIGGER" ] + "DESCENDING", "DISTINCT", "ELSE", "END", "EXCEPT", "EXTRACT", + "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", "FOR", "FROM", + "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", "ILIKE", + "IN", "INF", "INNER", "INTERSECT", "INTERVAL", "IS", "JOIN", + "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", + "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", + "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", + "SAMPLE", "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", + "THEN", "THROW", "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", + "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", "UNION", + "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", + "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", + "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", + "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", + "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", + "NOT_REGEX", "NULL_PROPERTY", "NULLISH", "PERCENT", "PLUS", + "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", + "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", "RBRACKET", + "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", + "SINGLE_LINE_COMMENT", "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", + "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] ruleNames = [ "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", "ELSE", "END", - "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", - "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERVAL", - "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", - "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", "NOT", - "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", - "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", - "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", - "THROW", "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", - "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", "UNION", "USING", - "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", "YEAR", - "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", - "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", - "STRING_LITERAL", "A", "B", "C", "D", "E", "F", "G", "H", - "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", - "T", "U", "V", "W", "X", "Y", "Z", "LETTER", "OCT_DIGIT", - "DEC_DIGIT", "HEX_DIGIT", "ARROW", "ASTERISK", "BACKQUOTE", - "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", - "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", - "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", - "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", - "NULL_PROPERTY", "NULLISH", "PERCENT", "PLUS", "QUERY", - "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", - "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", - "RBRACKET", "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", - "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", "WHITESPACE", - "STRING_TEXT", "STRING_ESCAPE_TRIGGER", "STRING_QUOTE_SINGLE", - "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] + "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", + "HOUR", "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", + "INTERVAL", "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", + "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", + "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", + "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", + "ROWS", "SAMPLE", "SECOND", "SELECT", "SEMI", "SETTINGS", + "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", "TO", + "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", + "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", + "WHILE", "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", + "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", + "HEXADECIMAL_LITERAL", "STRING_LITERAL", "A", "B", "C", + "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", + "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", + "Z", "LETTER", "OCT_DIGIT", "DEC_DIGIT", "HEX_DIGIT", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", + "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", + "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", + "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", + "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", "NULLISH", + "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", + "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", + "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", + "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", + "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", + "STRING_QUOTE_SINGLE", "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] grammarFileName = "HogQLLexer.g4" diff --git a/posthog/hogql/grammar/HogQLLexer.tokens b/posthog/hogql/grammar/HogQLLexer.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/posthog/hogql/grammar/HogQLLexer.tokens +++ b/posthog/hogql/grammar/HogQLLexer.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/posthog/hogql/grammar/HogQLParser.g4 b/posthog/hogql/grammar/HogQLParser.g4 index ecc89c4eb5543..7f0e482e31498 100644 --- a/posthog/hogql/grammar/HogQLParser.g4 +++ b/posthog/hogql/grammar/HogQLParser.g4 @@ -51,10 +51,12 @@ kvPairList: kvPair (COMMA kvPair)* COMMA?; // SELECT statement -select: (selectUnionStmt | selectStmt | hogqlxTagElement) EOF; +select: (selectSetStmt | selectStmt | hogqlxTagElement) EOF; -selectUnionStmt: selectStmtWithParens (UNION ALL selectStmtWithParens)*; -selectStmtWithParens: selectStmt | LPAREN selectUnionStmt RPAREN | placeholder; +selectStmtWithParens: selectStmt | LPAREN selectSetStmt RPAREN | placeholder; + +subsequentSelectSetClause: (EXCEPT | UNION ALL | INTERSECT) selectStmtWithParens; +selectSetStmt: selectStmtWithParens (subsequentSelectSetClause)*; selectStmt: with=withClause? @@ -201,7 +203,7 @@ columnExpr | columnExpr QUERY columnExpr COLON columnExpr # ColumnExprTernaryOp | columnExpr (AS identifier | AS STRING_LITERAL) # ColumnExprAlias | (tableIdentifier DOT)? ASTERISK # ColumnExprAsterisk // single-column only - | LPAREN selectUnionStmt RPAREN # ColumnExprSubquery // single-column only + | LPAREN selectSetStmt RPAREN # ColumnExprSubquery // single-column only | LPAREN columnExpr RPAREN # ColumnExprParens // single-column only | LPAREN columnExprList RPAREN # ColumnExprTuple | LBRACKET columnExprList? RBRACKET # ColumnExprArray @@ -231,7 +233,7 @@ hogqlxTagAttribute withExprList: withExpr (COMMA withExpr)* COMMA?; withExpr - : identifier AS LPAREN selectUnionStmt RPAREN # WithExprSubquery + : identifier AS LPAREN selectSetStmt RPAREN # WithExprSubquery // NOTE: asterisk and subquery goes before |columnExpr| so that we can mark them as multi-column expressions. | columnExpr AS identifier # WithExprColumn ; @@ -246,7 +248,7 @@ nestedIdentifier: identifier (DOT identifier)*; tableExpr : tableIdentifier # TableExprIdentifier | tableFunctionExpr # TableExprFunction - | LPAREN selectUnionStmt RPAREN # TableExprSubquery + | LPAREN selectSetStmt RPAREN # TableExprSubquery | tableExpr (alias | AS identifier) # TableExprAlias | hogqlxTagElement # TableExprTag | placeholder # TableExprPlaceholder diff --git a/posthog/hogql/grammar/HogQLParser.interp b/posthog/hogql/grammar/HogQLParser.interp index 86b5777f1ff22..4308ee42ae9b9 100644 --- a/posthog/hogql/grammar/HogQLParser.interp +++ b/posthog/hogql/grammar/HogQLParser.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -347,8 +351,9 @@ block kvPair kvPairList select -selectUnionStmt selectStmtWithParens +subsequentSelectSetClause +selectSetStmt selectStmt withClause topClause @@ -414,4 +419,4 @@ stringContentsFull atn: -[4, 1, 160, 1303, 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, 1, 0, 5, 0, 174, 8, 0, 10, 0, 12, 0, 177, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 183, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 192, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 197, 8, 4, 10, 4, 12, 4, 200, 9, 4, 1, 4, 3, 4, 203, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 217, 8, 5, 1, 6, 1, 6, 3, 6, 221, 8, 6, 1, 6, 3, 6, 224, 8, 6, 1, 7, 1, 7, 3, 7, 228, 8, 7, 1, 7, 3, 7, 231, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 238, 8, 8, 1, 8, 1, 8, 3, 8, 242, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 249, 8, 9, 10, 9, 12, 9, 252, 9, 9, 1, 9, 1, 9, 3, 9, 256, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 265, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 273, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 280, 8, 12, 1, 12, 1, 12, 3, 12, 284, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 290, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 295, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 303, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 310, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 316, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 328, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 334, 8, 18, 10, 18, 12, 18, 337, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 348, 8, 20, 10, 20, 12, 20, 351, 9, 20, 1, 20, 3, 20, 354, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 359, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 367, 8, 22, 10, 22, 12, 22, 370, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 378, 8, 23, 1, 24, 3, 24, 381, 8, 24, 1, 24, 1, 24, 3, 24, 385, 8, 24, 1, 24, 3, 24, 388, 8, 24, 1, 24, 1, 24, 3, 24, 392, 8, 24, 1, 24, 3, 24, 395, 8, 24, 1, 24, 3, 24, 398, 8, 24, 1, 24, 3, 24, 401, 8, 24, 1, 24, 3, 24, 404, 8, 24, 1, 24, 1, 24, 3, 24, 408, 8, 24, 1, 24, 1, 24, 3, 24, 412, 8, 24, 1, 24, 3, 24, 415, 8, 24, 1, 24, 3, 24, 418, 8, 24, 1, 24, 3, 24, 421, 8, 24, 1, 24, 1, 24, 3, 24, 425, 8, 24, 1, 24, 3, 24, 428, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 437, 8, 26, 1, 27, 1, 27, 1, 27, 1, 28, 3, 28, 443, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 462, 8, 29, 10, 29, 12, 29, 465, 9, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 481, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 498, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 504, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 510, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 521, 8, 36, 3, 36, 523, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 534, 8, 39, 1, 39, 3, 39, 537, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 543, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 551, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 557, 8, 39, 10, 39, 12, 39, 560, 9, 39, 1, 40, 3, 40, 563, 8, 40, 1, 40, 1, 40, 1, 40, 3, 40, 568, 8, 40, 1, 40, 3, 40, 571, 8, 40, 1, 40, 3, 40, 574, 8, 40, 1, 40, 1, 40, 3, 40, 578, 8, 40, 1, 40, 1, 40, 3, 40, 582, 8, 40, 1, 40, 3, 40, 585, 8, 40, 3, 40, 587, 8, 40, 1, 40, 3, 40, 590, 8, 40, 1, 40, 1, 40, 3, 40, 594, 8, 40, 1, 40, 1, 40, 3, 40, 598, 8, 40, 1, 40, 3, 40, 601, 8, 40, 3, 40, 603, 8, 40, 3, 40, 605, 8, 40, 1, 41, 1, 41, 1, 41, 3, 41, 610, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 621, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 627, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 632, 8, 44, 10, 44, 12, 44, 635, 9, 44, 1, 45, 1, 45, 3, 45, 639, 8, 45, 1, 45, 1, 45, 3, 45, 643, 8, 45, 1, 45, 1, 45, 3, 45, 647, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 653, 8, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 5, 47, 660, 8, 47, 10, 47, 12, 47, 663, 9, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 3, 49, 670, 8, 49, 1, 49, 3, 49, 673, 8, 49, 1, 49, 3, 49, 676, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 695, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 709, 8, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 723, 8, 56, 10, 56, 12, 56, 726, 9, 56, 1, 56, 3, 56, 729, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 738, 8, 56, 10, 56, 12, 56, 741, 9, 56, 1, 56, 3, 56, 744, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 753, 8, 56, 10, 56, 12, 56, 756, 9, 56, 1, 56, 3, 56, 759, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 766, 8, 56, 1, 56, 1, 56, 3, 56, 770, 8, 56, 1, 57, 1, 57, 1, 57, 5, 57, 775, 8, 57, 10, 57, 12, 57, 778, 9, 57, 1, 57, 3, 57, 781, 8, 57, 1, 58, 1, 58, 1, 58, 3, 58, 786, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 793, 8, 58, 11, 58, 12, 58, 794, 1, 58, 1, 58, 3, 58, 799, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 823, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 840, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 846, 8, 58, 1, 58, 3, 58, 849, 8, 58, 1, 58, 3, 58, 852, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 862, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 868, 8, 58, 1, 58, 3, 58, 871, 8, 58, 1, 58, 3, 58, 874, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 882, 8, 58, 1, 58, 3, 58, 885, 8, 58, 1, 58, 1, 58, 3, 58, 889, 8, 58, 1, 58, 3, 58, 892, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 906, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 923, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 928, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 933, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 939, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 946, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 958, 8, 58, 1, 58, 1, 58, 3, 58, 962, 8, 58, 1, 58, 3, 58, 965, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 974, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 988, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1004, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1033, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1041, 8, 58, 5, 58, 1043, 8, 58, 10, 58, 12, 58, 1046, 9, 58, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1052, 8, 59, 10, 59, 12, 59, 1055, 9, 59, 1, 59, 3, 59, 1058, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1065, 8, 59, 10, 59, 12, 59, 1068, 9, 59, 1, 59, 3, 59, 1071, 8, 59, 1, 59, 1, 59, 3, 59, 1075, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1080, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 1085, 8, 60, 10, 60, 12, 60, 1088, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1096, 8, 60, 10, 60, 12, 60, 1099, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1107, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1114, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1127, 8, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1132, 8, 62, 10, 62, 12, 62, 1135, 9, 62, 1, 62, 3, 62, 1138, 8, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1150, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1156, 8, 64, 1, 64, 3, 64, 1159, 8, 64, 1, 65, 1, 65, 1, 65, 5, 65, 1164, 8, 65, 10, 65, 12, 65, 1167, 9, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1178, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1184, 8, 66, 5, 66, 1186, 8, 66, 10, 66, 12, 66, 1189, 9, 66, 1, 67, 1, 67, 1, 67, 3, 67, 1194, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1201, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 1208, 8, 69, 10, 69, 12, 69, 1211, 9, 69, 1, 69, 3, 69, 1214, 8, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1224, 8, 71, 3, 71, 1226, 8, 71, 1, 72, 3, 72, 1229, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1237, 8, 72, 1, 73, 1, 73, 1, 73, 3, 73, 1242, 8, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 3, 77, 1252, 8, 77, 1, 78, 1, 78, 1, 78, 3, 78, 1257, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 3, 81, 1269, 8, 81, 1, 82, 1, 82, 5, 82, 1273, 8, 82, 10, 82, 12, 82, 1276, 9, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1285, 8, 83, 1, 84, 1, 84, 5, 84, 1289, 8, 84, 10, 84, 12, 84, 1292, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 1301, 8, 85, 1, 85, 0, 3, 78, 116, 132, 86, 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, 0, 17, 2, 0, 31, 31, 36, 36, 2, 0, 18, 18, 75, 75, 2, 0, 45, 45, 52, 52, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 81, 81, 2, 0, 52, 52, 74, 74, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 30, 30, 50, 50, 2, 0, 72, 72, 77, 77, 3, 0, 10, 10, 51, 51, 91, 91, 2, 0, 42, 42, 54, 54, 1, 0, 108, 109, 2, 0, 119, 119, 140, 140, 7, 0, 21, 21, 39, 39, 56, 57, 71, 71, 79, 79, 98, 98, 104, 104, 17, 0, 1, 13, 15, 20, 22, 28, 30, 30, 32, 35, 37, 38, 40, 43, 45, 52, 54, 55, 59, 59, 61, 70, 72, 78, 80, 84, 86, 93, 95, 97, 99, 100, 102, 103, 4, 0, 20, 20, 30, 30, 40, 40, 49, 49, 1475, 0, 175, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 4, 184, 1, 0, 0, 0, 6, 186, 1, 0, 0, 0, 8, 193, 1, 0, 0, 0, 10, 216, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 225, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 245, 1, 0, 0, 0, 20, 257, 1, 0, 0, 0, 22, 266, 1, 0, 0, 0, 24, 274, 1, 0, 0, 0, 26, 296, 1, 0, 0, 0, 28, 311, 1, 0, 0, 0, 30, 320, 1, 0, 0, 0, 32, 325, 1, 0, 0, 0, 34, 329, 1, 0, 0, 0, 36, 331, 1, 0, 0, 0, 38, 340, 1, 0, 0, 0, 40, 344, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 362, 1, 0, 0, 0, 46, 377, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 429, 1, 0, 0, 0, 52, 432, 1, 0, 0, 0, 54, 438, 1, 0, 0, 0, 56, 442, 1, 0, 0, 0, 58, 448, 1, 0, 0, 0, 60, 466, 1, 0, 0, 0, 62, 469, 1, 0, 0, 0, 64, 472, 1, 0, 0, 0, 66, 482, 1, 0, 0, 0, 68, 485, 1, 0, 0, 0, 70, 489, 1, 0, 0, 0, 72, 522, 1, 0, 0, 0, 74, 524, 1, 0, 0, 0, 76, 527, 1, 0, 0, 0, 78, 542, 1, 0, 0, 0, 80, 604, 1, 0, 0, 0, 82, 609, 1, 0, 0, 0, 84, 620, 1, 0, 0, 0, 86, 622, 1, 0, 0, 0, 88, 628, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 654, 1, 0, 0, 0, 94, 656, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 669, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 681, 1, 0, 0, 0, 104, 685, 1, 0, 0, 0, 106, 694, 1, 0, 0, 0, 108, 708, 1, 0, 0, 0, 110, 710, 1, 0, 0, 0, 112, 769, 1, 0, 0, 0, 114, 771, 1, 0, 0, 0, 116, 932, 1, 0, 0, 0, 118, 1074, 1, 0, 0, 0, 120, 1113, 1, 0, 0, 0, 122, 1126, 1, 0, 0, 0, 124, 1128, 1, 0, 0, 0, 126, 1149, 1, 0, 0, 0, 128, 1158, 1, 0, 0, 0, 130, 1160, 1, 0, 0, 0, 132, 1177, 1, 0, 0, 0, 134, 1190, 1, 0, 0, 0, 136, 1200, 1, 0, 0, 0, 138, 1204, 1, 0, 0, 0, 140, 1215, 1, 0, 0, 0, 142, 1225, 1, 0, 0, 0, 144, 1228, 1, 0, 0, 0, 146, 1241, 1, 0, 0, 0, 148, 1243, 1, 0, 0, 0, 150, 1245, 1, 0, 0, 0, 152, 1247, 1, 0, 0, 0, 154, 1251, 1, 0, 0, 0, 156, 1256, 1, 0, 0, 0, 158, 1258, 1, 0, 0, 0, 160, 1262, 1, 0, 0, 0, 162, 1268, 1, 0, 0, 0, 164, 1270, 1, 0, 0, 0, 166, 1284, 1, 0, 0, 0, 168, 1286, 1, 0, 0, 0, 170, 1300, 1, 0, 0, 0, 172, 174, 3, 2, 1, 0, 173, 172, 1, 0, 0, 0, 174, 177, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 178, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 178, 179, 5, 0, 0, 1, 179, 1, 1, 0, 0, 0, 180, 183, 3, 6, 3, 0, 181, 183, 3, 10, 5, 0, 182, 180, 1, 0, 0, 0, 182, 181, 1, 0, 0, 0, 183, 3, 1, 0, 0, 0, 184, 185, 3, 116, 58, 0, 185, 5, 1, 0, 0, 0, 186, 187, 5, 53, 0, 0, 187, 191, 3, 156, 78, 0, 188, 189, 5, 116, 0, 0, 189, 190, 5, 123, 0, 0, 190, 192, 3, 4, 2, 0, 191, 188, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 7, 1, 0, 0, 0, 193, 198, 3, 156, 78, 0, 194, 195, 5, 117, 0, 0, 195, 197, 3, 156, 78, 0, 196, 194, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 203, 5, 117, 0, 0, 202, 201, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 217, 3, 12, 6, 0, 205, 217, 3, 14, 7, 0, 206, 217, 3, 18, 9, 0, 207, 217, 3, 20, 10, 0, 208, 217, 3, 22, 11, 0, 209, 217, 3, 26, 13, 0, 210, 217, 3, 24, 12, 0, 211, 217, 3, 28, 14, 0, 212, 217, 3, 30, 15, 0, 213, 217, 3, 36, 18, 0, 214, 217, 3, 32, 16, 0, 215, 217, 3, 34, 17, 0, 216, 204, 1, 0, 0, 0, 216, 205, 1, 0, 0, 0, 216, 206, 1, 0, 0, 0, 216, 207, 1, 0, 0, 0, 216, 208, 1, 0, 0, 0, 216, 209, 1, 0, 0, 0, 216, 210, 1, 0, 0, 0, 216, 211, 1, 0, 0, 0, 216, 212, 1, 0, 0, 0, 216, 213, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 215, 1, 0, 0, 0, 217, 11, 1, 0, 0, 0, 218, 220, 5, 73, 0, 0, 219, 221, 3, 4, 2, 0, 220, 219, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 223, 1, 0, 0, 0, 222, 224, 5, 151, 0, 0, 223, 222, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, 13, 1, 0, 0, 0, 225, 227, 5, 85, 0, 0, 226, 228, 3, 4, 2, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 230, 1, 0, 0, 0, 229, 231, 5, 151, 0, 0, 230, 229, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 15, 1, 0, 0, 0, 232, 241, 5, 14, 0, 0, 233, 234, 5, 131, 0, 0, 234, 237, 3, 156, 78, 0, 235, 236, 5, 116, 0, 0, 236, 238, 3, 156, 78, 0, 237, 235, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 5, 150, 0, 0, 240, 242, 1, 0, 0, 0, 241, 233, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 3, 36, 18, 0, 244, 17, 1, 0, 0, 0, 245, 246, 5, 94, 0, 0, 246, 250, 3, 36, 18, 0, 247, 249, 3, 16, 8, 0, 248, 247, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 255, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 254, 5, 29, 0, 0, 254, 256, 3, 36, 18, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 19, 1, 0, 0, 0, 257, 258, 5, 41, 0, 0, 258, 259, 5, 131, 0, 0, 259, 260, 3, 4, 2, 0, 260, 261, 5, 150, 0, 0, 261, 264, 3, 10, 5, 0, 262, 263, 5, 25, 0, 0, 263, 265, 3, 10, 5, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 21, 1, 0, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 131, 0, 0, 268, 269, 3, 4, 2, 0, 269, 270, 5, 150, 0, 0, 270, 272, 3, 10, 5, 0, 271, 273, 5, 151, 0, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 23, 1, 0, 0, 0, 274, 275, 5, 33, 0, 0, 275, 279, 5, 131, 0, 0, 276, 280, 3, 6, 3, 0, 277, 280, 3, 30, 15, 0, 278, 280, 3, 4, 2, 0, 279, 276, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 278, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 5, 151, 0, 0, 282, 284, 3, 4, 2, 0, 283, 282, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 289, 5, 151, 0, 0, 286, 290, 3, 6, 3, 0, 287, 290, 3, 30, 15, 0, 288, 290, 3, 4, 2, 0, 289, 286, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 5, 150, 0, 0, 292, 294, 3, 10, 5, 0, 293, 295, 5, 151, 0, 0, 294, 293, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 25, 1, 0, 0, 0, 296, 297, 5, 33, 0, 0, 297, 298, 5, 131, 0, 0, 298, 299, 5, 53, 0, 0, 299, 302, 3, 156, 78, 0, 300, 301, 5, 117, 0, 0, 301, 303, 3, 156, 78, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 305, 5, 43, 0, 0, 305, 306, 3, 4, 2, 0, 306, 307, 5, 150, 0, 0, 307, 309, 3, 10, 5, 0, 308, 310, 5, 151, 0, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 27, 1, 0, 0, 0, 311, 312, 7, 0, 0, 0, 312, 313, 3, 156, 78, 0, 313, 315, 5, 131, 0, 0, 314, 316, 3, 8, 4, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 318, 5, 150, 0, 0, 318, 319, 3, 36, 18, 0, 319, 29, 1, 0, 0, 0, 320, 321, 3, 4, 2, 0, 321, 322, 5, 116, 0, 0, 322, 323, 5, 123, 0, 0, 323, 324, 3, 4, 2, 0, 324, 31, 1, 0, 0, 0, 325, 327, 3, 4, 2, 0, 326, 328, 5, 151, 0, 0, 327, 326, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 33, 1, 0, 0, 0, 329, 330, 5, 151, 0, 0, 330, 35, 1, 0, 0, 0, 331, 335, 5, 129, 0, 0, 332, 334, 3, 2, 1, 0, 333, 332, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 148, 0, 0, 339, 37, 1, 0, 0, 0, 340, 341, 3, 4, 2, 0, 341, 342, 5, 116, 0, 0, 342, 343, 3, 4, 2, 0, 343, 39, 1, 0, 0, 0, 344, 349, 3, 38, 19, 0, 345, 346, 5, 117, 0, 0, 346, 348, 3, 38, 19, 0, 347, 345, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 354, 5, 117, 0, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 41, 1, 0, 0, 0, 355, 359, 3, 44, 22, 0, 356, 359, 3, 48, 24, 0, 357, 359, 3, 120, 60, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 5, 0, 0, 1, 361, 43, 1, 0, 0, 0, 362, 368, 3, 46, 23, 0, 363, 364, 5, 96, 0, 0, 364, 365, 5, 1, 0, 0, 365, 367, 3, 46, 23, 0, 366, 363, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 45, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 378, 3, 48, 24, 0, 372, 373, 5, 131, 0, 0, 373, 374, 3, 44, 22, 0, 374, 375, 5, 150, 0, 0, 375, 378, 1, 0, 0, 0, 376, 378, 3, 160, 80, 0, 377, 371, 1, 0, 0, 0, 377, 372, 1, 0, 0, 0, 377, 376, 1, 0, 0, 0, 378, 47, 1, 0, 0, 0, 379, 381, 3, 50, 25, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 384, 5, 80, 0, 0, 383, 385, 5, 24, 0, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 388, 3, 52, 26, 0, 387, 386, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 391, 3, 114, 57, 0, 390, 392, 3, 54, 27, 0, 391, 390, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 395, 3, 56, 28, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 398, 3, 60, 30, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 400, 1, 0, 0, 0, 399, 401, 3, 62, 31, 0, 400, 399, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 403, 1, 0, 0, 0, 402, 404, 3, 64, 32, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 407, 1, 0, 0, 0, 405, 406, 5, 103, 0, 0, 406, 408, 7, 1, 0, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 410, 5, 103, 0, 0, 410, 412, 5, 90, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 1, 0, 0, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 417, 1, 0, 0, 0, 416, 418, 3, 58, 29, 0, 417, 416, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 420, 1, 0, 0, 0, 419, 421, 3, 68, 34, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 424, 1, 0, 0, 0, 422, 425, 3, 72, 36, 0, 423, 425, 3, 74, 37, 0, 424, 422, 1, 0, 0, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 427, 1, 0, 0, 0, 426, 428, 3, 76, 38, 0, 427, 426, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 49, 1, 0, 0, 0, 429, 430, 5, 103, 0, 0, 430, 431, 3, 124, 62, 0, 431, 51, 1, 0, 0, 0, 432, 433, 5, 89, 0, 0, 433, 436, 5, 109, 0, 0, 434, 435, 5, 103, 0, 0, 435, 437, 5, 86, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 53, 1, 0, 0, 0, 438, 439, 5, 34, 0, 0, 439, 440, 3, 78, 39, 0, 440, 55, 1, 0, 0, 0, 441, 443, 7, 2, 0, 0, 442, 441, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 5, 5, 0, 0, 445, 446, 5, 48, 0, 0, 446, 447, 3, 114, 57, 0, 447, 57, 1, 0, 0, 0, 448, 449, 5, 102, 0, 0, 449, 450, 3, 156, 78, 0, 450, 451, 5, 6, 0, 0, 451, 452, 5, 131, 0, 0, 452, 453, 3, 98, 49, 0, 453, 463, 5, 150, 0, 0, 454, 455, 5, 117, 0, 0, 455, 456, 3, 156, 78, 0, 456, 457, 5, 6, 0, 0, 457, 458, 5, 131, 0, 0, 458, 459, 3, 98, 49, 0, 459, 460, 5, 150, 0, 0, 460, 462, 1, 0, 0, 0, 461, 454, 1, 0, 0, 0, 462, 465, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 59, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 466, 467, 5, 70, 0, 0, 467, 468, 3, 116, 58, 0, 468, 61, 1, 0, 0, 0, 469, 470, 5, 100, 0, 0, 470, 471, 3, 116, 58, 0, 471, 63, 1, 0, 0, 0, 472, 473, 5, 37, 0, 0, 473, 480, 5, 11, 0, 0, 474, 475, 7, 1, 0, 0, 475, 476, 5, 131, 0, 0, 476, 477, 3, 114, 57, 0, 477, 478, 5, 150, 0, 0, 478, 481, 1, 0, 0, 0, 479, 481, 3, 114, 57, 0, 480, 474, 1, 0, 0, 0, 480, 479, 1, 0, 0, 0, 481, 65, 1, 0, 0, 0, 482, 483, 5, 38, 0, 0, 483, 484, 3, 116, 58, 0, 484, 67, 1, 0, 0, 0, 485, 486, 5, 65, 0, 0, 486, 487, 5, 11, 0, 0, 487, 488, 3, 88, 44, 0, 488, 69, 1, 0, 0, 0, 489, 490, 5, 65, 0, 0, 490, 491, 5, 11, 0, 0, 491, 492, 3, 114, 57, 0, 492, 71, 1, 0, 0, 0, 493, 494, 5, 55, 0, 0, 494, 497, 3, 116, 58, 0, 495, 496, 5, 117, 0, 0, 496, 498, 3, 116, 58, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 503, 1, 0, 0, 0, 499, 500, 5, 103, 0, 0, 500, 504, 5, 86, 0, 0, 501, 502, 5, 11, 0, 0, 502, 504, 3, 114, 57, 0, 503, 499, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 55, 0, 0, 506, 509, 3, 116, 58, 0, 507, 508, 5, 103, 0, 0, 508, 510, 5, 86, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 62, 0, 0, 512, 513, 3, 116, 58, 0, 513, 523, 1, 0, 0, 0, 514, 515, 5, 55, 0, 0, 515, 516, 3, 116, 58, 0, 516, 517, 5, 62, 0, 0, 517, 520, 3, 116, 58, 0, 518, 519, 5, 11, 0, 0, 519, 521, 3, 114, 57, 0, 520, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 523, 1, 0, 0, 0, 522, 493, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 514, 1, 0, 0, 0, 523, 73, 1, 0, 0, 0, 524, 525, 5, 62, 0, 0, 525, 526, 3, 116, 58, 0, 526, 75, 1, 0, 0, 0, 527, 528, 5, 82, 0, 0, 528, 529, 3, 94, 47, 0, 529, 77, 1, 0, 0, 0, 530, 531, 6, 39, -1, 0, 531, 533, 3, 132, 66, 0, 532, 534, 5, 28, 0, 0, 533, 532, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 536, 1, 0, 0, 0, 535, 537, 3, 86, 43, 0, 536, 535, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 543, 1, 0, 0, 0, 538, 539, 5, 131, 0, 0, 539, 540, 3, 78, 39, 0, 540, 541, 5, 150, 0, 0, 541, 543, 1, 0, 0, 0, 542, 530, 1, 0, 0, 0, 542, 538, 1, 0, 0, 0, 543, 558, 1, 0, 0, 0, 544, 545, 10, 3, 0, 0, 545, 546, 3, 82, 41, 0, 546, 547, 3, 78, 39, 4, 547, 557, 1, 0, 0, 0, 548, 550, 10, 4, 0, 0, 549, 551, 3, 80, 40, 0, 550, 549, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 553, 5, 48, 0, 0, 553, 554, 3, 78, 39, 0, 554, 555, 3, 84, 42, 0, 555, 557, 1, 0, 0, 0, 556, 544, 1, 0, 0, 0, 556, 548, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 79, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 561, 563, 7, 3, 0, 0, 562, 561, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 571, 5, 45, 0, 0, 565, 567, 5, 45, 0, 0, 566, 568, 7, 3, 0, 0, 567, 566, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 571, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 562, 1, 0, 0, 0, 570, 565, 1, 0, 0, 0, 570, 569, 1, 0, 0, 0, 571, 605, 1, 0, 0, 0, 572, 574, 7, 4, 0, 0, 573, 572, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 577, 7, 5, 0, 0, 576, 578, 5, 66, 0, 0, 577, 576, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 587, 1, 0, 0, 0, 579, 581, 7, 5, 0, 0, 580, 582, 5, 66, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 584, 1, 0, 0, 0, 583, 585, 7, 4, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 587, 1, 0, 0, 0, 586, 573, 1, 0, 0, 0, 586, 579, 1, 0, 0, 0, 587, 605, 1, 0, 0, 0, 588, 590, 7, 6, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 593, 5, 35, 0, 0, 592, 594, 5, 66, 0, 0, 593, 592, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 603, 1, 0, 0, 0, 595, 597, 5, 35, 0, 0, 596, 598, 5, 66, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 600, 1, 0, 0, 0, 599, 601, 7, 6, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 603, 1, 0, 0, 0, 602, 589, 1, 0, 0, 0, 602, 595, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 570, 1, 0, 0, 0, 604, 586, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 81, 1, 0, 0, 0, 606, 607, 5, 17, 0, 0, 607, 610, 5, 48, 0, 0, 608, 610, 5, 117, 0, 0, 609, 606, 1, 0, 0, 0, 609, 608, 1, 0, 0, 0, 610, 83, 1, 0, 0, 0, 611, 612, 5, 63, 0, 0, 612, 621, 3, 114, 57, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 131, 0, 0, 615, 616, 3, 114, 57, 0, 616, 617, 5, 150, 0, 0, 617, 621, 1, 0, 0, 0, 618, 619, 5, 97, 0, 0, 619, 621, 3, 114, 57, 0, 620, 611, 1, 0, 0, 0, 620, 613, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 85, 1, 0, 0, 0, 622, 623, 5, 78, 0, 0, 623, 626, 3, 92, 46, 0, 624, 625, 5, 62, 0, 0, 625, 627, 3, 92, 46, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 87, 1, 0, 0, 0, 628, 633, 3, 90, 45, 0, 629, 630, 5, 117, 0, 0, 630, 632, 3, 90, 45, 0, 631, 629, 1, 0, 0, 0, 632, 635, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 89, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 636, 638, 3, 116, 58, 0, 637, 639, 7, 7, 0, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 642, 1, 0, 0, 0, 640, 641, 5, 61, 0, 0, 641, 643, 7, 8, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 646, 1, 0, 0, 0, 644, 645, 5, 16, 0, 0, 645, 647, 5, 111, 0, 0, 646, 644, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 91, 1, 0, 0, 0, 648, 655, 3, 160, 80, 0, 649, 652, 3, 144, 72, 0, 650, 651, 5, 152, 0, 0, 651, 653, 3, 144, 72, 0, 652, 650, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 648, 1, 0, 0, 0, 654, 649, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 661, 3, 96, 48, 0, 657, 658, 5, 117, 0, 0, 658, 660, 3, 96, 48, 0, 659, 657, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 95, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 3, 156, 78, 0, 665, 666, 5, 123, 0, 0, 666, 667, 3, 146, 73, 0, 667, 97, 1, 0, 0, 0, 668, 670, 3, 100, 50, 0, 669, 668, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 673, 3, 102, 51, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 676, 3, 104, 52, 0, 675, 674, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 99, 1, 0, 0, 0, 677, 678, 5, 68, 0, 0, 678, 679, 5, 11, 0, 0, 679, 680, 3, 114, 57, 0, 680, 101, 1, 0, 0, 0, 681, 682, 5, 65, 0, 0, 682, 683, 5, 11, 0, 0, 683, 684, 3, 88, 44, 0, 684, 103, 1, 0, 0, 0, 685, 686, 7, 9, 0, 0, 686, 687, 3, 106, 53, 0, 687, 105, 1, 0, 0, 0, 688, 695, 3, 108, 54, 0, 689, 690, 5, 9, 0, 0, 690, 691, 3, 108, 54, 0, 691, 692, 5, 2, 0, 0, 692, 693, 3, 108, 54, 0, 693, 695, 1, 0, 0, 0, 694, 688, 1, 0, 0, 0, 694, 689, 1, 0, 0, 0, 695, 107, 1, 0, 0, 0, 696, 697, 5, 19, 0, 0, 697, 709, 5, 76, 0, 0, 698, 699, 5, 95, 0, 0, 699, 709, 5, 69, 0, 0, 700, 701, 5, 95, 0, 0, 701, 709, 5, 32, 0, 0, 702, 703, 3, 144, 72, 0, 703, 704, 5, 69, 0, 0, 704, 709, 1, 0, 0, 0, 705, 706, 3, 144, 72, 0, 706, 707, 5, 32, 0, 0, 707, 709, 1, 0, 0, 0, 708, 696, 1, 0, 0, 0, 708, 698, 1, 0, 0, 0, 708, 700, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 705, 1, 0, 0, 0, 709, 109, 1, 0, 0, 0, 710, 711, 3, 116, 58, 0, 711, 712, 5, 0, 0, 1, 712, 111, 1, 0, 0, 0, 713, 770, 3, 156, 78, 0, 714, 715, 3, 156, 78, 0, 715, 716, 5, 131, 0, 0, 716, 717, 3, 156, 78, 0, 717, 724, 3, 112, 56, 0, 718, 719, 5, 117, 0, 0, 719, 720, 3, 156, 78, 0, 720, 721, 3, 112, 56, 0, 721, 723, 1, 0, 0, 0, 722, 718, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 729, 5, 117, 0, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 150, 0, 0, 731, 770, 1, 0, 0, 0, 732, 733, 3, 156, 78, 0, 733, 734, 5, 131, 0, 0, 734, 739, 3, 158, 79, 0, 735, 736, 5, 117, 0, 0, 736, 738, 3, 158, 79, 0, 737, 735, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 744, 5, 117, 0, 0, 743, 742, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 5, 150, 0, 0, 746, 770, 1, 0, 0, 0, 747, 748, 3, 156, 78, 0, 748, 749, 5, 131, 0, 0, 749, 754, 3, 112, 56, 0, 750, 751, 5, 117, 0, 0, 751, 753, 3, 112, 56, 0, 752, 750, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 759, 5, 117, 0, 0, 758, 757, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 761, 5, 150, 0, 0, 761, 770, 1, 0, 0, 0, 762, 763, 3, 156, 78, 0, 763, 765, 5, 131, 0, 0, 764, 766, 3, 114, 57, 0, 765, 764, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 5, 150, 0, 0, 768, 770, 1, 0, 0, 0, 769, 713, 1, 0, 0, 0, 769, 714, 1, 0, 0, 0, 769, 732, 1, 0, 0, 0, 769, 747, 1, 0, 0, 0, 769, 762, 1, 0, 0, 0, 770, 113, 1, 0, 0, 0, 771, 776, 3, 116, 58, 0, 772, 773, 5, 117, 0, 0, 773, 775, 3, 116, 58, 0, 774, 772, 1, 0, 0, 0, 775, 778, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 780, 1, 0, 0, 0, 778, 776, 1, 0, 0, 0, 779, 781, 5, 117, 0, 0, 780, 779, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 115, 1, 0, 0, 0, 782, 783, 6, 58, -1, 0, 783, 785, 5, 12, 0, 0, 784, 786, 3, 116, 58, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 792, 1, 0, 0, 0, 787, 788, 5, 99, 0, 0, 788, 789, 3, 116, 58, 0, 789, 790, 5, 84, 0, 0, 790, 791, 3, 116, 58, 0, 791, 793, 1, 0, 0, 0, 792, 787, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 798, 1, 0, 0, 0, 796, 797, 5, 25, 0, 0, 797, 799, 3, 116, 58, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 801, 5, 26, 0, 0, 801, 933, 1, 0, 0, 0, 802, 803, 5, 13, 0, 0, 803, 804, 5, 131, 0, 0, 804, 805, 3, 116, 58, 0, 805, 806, 5, 6, 0, 0, 806, 807, 3, 112, 56, 0, 807, 808, 5, 150, 0, 0, 808, 933, 1, 0, 0, 0, 809, 810, 5, 20, 0, 0, 810, 933, 5, 111, 0, 0, 811, 812, 5, 46, 0, 0, 812, 813, 3, 116, 58, 0, 813, 814, 3, 148, 74, 0, 814, 933, 1, 0, 0, 0, 815, 816, 5, 83, 0, 0, 816, 817, 5, 131, 0, 0, 817, 818, 3, 116, 58, 0, 818, 819, 5, 34, 0, 0, 819, 822, 3, 116, 58, 0, 820, 821, 5, 33, 0, 0, 821, 823, 3, 116, 58, 0, 822, 820, 1, 0, 0, 0, 822, 823, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 825, 5, 150, 0, 0, 825, 933, 1, 0, 0, 0, 826, 827, 5, 87, 0, 0, 827, 933, 5, 111, 0, 0, 828, 829, 5, 92, 0, 0, 829, 830, 5, 131, 0, 0, 830, 831, 7, 10, 0, 0, 831, 832, 3, 162, 81, 0, 832, 833, 5, 34, 0, 0, 833, 834, 3, 116, 58, 0, 834, 835, 5, 150, 0, 0, 835, 933, 1, 0, 0, 0, 836, 837, 3, 156, 78, 0, 837, 839, 5, 131, 0, 0, 838, 840, 3, 114, 57, 0, 839, 838, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 5, 150, 0, 0, 842, 851, 1, 0, 0, 0, 843, 845, 5, 131, 0, 0, 844, 846, 5, 24, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 848, 1, 0, 0, 0, 847, 849, 3, 114, 57, 0, 848, 847, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 852, 5, 150, 0, 0, 851, 843, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 67, 0, 0, 854, 855, 5, 131, 0, 0, 855, 856, 3, 98, 49, 0, 856, 857, 5, 150, 0, 0, 857, 933, 1, 0, 0, 0, 858, 859, 3, 156, 78, 0, 859, 861, 5, 131, 0, 0, 860, 862, 3, 114, 57, 0, 861, 860, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 864, 5, 150, 0, 0, 864, 873, 1, 0, 0, 0, 865, 867, 5, 131, 0, 0, 866, 868, 5, 24, 0, 0, 867, 866, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 870, 1, 0, 0, 0, 869, 871, 3, 114, 57, 0, 870, 869, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 874, 5, 150, 0, 0, 873, 865, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 876, 5, 67, 0, 0, 876, 877, 3, 156, 78, 0, 877, 933, 1, 0, 0, 0, 878, 884, 3, 156, 78, 0, 879, 881, 5, 131, 0, 0, 880, 882, 3, 114, 57, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 885, 5, 150, 0, 0, 884, 879, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 888, 5, 131, 0, 0, 887, 889, 5, 24, 0, 0, 888, 887, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 891, 1, 0, 0, 0, 890, 892, 3, 114, 57, 0, 891, 890, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 5, 150, 0, 0, 894, 933, 1, 0, 0, 0, 895, 933, 3, 120, 60, 0, 896, 933, 3, 164, 82, 0, 897, 933, 3, 146, 73, 0, 898, 899, 5, 119, 0, 0, 899, 933, 3, 116, 58, 20, 900, 901, 5, 59, 0, 0, 901, 933, 3, 116, 58, 14, 902, 903, 3, 136, 68, 0, 903, 904, 5, 121, 0, 0, 904, 906, 1, 0, 0, 0, 905, 902, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 933, 5, 113, 0, 0, 908, 909, 5, 131, 0, 0, 909, 910, 3, 44, 22, 0, 910, 911, 5, 150, 0, 0, 911, 933, 1, 0, 0, 0, 912, 913, 5, 131, 0, 0, 913, 914, 3, 116, 58, 0, 914, 915, 5, 150, 0, 0, 915, 933, 1, 0, 0, 0, 916, 917, 5, 131, 0, 0, 917, 918, 3, 114, 57, 0, 918, 919, 5, 150, 0, 0, 919, 933, 1, 0, 0, 0, 920, 922, 5, 130, 0, 0, 921, 923, 3, 114, 57, 0, 922, 921, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 933, 5, 149, 0, 0, 925, 927, 5, 129, 0, 0, 926, 928, 3, 40, 20, 0, 927, 926, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 933, 5, 148, 0, 0, 930, 933, 3, 118, 59, 0, 931, 933, 3, 128, 64, 0, 932, 782, 1, 0, 0, 0, 932, 802, 1, 0, 0, 0, 932, 809, 1, 0, 0, 0, 932, 811, 1, 0, 0, 0, 932, 815, 1, 0, 0, 0, 932, 826, 1, 0, 0, 0, 932, 828, 1, 0, 0, 0, 932, 836, 1, 0, 0, 0, 932, 858, 1, 0, 0, 0, 932, 878, 1, 0, 0, 0, 932, 895, 1, 0, 0, 0, 932, 896, 1, 0, 0, 0, 932, 897, 1, 0, 0, 0, 932, 898, 1, 0, 0, 0, 932, 900, 1, 0, 0, 0, 932, 905, 1, 0, 0, 0, 932, 908, 1, 0, 0, 0, 932, 912, 1, 0, 0, 0, 932, 916, 1, 0, 0, 0, 932, 920, 1, 0, 0, 0, 932, 925, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 932, 931, 1, 0, 0, 0, 933, 1044, 1, 0, 0, 0, 934, 938, 10, 19, 0, 0, 935, 939, 5, 113, 0, 0, 936, 939, 5, 152, 0, 0, 937, 939, 5, 139, 0, 0, 938, 935, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 1043, 3, 116, 58, 20, 941, 945, 10, 18, 0, 0, 942, 946, 5, 140, 0, 0, 943, 946, 5, 119, 0, 0, 944, 946, 5, 118, 0, 0, 945, 942, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 1043, 3, 116, 58, 19, 948, 973, 10, 17, 0, 0, 949, 974, 5, 122, 0, 0, 950, 974, 5, 123, 0, 0, 951, 974, 5, 134, 0, 0, 952, 974, 5, 132, 0, 0, 953, 974, 5, 133, 0, 0, 954, 974, 5, 124, 0, 0, 955, 974, 5, 125, 0, 0, 956, 958, 5, 59, 0, 0, 957, 956, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 961, 5, 43, 0, 0, 960, 962, 5, 15, 0, 0, 961, 960, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 974, 1, 0, 0, 0, 963, 965, 5, 59, 0, 0, 964, 963, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 974, 7, 11, 0, 0, 967, 974, 5, 146, 0, 0, 968, 974, 5, 147, 0, 0, 969, 974, 5, 136, 0, 0, 970, 974, 5, 127, 0, 0, 971, 974, 5, 128, 0, 0, 972, 974, 5, 135, 0, 0, 973, 949, 1, 0, 0, 0, 973, 950, 1, 0, 0, 0, 973, 951, 1, 0, 0, 0, 973, 952, 1, 0, 0, 0, 973, 953, 1, 0, 0, 0, 973, 954, 1, 0, 0, 0, 973, 955, 1, 0, 0, 0, 973, 957, 1, 0, 0, 0, 973, 964, 1, 0, 0, 0, 973, 967, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 969, 1, 0, 0, 0, 973, 970, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 973, 972, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 1043, 3, 116, 58, 18, 976, 977, 10, 15, 0, 0, 977, 978, 5, 138, 0, 0, 978, 1043, 3, 116, 58, 16, 979, 980, 10, 13, 0, 0, 980, 981, 5, 2, 0, 0, 981, 1043, 3, 116, 58, 14, 982, 983, 10, 12, 0, 0, 983, 984, 5, 64, 0, 0, 984, 1043, 3, 116, 58, 13, 985, 987, 10, 11, 0, 0, 986, 988, 5, 59, 0, 0, 987, 986, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 990, 5, 9, 0, 0, 990, 991, 3, 116, 58, 0, 991, 992, 5, 2, 0, 0, 992, 993, 3, 116, 58, 12, 993, 1043, 1, 0, 0, 0, 994, 995, 10, 10, 0, 0, 995, 996, 5, 141, 0, 0, 996, 997, 3, 116, 58, 0, 997, 998, 5, 116, 0, 0, 998, 999, 3, 116, 58, 10, 999, 1043, 1, 0, 0, 0, 1000, 1001, 10, 30, 0, 0, 1001, 1003, 5, 131, 0, 0, 1002, 1004, 3, 114, 57, 0, 1003, 1002, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1043, 5, 150, 0, 0, 1006, 1007, 10, 26, 0, 0, 1007, 1008, 5, 130, 0, 0, 1008, 1009, 3, 116, 58, 0, 1009, 1010, 5, 149, 0, 0, 1010, 1043, 1, 0, 0, 0, 1011, 1012, 10, 25, 0, 0, 1012, 1013, 5, 121, 0, 0, 1013, 1043, 5, 109, 0, 0, 1014, 1015, 10, 24, 0, 0, 1015, 1016, 5, 121, 0, 0, 1016, 1043, 3, 156, 78, 0, 1017, 1018, 10, 23, 0, 0, 1018, 1019, 5, 137, 0, 0, 1019, 1020, 5, 130, 0, 0, 1020, 1021, 3, 116, 58, 0, 1021, 1022, 5, 149, 0, 0, 1022, 1043, 1, 0, 0, 0, 1023, 1024, 10, 22, 0, 0, 1024, 1025, 5, 137, 0, 0, 1025, 1043, 5, 109, 0, 0, 1026, 1027, 10, 21, 0, 0, 1027, 1028, 5, 137, 0, 0, 1028, 1043, 3, 156, 78, 0, 1029, 1030, 10, 16, 0, 0, 1030, 1032, 5, 47, 0, 0, 1031, 1033, 5, 59, 0, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1043, 5, 60, 0, 0, 1035, 1040, 10, 9, 0, 0, 1036, 1037, 5, 6, 0, 0, 1037, 1041, 3, 156, 78, 0, 1038, 1039, 5, 6, 0, 0, 1039, 1041, 5, 111, 0, 0, 1040, 1036, 1, 0, 0, 0, 1040, 1038, 1, 0, 0, 0, 1041, 1043, 1, 0, 0, 0, 1042, 934, 1, 0, 0, 0, 1042, 941, 1, 0, 0, 0, 1042, 948, 1, 0, 0, 0, 1042, 976, 1, 0, 0, 0, 1042, 979, 1, 0, 0, 0, 1042, 982, 1, 0, 0, 0, 1042, 985, 1, 0, 0, 0, 1042, 994, 1, 0, 0, 0, 1042, 1000, 1, 0, 0, 0, 1042, 1006, 1, 0, 0, 0, 1042, 1011, 1, 0, 0, 0, 1042, 1014, 1, 0, 0, 0, 1042, 1017, 1, 0, 0, 0, 1042, 1023, 1, 0, 0, 0, 1042, 1026, 1, 0, 0, 0, 1042, 1029, 1, 0, 0, 0, 1042, 1035, 1, 0, 0, 0, 1043, 1046, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 117, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1047, 1048, 5, 131, 0, 0, 1048, 1053, 3, 156, 78, 0, 1049, 1050, 5, 117, 0, 0, 1050, 1052, 3, 156, 78, 0, 1051, 1049, 1, 0, 0, 0, 1052, 1055, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1057, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1056, 1058, 5, 117, 0, 0, 1057, 1056, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 5, 150, 0, 0, 1060, 1075, 1, 0, 0, 0, 1061, 1066, 3, 156, 78, 0, 1062, 1063, 5, 117, 0, 0, 1063, 1065, 3, 156, 78, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1068, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1069, 1071, 5, 117, 0, 0, 1070, 1069, 1, 0, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1075, 1, 0, 0, 0, 1072, 1073, 5, 131, 0, 0, 1073, 1075, 5, 150, 0, 0, 1074, 1047, 1, 0, 0, 0, 1074, 1061, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1079, 5, 112, 0, 0, 1077, 1080, 3, 116, 58, 0, 1078, 1080, 3, 36, 18, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1078, 1, 0, 0, 0, 1080, 119, 1, 0, 0, 0, 1081, 1082, 5, 133, 0, 0, 1082, 1086, 3, 156, 78, 0, 1083, 1085, 3, 122, 61, 0, 1084, 1083, 1, 0, 0, 0, 1085, 1088, 1, 0, 0, 0, 1086, 1084, 1, 0, 0, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1089, 1, 0, 0, 0, 1088, 1086, 1, 0, 0, 0, 1089, 1090, 5, 152, 0, 0, 1090, 1091, 5, 125, 0, 0, 1091, 1114, 1, 0, 0, 0, 1092, 1093, 5, 133, 0, 0, 1093, 1097, 3, 156, 78, 0, 1094, 1096, 3, 122, 61, 0, 1095, 1094, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1106, 5, 125, 0, 0, 1101, 1107, 3, 120, 60, 0, 1102, 1103, 5, 129, 0, 0, 1103, 1104, 3, 116, 58, 0, 1104, 1105, 5, 148, 0, 0, 1105, 1107, 1, 0, 0, 0, 1106, 1101, 1, 0, 0, 0, 1106, 1102, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 5, 133, 0, 0, 1109, 1110, 5, 152, 0, 0, 1110, 1111, 3, 156, 78, 0, 1111, 1112, 5, 125, 0, 0, 1112, 1114, 1, 0, 0, 0, 1113, 1081, 1, 0, 0, 0, 1113, 1092, 1, 0, 0, 0, 1114, 121, 1, 0, 0, 0, 1115, 1116, 3, 156, 78, 0, 1116, 1117, 5, 123, 0, 0, 1117, 1118, 3, 162, 81, 0, 1118, 1127, 1, 0, 0, 0, 1119, 1120, 3, 156, 78, 0, 1120, 1121, 5, 123, 0, 0, 1121, 1122, 5, 129, 0, 0, 1122, 1123, 3, 116, 58, 0, 1123, 1124, 5, 148, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1127, 3, 156, 78, 0, 1126, 1115, 1, 0, 0, 0, 1126, 1119, 1, 0, 0, 0, 1126, 1125, 1, 0, 0, 0, 1127, 123, 1, 0, 0, 0, 1128, 1133, 3, 126, 63, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1132, 3, 126, 63, 0, 1131, 1129, 1, 0, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1137, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1136, 1138, 5, 117, 0, 0, 1137, 1136, 1, 0, 0, 0, 1137, 1138, 1, 0, 0, 0, 1138, 125, 1, 0, 0, 0, 1139, 1140, 3, 156, 78, 0, 1140, 1141, 5, 6, 0, 0, 1141, 1142, 5, 131, 0, 0, 1142, 1143, 3, 44, 22, 0, 1143, 1144, 5, 150, 0, 0, 1144, 1150, 1, 0, 0, 0, 1145, 1146, 3, 116, 58, 0, 1146, 1147, 5, 6, 0, 0, 1147, 1148, 3, 156, 78, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1139, 1, 0, 0, 0, 1149, 1145, 1, 0, 0, 0, 1150, 127, 1, 0, 0, 0, 1151, 1159, 3, 160, 80, 0, 1152, 1153, 3, 136, 68, 0, 1153, 1154, 5, 121, 0, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1152, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 3, 130, 65, 0, 1158, 1151, 1, 0, 0, 0, 1158, 1155, 1, 0, 0, 0, 1159, 129, 1, 0, 0, 0, 1160, 1165, 3, 156, 78, 0, 1161, 1162, 5, 121, 0, 0, 1162, 1164, 3, 156, 78, 0, 1163, 1161, 1, 0, 0, 0, 1164, 1167, 1, 0, 0, 0, 1165, 1163, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 131, 1, 0, 0, 0, 1167, 1165, 1, 0, 0, 0, 1168, 1169, 6, 66, -1, 0, 1169, 1178, 3, 136, 68, 0, 1170, 1178, 3, 134, 67, 0, 1171, 1172, 5, 131, 0, 0, 1172, 1173, 3, 44, 22, 0, 1173, 1174, 5, 150, 0, 0, 1174, 1178, 1, 0, 0, 0, 1175, 1178, 3, 120, 60, 0, 1176, 1178, 3, 160, 80, 0, 1177, 1168, 1, 0, 0, 0, 1177, 1170, 1, 0, 0, 0, 1177, 1171, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1177, 1176, 1, 0, 0, 0, 1178, 1187, 1, 0, 0, 0, 1179, 1183, 10, 3, 0, 0, 1180, 1184, 3, 154, 77, 0, 1181, 1182, 5, 6, 0, 0, 1182, 1184, 3, 156, 78, 0, 1183, 1180, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1186, 1189, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 133, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1190, 1191, 3, 156, 78, 0, 1191, 1193, 5, 131, 0, 0, 1192, 1194, 3, 138, 69, 0, 1193, 1192, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 5, 150, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1198, 3, 140, 70, 0, 1198, 1199, 5, 121, 0, 0, 1199, 1201, 1, 0, 0, 0, 1200, 1197, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 3, 156, 78, 0, 1203, 137, 1, 0, 0, 0, 1204, 1209, 3, 116, 58, 0, 1205, 1206, 5, 117, 0, 0, 1206, 1208, 3, 116, 58, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1213, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1214, 5, 117, 0, 0, 1213, 1212, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 139, 1, 0, 0, 0, 1215, 1216, 3, 156, 78, 0, 1216, 141, 1, 0, 0, 0, 1217, 1226, 5, 107, 0, 0, 1218, 1219, 5, 121, 0, 0, 1219, 1226, 7, 12, 0, 0, 1220, 1221, 5, 109, 0, 0, 1221, 1223, 5, 121, 0, 0, 1222, 1224, 7, 12, 0, 0, 1223, 1222, 1, 0, 0, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1220, 1, 0, 0, 0, 1226, 143, 1, 0, 0, 0, 1227, 1229, 7, 13, 0, 0, 1228, 1227, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1236, 1, 0, 0, 0, 1230, 1237, 3, 142, 71, 0, 1231, 1237, 5, 108, 0, 0, 1232, 1237, 5, 109, 0, 0, 1233, 1237, 5, 110, 0, 0, 1234, 1237, 5, 44, 0, 0, 1235, 1237, 5, 58, 0, 0, 1236, 1230, 1, 0, 0, 0, 1236, 1231, 1, 0, 0, 0, 1236, 1232, 1, 0, 0, 0, 1236, 1233, 1, 0, 0, 0, 1236, 1234, 1, 0, 0, 0, 1236, 1235, 1, 0, 0, 0, 1237, 145, 1, 0, 0, 0, 1238, 1242, 3, 144, 72, 0, 1239, 1242, 5, 111, 0, 0, 1240, 1242, 5, 60, 0, 0, 1241, 1238, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1240, 1, 0, 0, 0, 1242, 147, 1, 0, 0, 0, 1243, 1244, 7, 14, 0, 0, 1244, 149, 1, 0, 0, 0, 1245, 1246, 7, 15, 0, 0, 1246, 151, 1, 0, 0, 0, 1247, 1248, 7, 16, 0, 0, 1248, 153, 1, 0, 0, 0, 1249, 1252, 5, 106, 0, 0, 1250, 1252, 3, 152, 76, 0, 1251, 1249, 1, 0, 0, 0, 1251, 1250, 1, 0, 0, 0, 1252, 155, 1, 0, 0, 0, 1253, 1257, 5, 106, 0, 0, 1254, 1257, 3, 148, 74, 0, 1255, 1257, 3, 150, 75, 0, 1256, 1253, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1255, 1, 0, 0, 0, 1257, 157, 1, 0, 0, 0, 1258, 1259, 3, 162, 81, 0, 1259, 1260, 5, 123, 0, 0, 1260, 1261, 3, 144, 72, 0, 1261, 159, 1, 0, 0, 0, 1262, 1263, 5, 129, 0, 0, 1263, 1264, 3, 116, 58, 0, 1264, 1265, 5, 148, 0, 0, 1265, 161, 1, 0, 0, 0, 1266, 1269, 5, 111, 0, 0, 1267, 1269, 3, 164, 82, 0, 1268, 1266, 1, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1269, 163, 1, 0, 0, 0, 1270, 1274, 5, 143, 0, 0, 1271, 1273, 3, 166, 83, 0, 1272, 1271, 1, 0, 0, 0, 1273, 1276, 1, 0, 0, 0, 1274, 1272, 1, 0, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1277, 1, 0, 0, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1278, 5, 145, 0, 0, 1278, 165, 1, 0, 0, 0, 1279, 1280, 5, 158, 0, 0, 1280, 1281, 3, 116, 58, 0, 1281, 1282, 5, 148, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1285, 5, 157, 0, 0, 1284, 1279, 1, 0, 0, 0, 1284, 1283, 1, 0, 0, 0, 1285, 167, 1, 0, 0, 0, 1286, 1290, 5, 144, 0, 0, 1287, 1289, 3, 170, 85, 0, 1288, 1287, 1, 0, 0, 0, 1289, 1292, 1, 0, 0, 0, 1290, 1288, 1, 0, 0, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1293, 1294, 5, 0, 0, 1, 1294, 169, 1, 0, 0, 0, 1295, 1296, 5, 160, 0, 0, 1296, 1297, 3, 116, 58, 0, 1297, 1298, 5, 148, 0, 0, 1298, 1301, 1, 0, 0, 0, 1299, 1301, 5, 159, 0, 0, 1300, 1295, 1, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 171, 1, 0, 0, 0, 167, 175, 182, 191, 198, 202, 216, 220, 223, 227, 230, 237, 241, 250, 255, 264, 272, 279, 283, 289, 294, 302, 309, 315, 327, 335, 349, 353, 358, 368, 377, 380, 384, 387, 391, 394, 397, 400, 403, 407, 411, 414, 417, 420, 424, 427, 436, 442, 463, 480, 497, 503, 509, 520, 522, 533, 536, 542, 550, 556, 558, 562, 567, 570, 573, 577, 581, 584, 586, 589, 593, 597, 600, 602, 604, 609, 620, 626, 633, 638, 642, 646, 652, 654, 661, 669, 672, 675, 694, 708, 724, 728, 739, 743, 754, 758, 765, 769, 776, 780, 785, 794, 798, 822, 839, 845, 848, 851, 861, 867, 870, 873, 881, 884, 888, 891, 905, 922, 927, 932, 938, 945, 957, 961, 964, 973, 987, 1003, 1032, 1040, 1042, 1044, 1053, 1057, 1066, 1070, 1074, 1079, 1086, 1097, 1106, 1113, 1126, 1133, 1137, 1149, 1155, 1158, 1165, 1177, 1183, 1187, 1193, 1200, 1209, 1213, 1223, 1225, 1228, 1236, 1241, 1251, 1256, 1268, 1274, 1284, 1290, 1300] \ No newline at end of file +[4, 1, 162, 1311, 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, 1, 0, 5, 0, 176, 8, 0, 10, 0, 12, 0, 179, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 185, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 194, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 199, 8, 4, 10, 4, 12, 4, 202, 9, 4, 1, 4, 3, 4, 205, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 219, 8, 5, 1, 6, 1, 6, 3, 6, 223, 8, 6, 1, 6, 3, 6, 226, 8, 6, 1, 7, 1, 7, 3, 7, 230, 8, 7, 1, 7, 3, 7, 233, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 240, 8, 8, 1, 8, 1, 8, 3, 8, 244, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 251, 8, 9, 10, 9, 12, 9, 254, 9, 9, 1, 9, 1, 9, 3, 9, 258, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 267, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 275, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 282, 8, 12, 1, 12, 1, 12, 3, 12, 286, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 292, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 305, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 312, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 318, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 330, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 336, 8, 18, 10, 18, 12, 18, 339, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 350, 8, 20, 10, 20, 12, 20, 353, 9, 20, 1, 20, 3, 20, 356, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 361, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 371, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 23, 1, 23, 1, 24, 1, 24, 5, 24, 383, 8, 24, 10, 24, 12, 24, 386, 9, 24, 1, 25, 3, 25, 389, 8, 25, 1, 25, 1, 25, 3, 25, 393, 8, 25, 1, 25, 3, 25, 396, 8, 25, 1, 25, 1, 25, 3, 25, 400, 8, 25, 1, 25, 3, 25, 403, 8, 25, 1, 25, 3, 25, 406, 8, 25, 1, 25, 3, 25, 409, 8, 25, 1, 25, 3, 25, 412, 8, 25, 1, 25, 1, 25, 3, 25, 416, 8, 25, 1, 25, 1, 25, 3, 25, 420, 8, 25, 1, 25, 3, 25, 423, 8, 25, 1, 25, 3, 25, 426, 8, 25, 1, 25, 3, 25, 429, 8, 25, 1, 25, 1, 25, 3, 25, 433, 8, 25, 1, 25, 3, 25, 436, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 445, 8, 27, 1, 28, 1, 28, 1, 28, 1, 29, 3, 29, 451, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 470, 8, 30, 10, 30, 12, 30, 473, 9, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 489, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 506, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 512, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 518, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 529, 8, 37, 3, 37, 531, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 542, 8, 40, 1, 40, 3, 40, 545, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 551, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 559, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 565, 8, 40, 10, 40, 12, 40, 568, 9, 40, 1, 41, 3, 41, 571, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 576, 8, 41, 1, 41, 3, 41, 579, 8, 41, 1, 41, 3, 41, 582, 8, 41, 1, 41, 1, 41, 3, 41, 586, 8, 41, 1, 41, 1, 41, 3, 41, 590, 8, 41, 1, 41, 3, 41, 593, 8, 41, 3, 41, 595, 8, 41, 1, 41, 3, 41, 598, 8, 41, 1, 41, 1, 41, 3, 41, 602, 8, 41, 1, 41, 1, 41, 3, 41, 606, 8, 41, 1, 41, 3, 41, 609, 8, 41, 3, 41, 611, 8, 41, 3, 41, 613, 8, 41, 1, 42, 1, 42, 1, 42, 3, 42, 618, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 629, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 635, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 640, 8, 45, 10, 45, 12, 45, 643, 9, 45, 1, 46, 1, 46, 3, 46, 647, 8, 46, 1, 46, 1, 46, 3, 46, 651, 8, 46, 1, 46, 1, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 661, 8, 47, 3, 47, 663, 8, 47, 1, 48, 1, 48, 1, 48, 5, 48, 668, 8, 48, 10, 48, 12, 48, 671, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 3, 50, 678, 8, 50, 1, 50, 3, 50, 681, 8, 50, 1, 50, 3, 50, 684, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 703, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 717, 8, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 731, 8, 57, 10, 57, 12, 57, 734, 9, 57, 1, 57, 3, 57, 737, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 746, 8, 57, 10, 57, 12, 57, 749, 9, 57, 1, 57, 3, 57, 752, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 761, 8, 57, 10, 57, 12, 57, 764, 9, 57, 1, 57, 3, 57, 767, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 774, 8, 57, 1, 57, 1, 57, 3, 57, 778, 8, 57, 1, 58, 1, 58, 1, 58, 5, 58, 783, 8, 58, 10, 58, 12, 58, 786, 9, 58, 1, 58, 3, 58, 789, 8, 58, 1, 59, 1, 59, 1, 59, 3, 59, 794, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 801, 8, 59, 11, 59, 12, 59, 802, 1, 59, 1, 59, 3, 59, 807, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 831, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 848, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 854, 8, 59, 1, 59, 3, 59, 857, 8, 59, 1, 59, 3, 59, 860, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 870, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 876, 8, 59, 1, 59, 3, 59, 879, 8, 59, 1, 59, 3, 59, 882, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 890, 8, 59, 1, 59, 3, 59, 893, 8, 59, 1, 59, 1, 59, 3, 59, 897, 8, 59, 1, 59, 3, 59, 900, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 914, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 931, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 936, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 947, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 954, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 966, 8, 59, 1, 59, 1, 59, 3, 59, 970, 8, 59, 1, 59, 3, 59, 973, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 982, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 996, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1012, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1041, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1049, 8, 59, 5, 59, 1051, 8, 59, 10, 59, 12, 59, 1054, 9, 59, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1060, 8, 60, 10, 60, 12, 60, 1063, 9, 60, 1, 60, 3, 60, 1066, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1073, 8, 60, 10, 60, 12, 60, 1076, 9, 60, 1, 60, 3, 60, 1079, 8, 60, 1, 60, 1, 60, 3, 60, 1083, 8, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1088, 8, 60, 1, 61, 1, 61, 1, 61, 5, 61, 1093, 8, 61, 10, 61, 12, 61, 1096, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1104, 8, 61, 10, 61, 12, 61, 1107, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1115, 8, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1122, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1135, 8, 62, 1, 63, 1, 63, 1, 63, 5, 63, 1140, 8, 63, 10, 63, 12, 63, 1143, 9, 63, 1, 63, 3, 63, 1146, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1158, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1164, 8, 65, 1, 65, 3, 65, 1167, 8, 65, 1, 66, 1, 66, 1, 66, 5, 66, 1172, 8, 66, 10, 66, 12, 66, 1175, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1186, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1192, 8, 67, 5, 67, 1194, 8, 67, 10, 67, 12, 67, 1197, 9, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1202, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 3, 69, 1209, 8, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1216, 8, 70, 10, 70, 12, 70, 1219, 9, 70, 1, 70, 3, 70, 1222, 8, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1232, 8, 72, 3, 72, 1234, 8, 72, 1, 73, 3, 73, 1237, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1245, 8, 73, 1, 74, 1, 74, 1, 74, 3, 74, 1250, 8, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 3, 78, 1260, 8, 78, 1, 79, 1, 79, 1, 79, 3, 79, 1265, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 3, 82, 1277, 8, 82, 1, 83, 1, 83, 5, 83, 1281, 8, 83, 10, 83, 12, 83, 1284, 9, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1293, 8, 84, 1, 85, 1, 85, 5, 85, 1297, 8, 85, 10, 85, 12, 85, 1300, 9, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1309, 8, 86, 1, 86, 0, 3, 80, 118, 134, 87, 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, 0, 17, 2, 0, 32, 32, 37, 37, 2, 0, 18, 18, 77, 77, 2, 0, 46, 46, 54, 54, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 83, 83, 2, 0, 54, 54, 76, 76, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 31, 31, 52, 52, 2, 0, 74, 74, 79, 79, 3, 0, 10, 10, 53, 53, 93, 93, 2, 0, 43, 43, 56, 56, 1, 0, 110, 111, 2, 0, 121, 121, 142, 142, 7, 0, 21, 21, 40, 40, 58, 59, 73, 73, 81, 81, 100, 100, 106, 106, 19, 0, 1, 13, 15, 20, 22, 26, 28, 29, 31, 31, 33, 36, 38, 39, 41, 44, 46, 46, 48, 54, 56, 57, 61, 61, 63, 72, 74, 80, 82, 86, 88, 95, 97, 99, 101, 102, 104, 105, 4, 0, 20, 20, 31, 31, 41, 41, 51, 51, 1484, 0, 177, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 6, 188, 1, 0, 0, 0, 8, 195, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 247, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 268, 1, 0, 0, 0, 24, 276, 1, 0, 0, 0, 26, 298, 1, 0, 0, 0, 28, 313, 1, 0, 0, 0, 30, 322, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 331, 1, 0, 0, 0, 36, 333, 1, 0, 0, 0, 38, 342, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 370, 1, 0, 0, 0, 46, 376, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 388, 1, 0, 0, 0, 52, 437, 1, 0, 0, 0, 54, 440, 1, 0, 0, 0, 56, 446, 1, 0, 0, 0, 58, 450, 1, 0, 0, 0, 60, 456, 1, 0, 0, 0, 62, 474, 1, 0, 0, 0, 64, 477, 1, 0, 0, 0, 66, 480, 1, 0, 0, 0, 68, 490, 1, 0, 0, 0, 70, 493, 1, 0, 0, 0, 72, 497, 1, 0, 0, 0, 74, 530, 1, 0, 0, 0, 76, 532, 1, 0, 0, 0, 78, 535, 1, 0, 0, 0, 80, 550, 1, 0, 0, 0, 82, 612, 1, 0, 0, 0, 84, 617, 1, 0, 0, 0, 86, 628, 1, 0, 0, 0, 88, 630, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 644, 1, 0, 0, 0, 94, 662, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 672, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 685, 1, 0, 0, 0, 104, 689, 1, 0, 0, 0, 106, 693, 1, 0, 0, 0, 108, 702, 1, 0, 0, 0, 110, 716, 1, 0, 0, 0, 112, 718, 1, 0, 0, 0, 114, 777, 1, 0, 0, 0, 116, 779, 1, 0, 0, 0, 118, 940, 1, 0, 0, 0, 120, 1082, 1, 0, 0, 0, 122, 1121, 1, 0, 0, 0, 124, 1134, 1, 0, 0, 0, 126, 1136, 1, 0, 0, 0, 128, 1157, 1, 0, 0, 0, 130, 1166, 1, 0, 0, 0, 132, 1168, 1, 0, 0, 0, 134, 1185, 1, 0, 0, 0, 136, 1198, 1, 0, 0, 0, 138, 1208, 1, 0, 0, 0, 140, 1212, 1, 0, 0, 0, 142, 1223, 1, 0, 0, 0, 144, 1233, 1, 0, 0, 0, 146, 1236, 1, 0, 0, 0, 148, 1249, 1, 0, 0, 0, 150, 1251, 1, 0, 0, 0, 152, 1253, 1, 0, 0, 0, 154, 1255, 1, 0, 0, 0, 156, 1259, 1, 0, 0, 0, 158, 1264, 1, 0, 0, 0, 160, 1266, 1, 0, 0, 0, 162, 1270, 1, 0, 0, 0, 164, 1276, 1, 0, 0, 0, 166, 1278, 1, 0, 0, 0, 168, 1292, 1, 0, 0, 0, 170, 1294, 1, 0, 0, 0, 172, 1308, 1, 0, 0, 0, 174, 176, 3, 2, 1, 0, 175, 174, 1, 0, 0, 0, 176, 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 180, 181, 5, 0, 0, 1, 181, 1, 1, 0, 0, 0, 182, 185, 3, 6, 3, 0, 183, 185, 3, 10, 5, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 3, 1, 0, 0, 0, 186, 187, 3, 118, 59, 0, 187, 5, 1, 0, 0, 0, 188, 189, 5, 55, 0, 0, 189, 193, 3, 158, 79, 0, 190, 191, 5, 118, 0, 0, 191, 192, 5, 125, 0, 0, 192, 194, 3, 4, 2, 0, 193, 190, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 7, 1, 0, 0, 0, 195, 200, 3, 158, 79, 0, 196, 197, 5, 119, 0, 0, 197, 199, 3, 158, 79, 0, 198, 196, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 203, 205, 5, 119, 0, 0, 204, 203, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 9, 1, 0, 0, 0, 206, 219, 3, 12, 6, 0, 207, 219, 3, 14, 7, 0, 208, 219, 3, 18, 9, 0, 209, 219, 3, 20, 10, 0, 210, 219, 3, 22, 11, 0, 211, 219, 3, 26, 13, 0, 212, 219, 3, 24, 12, 0, 213, 219, 3, 28, 14, 0, 214, 219, 3, 30, 15, 0, 215, 219, 3, 36, 18, 0, 216, 219, 3, 32, 16, 0, 217, 219, 3, 34, 17, 0, 218, 206, 1, 0, 0, 0, 218, 207, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 209, 1, 0, 0, 0, 218, 210, 1, 0, 0, 0, 218, 211, 1, 0, 0, 0, 218, 212, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 218, 214, 1, 0, 0, 0, 218, 215, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 217, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 222, 5, 75, 0, 0, 221, 223, 3, 4, 2, 0, 222, 221, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 225, 1, 0, 0, 0, 224, 226, 5, 153, 0, 0, 225, 224, 1, 0, 0, 0, 225, 226, 1, 0, 0, 0, 226, 13, 1, 0, 0, 0, 227, 229, 5, 87, 0, 0, 228, 230, 3, 4, 2, 0, 229, 228, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 233, 5, 153, 0, 0, 232, 231, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 15, 1, 0, 0, 0, 234, 243, 5, 14, 0, 0, 235, 236, 5, 133, 0, 0, 236, 239, 3, 158, 79, 0, 237, 238, 5, 118, 0, 0, 238, 240, 3, 158, 79, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 5, 152, 0, 0, 242, 244, 1, 0, 0, 0, 243, 235, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 246, 3, 36, 18, 0, 246, 17, 1, 0, 0, 0, 247, 248, 5, 96, 0, 0, 248, 252, 3, 36, 18, 0, 249, 251, 3, 16, 8, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 257, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 30, 0, 0, 256, 258, 3, 36, 18, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 19, 1, 0, 0, 0, 259, 260, 5, 42, 0, 0, 260, 261, 5, 133, 0, 0, 261, 262, 3, 4, 2, 0, 262, 263, 5, 152, 0, 0, 263, 266, 3, 10, 5, 0, 264, 265, 5, 25, 0, 0, 265, 267, 3, 10, 5, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 269, 5, 103, 0, 0, 269, 270, 5, 133, 0, 0, 270, 271, 3, 4, 2, 0, 271, 272, 5, 152, 0, 0, 272, 274, 3, 10, 5, 0, 273, 275, 5, 153, 0, 0, 274, 273, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 23, 1, 0, 0, 0, 276, 277, 5, 34, 0, 0, 277, 281, 5, 133, 0, 0, 278, 282, 3, 6, 3, 0, 279, 282, 3, 30, 15, 0, 280, 282, 3, 4, 2, 0, 281, 278, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 280, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 285, 5, 153, 0, 0, 284, 286, 3, 4, 2, 0, 285, 284, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 291, 5, 153, 0, 0, 288, 292, 3, 6, 3, 0, 289, 292, 3, 30, 15, 0, 290, 292, 3, 4, 2, 0, 291, 288, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 290, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 294, 5, 152, 0, 0, 294, 296, 3, 10, 5, 0, 295, 297, 5, 153, 0, 0, 296, 295, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 25, 1, 0, 0, 0, 298, 299, 5, 34, 0, 0, 299, 300, 5, 133, 0, 0, 300, 301, 5, 55, 0, 0, 301, 304, 3, 158, 79, 0, 302, 303, 5, 119, 0, 0, 303, 305, 3, 158, 79, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 307, 5, 44, 0, 0, 307, 308, 3, 4, 2, 0, 308, 309, 5, 152, 0, 0, 309, 311, 3, 10, 5, 0, 310, 312, 5, 153, 0, 0, 311, 310, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 27, 1, 0, 0, 0, 313, 314, 7, 0, 0, 0, 314, 315, 3, 158, 79, 0, 315, 317, 5, 133, 0, 0, 316, 318, 3, 8, 4, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 5, 152, 0, 0, 320, 321, 3, 36, 18, 0, 321, 29, 1, 0, 0, 0, 322, 323, 3, 4, 2, 0, 323, 324, 5, 118, 0, 0, 324, 325, 5, 125, 0, 0, 325, 326, 3, 4, 2, 0, 326, 31, 1, 0, 0, 0, 327, 329, 3, 4, 2, 0, 328, 330, 5, 153, 0, 0, 329, 328, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 33, 1, 0, 0, 0, 331, 332, 5, 153, 0, 0, 332, 35, 1, 0, 0, 0, 333, 337, 5, 131, 0, 0, 334, 336, 3, 2, 1, 0, 335, 334, 1, 0, 0, 0, 336, 339, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 340, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 340, 341, 5, 150, 0, 0, 341, 37, 1, 0, 0, 0, 342, 343, 3, 4, 2, 0, 343, 344, 5, 118, 0, 0, 344, 345, 3, 4, 2, 0, 345, 39, 1, 0, 0, 0, 346, 351, 3, 38, 19, 0, 347, 348, 5, 119, 0, 0, 348, 350, 3, 38, 19, 0, 349, 347, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 354, 356, 5, 119, 0, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 41, 1, 0, 0, 0, 357, 361, 3, 48, 24, 0, 358, 361, 3, 50, 25, 0, 359, 361, 3, 122, 61, 0, 360, 357, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 0, 0, 1, 363, 43, 1, 0, 0, 0, 364, 371, 3, 50, 25, 0, 365, 366, 5, 133, 0, 0, 366, 367, 3, 48, 24, 0, 367, 368, 5, 152, 0, 0, 368, 371, 1, 0, 0, 0, 369, 371, 3, 162, 81, 0, 370, 364, 1, 0, 0, 0, 370, 365, 1, 0, 0, 0, 370, 369, 1, 0, 0, 0, 371, 45, 1, 0, 0, 0, 372, 377, 5, 27, 0, 0, 373, 374, 5, 98, 0, 0, 374, 377, 5, 1, 0, 0, 375, 377, 5, 47, 0, 0, 376, 372, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 376, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 3, 44, 22, 0, 379, 47, 1, 0, 0, 0, 380, 384, 3, 44, 22, 0, 381, 383, 3, 46, 23, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 49, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 389, 3, 52, 26, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 5, 82, 0, 0, 391, 393, 5, 24, 0, 0, 392, 391, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 395, 1, 0, 0, 0, 394, 396, 3, 54, 27, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 3, 116, 58, 0, 398, 400, 3, 56, 28, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 403, 3, 58, 29, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 406, 3, 62, 31, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 409, 3, 64, 32, 0, 408, 407, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 411, 1, 0, 0, 0, 410, 412, 3, 66, 33, 0, 411, 410, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 415, 1, 0, 0, 0, 413, 414, 5, 105, 0, 0, 414, 416, 7, 1, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 418, 5, 105, 0, 0, 418, 420, 5, 92, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 423, 3, 68, 34, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 425, 1, 0, 0, 0, 424, 426, 3, 60, 30, 0, 425, 424, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 428, 1, 0, 0, 0, 427, 429, 3, 70, 35, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 433, 3, 74, 37, 0, 431, 433, 3, 76, 38, 0, 432, 430, 1, 0, 0, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 78, 39, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 51, 1, 0, 0, 0, 437, 438, 5, 105, 0, 0, 438, 439, 3, 126, 63, 0, 439, 53, 1, 0, 0, 0, 440, 441, 5, 91, 0, 0, 441, 444, 5, 111, 0, 0, 442, 443, 5, 105, 0, 0, 443, 445, 5, 88, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 55, 1, 0, 0, 0, 446, 447, 5, 35, 0, 0, 447, 448, 3, 80, 40, 0, 448, 57, 1, 0, 0, 0, 449, 451, 7, 2, 0, 0, 450, 449, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 5, 5, 0, 0, 453, 454, 5, 50, 0, 0, 454, 455, 3, 116, 58, 0, 455, 59, 1, 0, 0, 0, 456, 457, 5, 104, 0, 0, 457, 458, 3, 158, 79, 0, 458, 459, 5, 6, 0, 0, 459, 460, 5, 133, 0, 0, 460, 461, 3, 100, 50, 0, 461, 471, 5, 152, 0, 0, 462, 463, 5, 119, 0, 0, 463, 464, 3, 158, 79, 0, 464, 465, 5, 6, 0, 0, 465, 466, 5, 133, 0, 0, 466, 467, 3, 100, 50, 0, 467, 468, 5, 152, 0, 0, 468, 470, 1, 0, 0, 0, 469, 462, 1, 0, 0, 0, 470, 473, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 61, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 474, 475, 5, 72, 0, 0, 475, 476, 3, 118, 59, 0, 476, 63, 1, 0, 0, 0, 477, 478, 5, 102, 0, 0, 478, 479, 3, 118, 59, 0, 479, 65, 1, 0, 0, 0, 480, 481, 5, 38, 0, 0, 481, 488, 5, 11, 0, 0, 482, 483, 7, 1, 0, 0, 483, 484, 5, 133, 0, 0, 484, 485, 3, 116, 58, 0, 485, 486, 5, 152, 0, 0, 486, 489, 1, 0, 0, 0, 487, 489, 3, 116, 58, 0, 488, 482, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 67, 1, 0, 0, 0, 490, 491, 5, 39, 0, 0, 491, 492, 3, 118, 59, 0, 492, 69, 1, 0, 0, 0, 493, 494, 5, 67, 0, 0, 494, 495, 5, 11, 0, 0, 495, 496, 3, 90, 45, 0, 496, 71, 1, 0, 0, 0, 497, 498, 5, 67, 0, 0, 498, 499, 5, 11, 0, 0, 499, 500, 3, 116, 58, 0, 500, 73, 1, 0, 0, 0, 501, 502, 5, 57, 0, 0, 502, 505, 3, 118, 59, 0, 503, 504, 5, 119, 0, 0, 504, 506, 3, 118, 59, 0, 505, 503, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 511, 1, 0, 0, 0, 507, 508, 5, 105, 0, 0, 508, 512, 5, 88, 0, 0, 509, 510, 5, 11, 0, 0, 510, 512, 3, 116, 58, 0, 511, 507, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 531, 1, 0, 0, 0, 513, 514, 5, 57, 0, 0, 514, 517, 3, 118, 59, 0, 515, 516, 5, 105, 0, 0, 516, 518, 5, 88, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 64, 0, 0, 520, 521, 3, 118, 59, 0, 521, 531, 1, 0, 0, 0, 522, 523, 5, 57, 0, 0, 523, 524, 3, 118, 59, 0, 524, 525, 5, 64, 0, 0, 525, 528, 3, 118, 59, 0, 526, 527, 5, 11, 0, 0, 527, 529, 3, 116, 58, 0, 528, 526, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 531, 1, 0, 0, 0, 530, 501, 1, 0, 0, 0, 530, 513, 1, 0, 0, 0, 530, 522, 1, 0, 0, 0, 531, 75, 1, 0, 0, 0, 532, 533, 5, 64, 0, 0, 533, 534, 3, 118, 59, 0, 534, 77, 1, 0, 0, 0, 535, 536, 5, 84, 0, 0, 536, 537, 3, 96, 48, 0, 537, 79, 1, 0, 0, 0, 538, 539, 6, 40, -1, 0, 539, 541, 3, 134, 67, 0, 540, 542, 5, 29, 0, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 545, 3, 88, 44, 0, 544, 543, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 551, 1, 0, 0, 0, 546, 547, 5, 133, 0, 0, 547, 548, 3, 80, 40, 0, 548, 549, 5, 152, 0, 0, 549, 551, 1, 0, 0, 0, 550, 538, 1, 0, 0, 0, 550, 546, 1, 0, 0, 0, 551, 566, 1, 0, 0, 0, 552, 553, 10, 3, 0, 0, 553, 554, 3, 84, 42, 0, 554, 555, 3, 80, 40, 4, 555, 565, 1, 0, 0, 0, 556, 558, 10, 4, 0, 0, 557, 559, 3, 82, 41, 0, 558, 557, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 561, 5, 50, 0, 0, 561, 562, 3, 80, 40, 0, 562, 563, 3, 86, 43, 0, 563, 565, 1, 0, 0, 0, 564, 552, 1, 0, 0, 0, 564, 556, 1, 0, 0, 0, 565, 568, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 81, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 569, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 579, 5, 46, 0, 0, 573, 575, 5, 46, 0, 0, 574, 576, 7, 3, 0, 0, 575, 574, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 579, 1, 0, 0, 0, 577, 579, 7, 3, 0, 0, 578, 570, 1, 0, 0, 0, 578, 573, 1, 0, 0, 0, 578, 577, 1, 0, 0, 0, 579, 613, 1, 0, 0, 0, 580, 582, 7, 4, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 585, 7, 5, 0, 0, 584, 586, 5, 68, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 595, 1, 0, 0, 0, 587, 589, 7, 5, 0, 0, 588, 590, 5, 68, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 593, 7, 4, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 595, 1, 0, 0, 0, 594, 581, 1, 0, 0, 0, 594, 587, 1, 0, 0, 0, 595, 613, 1, 0, 0, 0, 596, 598, 7, 6, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 601, 5, 36, 0, 0, 600, 602, 5, 68, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 611, 1, 0, 0, 0, 603, 605, 5, 36, 0, 0, 604, 606, 5, 68, 0, 0, 605, 604, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 608, 1, 0, 0, 0, 607, 609, 7, 6, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 611, 1, 0, 0, 0, 610, 597, 1, 0, 0, 0, 610, 603, 1, 0, 0, 0, 611, 613, 1, 0, 0, 0, 612, 578, 1, 0, 0, 0, 612, 594, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 83, 1, 0, 0, 0, 614, 615, 5, 17, 0, 0, 615, 618, 5, 50, 0, 0, 616, 618, 5, 119, 0, 0, 617, 614, 1, 0, 0, 0, 617, 616, 1, 0, 0, 0, 618, 85, 1, 0, 0, 0, 619, 620, 5, 65, 0, 0, 620, 629, 3, 116, 58, 0, 621, 622, 5, 99, 0, 0, 622, 623, 5, 133, 0, 0, 623, 624, 3, 116, 58, 0, 624, 625, 5, 152, 0, 0, 625, 629, 1, 0, 0, 0, 626, 627, 5, 99, 0, 0, 627, 629, 3, 116, 58, 0, 628, 619, 1, 0, 0, 0, 628, 621, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 629, 87, 1, 0, 0, 0, 630, 631, 5, 80, 0, 0, 631, 634, 3, 94, 47, 0, 632, 633, 5, 64, 0, 0, 633, 635, 3, 94, 47, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 89, 1, 0, 0, 0, 636, 641, 3, 92, 46, 0, 637, 638, 5, 119, 0, 0, 638, 640, 3, 92, 46, 0, 639, 637, 1, 0, 0, 0, 640, 643, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 91, 1, 0, 0, 0, 643, 641, 1, 0, 0, 0, 644, 646, 3, 118, 59, 0, 645, 647, 7, 7, 0, 0, 646, 645, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 649, 5, 63, 0, 0, 649, 651, 7, 8, 0, 0, 650, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 654, 1, 0, 0, 0, 652, 653, 5, 16, 0, 0, 653, 655, 5, 113, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 663, 3, 162, 81, 0, 657, 660, 3, 146, 73, 0, 658, 659, 5, 154, 0, 0, 659, 661, 3, 146, 73, 0, 660, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 656, 1, 0, 0, 0, 662, 657, 1, 0, 0, 0, 663, 95, 1, 0, 0, 0, 664, 669, 3, 98, 49, 0, 665, 666, 5, 119, 0, 0, 666, 668, 3, 98, 49, 0, 667, 665, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 97, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 672, 673, 3, 158, 79, 0, 673, 674, 5, 125, 0, 0, 674, 675, 3, 148, 74, 0, 675, 99, 1, 0, 0, 0, 676, 678, 3, 102, 51, 0, 677, 676, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 680, 1, 0, 0, 0, 679, 681, 3, 104, 52, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 683, 1, 0, 0, 0, 682, 684, 3, 106, 53, 0, 683, 682, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 101, 1, 0, 0, 0, 685, 686, 5, 70, 0, 0, 686, 687, 5, 11, 0, 0, 687, 688, 3, 116, 58, 0, 688, 103, 1, 0, 0, 0, 689, 690, 5, 67, 0, 0, 690, 691, 5, 11, 0, 0, 691, 692, 3, 90, 45, 0, 692, 105, 1, 0, 0, 0, 693, 694, 7, 9, 0, 0, 694, 695, 3, 108, 54, 0, 695, 107, 1, 0, 0, 0, 696, 703, 3, 110, 55, 0, 697, 698, 5, 9, 0, 0, 698, 699, 3, 110, 55, 0, 699, 700, 5, 2, 0, 0, 700, 701, 3, 110, 55, 0, 701, 703, 1, 0, 0, 0, 702, 696, 1, 0, 0, 0, 702, 697, 1, 0, 0, 0, 703, 109, 1, 0, 0, 0, 704, 705, 5, 19, 0, 0, 705, 717, 5, 78, 0, 0, 706, 707, 5, 97, 0, 0, 707, 717, 5, 71, 0, 0, 708, 709, 5, 97, 0, 0, 709, 717, 5, 33, 0, 0, 710, 711, 3, 146, 73, 0, 711, 712, 5, 71, 0, 0, 712, 717, 1, 0, 0, 0, 713, 714, 3, 146, 73, 0, 714, 715, 5, 33, 0, 0, 715, 717, 1, 0, 0, 0, 716, 704, 1, 0, 0, 0, 716, 706, 1, 0, 0, 0, 716, 708, 1, 0, 0, 0, 716, 710, 1, 0, 0, 0, 716, 713, 1, 0, 0, 0, 717, 111, 1, 0, 0, 0, 718, 719, 3, 118, 59, 0, 719, 720, 5, 0, 0, 1, 720, 113, 1, 0, 0, 0, 721, 778, 3, 158, 79, 0, 722, 723, 3, 158, 79, 0, 723, 724, 5, 133, 0, 0, 724, 725, 3, 158, 79, 0, 725, 732, 3, 114, 57, 0, 726, 727, 5, 119, 0, 0, 727, 728, 3, 158, 79, 0, 728, 729, 3, 114, 57, 0, 729, 731, 1, 0, 0, 0, 730, 726, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 737, 5, 119, 0, 0, 736, 735, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 5, 152, 0, 0, 739, 778, 1, 0, 0, 0, 740, 741, 3, 158, 79, 0, 741, 742, 5, 133, 0, 0, 742, 747, 3, 160, 80, 0, 743, 744, 5, 119, 0, 0, 744, 746, 3, 160, 80, 0, 745, 743, 1, 0, 0, 0, 746, 749, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 751, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 750, 752, 5, 119, 0, 0, 751, 750, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 5, 152, 0, 0, 754, 778, 1, 0, 0, 0, 755, 756, 3, 158, 79, 0, 756, 757, 5, 133, 0, 0, 757, 762, 3, 114, 57, 0, 758, 759, 5, 119, 0, 0, 759, 761, 3, 114, 57, 0, 760, 758, 1, 0, 0, 0, 761, 764, 1, 0, 0, 0, 762, 760, 1, 0, 0, 0, 762, 763, 1, 0, 0, 0, 763, 766, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 767, 5, 119, 0, 0, 766, 765, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 5, 152, 0, 0, 769, 778, 1, 0, 0, 0, 770, 771, 3, 158, 79, 0, 771, 773, 5, 133, 0, 0, 772, 774, 3, 116, 58, 0, 773, 772, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 5, 152, 0, 0, 776, 778, 1, 0, 0, 0, 777, 721, 1, 0, 0, 0, 777, 722, 1, 0, 0, 0, 777, 740, 1, 0, 0, 0, 777, 755, 1, 0, 0, 0, 777, 770, 1, 0, 0, 0, 778, 115, 1, 0, 0, 0, 779, 784, 3, 118, 59, 0, 780, 781, 5, 119, 0, 0, 781, 783, 3, 118, 59, 0, 782, 780, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 782, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 787, 789, 5, 119, 0, 0, 788, 787, 1, 0, 0, 0, 788, 789, 1, 0, 0, 0, 789, 117, 1, 0, 0, 0, 790, 791, 6, 59, -1, 0, 791, 793, 5, 12, 0, 0, 792, 794, 3, 118, 59, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 800, 1, 0, 0, 0, 795, 796, 5, 101, 0, 0, 796, 797, 3, 118, 59, 0, 797, 798, 5, 86, 0, 0, 798, 799, 3, 118, 59, 0, 799, 801, 1, 0, 0, 0, 800, 795, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 25, 0, 0, 805, 807, 3, 118, 59, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 5, 26, 0, 0, 809, 941, 1, 0, 0, 0, 810, 811, 5, 13, 0, 0, 811, 812, 5, 133, 0, 0, 812, 813, 3, 118, 59, 0, 813, 814, 5, 6, 0, 0, 814, 815, 3, 114, 57, 0, 815, 816, 5, 152, 0, 0, 816, 941, 1, 0, 0, 0, 817, 818, 5, 20, 0, 0, 818, 941, 5, 113, 0, 0, 819, 820, 5, 48, 0, 0, 820, 821, 3, 118, 59, 0, 821, 822, 3, 150, 75, 0, 822, 941, 1, 0, 0, 0, 823, 824, 5, 85, 0, 0, 824, 825, 5, 133, 0, 0, 825, 826, 3, 118, 59, 0, 826, 827, 5, 35, 0, 0, 827, 830, 3, 118, 59, 0, 828, 829, 5, 34, 0, 0, 829, 831, 3, 118, 59, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 833, 5, 152, 0, 0, 833, 941, 1, 0, 0, 0, 834, 835, 5, 89, 0, 0, 835, 941, 5, 113, 0, 0, 836, 837, 5, 94, 0, 0, 837, 838, 5, 133, 0, 0, 838, 839, 7, 10, 0, 0, 839, 840, 3, 164, 82, 0, 840, 841, 5, 35, 0, 0, 841, 842, 3, 118, 59, 0, 842, 843, 5, 152, 0, 0, 843, 941, 1, 0, 0, 0, 844, 845, 3, 158, 79, 0, 845, 847, 5, 133, 0, 0, 846, 848, 3, 116, 58, 0, 847, 846, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 5, 152, 0, 0, 850, 859, 1, 0, 0, 0, 851, 853, 5, 133, 0, 0, 852, 854, 5, 24, 0, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 856, 1, 0, 0, 0, 855, 857, 3, 116, 58, 0, 856, 855, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 5, 152, 0, 0, 859, 851, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 69, 0, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 100, 50, 0, 864, 865, 5, 152, 0, 0, 865, 941, 1, 0, 0, 0, 866, 867, 3, 158, 79, 0, 867, 869, 5, 133, 0, 0, 868, 870, 3, 116, 58, 0, 869, 868, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 5, 152, 0, 0, 872, 881, 1, 0, 0, 0, 873, 875, 5, 133, 0, 0, 874, 876, 5, 24, 0, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 1, 0, 0, 0, 877, 879, 3, 116, 58, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 882, 5, 152, 0, 0, 881, 873, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 69, 0, 0, 884, 885, 3, 158, 79, 0, 885, 941, 1, 0, 0, 0, 886, 892, 3, 158, 79, 0, 887, 889, 5, 133, 0, 0, 888, 890, 3, 116, 58, 0, 889, 888, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 5, 152, 0, 0, 892, 887, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 896, 5, 133, 0, 0, 895, 897, 5, 24, 0, 0, 896, 895, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 899, 1, 0, 0, 0, 898, 900, 3, 116, 58, 0, 899, 898, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 5, 152, 0, 0, 902, 941, 1, 0, 0, 0, 903, 941, 3, 122, 61, 0, 904, 941, 3, 166, 83, 0, 905, 941, 3, 148, 74, 0, 906, 907, 5, 121, 0, 0, 907, 941, 3, 118, 59, 20, 908, 909, 5, 61, 0, 0, 909, 941, 3, 118, 59, 14, 910, 911, 3, 138, 69, 0, 911, 912, 5, 123, 0, 0, 912, 914, 1, 0, 0, 0, 913, 910, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 941, 5, 115, 0, 0, 916, 917, 5, 133, 0, 0, 917, 918, 3, 48, 24, 0, 918, 919, 5, 152, 0, 0, 919, 941, 1, 0, 0, 0, 920, 921, 5, 133, 0, 0, 921, 922, 3, 118, 59, 0, 922, 923, 5, 152, 0, 0, 923, 941, 1, 0, 0, 0, 924, 925, 5, 133, 0, 0, 925, 926, 3, 116, 58, 0, 926, 927, 5, 152, 0, 0, 927, 941, 1, 0, 0, 0, 928, 930, 5, 132, 0, 0, 929, 931, 3, 116, 58, 0, 930, 929, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 941, 5, 151, 0, 0, 933, 935, 5, 131, 0, 0, 934, 936, 3, 40, 20, 0, 935, 934, 1, 0, 0, 0, 935, 936, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 941, 5, 150, 0, 0, 938, 941, 3, 120, 60, 0, 939, 941, 3, 130, 65, 0, 940, 790, 1, 0, 0, 0, 940, 810, 1, 0, 0, 0, 940, 817, 1, 0, 0, 0, 940, 819, 1, 0, 0, 0, 940, 823, 1, 0, 0, 0, 940, 834, 1, 0, 0, 0, 940, 836, 1, 0, 0, 0, 940, 844, 1, 0, 0, 0, 940, 866, 1, 0, 0, 0, 940, 886, 1, 0, 0, 0, 940, 903, 1, 0, 0, 0, 940, 904, 1, 0, 0, 0, 940, 905, 1, 0, 0, 0, 940, 906, 1, 0, 0, 0, 940, 908, 1, 0, 0, 0, 940, 913, 1, 0, 0, 0, 940, 916, 1, 0, 0, 0, 940, 920, 1, 0, 0, 0, 940, 924, 1, 0, 0, 0, 940, 928, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 1052, 1, 0, 0, 0, 942, 946, 10, 19, 0, 0, 943, 947, 5, 115, 0, 0, 944, 947, 5, 154, 0, 0, 945, 947, 5, 141, 0, 0, 946, 943, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 1051, 3, 118, 59, 20, 949, 953, 10, 18, 0, 0, 950, 954, 5, 142, 0, 0, 951, 954, 5, 121, 0, 0, 952, 954, 5, 120, 0, 0, 953, 950, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 952, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 1051, 3, 118, 59, 19, 956, 981, 10, 17, 0, 0, 957, 982, 5, 124, 0, 0, 958, 982, 5, 125, 0, 0, 959, 982, 5, 136, 0, 0, 960, 982, 5, 134, 0, 0, 961, 982, 5, 135, 0, 0, 962, 982, 5, 126, 0, 0, 963, 982, 5, 127, 0, 0, 964, 966, 5, 61, 0, 0, 965, 964, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 969, 5, 44, 0, 0, 968, 970, 5, 15, 0, 0, 969, 968, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 982, 1, 0, 0, 0, 971, 973, 5, 61, 0, 0, 972, 971, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 982, 7, 11, 0, 0, 975, 982, 5, 148, 0, 0, 976, 982, 5, 149, 0, 0, 977, 982, 5, 138, 0, 0, 978, 982, 5, 129, 0, 0, 979, 982, 5, 130, 0, 0, 980, 982, 5, 137, 0, 0, 981, 957, 1, 0, 0, 0, 981, 958, 1, 0, 0, 0, 981, 959, 1, 0, 0, 0, 981, 960, 1, 0, 0, 0, 981, 961, 1, 0, 0, 0, 981, 962, 1, 0, 0, 0, 981, 963, 1, 0, 0, 0, 981, 965, 1, 0, 0, 0, 981, 972, 1, 0, 0, 0, 981, 975, 1, 0, 0, 0, 981, 976, 1, 0, 0, 0, 981, 977, 1, 0, 0, 0, 981, 978, 1, 0, 0, 0, 981, 979, 1, 0, 0, 0, 981, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 1051, 3, 118, 59, 18, 984, 985, 10, 15, 0, 0, 985, 986, 5, 140, 0, 0, 986, 1051, 3, 118, 59, 16, 987, 988, 10, 13, 0, 0, 988, 989, 5, 2, 0, 0, 989, 1051, 3, 118, 59, 14, 990, 991, 10, 12, 0, 0, 991, 992, 5, 66, 0, 0, 992, 1051, 3, 118, 59, 13, 993, 995, 10, 11, 0, 0, 994, 996, 5, 61, 0, 0, 995, 994, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 998, 5, 9, 0, 0, 998, 999, 3, 118, 59, 0, 999, 1000, 5, 2, 0, 0, 1000, 1001, 3, 118, 59, 12, 1001, 1051, 1, 0, 0, 0, 1002, 1003, 10, 10, 0, 0, 1003, 1004, 5, 143, 0, 0, 1004, 1005, 3, 118, 59, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 3, 118, 59, 10, 1007, 1051, 1, 0, 0, 0, 1008, 1009, 10, 30, 0, 0, 1009, 1011, 5, 133, 0, 0, 1010, 1012, 3, 116, 58, 0, 1011, 1010, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1051, 5, 152, 0, 0, 1014, 1015, 10, 26, 0, 0, 1015, 1016, 5, 132, 0, 0, 1016, 1017, 3, 118, 59, 0, 1017, 1018, 5, 151, 0, 0, 1018, 1051, 1, 0, 0, 0, 1019, 1020, 10, 25, 0, 0, 1020, 1021, 5, 123, 0, 0, 1021, 1051, 5, 111, 0, 0, 1022, 1023, 10, 24, 0, 0, 1023, 1024, 5, 123, 0, 0, 1024, 1051, 3, 158, 79, 0, 1025, 1026, 10, 23, 0, 0, 1026, 1027, 5, 139, 0, 0, 1027, 1028, 5, 132, 0, 0, 1028, 1029, 3, 118, 59, 0, 1029, 1030, 5, 151, 0, 0, 1030, 1051, 1, 0, 0, 0, 1031, 1032, 10, 22, 0, 0, 1032, 1033, 5, 139, 0, 0, 1033, 1051, 5, 111, 0, 0, 1034, 1035, 10, 21, 0, 0, 1035, 1036, 5, 139, 0, 0, 1036, 1051, 3, 158, 79, 0, 1037, 1038, 10, 16, 0, 0, 1038, 1040, 5, 49, 0, 0, 1039, 1041, 5, 61, 0, 0, 1040, 1039, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1051, 5, 62, 0, 0, 1043, 1048, 10, 9, 0, 0, 1044, 1045, 5, 6, 0, 0, 1045, 1049, 3, 158, 79, 0, 1046, 1047, 5, 6, 0, 0, 1047, 1049, 5, 113, 0, 0, 1048, 1044, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1051, 1, 0, 0, 0, 1050, 942, 1, 0, 0, 0, 1050, 949, 1, 0, 0, 0, 1050, 956, 1, 0, 0, 0, 1050, 984, 1, 0, 0, 0, 1050, 987, 1, 0, 0, 0, 1050, 990, 1, 0, 0, 0, 1050, 993, 1, 0, 0, 0, 1050, 1002, 1, 0, 0, 0, 1050, 1008, 1, 0, 0, 0, 1050, 1014, 1, 0, 0, 0, 1050, 1019, 1, 0, 0, 0, 1050, 1022, 1, 0, 0, 0, 1050, 1025, 1, 0, 0, 0, 1050, 1031, 1, 0, 0, 0, 1050, 1034, 1, 0, 0, 0, 1050, 1037, 1, 0, 0, 0, 1050, 1043, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 119, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1055, 1056, 5, 133, 0, 0, 1056, 1061, 3, 158, 79, 0, 1057, 1058, 5, 119, 0, 0, 1058, 1060, 3, 158, 79, 0, 1059, 1057, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1065, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1066, 5, 119, 0, 0, 1065, 1064, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 5, 152, 0, 0, 1068, 1083, 1, 0, 0, 0, 1069, 1074, 3, 158, 79, 0, 1070, 1071, 5, 119, 0, 0, 1071, 1073, 3, 158, 79, 0, 1072, 1070, 1, 0, 0, 0, 1073, 1076, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1077, 1079, 5, 119, 0, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1083, 1, 0, 0, 0, 1080, 1081, 5, 133, 0, 0, 1081, 1083, 5, 152, 0, 0, 1082, 1055, 1, 0, 0, 0, 1082, 1069, 1, 0, 0, 0, 1082, 1080, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1087, 5, 114, 0, 0, 1085, 1088, 3, 118, 59, 0, 1086, 1088, 3, 36, 18, 0, 1087, 1085, 1, 0, 0, 0, 1087, 1086, 1, 0, 0, 0, 1088, 121, 1, 0, 0, 0, 1089, 1090, 5, 135, 0, 0, 1090, 1094, 3, 158, 79, 0, 1091, 1093, 3, 124, 62, 0, 1092, 1091, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1098, 5, 154, 0, 0, 1098, 1099, 5, 127, 0, 0, 1099, 1122, 1, 0, 0, 0, 1100, 1101, 5, 135, 0, 0, 1101, 1105, 3, 158, 79, 0, 1102, 1104, 3, 124, 62, 0, 1103, 1102, 1, 0, 0, 0, 1104, 1107, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1108, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1108, 1114, 5, 127, 0, 0, 1109, 1115, 3, 122, 61, 0, 1110, 1111, 5, 131, 0, 0, 1111, 1112, 3, 118, 59, 0, 1112, 1113, 5, 150, 0, 0, 1113, 1115, 1, 0, 0, 0, 1114, 1109, 1, 0, 0, 0, 1114, 1110, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 5, 135, 0, 0, 1117, 1118, 5, 154, 0, 0, 1118, 1119, 3, 158, 79, 0, 1119, 1120, 5, 127, 0, 0, 1120, 1122, 1, 0, 0, 0, 1121, 1089, 1, 0, 0, 0, 1121, 1100, 1, 0, 0, 0, 1122, 123, 1, 0, 0, 0, 1123, 1124, 3, 158, 79, 0, 1124, 1125, 5, 125, 0, 0, 1125, 1126, 3, 164, 82, 0, 1126, 1135, 1, 0, 0, 0, 1127, 1128, 3, 158, 79, 0, 1128, 1129, 5, 125, 0, 0, 1129, 1130, 5, 131, 0, 0, 1130, 1131, 3, 118, 59, 0, 1131, 1132, 5, 150, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1135, 3, 158, 79, 0, 1134, 1123, 1, 0, 0, 0, 1134, 1127, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1135, 125, 1, 0, 0, 0, 1136, 1141, 3, 128, 64, 0, 1137, 1138, 5, 119, 0, 0, 1138, 1140, 3, 128, 64, 0, 1139, 1137, 1, 0, 0, 0, 1140, 1143, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1145, 1, 0, 0, 0, 1143, 1141, 1, 0, 0, 0, 1144, 1146, 5, 119, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 127, 1, 0, 0, 0, 1147, 1148, 3, 158, 79, 0, 1148, 1149, 5, 6, 0, 0, 1149, 1150, 5, 133, 0, 0, 1150, 1151, 3, 48, 24, 0, 1151, 1152, 5, 152, 0, 0, 1152, 1158, 1, 0, 0, 0, 1153, 1154, 3, 118, 59, 0, 1154, 1155, 5, 6, 0, 0, 1155, 1156, 3, 158, 79, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1147, 1, 0, 0, 0, 1157, 1153, 1, 0, 0, 0, 1158, 129, 1, 0, 0, 0, 1159, 1167, 3, 162, 81, 0, 1160, 1161, 3, 138, 69, 0, 1161, 1162, 5, 123, 0, 0, 1162, 1164, 1, 0, 0, 0, 1163, 1160, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1167, 3, 132, 66, 0, 1166, 1159, 1, 0, 0, 0, 1166, 1163, 1, 0, 0, 0, 1167, 131, 1, 0, 0, 0, 1168, 1173, 3, 158, 79, 0, 1169, 1170, 5, 123, 0, 0, 1170, 1172, 3, 158, 79, 0, 1171, 1169, 1, 0, 0, 0, 1172, 1175, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 133, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1176, 1177, 6, 67, -1, 0, 1177, 1186, 3, 138, 69, 0, 1178, 1186, 3, 136, 68, 0, 1179, 1180, 5, 133, 0, 0, 1180, 1181, 3, 48, 24, 0, 1181, 1182, 5, 152, 0, 0, 1182, 1186, 1, 0, 0, 0, 1183, 1186, 3, 122, 61, 0, 1184, 1186, 3, 162, 81, 0, 1185, 1176, 1, 0, 0, 0, 1185, 1178, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1184, 1, 0, 0, 0, 1186, 1195, 1, 0, 0, 0, 1187, 1191, 10, 3, 0, 0, 1188, 1192, 3, 156, 78, 0, 1189, 1190, 5, 6, 0, 0, 1190, 1192, 3, 158, 79, 0, 1191, 1188, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1194, 1, 0, 0, 0, 1193, 1187, 1, 0, 0, 0, 1194, 1197, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1195, 1196, 1, 0, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1195, 1, 0, 0, 0, 1198, 1199, 3, 158, 79, 0, 1199, 1201, 5, 133, 0, 0, 1200, 1202, 3, 140, 70, 0, 1201, 1200, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 5, 152, 0, 0, 1204, 137, 1, 0, 0, 0, 1205, 1206, 3, 142, 71, 0, 1206, 1207, 5, 123, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1205, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 3, 158, 79, 0, 1211, 139, 1, 0, 0, 0, 1212, 1217, 3, 118, 59, 0, 1213, 1214, 5, 119, 0, 0, 1214, 1216, 3, 118, 59, 0, 1215, 1213, 1, 0, 0, 0, 1216, 1219, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1221, 1, 0, 0, 0, 1219, 1217, 1, 0, 0, 0, 1220, 1222, 5, 119, 0, 0, 1221, 1220, 1, 0, 0, 0, 1221, 1222, 1, 0, 0, 0, 1222, 141, 1, 0, 0, 0, 1223, 1224, 3, 158, 79, 0, 1224, 143, 1, 0, 0, 0, 1225, 1234, 5, 109, 0, 0, 1226, 1227, 5, 123, 0, 0, 1227, 1234, 7, 12, 0, 0, 1228, 1229, 5, 111, 0, 0, 1229, 1231, 5, 123, 0, 0, 1230, 1232, 7, 12, 0, 0, 1231, 1230, 1, 0, 0, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1234, 1, 0, 0, 0, 1233, 1225, 1, 0, 0, 0, 1233, 1226, 1, 0, 0, 0, 1233, 1228, 1, 0, 0, 0, 1234, 145, 1, 0, 0, 0, 1235, 1237, 7, 13, 0, 0, 1236, 1235, 1, 0, 0, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1244, 1, 0, 0, 0, 1238, 1245, 3, 144, 72, 0, 1239, 1245, 5, 110, 0, 0, 1240, 1245, 5, 111, 0, 0, 1241, 1245, 5, 112, 0, 0, 1242, 1245, 5, 45, 0, 0, 1243, 1245, 5, 60, 0, 0, 1244, 1238, 1, 0, 0, 0, 1244, 1239, 1, 0, 0, 0, 1244, 1240, 1, 0, 0, 0, 1244, 1241, 1, 0, 0, 0, 1244, 1242, 1, 0, 0, 0, 1244, 1243, 1, 0, 0, 0, 1245, 147, 1, 0, 0, 0, 1246, 1250, 3, 146, 73, 0, 1247, 1250, 5, 113, 0, 0, 1248, 1250, 5, 62, 0, 0, 1249, 1246, 1, 0, 0, 0, 1249, 1247, 1, 0, 0, 0, 1249, 1248, 1, 0, 0, 0, 1250, 149, 1, 0, 0, 0, 1251, 1252, 7, 14, 0, 0, 1252, 151, 1, 0, 0, 0, 1253, 1254, 7, 15, 0, 0, 1254, 153, 1, 0, 0, 0, 1255, 1256, 7, 16, 0, 0, 1256, 155, 1, 0, 0, 0, 1257, 1260, 5, 108, 0, 0, 1258, 1260, 3, 154, 77, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1258, 1, 0, 0, 0, 1260, 157, 1, 0, 0, 0, 1261, 1265, 5, 108, 0, 0, 1262, 1265, 3, 150, 75, 0, 1263, 1265, 3, 152, 76, 0, 1264, 1261, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1263, 1, 0, 0, 0, 1265, 159, 1, 0, 0, 0, 1266, 1267, 3, 164, 82, 0, 1267, 1268, 5, 125, 0, 0, 1268, 1269, 3, 146, 73, 0, 1269, 161, 1, 0, 0, 0, 1270, 1271, 5, 131, 0, 0, 1271, 1272, 3, 118, 59, 0, 1272, 1273, 5, 150, 0, 0, 1273, 163, 1, 0, 0, 0, 1274, 1277, 5, 113, 0, 0, 1275, 1277, 3, 166, 83, 0, 1276, 1274, 1, 0, 0, 0, 1276, 1275, 1, 0, 0, 0, 1277, 165, 1, 0, 0, 0, 1278, 1282, 5, 145, 0, 0, 1279, 1281, 3, 168, 84, 0, 1280, 1279, 1, 0, 0, 0, 1281, 1284, 1, 0, 0, 0, 1282, 1280, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1285, 1, 0, 0, 0, 1284, 1282, 1, 0, 0, 0, 1285, 1286, 5, 147, 0, 0, 1286, 167, 1, 0, 0, 0, 1287, 1288, 5, 160, 0, 0, 1288, 1289, 3, 118, 59, 0, 1289, 1290, 5, 150, 0, 0, 1290, 1293, 1, 0, 0, 0, 1291, 1293, 5, 159, 0, 0, 1292, 1287, 1, 0, 0, 0, 1292, 1291, 1, 0, 0, 0, 1293, 169, 1, 0, 0, 0, 1294, 1298, 5, 146, 0, 0, 1295, 1297, 3, 172, 86, 0, 1296, 1295, 1, 0, 0, 0, 1297, 1300, 1, 0, 0, 0, 1298, 1296, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1301, 1, 0, 0, 0, 1300, 1298, 1, 0, 0, 0, 1301, 1302, 5, 0, 0, 1, 1302, 171, 1, 0, 0, 0, 1303, 1304, 5, 162, 0, 0, 1304, 1305, 3, 118, 59, 0, 1305, 1306, 5, 150, 0, 0, 1306, 1309, 1, 0, 0, 0, 1307, 1309, 5, 161, 0, 0, 1308, 1303, 1, 0, 0, 0, 1308, 1307, 1, 0, 0, 0, 1309, 173, 1, 0, 0, 0, 168, 177, 184, 193, 200, 204, 218, 222, 225, 229, 232, 239, 243, 252, 257, 266, 274, 281, 285, 291, 296, 304, 311, 317, 329, 337, 351, 355, 360, 370, 376, 384, 388, 392, 395, 399, 402, 405, 408, 411, 415, 419, 422, 425, 428, 432, 435, 444, 450, 471, 488, 505, 511, 517, 528, 530, 541, 544, 550, 558, 564, 566, 570, 575, 578, 581, 585, 589, 592, 594, 597, 601, 605, 608, 610, 612, 617, 628, 634, 641, 646, 650, 654, 660, 662, 669, 677, 680, 683, 702, 716, 732, 736, 747, 751, 762, 766, 773, 777, 784, 788, 793, 802, 806, 830, 847, 853, 856, 859, 869, 875, 878, 881, 889, 892, 896, 899, 913, 930, 935, 940, 946, 953, 965, 969, 972, 981, 995, 1011, 1040, 1048, 1050, 1052, 1061, 1065, 1074, 1078, 1082, 1087, 1094, 1105, 1114, 1121, 1134, 1141, 1145, 1157, 1163, 1166, 1173, 1185, 1191, 1195, 1201, 1208, 1217, 1221, 1231, 1233, 1236, 1244, 1249, 1259, 1264, 1276, 1282, 1292, 1298, 1308] \ No newline at end of file diff --git a/posthog/hogql/grammar/HogQLParser.py b/posthog/hogql/grammar/HogQLParser.py index ab0499e653ddb..70f7e139b7999 100644 --- a/posthog/hogql/grammar/HogQLParser.py +++ b/posthog/hogql/grammar/HogQLParser.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,1,160,1303,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, + 4,1,162,1311,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, @@ -23,519 +23,522 @@ def serializedATN(): 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,1,0,5,0,174,8,0,10,0,12,0,177,9,0,1,0,1,0,1,1,1,1,3,1,183, - 8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,192,8,3,1,4,1,4,1,4,5,4,197, - 8,4,10,4,12,4,200,9,4,1,4,3,4,203,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,3,5,217,8,5,1,6,1,6,3,6,221,8,6,1,6,3,6,224, - 8,6,1,7,1,7,3,7,228,8,7,1,7,3,7,231,8,7,1,8,1,8,1,8,1,8,1,8,3,8, - 238,8,8,1,8,1,8,3,8,242,8,8,1,8,1,8,1,9,1,9,1,9,5,9,249,8,9,10,9, - 12,9,252,9,9,1,9,1,9,3,9,256,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1, - 10,3,10,265,8,10,1,11,1,11,1,11,1,11,1,11,1,11,3,11,273,8,11,1,12, - 1,12,1,12,1,12,1,12,3,12,280,8,12,1,12,1,12,3,12,284,8,12,1,12,1, - 12,1,12,1,12,3,12,290,8,12,1,12,1,12,1,12,3,12,295,8,12,1,13,1,13, - 1,13,1,13,1,13,1,13,3,13,303,8,13,1,13,1,13,1,13,1,13,1,13,3,13, - 310,8,13,1,14,1,14,1,14,1,14,3,14,316,8,14,1,14,1,14,1,14,1,15,1, - 15,1,15,1,15,1,15,1,16,1,16,3,16,328,8,16,1,17,1,17,1,18,1,18,5, - 18,334,8,18,10,18,12,18,337,9,18,1,18,1,18,1,19,1,19,1,19,1,19,1, - 20,1,20,1,20,5,20,348,8,20,10,20,12,20,351,9,20,1,20,3,20,354,8, - 20,1,21,1,21,1,21,3,21,359,8,21,1,21,1,21,1,22,1,22,1,22,1,22,5, - 22,367,8,22,10,22,12,22,370,9,22,1,23,1,23,1,23,1,23,1,23,1,23,3, - 23,378,8,23,1,24,3,24,381,8,24,1,24,1,24,3,24,385,8,24,1,24,3,24, - 388,8,24,1,24,1,24,3,24,392,8,24,1,24,3,24,395,8,24,1,24,3,24,398, - 8,24,1,24,3,24,401,8,24,1,24,3,24,404,8,24,1,24,1,24,3,24,408,8, - 24,1,24,1,24,3,24,412,8,24,1,24,3,24,415,8,24,1,24,3,24,418,8,24, - 1,24,3,24,421,8,24,1,24,1,24,3,24,425,8,24,1,24,3,24,428,8,24,1, - 25,1,25,1,25,1,26,1,26,1,26,1,26,3,26,437,8,26,1,27,1,27,1,27,1, - 28,3,28,443,8,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1, - 29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,462,8,29,10,29,12,29, - 465,9,29,1,30,1,30,1,30,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,32,3,32,481,8,32,1,33,1,33,1,33,1,34,1,34,1,34,1,34, - 1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,3,36,498,8,36,1,36,1,36, - 1,36,1,36,3,36,504,8,36,1,36,1,36,1,36,1,36,3,36,510,8,36,1,36,1, - 36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,521,8,36,3,36,523,8,36, - 1,37,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39,3,39,534,8,39,1,39, - 3,39,537,8,39,1,39,1,39,1,39,1,39,3,39,543,8,39,1,39,1,39,1,39,1, - 39,1,39,1,39,3,39,551,8,39,1,39,1,39,1,39,1,39,5,39,557,8,39,10, - 39,12,39,560,9,39,1,40,3,40,563,8,40,1,40,1,40,1,40,3,40,568,8,40, - 1,40,3,40,571,8,40,1,40,3,40,574,8,40,1,40,1,40,3,40,578,8,40,1, - 40,1,40,3,40,582,8,40,1,40,3,40,585,8,40,3,40,587,8,40,1,40,3,40, - 590,8,40,1,40,1,40,3,40,594,8,40,1,40,1,40,3,40,598,8,40,1,40,3, - 40,601,8,40,3,40,603,8,40,3,40,605,8,40,1,41,1,41,1,41,3,41,610, - 8,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,621,8,42, - 1,43,1,43,1,43,1,43,3,43,627,8,43,1,44,1,44,1,44,5,44,632,8,44,10, - 44,12,44,635,9,44,1,45,1,45,3,45,639,8,45,1,45,1,45,3,45,643,8,45, - 1,45,1,45,3,45,647,8,45,1,46,1,46,1,46,1,46,3,46,653,8,46,3,46,655, - 8,46,1,47,1,47,1,47,5,47,660,8,47,10,47,12,47,663,9,47,1,48,1,48, - 1,48,1,48,1,49,3,49,670,8,49,1,49,3,49,673,8,49,1,49,3,49,676,8, - 49,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,53,1, - 53,1,53,1,53,1,53,1,53,3,53,695,8,53,1,54,1,54,1,54,1,54,1,54,1, - 54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,709,8,54,1,55,1,55,1,55,1, - 56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,723,8,56,10,56,12, - 56,726,9,56,1,56,3,56,729,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56, - 5,56,738,8,56,10,56,12,56,741,9,56,1,56,3,56,744,8,56,1,56,1,56, - 1,56,1,56,1,56,1,56,1,56,5,56,753,8,56,10,56,12,56,756,9,56,1,56, - 3,56,759,8,56,1,56,1,56,1,56,1,56,1,56,3,56,766,8,56,1,56,1,56,3, - 56,770,8,56,1,57,1,57,1,57,5,57,775,8,57,10,57,12,57,778,9,57,1, - 57,3,57,781,8,57,1,58,1,58,1,58,3,58,786,8,58,1,58,1,58,1,58,1,58, - 1,58,4,58,793,8,58,11,58,12,58,794,1,58,1,58,3,58,799,8,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,823,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 3,58,840,8,58,1,58,1,58,1,58,1,58,3,58,846,8,58,1,58,3,58,849,8, - 58,1,58,3,58,852,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3, - 58,862,8,58,1,58,1,58,1,58,1,58,3,58,868,8,58,1,58,3,58,871,8,58, - 1,58,3,58,874,8,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,882,8,58,1, - 58,3,58,885,8,58,1,58,1,58,3,58,889,8,58,1,58,3,58,892,8,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,906, - 8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,3,58,923,8,58,1,58,1,58,1,58,3,58,928,8,58,1,58,1, - 58,1,58,3,58,933,8,58,1,58,1,58,1,58,1,58,3,58,939,8,58,1,58,1,58, - 1,58,1,58,1,58,3,58,946,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,3,58,958,8,58,1,58,1,58,3,58,962,8,58,1,58,3,58,965, - 8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,974,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,988,8,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,3,58,1004,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,3,58,1033,8,58,1,58,1,58,1,58,1,58,1,58, - 1,58,3,58,1041,8,58,5,58,1043,8,58,10,58,12,58,1046,9,58,1,59,1, - 59,1,59,1,59,5,59,1052,8,59,10,59,12,59,1055,9,59,1,59,3,59,1058, - 8,59,1,59,1,59,1,59,1,59,1,59,5,59,1065,8,59,10,59,12,59,1068,9, - 59,1,59,3,59,1071,8,59,1,59,1,59,3,59,1075,8,59,1,59,1,59,1,59,3, - 59,1080,8,59,1,60,1,60,1,60,5,60,1085,8,60,10,60,12,60,1088,9,60, - 1,60,1,60,1,60,1,60,1,60,1,60,5,60,1096,8,60,10,60,12,60,1099,9, - 60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1107,8,60,1,60,1,60,1,60,1, - 60,1,60,3,60,1114,8,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1, - 61,1,61,1,61,3,61,1127,8,61,1,62,1,62,1,62,5,62,1132,8,62,10,62, - 12,62,1135,9,62,1,62,3,62,1138,8,62,1,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,63,1,63,1,63,3,63,1150,8,63,1,64,1,64,1,64,1,64,3,64,1156, - 8,64,1,64,3,64,1159,8,64,1,65,1,65,1,65,5,65,1164,8,65,10,65,12, - 65,1167,9,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1178, - 8,66,1,66,1,66,1,66,1,66,3,66,1184,8,66,5,66,1186,8,66,10,66,12, - 66,1189,9,66,1,67,1,67,1,67,3,67,1194,8,67,1,67,1,67,1,68,1,68,1, - 68,3,68,1201,8,68,1,68,1,68,1,69,1,69,1,69,5,69,1208,8,69,10,69, - 12,69,1211,9,69,1,69,3,69,1214,8,69,1,70,1,70,1,71,1,71,1,71,1,71, - 1,71,1,71,3,71,1224,8,71,3,71,1226,8,71,1,72,3,72,1229,8,72,1,72, - 1,72,1,72,1,72,1,72,1,72,3,72,1237,8,72,1,73,1,73,1,73,3,73,1242, - 8,73,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,3,77,1252,8,77,1,78, - 1,78,1,78,3,78,1257,8,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80, - 1,81,1,81,3,81,1269,8,81,1,82,1,82,5,82,1273,8,82,10,82,12,82,1276, - 9,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,3,83,1285,8,83,1,84,1,84, - 5,84,1289,8,84,10,84,12,84,1292,9,84,1,84,1,84,1,85,1,85,1,85,1, - 85,1,85,3,85,1301,8,85,1,85,0,3,78,116,132,86,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,0,17,2,0,31,31,36,36,2,0,18,18,75,75,2,0,45,45,52,52, - 3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,81,81,2,0,52,52,74,74,2,0,1,1,4, - 4,2,0,7,7,22,23,2,0,30,30,50,50,2,0,72,72,77,77,3,0,10,10,51,51, - 91,91,2,0,42,42,54,54,1,0,108,109,2,0,119,119,140,140,7,0,21,21, - 39,39,56,57,71,71,79,79,98,98,104,104,17,0,1,13,15,20,22,28,30,30, - 32,35,37,38,40,43,45,52,54,55,59,59,61,70,72,78,80,84,86,93,95,97, - 99,100,102,103,4,0,20,20,30,30,40,40,49,49,1475,0,175,1,0,0,0,2, - 182,1,0,0,0,4,184,1,0,0,0,6,186,1,0,0,0,8,193,1,0,0,0,10,216,1,0, - 0,0,12,218,1,0,0,0,14,225,1,0,0,0,16,232,1,0,0,0,18,245,1,0,0,0, - 20,257,1,0,0,0,22,266,1,0,0,0,24,274,1,0,0,0,26,296,1,0,0,0,28,311, - 1,0,0,0,30,320,1,0,0,0,32,325,1,0,0,0,34,329,1,0,0,0,36,331,1,0, - 0,0,38,340,1,0,0,0,40,344,1,0,0,0,42,358,1,0,0,0,44,362,1,0,0,0, - 46,377,1,0,0,0,48,380,1,0,0,0,50,429,1,0,0,0,52,432,1,0,0,0,54,438, - 1,0,0,0,56,442,1,0,0,0,58,448,1,0,0,0,60,466,1,0,0,0,62,469,1,0, - 0,0,64,472,1,0,0,0,66,482,1,0,0,0,68,485,1,0,0,0,70,489,1,0,0,0, - 72,522,1,0,0,0,74,524,1,0,0,0,76,527,1,0,0,0,78,542,1,0,0,0,80,604, - 1,0,0,0,82,609,1,0,0,0,84,620,1,0,0,0,86,622,1,0,0,0,88,628,1,0, - 0,0,90,636,1,0,0,0,92,654,1,0,0,0,94,656,1,0,0,0,96,664,1,0,0,0, - 98,669,1,0,0,0,100,677,1,0,0,0,102,681,1,0,0,0,104,685,1,0,0,0,106, - 694,1,0,0,0,108,708,1,0,0,0,110,710,1,0,0,0,112,769,1,0,0,0,114, - 771,1,0,0,0,116,932,1,0,0,0,118,1074,1,0,0,0,120,1113,1,0,0,0,122, - 1126,1,0,0,0,124,1128,1,0,0,0,126,1149,1,0,0,0,128,1158,1,0,0,0, - 130,1160,1,0,0,0,132,1177,1,0,0,0,134,1190,1,0,0,0,136,1200,1,0, - 0,0,138,1204,1,0,0,0,140,1215,1,0,0,0,142,1225,1,0,0,0,144,1228, - 1,0,0,0,146,1241,1,0,0,0,148,1243,1,0,0,0,150,1245,1,0,0,0,152,1247, - 1,0,0,0,154,1251,1,0,0,0,156,1256,1,0,0,0,158,1258,1,0,0,0,160,1262, - 1,0,0,0,162,1268,1,0,0,0,164,1270,1,0,0,0,166,1284,1,0,0,0,168,1286, - 1,0,0,0,170,1300,1,0,0,0,172,174,3,2,1,0,173,172,1,0,0,0,174,177, - 1,0,0,0,175,173,1,0,0,0,175,176,1,0,0,0,176,178,1,0,0,0,177,175, - 1,0,0,0,178,179,5,0,0,1,179,1,1,0,0,0,180,183,3,6,3,0,181,183,3, - 10,5,0,182,180,1,0,0,0,182,181,1,0,0,0,183,3,1,0,0,0,184,185,3,116, - 58,0,185,5,1,0,0,0,186,187,5,53,0,0,187,191,3,156,78,0,188,189,5, - 116,0,0,189,190,5,123,0,0,190,192,3,4,2,0,191,188,1,0,0,0,191,192, - 1,0,0,0,192,7,1,0,0,0,193,198,3,156,78,0,194,195,5,117,0,0,195,197, - 3,156,78,0,196,194,1,0,0,0,197,200,1,0,0,0,198,196,1,0,0,0,198,199, - 1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,201,203,5,117,0,0,202,201, - 1,0,0,0,202,203,1,0,0,0,203,9,1,0,0,0,204,217,3,12,6,0,205,217,3, - 14,7,0,206,217,3,18,9,0,207,217,3,20,10,0,208,217,3,22,11,0,209, - 217,3,26,13,0,210,217,3,24,12,0,211,217,3,28,14,0,212,217,3,30,15, - 0,213,217,3,36,18,0,214,217,3,32,16,0,215,217,3,34,17,0,216,204, - 1,0,0,0,216,205,1,0,0,0,216,206,1,0,0,0,216,207,1,0,0,0,216,208, - 1,0,0,0,216,209,1,0,0,0,216,210,1,0,0,0,216,211,1,0,0,0,216,212, - 1,0,0,0,216,213,1,0,0,0,216,214,1,0,0,0,216,215,1,0,0,0,217,11,1, - 0,0,0,218,220,5,73,0,0,219,221,3,4,2,0,220,219,1,0,0,0,220,221,1, - 0,0,0,221,223,1,0,0,0,222,224,5,151,0,0,223,222,1,0,0,0,223,224, - 1,0,0,0,224,13,1,0,0,0,225,227,5,85,0,0,226,228,3,4,2,0,227,226, - 1,0,0,0,227,228,1,0,0,0,228,230,1,0,0,0,229,231,5,151,0,0,230,229, - 1,0,0,0,230,231,1,0,0,0,231,15,1,0,0,0,232,241,5,14,0,0,233,234, - 5,131,0,0,234,237,3,156,78,0,235,236,5,116,0,0,236,238,3,156,78, - 0,237,235,1,0,0,0,237,238,1,0,0,0,238,239,1,0,0,0,239,240,5,150, - 0,0,240,242,1,0,0,0,241,233,1,0,0,0,241,242,1,0,0,0,242,243,1,0, - 0,0,243,244,3,36,18,0,244,17,1,0,0,0,245,246,5,94,0,0,246,250,3, - 36,18,0,247,249,3,16,8,0,248,247,1,0,0,0,249,252,1,0,0,0,250,248, - 1,0,0,0,250,251,1,0,0,0,251,255,1,0,0,0,252,250,1,0,0,0,253,254, - 5,29,0,0,254,256,3,36,18,0,255,253,1,0,0,0,255,256,1,0,0,0,256,19, - 1,0,0,0,257,258,5,41,0,0,258,259,5,131,0,0,259,260,3,4,2,0,260,261, - 5,150,0,0,261,264,3,10,5,0,262,263,5,25,0,0,263,265,3,10,5,0,264, - 262,1,0,0,0,264,265,1,0,0,0,265,21,1,0,0,0,266,267,5,101,0,0,267, - 268,5,131,0,0,268,269,3,4,2,0,269,270,5,150,0,0,270,272,3,10,5,0, - 271,273,5,151,0,0,272,271,1,0,0,0,272,273,1,0,0,0,273,23,1,0,0,0, - 274,275,5,33,0,0,275,279,5,131,0,0,276,280,3,6,3,0,277,280,3,30, - 15,0,278,280,3,4,2,0,279,276,1,0,0,0,279,277,1,0,0,0,279,278,1,0, - 0,0,279,280,1,0,0,0,280,281,1,0,0,0,281,283,5,151,0,0,282,284,3, - 4,2,0,283,282,1,0,0,0,283,284,1,0,0,0,284,285,1,0,0,0,285,289,5, - 151,0,0,286,290,3,6,3,0,287,290,3,30,15,0,288,290,3,4,2,0,289,286, - 1,0,0,0,289,287,1,0,0,0,289,288,1,0,0,0,289,290,1,0,0,0,290,291, - 1,0,0,0,291,292,5,150,0,0,292,294,3,10,5,0,293,295,5,151,0,0,294, - 293,1,0,0,0,294,295,1,0,0,0,295,25,1,0,0,0,296,297,5,33,0,0,297, - 298,5,131,0,0,298,299,5,53,0,0,299,302,3,156,78,0,300,301,5,117, - 0,0,301,303,3,156,78,0,302,300,1,0,0,0,302,303,1,0,0,0,303,304,1, - 0,0,0,304,305,5,43,0,0,305,306,3,4,2,0,306,307,5,150,0,0,307,309, - 3,10,5,0,308,310,5,151,0,0,309,308,1,0,0,0,309,310,1,0,0,0,310,27, - 1,0,0,0,311,312,7,0,0,0,312,313,3,156,78,0,313,315,5,131,0,0,314, - 316,3,8,4,0,315,314,1,0,0,0,315,316,1,0,0,0,316,317,1,0,0,0,317, - 318,5,150,0,0,318,319,3,36,18,0,319,29,1,0,0,0,320,321,3,4,2,0,321, - 322,5,116,0,0,322,323,5,123,0,0,323,324,3,4,2,0,324,31,1,0,0,0,325, - 327,3,4,2,0,326,328,5,151,0,0,327,326,1,0,0,0,327,328,1,0,0,0,328, - 33,1,0,0,0,329,330,5,151,0,0,330,35,1,0,0,0,331,335,5,129,0,0,332, - 334,3,2,1,0,333,332,1,0,0,0,334,337,1,0,0,0,335,333,1,0,0,0,335, - 336,1,0,0,0,336,338,1,0,0,0,337,335,1,0,0,0,338,339,5,148,0,0,339, - 37,1,0,0,0,340,341,3,4,2,0,341,342,5,116,0,0,342,343,3,4,2,0,343, - 39,1,0,0,0,344,349,3,38,19,0,345,346,5,117,0,0,346,348,3,38,19,0, - 347,345,1,0,0,0,348,351,1,0,0,0,349,347,1,0,0,0,349,350,1,0,0,0, - 350,353,1,0,0,0,351,349,1,0,0,0,352,354,5,117,0,0,353,352,1,0,0, - 0,353,354,1,0,0,0,354,41,1,0,0,0,355,359,3,44,22,0,356,359,3,48, - 24,0,357,359,3,120,60,0,358,355,1,0,0,0,358,356,1,0,0,0,358,357, - 1,0,0,0,359,360,1,0,0,0,360,361,5,0,0,1,361,43,1,0,0,0,362,368,3, - 46,23,0,363,364,5,96,0,0,364,365,5,1,0,0,365,367,3,46,23,0,366,363, - 1,0,0,0,367,370,1,0,0,0,368,366,1,0,0,0,368,369,1,0,0,0,369,45,1, - 0,0,0,370,368,1,0,0,0,371,378,3,48,24,0,372,373,5,131,0,0,373,374, - 3,44,22,0,374,375,5,150,0,0,375,378,1,0,0,0,376,378,3,160,80,0,377, - 371,1,0,0,0,377,372,1,0,0,0,377,376,1,0,0,0,378,47,1,0,0,0,379,381, - 3,50,25,0,380,379,1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,384, - 5,80,0,0,383,385,5,24,0,0,384,383,1,0,0,0,384,385,1,0,0,0,385,387, - 1,0,0,0,386,388,3,52,26,0,387,386,1,0,0,0,387,388,1,0,0,0,388,389, - 1,0,0,0,389,391,3,114,57,0,390,392,3,54,27,0,391,390,1,0,0,0,391, - 392,1,0,0,0,392,394,1,0,0,0,393,395,3,56,28,0,394,393,1,0,0,0,394, - 395,1,0,0,0,395,397,1,0,0,0,396,398,3,60,30,0,397,396,1,0,0,0,397, - 398,1,0,0,0,398,400,1,0,0,0,399,401,3,62,31,0,400,399,1,0,0,0,400, - 401,1,0,0,0,401,403,1,0,0,0,402,404,3,64,32,0,403,402,1,0,0,0,403, - 404,1,0,0,0,404,407,1,0,0,0,405,406,5,103,0,0,406,408,7,1,0,0,407, - 405,1,0,0,0,407,408,1,0,0,0,408,411,1,0,0,0,409,410,5,103,0,0,410, - 412,5,90,0,0,411,409,1,0,0,0,411,412,1,0,0,0,412,414,1,0,0,0,413, - 415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,417,1,0,0,0,416, - 418,3,58,29,0,417,416,1,0,0,0,417,418,1,0,0,0,418,420,1,0,0,0,419, - 421,3,68,34,0,420,419,1,0,0,0,420,421,1,0,0,0,421,424,1,0,0,0,422, - 425,3,72,36,0,423,425,3,74,37,0,424,422,1,0,0,0,424,423,1,0,0,0, - 424,425,1,0,0,0,425,427,1,0,0,0,426,428,3,76,38,0,427,426,1,0,0, - 0,427,428,1,0,0,0,428,49,1,0,0,0,429,430,5,103,0,0,430,431,3,124, - 62,0,431,51,1,0,0,0,432,433,5,89,0,0,433,436,5,109,0,0,434,435,5, - 103,0,0,435,437,5,86,0,0,436,434,1,0,0,0,436,437,1,0,0,0,437,53, - 1,0,0,0,438,439,5,34,0,0,439,440,3,78,39,0,440,55,1,0,0,0,441,443, - 7,2,0,0,442,441,1,0,0,0,442,443,1,0,0,0,443,444,1,0,0,0,444,445, - 5,5,0,0,445,446,5,48,0,0,446,447,3,114,57,0,447,57,1,0,0,0,448,449, - 5,102,0,0,449,450,3,156,78,0,450,451,5,6,0,0,451,452,5,131,0,0,452, - 453,3,98,49,0,453,463,5,150,0,0,454,455,5,117,0,0,455,456,3,156, - 78,0,456,457,5,6,0,0,457,458,5,131,0,0,458,459,3,98,49,0,459,460, - 5,150,0,0,460,462,1,0,0,0,461,454,1,0,0,0,462,465,1,0,0,0,463,461, - 1,0,0,0,463,464,1,0,0,0,464,59,1,0,0,0,465,463,1,0,0,0,466,467,5, - 70,0,0,467,468,3,116,58,0,468,61,1,0,0,0,469,470,5,100,0,0,470,471, - 3,116,58,0,471,63,1,0,0,0,472,473,5,37,0,0,473,480,5,11,0,0,474, - 475,7,1,0,0,475,476,5,131,0,0,476,477,3,114,57,0,477,478,5,150,0, - 0,478,481,1,0,0,0,479,481,3,114,57,0,480,474,1,0,0,0,480,479,1,0, - 0,0,481,65,1,0,0,0,482,483,5,38,0,0,483,484,3,116,58,0,484,67,1, - 0,0,0,485,486,5,65,0,0,486,487,5,11,0,0,487,488,3,88,44,0,488,69, - 1,0,0,0,489,490,5,65,0,0,490,491,5,11,0,0,491,492,3,114,57,0,492, - 71,1,0,0,0,493,494,5,55,0,0,494,497,3,116,58,0,495,496,5,117,0,0, - 496,498,3,116,58,0,497,495,1,0,0,0,497,498,1,0,0,0,498,503,1,0,0, - 0,499,500,5,103,0,0,500,504,5,86,0,0,501,502,5,11,0,0,502,504,3, - 114,57,0,503,499,1,0,0,0,503,501,1,0,0,0,503,504,1,0,0,0,504,523, - 1,0,0,0,505,506,5,55,0,0,506,509,3,116,58,0,507,508,5,103,0,0,508, - 510,5,86,0,0,509,507,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0,511, - 512,5,62,0,0,512,513,3,116,58,0,513,523,1,0,0,0,514,515,5,55,0,0, - 515,516,3,116,58,0,516,517,5,62,0,0,517,520,3,116,58,0,518,519,5, - 11,0,0,519,521,3,114,57,0,520,518,1,0,0,0,520,521,1,0,0,0,521,523, - 1,0,0,0,522,493,1,0,0,0,522,505,1,0,0,0,522,514,1,0,0,0,523,73,1, - 0,0,0,524,525,5,62,0,0,525,526,3,116,58,0,526,75,1,0,0,0,527,528, - 5,82,0,0,528,529,3,94,47,0,529,77,1,0,0,0,530,531,6,39,-1,0,531, - 533,3,132,66,0,532,534,5,28,0,0,533,532,1,0,0,0,533,534,1,0,0,0, - 534,536,1,0,0,0,535,537,3,86,43,0,536,535,1,0,0,0,536,537,1,0,0, - 0,537,543,1,0,0,0,538,539,5,131,0,0,539,540,3,78,39,0,540,541,5, - 150,0,0,541,543,1,0,0,0,542,530,1,0,0,0,542,538,1,0,0,0,543,558, - 1,0,0,0,544,545,10,3,0,0,545,546,3,82,41,0,546,547,3,78,39,4,547, - 557,1,0,0,0,548,550,10,4,0,0,549,551,3,80,40,0,550,549,1,0,0,0,550, - 551,1,0,0,0,551,552,1,0,0,0,552,553,5,48,0,0,553,554,3,78,39,0,554, - 555,3,84,42,0,555,557,1,0,0,0,556,544,1,0,0,0,556,548,1,0,0,0,557, - 560,1,0,0,0,558,556,1,0,0,0,558,559,1,0,0,0,559,79,1,0,0,0,560,558, - 1,0,0,0,561,563,7,3,0,0,562,561,1,0,0,0,562,563,1,0,0,0,563,564, - 1,0,0,0,564,571,5,45,0,0,565,567,5,45,0,0,566,568,7,3,0,0,567,566, - 1,0,0,0,567,568,1,0,0,0,568,571,1,0,0,0,569,571,7,3,0,0,570,562, - 1,0,0,0,570,565,1,0,0,0,570,569,1,0,0,0,571,605,1,0,0,0,572,574, - 7,4,0,0,573,572,1,0,0,0,573,574,1,0,0,0,574,575,1,0,0,0,575,577, - 7,5,0,0,576,578,5,66,0,0,577,576,1,0,0,0,577,578,1,0,0,0,578,587, - 1,0,0,0,579,581,7,5,0,0,580,582,5,66,0,0,581,580,1,0,0,0,581,582, - 1,0,0,0,582,584,1,0,0,0,583,585,7,4,0,0,584,583,1,0,0,0,584,585, - 1,0,0,0,585,587,1,0,0,0,586,573,1,0,0,0,586,579,1,0,0,0,587,605, - 1,0,0,0,588,590,7,6,0,0,589,588,1,0,0,0,589,590,1,0,0,0,590,591, - 1,0,0,0,591,593,5,35,0,0,592,594,5,66,0,0,593,592,1,0,0,0,593,594, - 1,0,0,0,594,603,1,0,0,0,595,597,5,35,0,0,596,598,5,66,0,0,597,596, - 1,0,0,0,597,598,1,0,0,0,598,600,1,0,0,0,599,601,7,6,0,0,600,599, - 1,0,0,0,600,601,1,0,0,0,601,603,1,0,0,0,602,589,1,0,0,0,602,595, - 1,0,0,0,603,605,1,0,0,0,604,570,1,0,0,0,604,586,1,0,0,0,604,602, - 1,0,0,0,605,81,1,0,0,0,606,607,5,17,0,0,607,610,5,48,0,0,608,610, - 5,117,0,0,609,606,1,0,0,0,609,608,1,0,0,0,610,83,1,0,0,0,611,612, - 5,63,0,0,612,621,3,114,57,0,613,614,5,97,0,0,614,615,5,131,0,0,615, - 616,3,114,57,0,616,617,5,150,0,0,617,621,1,0,0,0,618,619,5,97,0, - 0,619,621,3,114,57,0,620,611,1,0,0,0,620,613,1,0,0,0,620,618,1,0, - 0,0,621,85,1,0,0,0,622,623,5,78,0,0,623,626,3,92,46,0,624,625,5, - 62,0,0,625,627,3,92,46,0,626,624,1,0,0,0,626,627,1,0,0,0,627,87, - 1,0,0,0,628,633,3,90,45,0,629,630,5,117,0,0,630,632,3,90,45,0,631, - 629,1,0,0,0,632,635,1,0,0,0,633,631,1,0,0,0,633,634,1,0,0,0,634, - 89,1,0,0,0,635,633,1,0,0,0,636,638,3,116,58,0,637,639,7,7,0,0,638, - 637,1,0,0,0,638,639,1,0,0,0,639,642,1,0,0,0,640,641,5,61,0,0,641, - 643,7,8,0,0,642,640,1,0,0,0,642,643,1,0,0,0,643,646,1,0,0,0,644, - 645,5,16,0,0,645,647,5,111,0,0,646,644,1,0,0,0,646,647,1,0,0,0,647, - 91,1,0,0,0,648,655,3,160,80,0,649,652,3,144,72,0,650,651,5,152,0, - 0,651,653,3,144,72,0,652,650,1,0,0,0,652,653,1,0,0,0,653,655,1,0, - 0,0,654,648,1,0,0,0,654,649,1,0,0,0,655,93,1,0,0,0,656,661,3,96, - 48,0,657,658,5,117,0,0,658,660,3,96,48,0,659,657,1,0,0,0,660,663, - 1,0,0,0,661,659,1,0,0,0,661,662,1,0,0,0,662,95,1,0,0,0,663,661,1, - 0,0,0,664,665,3,156,78,0,665,666,5,123,0,0,666,667,3,146,73,0,667, - 97,1,0,0,0,668,670,3,100,50,0,669,668,1,0,0,0,669,670,1,0,0,0,670, - 672,1,0,0,0,671,673,3,102,51,0,672,671,1,0,0,0,672,673,1,0,0,0,673, - 675,1,0,0,0,674,676,3,104,52,0,675,674,1,0,0,0,675,676,1,0,0,0,676, - 99,1,0,0,0,677,678,5,68,0,0,678,679,5,11,0,0,679,680,3,114,57,0, - 680,101,1,0,0,0,681,682,5,65,0,0,682,683,5,11,0,0,683,684,3,88,44, - 0,684,103,1,0,0,0,685,686,7,9,0,0,686,687,3,106,53,0,687,105,1,0, - 0,0,688,695,3,108,54,0,689,690,5,9,0,0,690,691,3,108,54,0,691,692, - 5,2,0,0,692,693,3,108,54,0,693,695,1,0,0,0,694,688,1,0,0,0,694,689, - 1,0,0,0,695,107,1,0,0,0,696,697,5,19,0,0,697,709,5,76,0,0,698,699, - 5,95,0,0,699,709,5,69,0,0,700,701,5,95,0,0,701,709,5,32,0,0,702, - 703,3,144,72,0,703,704,5,69,0,0,704,709,1,0,0,0,705,706,3,144,72, - 0,706,707,5,32,0,0,707,709,1,0,0,0,708,696,1,0,0,0,708,698,1,0,0, - 0,708,700,1,0,0,0,708,702,1,0,0,0,708,705,1,0,0,0,709,109,1,0,0, - 0,710,711,3,116,58,0,711,712,5,0,0,1,712,111,1,0,0,0,713,770,3,156, - 78,0,714,715,3,156,78,0,715,716,5,131,0,0,716,717,3,156,78,0,717, - 724,3,112,56,0,718,719,5,117,0,0,719,720,3,156,78,0,720,721,3,112, - 56,0,721,723,1,0,0,0,722,718,1,0,0,0,723,726,1,0,0,0,724,722,1,0, - 0,0,724,725,1,0,0,0,725,728,1,0,0,0,726,724,1,0,0,0,727,729,5,117, - 0,0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0,0,730,731,5,150, - 0,0,731,770,1,0,0,0,732,733,3,156,78,0,733,734,5,131,0,0,734,739, - 3,158,79,0,735,736,5,117,0,0,736,738,3,158,79,0,737,735,1,0,0,0, - 738,741,1,0,0,0,739,737,1,0,0,0,739,740,1,0,0,0,740,743,1,0,0,0, - 741,739,1,0,0,0,742,744,5,117,0,0,743,742,1,0,0,0,743,744,1,0,0, - 0,744,745,1,0,0,0,745,746,5,150,0,0,746,770,1,0,0,0,747,748,3,156, - 78,0,748,749,5,131,0,0,749,754,3,112,56,0,750,751,5,117,0,0,751, - 753,3,112,56,0,752,750,1,0,0,0,753,756,1,0,0,0,754,752,1,0,0,0,754, - 755,1,0,0,0,755,758,1,0,0,0,756,754,1,0,0,0,757,759,5,117,0,0,758, - 757,1,0,0,0,758,759,1,0,0,0,759,760,1,0,0,0,760,761,5,150,0,0,761, - 770,1,0,0,0,762,763,3,156,78,0,763,765,5,131,0,0,764,766,3,114,57, - 0,765,764,1,0,0,0,765,766,1,0,0,0,766,767,1,0,0,0,767,768,5,150, - 0,0,768,770,1,0,0,0,769,713,1,0,0,0,769,714,1,0,0,0,769,732,1,0, - 0,0,769,747,1,0,0,0,769,762,1,0,0,0,770,113,1,0,0,0,771,776,3,116, - 58,0,772,773,5,117,0,0,773,775,3,116,58,0,774,772,1,0,0,0,775,778, - 1,0,0,0,776,774,1,0,0,0,776,777,1,0,0,0,777,780,1,0,0,0,778,776, - 1,0,0,0,779,781,5,117,0,0,780,779,1,0,0,0,780,781,1,0,0,0,781,115, - 1,0,0,0,782,783,6,58,-1,0,783,785,5,12,0,0,784,786,3,116,58,0,785, - 784,1,0,0,0,785,786,1,0,0,0,786,792,1,0,0,0,787,788,5,99,0,0,788, - 789,3,116,58,0,789,790,5,84,0,0,790,791,3,116,58,0,791,793,1,0,0, - 0,792,787,1,0,0,0,793,794,1,0,0,0,794,792,1,0,0,0,794,795,1,0,0, - 0,795,798,1,0,0,0,796,797,5,25,0,0,797,799,3,116,58,0,798,796,1, - 0,0,0,798,799,1,0,0,0,799,800,1,0,0,0,800,801,5,26,0,0,801,933,1, - 0,0,0,802,803,5,13,0,0,803,804,5,131,0,0,804,805,3,116,58,0,805, - 806,5,6,0,0,806,807,3,112,56,0,807,808,5,150,0,0,808,933,1,0,0,0, - 809,810,5,20,0,0,810,933,5,111,0,0,811,812,5,46,0,0,812,813,3,116, - 58,0,813,814,3,148,74,0,814,933,1,0,0,0,815,816,5,83,0,0,816,817, - 5,131,0,0,817,818,3,116,58,0,818,819,5,34,0,0,819,822,3,116,58,0, - 820,821,5,33,0,0,821,823,3,116,58,0,822,820,1,0,0,0,822,823,1,0, - 0,0,823,824,1,0,0,0,824,825,5,150,0,0,825,933,1,0,0,0,826,827,5, - 87,0,0,827,933,5,111,0,0,828,829,5,92,0,0,829,830,5,131,0,0,830, - 831,7,10,0,0,831,832,3,162,81,0,832,833,5,34,0,0,833,834,3,116,58, - 0,834,835,5,150,0,0,835,933,1,0,0,0,836,837,3,156,78,0,837,839,5, - 131,0,0,838,840,3,114,57,0,839,838,1,0,0,0,839,840,1,0,0,0,840,841, - 1,0,0,0,841,842,5,150,0,0,842,851,1,0,0,0,843,845,5,131,0,0,844, - 846,5,24,0,0,845,844,1,0,0,0,845,846,1,0,0,0,846,848,1,0,0,0,847, - 849,3,114,57,0,848,847,1,0,0,0,848,849,1,0,0,0,849,850,1,0,0,0,850, - 852,5,150,0,0,851,843,1,0,0,0,851,852,1,0,0,0,852,853,1,0,0,0,853, - 854,5,67,0,0,854,855,5,131,0,0,855,856,3,98,49,0,856,857,5,150,0, - 0,857,933,1,0,0,0,858,859,3,156,78,0,859,861,5,131,0,0,860,862,3, - 114,57,0,861,860,1,0,0,0,861,862,1,0,0,0,862,863,1,0,0,0,863,864, - 5,150,0,0,864,873,1,0,0,0,865,867,5,131,0,0,866,868,5,24,0,0,867, - 866,1,0,0,0,867,868,1,0,0,0,868,870,1,0,0,0,869,871,3,114,57,0,870, - 869,1,0,0,0,870,871,1,0,0,0,871,872,1,0,0,0,872,874,5,150,0,0,873, - 865,1,0,0,0,873,874,1,0,0,0,874,875,1,0,0,0,875,876,5,67,0,0,876, - 877,3,156,78,0,877,933,1,0,0,0,878,884,3,156,78,0,879,881,5,131, - 0,0,880,882,3,114,57,0,881,880,1,0,0,0,881,882,1,0,0,0,882,883,1, - 0,0,0,883,885,5,150,0,0,884,879,1,0,0,0,884,885,1,0,0,0,885,886, - 1,0,0,0,886,888,5,131,0,0,887,889,5,24,0,0,888,887,1,0,0,0,888,889, - 1,0,0,0,889,891,1,0,0,0,890,892,3,114,57,0,891,890,1,0,0,0,891,892, - 1,0,0,0,892,893,1,0,0,0,893,894,5,150,0,0,894,933,1,0,0,0,895,933, - 3,120,60,0,896,933,3,164,82,0,897,933,3,146,73,0,898,899,5,119,0, - 0,899,933,3,116,58,20,900,901,5,59,0,0,901,933,3,116,58,14,902,903, - 3,136,68,0,903,904,5,121,0,0,904,906,1,0,0,0,905,902,1,0,0,0,905, - 906,1,0,0,0,906,907,1,0,0,0,907,933,5,113,0,0,908,909,5,131,0,0, - 909,910,3,44,22,0,910,911,5,150,0,0,911,933,1,0,0,0,912,913,5,131, - 0,0,913,914,3,116,58,0,914,915,5,150,0,0,915,933,1,0,0,0,916,917, - 5,131,0,0,917,918,3,114,57,0,918,919,5,150,0,0,919,933,1,0,0,0,920, - 922,5,130,0,0,921,923,3,114,57,0,922,921,1,0,0,0,922,923,1,0,0,0, - 923,924,1,0,0,0,924,933,5,149,0,0,925,927,5,129,0,0,926,928,3,40, - 20,0,927,926,1,0,0,0,927,928,1,0,0,0,928,929,1,0,0,0,929,933,5,148, - 0,0,930,933,3,118,59,0,931,933,3,128,64,0,932,782,1,0,0,0,932,802, - 1,0,0,0,932,809,1,0,0,0,932,811,1,0,0,0,932,815,1,0,0,0,932,826, - 1,0,0,0,932,828,1,0,0,0,932,836,1,0,0,0,932,858,1,0,0,0,932,878, - 1,0,0,0,932,895,1,0,0,0,932,896,1,0,0,0,932,897,1,0,0,0,932,898, - 1,0,0,0,932,900,1,0,0,0,932,905,1,0,0,0,932,908,1,0,0,0,932,912, - 1,0,0,0,932,916,1,0,0,0,932,920,1,0,0,0,932,925,1,0,0,0,932,930, - 1,0,0,0,932,931,1,0,0,0,933,1044,1,0,0,0,934,938,10,19,0,0,935,939, - 5,113,0,0,936,939,5,152,0,0,937,939,5,139,0,0,938,935,1,0,0,0,938, - 936,1,0,0,0,938,937,1,0,0,0,939,940,1,0,0,0,940,1043,3,116,58,20, - 941,945,10,18,0,0,942,946,5,140,0,0,943,946,5,119,0,0,944,946,5, - 118,0,0,945,942,1,0,0,0,945,943,1,0,0,0,945,944,1,0,0,0,946,947, - 1,0,0,0,947,1043,3,116,58,19,948,973,10,17,0,0,949,974,5,122,0,0, - 950,974,5,123,0,0,951,974,5,134,0,0,952,974,5,132,0,0,953,974,5, - 133,0,0,954,974,5,124,0,0,955,974,5,125,0,0,956,958,5,59,0,0,957, - 956,1,0,0,0,957,958,1,0,0,0,958,959,1,0,0,0,959,961,5,43,0,0,960, - 962,5,15,0,0,961,960,1,0,0,0,961,962,1,0,0,0,962,974,1,0,0,0,963, - 965,5,59,0,0,964,963,1,0,0,0,964,965,1,0,0,0,965,966,1,0,0,0,966, - 974,7,11,0,0,967,974,5,146,0,0,968,974,5,147,0,0,969,974,5,136,0, - 0,970,974,5,127,0,0,971,974,5,128,0,0,972,974,5,135,0,0,973,949, - 1,0,0,0,973,950,1,0,0,0,973,951,1,0,0,0,973,952,1,0,0,0,973,953, - 1,0,0,0,973,954,1,0,0,0,973,955,1,0,0,0,973,957,1,0,0,0,973,964, - 1,0,0,0,973,967,1,0,0,0,973,968,1,0,0,0,973,969,1,0,0,0,973,970, - 1,0,0,0,973,971,1,0,0,0,973,972,1,0,0,0,974,975,1,0,0,0,975,1043, - 3,116,58,18,976,977,10,15,0,0,977,978,5,138,0,0,978,1043,3,116,58, - 16,979,980,10,13,0,0,980,981,5,2,0,0,981,1043,3,116,58,14,982,983, - 10,12,0,0,983,984,5,64,0,0,984,1043,3,116,58,13,985,987,10,11,0, - 0,986,988,5,59,0,0,987,986,1,0,0,0,987,988,1,0,0,0,988,989,1,0,0, - 0,989,990,5,9,0,0,990,991,3,116,58,0,991,992,5,2,0,0,992,993,3,116, - 58,12,993,1043,1,0,0,0,994,995,10,10,0,0,995,996,5,141,0,0,996,997, - 3,116,58,0,997,998,5,116,0,0,998,999,3,116,58,10,999,1043,1,0,0, - 0,1000,1001,10,30,0,0,1001,1003,5,131,0,0,1002,1004,3,114,57,0,1003, - 1002,1,0,0,0,1003,1004,1,0,0,0,1004,1005,1,0,0,0,1005,1043,5,150, - 0,0,1006,1007,10,26,0,0,1007,1008,5,130,0,0,1008,1009,3,116,58,0, - 1009,1010,5,149,0,0,1010,1043,1,0,0,0,1011,1012,10,25,0,0,1012,1013, - 5,121,0,0,1013,1043,5,109,0,0,1014,1015,10,24,0,0,1015,1016,5,121, - 0,0,1016,1043,3,156,78,0,1017,1018,10,23,0,0,1018,1019,5,137,0,0, - 1019,1020,5,130,0,0,1020,1021,3,116,58,0,1021,1022,5,149,0,0,1022, - 1043,1,0,0,0,1023,1024,10,22,0,0,1024,1025,5,137,0,0,1025,1043,5, - 109,0,0,1026,1027,10,21,0,0,1027,1028,5,137,0,0,1028,1043,3,156, - 78,0,1029,1030,10,16,0,0,1030,1032,5,47,0,0,1031,1033,5,59,0,0,1032, - 1031,1,0,0,0,1032,1033,1,0,0,0,1033,1034,1,0,0,0,1034,1043,5,60, - 0,0,1035,1040,10,9,0,0,1036,1037,5,6,0,0,1037,1041,3,156,78,0,1038, - 1039,5,6,0,0,1039,1041,5,111,0,0,1040,1036,1,0,0,0,1040,1038,1,0, - 0,0,1041,1043,1,0,0,0,1042,934,1,0,0,0,1042,941,1,0,0,0,1042,948, - 1,0,0,0,1042,976,1,0,0,0,1042,979,1,0,0,0,1042,982,1,0,0,0,1042, - 985,1,0,0,0,1042,994,1,0,0,0,1042,1000,1,0,0,0,1042,1006,1,0,0,0, - 1042,1011,1,0,0,0,1042,1014,1,0,0,0,1042,1017,1,0,0,0,1042,1023, - 1,0,0,0,1042,1026,1,0,0,0,1042,1029,1,0,0,0,1042,1035,1,0,0,0,1043, - 1046,1,0,0,0,1044,1042,1,0,0,0,1044,1045,1,0,0,0,1045,117,1,0,0, - 0,1046,1044,1,0,0,0,1047,1048,5,131,0,0,1048,1053,3,156,78,0,1049, - 1050,5,117,0,0,1050,1052,3,156,78,0,1051,1049,1,0,0,0,1052,1055, - 1,0,0,0,1053,1051,1,0,0,0,1053,1054,1,0,0,0,1054,1057,1,0,0,0,1055, - 1053,1,0,0,0,1056,1058,5,117,0,0,1057,1056,1,0,0,0,1057,1058,1,0, - 0,0,1058,1059,1,0,0,0,1059,1060,5,150,0,0,1060,1075,1,0,0,0,1061, - 1066,3,156,78,0,1062,1063,5,117,0,0,1063,1065,3,156,78,0,1064,1062, - 1,0,0,0,1065,1068,1,0,0,0,1066,1064,1,0,0,0,1066,1067,1,0,0,0,1067, - 1070,1,0,0,0,1068,1066,1,0,0,0,1069,1071,5,117,0,0,1070,1069,1,0, - 0,0,1070,1071,1,0,0,0,1071,1075,1,0,0,0,1072,1073,5,131,0,0,1073, - 1075,5,150,0,0,1074,1047,1,0,0,0,1074,1061,1,0,0,0,1074,1072,1,0, - 0,0,1075,1076,1,0,0,0,1076,1079,5,112,0,0,1077,1080,3,116,58,0,1078, - 1080,3,36,18,0,1079,1077,1,0,0,0,1079,1078,1,0,0,0,1080,119,1,0, - 0,0,1081,1082,5,133,0,0,1082,1086,3,156,78,0,1083,1085,3,122,61, - 0,1084,1083,1,0,0,0,1085,1088,1,0,0,0,1086,1084,1,0,0,0,1086,1087, - 1,0,0,0,1087,1089,1,0,0,0,1088,1086,1,0,0,0,1089,1090,5,152,0,0, - 1090,1091,5,125,0,0,1091,1114,1,0,0,0,1092,1093,5,133,0,0,1093,1097, - 3,156,78,0,1094,1096,3,122,61,0,1095,1094,1,0,0,0,1096,1099,1,0, - 0,0,1097,1095,1,0,0,0,1097,1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097, - 1,0,0,0,1100,1106,5,125,0,0,1101,1107,3,120,60,0,1102,1103,5,129, - 0,0,1103,1104,3,116,58,0,1104,1105,5,148,0,0,1105,1107,1,0,0,0,1106, - 1101,1,0,0,0,1106,1102,1,0,0,0,1106,1107,1,0,0,0,1107,1108,1,0,0, - 0,1108,1109,5,133,0,0,1109,1110,5,152,0,0,1110,1111,3,156,78,0,1111, - 1112,5,125,0,0,1112,1114,1,0,0,0,1113,1081,1,0,0,0,1113,1092,1,0, - 0,0,1114,121,1,0,0,0,1115,1116,3,156,78,0,1116,1117,5,123,0,0,1117, - 1118,3,162,81,0,1118,1127,1,0,0,0,1119,1120,3,156,78,0,1120,1121, - 5,123,0,0,1121,1122,5,129,0,0,1122,1123,3,116,58,0,1123,1124,5,148, - 0,0,1124,1127,1,0,0,0,1125,1127,3,156,78,0,1126,1115,1,0,0,0,1126, - 1119,1,0,0,0,1126,1125,1,0,0,0,1127,123,1,0,0,0,1128,1133,3,126, - 63,0,1129,1130,5,117,0,0,1130,1132,3,126,63,0,1131,1129,1,0,0,0, - 1132,1135,1,0,0,0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134,1137, - 1,0,0,0,1135,1133,1,0,0,0,1136,1138,5,117,0,0,1137,1136,1,0,0,0, - 1137,1138,1,0,0,0,1138,125,1,0,0,0,1139,1140,3,156,78,0,1140,1141, - 5,6,0,0,1141,1142,5,131,0,0,1142,1143,3,44,22,0,1143,1144,5,150, - 0,0,1144,1150,1,0,0,0,1145,1146,3,116,58,0,1146,1147,5,6,0,0,1147, - 1148,3,156,78,0,1148,1150,1,0,0,0,1149,1139,1,0,0,0,1149,1145,1, - 0,0,0,1150,127,1,0,0,0,1151,1159,3,160,80,0,1152,1153,3,136,68,0, - 1153,1154,5,121,0,0,1154,1156,1,0,0,0,1155,1152,1,0,0,0,1155,1156, - 1,0,0,0,1156,1157,1,0,0,0,1157,1159,3,130,65,0,1158,1151,1,0,0,0, - 1158,1155,1,0,0,0,1159,129,1,0,0,0,1160,1165,3,156,78,0,1161,1162, - 5,121,0,0,1162,1164,3,156,78,0,1163,1161,1,0,0,0,1164,1167,1,0,0, - 0,1165,1163,1,0,0,0,1165,1166,1,0,0,0,1166,131,1,0,0,0,1167,1165, - 1,0,0,0,1168,1169,6,66,-1,0,1169,1178,3,136,68,0,1170,1178,3,134, - 67,0,1171,1172,5,131,0,0,1172,1173,3,44,22,0,1173,1174,5,150,0,0, - 1174,1178,1,0,0,0,1175,1178,3,120,60,0,1176,1178,3,160,80,0,1177, - 1168,1,0,0,0,1177,1170,1,0,0,0,1177,1171,1,0,0,0,1177,1175,1,0,0, - 0,1177,1176,1,0,0,0,1178,1187,1,0,0,0,1179,1183,10,3,0,0,1180,1184, - 3,154,77,0,1181,1182,5,6,0,0,1182,1184,3,156,78,0,1183,1180,1,0, - 0,0,1183,1181,1,0,0,0,1184,1186,1,0,0,0,1185,1179,1,0,0,0,1186,1189, - 1,0,0,0,1187,1185,1,0,0,0,1187,1188,1,0,0,0,1188,133,1,0,0,0,1189, - 1187,1,0,0,0,1190,1191,3,156,78,0,1191,1193,5,131,0,0,1192,1194, - 3,138,69,0,1193,1192,1,0,0,0,1193,1194,1,0,0,0,1194,1195,1,0,0,0, - 1195,1196,5,150,0,0,1196,135,1,0,0,0,1197,1198,3,140,70,0,1198,1199, - 5,121,0,0,1199,1201,1,0,0,0,1200,1197,1,0,0,0,1200,1201,1,0,0,0, - 1201,1202,1,0,0,0,1202,1203,3,156,78,0,1203,137,1,0,0,0,1204,1209, - 3,116,58,0,1205,1206,5,117,0,0,1206,1208,3,116,58,0,1207,1205,1, - 0,0,0,1208,1211,1,0,0,0,1209,1207,1,0,0,0,1209,1210,1,0,0,0,1210, - 1213,1,0,0,0,1211,1209,1,0,0,0,1212,1214,5,117,0,0,1213,1212,1,0, - 0,0,1213,1214,1,0,0,0,1214,139,1,0,0,0,1215,1216,3,156,78,0,1216, - 141,1,0,0,0,1217,1226,5,107,0,0,1218,1219,5,121,0,0,1219,1226,7, - 12,0,0,1220,1221,5,109,0,0,1221,1223,5,121,0,0,1222,1224,7,12,0, - 0,1223,1222,1,0,0,0,1223,1224,1,0,0,0,1224,1226,1,0,0,0,1225,1217, - 1,0,0,0,1225,1218,1,0,0,0,1225,1220,1,0,0,0,1226,143,1,0,0,0,1227, - 1229,7,13,0,0,1228,1227,1,0,0,0,1228,1229,1,0,0,0,1229,1236,1,0, - 0,0,1230,1237,3,142,71,0,1231,1237,5,108,0,0,1232,1237,5,109,0,0, - 1233,1237,5,110,0,0,1234,1237,5,44,0,0,1235,1237,5,58,0,0,1236,1230, - 1,0,0,0,1236,1231,1,0,0,0,1236,1232,1,0,0,0,1236,1233,1,0,0,0,1236, - 1234,1,0,0,0,1236,1235,1,0,0,0,1237,145,1,0,0,0,1238,1242,3,144, - 72,0,1239,1242,5,111,0,0,1240,1242,5,60,0,0,1241,1238,1,0,0,0,1241, - 1239,1,0,0,0,1241,1240,1,0,0,0,1242,147,1,0,0,0,1243,1244,7,14,0, - 0,1244,149,1,0,0,0,1245,1246,7,15,0,0,1246,151,1,0,0,0,1247,1248, - 7,16,0,0,1248,153,1,0,0,0,1249,1252,5,106,0,0,1250,1252,3,152,76, - 0,1251,1249,1,0,0,0,1251,1250,1,0,0,0,1252,155,1,0,0,0,1253,1257, - 5,106,0,0,1254,1257,3,148,74,0,1255,1257,3,150,75,0,1256,1253,1, - 0,0,0,1256,1254,1,0,0,0,1256,1255,1,0,0,0,1257,157,1,0,0,0,1258, - 1259,3,162,81,0,1259,1260,5,123,0,0,1260,1261,3,144,72,0,1261,159, - 1,0,0,0,1262,1263,5,129,0,0,1263,1264,3,116,58,0,1264,1265,5,148, - 0,0,1265,161,1,0,0,0,1266,1269,5,111,0,0,1267,1269,3,164,82,0,1268, - 1266,1,0,0,0,1268,1267,1,0,0,0,1269,163,1,0,0,0,1270,1274,5,143, - 0,0,1271,1273,3,166,83,0,1272,1271,1,0,0,0,1273,1276,1,0,0,0,1274, - 1272,1,0,0,0,1274,1275,1,0,0,0,1275,1277,1,0,0,0,1276,1274,1,0,0, - 0,1277,1278,5,145,0,0,1278,165,1,0,0,0,1279,1280,5,158,0,0,1280, - 1281,3,116,58,0,1281,1282,5,148,0,0,1282,1285,1,0,0,0,1283,1285, - 5,157,0,0,1284,1279,1,0,0,0,1284,1283,1,0,0,0,1285,167,1,0,0,0,1286, - 1290,5,144,0,0,1287,1289,3,170,85,0,1288,1287,1,0,0,0,1289,1292, - 1,0,0,0,1290,1288,1,0,0,0,1290,1291,1,0,0,0,1291,1293,1,0,0,0,1292, - 1290,1,0,0,0,1293,1294,5,0,0,1,1294,169,1,0,0,0,1295,1296,5,160, - 0,0,1296,1297,3,116,58,0,1297,1298,5,148,0,0,1298,1301,1,0,0,0,1299, - 1301,5,159,0,0,1300,1295,1,0,0,0,1300,1299,1,0,0,0,1301,171,1,0, - 0,0,167,175,182,191,198,202,216,220,223,227,230,237,241,250,255, - 264,272,279,283,289,294,302,309,315,327,335,349,353,358,368,377, - 380,384,387,391,394,397,400,403,407,411,414,417,420,424,427,436, - 442,463,480,497,503,509,520,522,533,536,542,550,556,558,562,567, - 570,573,577,581,584,586,589,593,597,600,602,604,609,620,626,633, - 638,642,646,652,654,661,669,672,675,694,708,724,728,739,743,754, - 758,765,769,776,780,785,794,798,822,839,845,848,851,861,867,870, - 873,881,884,888,891,905,922,927,932,938,945,957,961,964,973,987, - 1003,1032,1040,1042,1044,1053,1057,1066,1070,1074,1079,1086,1097, - 1106,1113,1126,1133,1137,1149,1155,1158,1165,1177,1183,1187,1193, - 1200,1209,1213,1223,1225,1228,1236,1241,1251,1256,1268,1274,1284, - 1290,1300 + 85,7,85,2,86,7,86,1,0,5,0,176,8,0,10,0,12,0,179,9,0,1,0,1,0,1,1, + 1,1,3,1,185,8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,194,8,3,1,4,1,4, + 1,4,5,4,199,8,4,10,4,12,4,202,9,4,1,4,3,4,205,8,4,1,5,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,219,8,5,1,6,1,6,3,6,223,8, + 6,1,6,3,6,226,8,6,1,7,1,7,3,7,230,8,7,1,7,3,7,233,8,7,1,8,1,8,1, + 8,1,8,1,8,3,8,240,8,8,1,8,1,8,3,8,244,8,8,1,8,1,8,1,9,1,9,1,9,5, + 9,251,8,9,10,9,12,9,254,9,9,1,9,1,9,3,9,258,8,9,1,10,1,10,1,10,1, + 10,1,10,1,10,1,10,3,10,267,8,10,1,11,1,11,1,11,1,11,1,11,1,11,3, + 11,275,8,11,1,12,1,12,1,12,1,12,1,12,3,12,282,8,12,1,12,1,12,3,12, + 286,8,12,1,12,1,12,1,12,1,12,3,12,292,8,12,1,12,1,12,1,12,3,12,297, + 8,12,1,13,1,13,1,13,1,13,1,13,1,13,3,13,305,8,13,1,13,1,13,1,13, + 1,13,1,13,3,13,312,8,13,1,14,1,14,1,14,1,14,3,14,318,8,14,1,14,1, + 14,1,14,1,15,1,15,1,15,1,15,1,15,1,16,1,16,3,16,330,8,16,1,17,1, + 17,1,18,1,18,5,18,336,8,18,10,18,12,18,339,9,18,1,18,1,18,1,19,1, + 19,1,19,1,19,1,20,1,20,1,20,5,20,350,8,20,10,20,12,20,353,9,20,1, + 20,3,20,356,8,20,1,21,1,21,1,21,3,21,361,8,21,1,21,1,21,1,22,1,22, + 1,22,1,22,1,22,1,22,3,22,371,8,22,1,23,1,23,1,23,1,23,3,23,377,8, + 23,1,23,1,23,1,24,1,24,5,24,383,8,24,10,24,12,24,386,9,24,1,25,3, + 25,389,8,25,1,25,1,25,3,25,393,8,25,1,25,3,25,396,8,25,1,25,1,25, + 3,25,400,8,25,1,25,3,25,403,8,25,1,25,3,25,406,8,25,1,25,3,25,409, + 8,25,1,25,3,25,412,8,25,1,25,1,25,3,25,416,8,25,1,25,1,25,3,25,420, + 8,25,1,25,3,25,423,8,25,1,25,3,25,426,8,25,1,25,3,25,429,8,25,1, + 25,1,25,3,25,433,8,25,1,25,3,25,436,8,25,1,26,1,26,1,26,1,27,1,27, + 1,27,1,27,3,27,445,8,27,1,28,1,28,1,28,1,29,3,29,451,8,29,1,29,1, + 29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1, + 30,1,30,1,30,5,30,470,8,30,10,30,12,30,473,9,30,1,31,1,31,1,31,1, + 32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,489,8, + 33,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1, + 37,1,37,1,37,3,37,506,8,37,1,37,1,37,1,37,1,37,3,37,512,8,37,1,37, + 1,37,1,37,1,37,3,37,518,8,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37, + 1,37,1,37,3,37,529,8,37,3,37,531,8,37,1,38,1,38,1,38,1,39,1,39,1, + 39,1,40,1,40,1,40,3,40,542,8,40,1,40,3,40,545,8,40,1,40,1,40,1,40, + 1,40,3,40,551,8,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,559,8,40,1, + 40,1,40,1,40,1,40,5,40,565,8,40,10,40,12,40,568,9,40,1,41,3,41,571, + 8,41,1,41,1,41,1,41,3,41,576,8,41,1,41,3,41,579,8,41,1,41,3,41,582, + 8,41,1,41,1,41,3,41,586,8,41,1,41,1,41,3,41,590,8,41,1,41,3,41,593, + 8,41,3,41,595,8,41,1,41,3,41,598,8,41,1,41,1,41,3,41,602,8,41,1, + 41,1,41,3,41,606,8,41,1,41,3,41,609,8,41,3,41,611,8,41,3,41,613, + 8,41,1,42,1,42,1,42,3,42,618,8,42,1,43,1,43,1,43,1,43,1,43,1,43, + 1,43,1,43,1,43,3,43,629,8,43,1,44,1,44,1,44,1,44,3,44,635,8,44,1, + 45,1,45,1,45,5,45,640,8,45,10,45,12,45,643,9,45,1,46,1,46,3,46,647, + 8,46,1,46,1,46,3,46,651,8,46,1,46,1,46,3,46,655,8,46,1,47,1,47,1, + 47,1,47,3,47,661,8,47,3,47,663,8,47,1,48,1,48,1,48,5,48,668,8,48, + 10,48,12,48,671,9,48,1,49,1,49,1,49,1,49,1,50,3,50,678,8,50,1,50, + 3,50,681,8,50,1,50,3,50,684,8,50,1,51,1,51,1,51,1,51,1,52,1,52,1, + 52,1,52,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,3,54,703,8, + 54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,3, + 55,717,8,55,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1, + 57,1,57,5,57,731,8,57,10,57,12,57,734,9,57,1,57,3,57,737,8,57,1, + 57,1,57,1,57,1,57,1,57,1,57,1,57,5,57,746,8,57,10,57,12,57,749,9, + 57,1,57,3,57,752,8,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,5,57,761, + 8,57,10,57,12,57,764,9,57,1,57,3,57,767,8,57,1,57,1,57,1,57,1,57, + 1,57,3,57,774,8,57,1,57,1,57,3,57,778,8,57,1,58,1,58,1,58,5,58,783, + 8,58,10,58,12,58,786,9,58,1,58,3,58,789,8,58,1,59,1,59,1,59,3,59, + 794,8,59,1,59,1,59,1,59,1,59,1,59,4,59,801,8,59,11,59,12,59,802, + 1,59,1,59,3,59,807,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,3,59,831,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,3,59,848,8,59,1,59,1,59,1,59,1,59, + 3,59,854,8,59,1,59,3,59,857,8,59,1,59,3,59,860,8,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,3,59,870,8,59,1,59,1,59,1,59,1,59,3, + 59,876,8,59,1,59,3,59,879,8,59,1,59,3,59,882,8,59,1,59,1,59,1,59, + 1,59,1,59,1,59,3,59,890,8,59,1,59,3,59,893,8,59,1,59,1,59,3,59,897, + 8,59,1,59,3,59,900,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,3,59,914,8,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,931,8,59,1,59, + 1,59,1,59,3,59,936,8,59,1,59,1,59,1,59,3,59,941,8,59,1,59,1,59,1, + 59,1,59,3,59,947,8,59,1,59,1,59,1,59,1,59,1,59,3,59,954,8,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,966,8,59,1,59, + 1,59,3,59,970,8,59,1,59,3,59,973,8,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,3,59,982,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,3,59,996,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1012,8,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1041, + 8,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1049,8,59,5,59,1051,8,59, + 10,59,12,59,1054,9,59,1,60,1,60,1,60,1,60,5,60,1060,8,60,10,60,12, + 60,1063,9,60,1,60,3,60,1066,8,60,1,60,1,60,1,60,1,60,1,60,5,60,1073, + 8,60,10,60,12,60,1076,9,60,1,60,3,60,1079,8,60,1,60,1,60,3,60,1083, + 8,60,1,60,1,60,1,60,3,60,1088,8,60,1,61,1,61,1,61,5,61,1093,8,61, + 10,61,12,61,1096,9,61,1,61,1,61,1,61,1,61,1,61,1,61,5,61,1104,8, + 61,10,61,12,61,1107,9,61,1,61,1,61,1,61,1,61,1,61,1,61,3,61,1115, + 8,61,1,61,1,61,1,61,1,61,1,61,3,61,1122,8,61,1,62,1,62,1,62,1,62, + 1,62,1,62,1,62,1,62,1,62,1,62,1,62,3,62,1135,8,62,1,63,1,63,1,63, + 5,63,1140,8,63,10,63,12,63,1143,9,63,1,63,3,63,1146,8,63,1,64,1, + 64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1158,8,64,1,65,1, + 65,1,65,1,65,3,65,1164,8,65,1,65,3,65,1167,8,65,1,66,1,66,1,66,5, + 66,1172,8,66,10,66,12,66,1175,9,66,1,67,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,3,67,1186,8,67,1,67,1,67,1,67,1,67,3,67,1192,8,67, + 5,67,1194,8,67,10,67,12,67,1197,9,67,1,68,1,68,1,68,3,68,1202,8, + 68,1,68,1,68,1,69,1,69,1,69,3,69,1209,8,69,1,69,1,69,1,70,1,70,1, + 70,5,70,1216,8,70,10,70,12,70,1219,9,70,1,70,3,70,1222,8,70,1,71, + 1,71,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1232,8,72,3,72,1234,8,72, + 1,73,3,73,1237,8,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1245,8,73, + 1,74,1,74,1,74,3,74,1250,8,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78, + 1,78,3,78,1260,8,78,1,79,1,79,1,79,3,79,1265,8,79,1,80,1,80,1,80, + 1,80,1,81,1,81,1,81,1,81,1,82,1,82,3,82,1277,8,82,1,83,1,83,5,83, + 1281,8,83,10,83,12,83,1284,9,83,1,83,1,83,1,84,1,84,1,84,1,84,1, + 84,3,84,1293,8,84,1,85,1,85,5,85,1297,8,85,10,85,12,85,1300,9,85, + 1,85,1,85,1,86,1,86,1,86,1,86,1,86,3,86,1309,8,86,1,86,0,3,80,118, + 134,87,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,0,17,2,0,32,32,37,37,2,0, + 18,18,77,77,2,0,46,46,54,54,3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,83,83, + 2,0,54,54,76,76,2,0,1,1,4,4,2,0,7,7,22,23,2,0,31,31,52,52,2,0,74, + 74,79,79,3,0,10,10,53,53,93,93,2,0,43,43,56,56,1,0,110,111,2,0,121, + 121,142,142,7,0,21,21,40,40,58,59,73,73,81,81,100,100,106,106,19, + 0,1,13,15,20,22,26,28,29,31,31,33,36,38,39,41,44,46,46,48,54,56, + 57,61,61,63,72,74,80,82,86,88,95,97,99,101,102,104,105,4,0,20,20, + 31,31,41,41,51,51,1484,0,177,1,0,0,0,2,184,1,0,0,0,4,186,1,0,0,0, + 6,188,1,0,0,0,8,195,1,0,0,0,10,218,1,0,0,0,12,220,1,0,0,0,14,227, + 1,0,0,0,16,234,1,0,0,0,18,247,1,0,0,0,20,259,1,0,0,0,22,268,1,0, + 0,0,24,276,1,0,0,0,26,298,1,0,0,0,28,313,1,0,0,0,30,322,1,0,0,0, + 32,327,1,0,0,0,34,331,1,0,0,0,36,333,1,0,0,0,38,342,1,0,0,0,40,346, + 1,0,0,0,42,360,1,0,0,0,44,370,1,0,0,0,46,376,1,0,0,0,48,380,1,0, + 0,0,50,388,1,0,0,0,52,437,1,0,0,0,54,440,1,0,0,0,56,446,1,0,0,0, + 58,450,1,0,0,0,60,456,1,0,0,0,62,474,1,0,0,0,64,477,1,0,0,0,66,480, + 1,0,0,0,68,490,1,0,0,0,70,493,1,0,0,0,72,497,1,0,0,0,74,530,1,0, + 0,0,76,532,1,0,0,0,78,535,1,0,0,0,80,550,1,0,0,0,82,612,1,0,0,0, + 84,617,1,0,0,0,86,628,1,0,0,0,88,630,1,0,0,0,90,636,1,0,0,0,92,644, + 1,0,0,0,94,662,1,0,0,0,96,664,1,0,0,0,98,672,1,0,0,0,100,677,1,0, + 0,0,102,685,1,0,0,0,104,689,1,0,0,0,106,693,1,0,0,0,108,702,1,0, + 0,0,110,716,1,0,0,0,112,718,1,0,0,0,114,777,1,0,0,0,116,779,1,0, + 0,0,118,940,1,0,0,0,120,1082,1,0,0,0,122,1121,1,0,0,0,124,1134,1, + 0,0,0,126,1136,1,0,0,0,128,1157,1,0,0,0,130,1166,1,0,0,0,132,1168, + 1,0,0,0,134,1185,1,0,0,0,136,1198,1,0,0,0,138,1208,1,0,0,0,140,1212, + 1,0,0,0,142,1223,1,0,0,0,144,1233,1,0,0,0,146,1236,1,0,0,0,148,1249, + 1,0,0,0,150,1251,1,0,0,0,152,1253,1,0,0,0,154,1255,1,0,0,0,156,1259, + 1,0,0,0,158,1264,1,0,0,0,160,1266,1,0,0,0,162,1270,1,0,0,0,164,1276, + 1,0,0,0,166,1278,1,0,0,0,168,1292,1,0,0,0,170,1294,1,0,0,0,172,1308, + 1,0,0,0,174,176,3,2,1,0,175,174,1,0,0,0,176,179,1,0,0,0,177,175, + 1,0,0,0,177,178,1,0,0,0,178,180,1,0,0,0,179,177,1,0,0,0,180,181, + 5,0,0,1,181,1,1,0,0,0,182,185,3,6,3,0,183,185,3,10,5,0,184,182,1, + 0,0,0,184,183,1,0,0,0,185,3,1,0,0,0,186,187,3,118,59,0,187,5,1,0, + 0,0,188,189,5,55,0,0,189,193,3,158,79,0,190,191,5,118,0,0,191,192, + 5,125,0,0,192,194,3,4,2,0,193,190,1,0,0,0,193,194,1,0,0,0,194,7, + 1,0,0,0,195,200,3,158,79,0,196,197,5,119,0,0,197,199,3,158,79,0, + 198,196,1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,200,201,1,0,0,0, + 201,204,1,0,0,0,202,200,1,0,0,0,203,205,5,119,0,0,204,203,1,0,0, + 0,204,205,1,0,0,0,205,9,1,0,0,0,206,219,3,12,6,0,207,219,3,14,7, + 0,208,219,3,18,9,0,209,219,3,20,10,0,210,219,3,22,11,0,211,219,3, + 26,13,0,212,219,3,24,12,0,213,219,3,28,14,0,214,219,3,30,15,0,215, + 219,3,36,18,0,216,219,3,32,16,0,217,219,3,34,17,0,218,206,1,0,0, + 0,218,207,1,0,0,0,218,208,1,0,0,0,218,209,1,0,0,0,218,210,1,0,0, + 0,218,211,1,0,0,0,218,212,1,0,0,0,218,213,1,0,0,0,218,214,1,0,0, + 0,218,215,1,0,0,0,218,216,1,0,0,0,218,217,1,0,0,0,219,11,1,0,0,0, + 220,222,5,75,0,0,221,223,3,4,2,0,222,221,1,0,0,0,222,223,1,0,0,0, + 223,225,1,0,0,0,224,226,5,153,0,0,225,224,1,0,0,0,225,226,1,0,0, + 0,226,13,1,0,0,0,227,229,5,87,0,0,228,230,3,4,2,0,229,228,1,0,0, + 0,229,230,1,0,0,0,230,232,1,0,0,0,231,233,5,153,0,0,232,231,1,0, + 0,0,232,233,1,0,0,0,233,15,1,0,0,0,234,243,5,14,0,0,235,236,5,133, + 0,0,236,239,3,158,79,0,237,238,5,118,0,0,238,240,3,158,79,0,239, + 237,1,0,0,0,239,240,1,0,0,0,240,241,1,0,0,0,241,242,5,152,0,0,242, + 244,1,0,0,0,243,235,1,0,0,0,243,244,1,0,0,0,244,245,1,0,0,0,245, + 246,3,36,18,0,246,17,1,0,0,0,247,248,5,96,0,0,248,252,3,36,18,0, + 249,251,3,16,8,0,250,249,1,0,0,0,251,254,1,0,0,0,252,250,1,0,0,0, + 252,253,1,0,0,0,253,257,1,0,0,0,254,252,1,0,0,0,255,256,5,30,0,0, + 256,258,3,36,18,0,257,255,1,0,0,0,257,258,1,0,0,0,258,19,1,0,0,0, + 259,260,5,42,0,0,260,261,5,133,0,0,261,262,3,4,2,0,262,263,5,152, + 0,0,263,266,3,10,5,0,264,265,5,25,0,0,265,267,3,10,5,0,266,264,1, + 0,0,0,266,267,1,0,0,0,267,21,1,0,0,0,268,269,5,103,0,0,269,270,5, + 133,0,0,270,271,3,4,2,0,271,272,5,152,0,0,272,274,3,10,5,0,273,275, + 5,153,0,0,274,273,1,0,0,0,274,275,1,0,0,0,275,23,1,0,0,0,276,277, + 5,34,0,0,277,281,5,133,0,0,278,282,3,6,3,0,279,282,3,30,15,0,280, + 282,3,4,2,0,281,278,1,0,0,0,281,279,1,0,0,0,281,280,1,0,0,0,281, + 282,1,0,0,0,282,283,1,0,0,0,283,285,5,153,0,0,284,286,3,4,2,0,285, + 284,1,0,0,0,285,286,1,0,0,0,286,287,1,0,0,0,287,291,5,153,0,0,288, + 292,3,6,3,0,289,292,3,30,15,0,290,292,3,4,2,0,291,288,1,0,0,0,291, + 289,1,0,0,0,291,290,1,0,0,0,291,292,1,0,0,0,292,293,1,0,0,0,293, + 294,5,152,0,0,294,296,3,10,5,0,295,297,5,153,0,0,296,295,1,0,0,0, + 296,297,1,0,0,0,297,25,1,0,0,0,298,299,5,34,0,0,299,300,5,133,0, + 0,300,301,5,55,0,0,301,304,3,158,79,0,302,303,5,119,0,0,303,305, + 3,158,79,0,304,302,1,0,0,0,304,305,1,0,0,0,305,306,1,0,0,0,306,307, + 5,44,0,0,307,308,3,4,2,0,308,309,5,152,0,0,309,311,3,10,5,0,310, + 312,5,153,0,0,311,310,1,0,0,0,311,312,1,0,0,0,312,27,1,0,0,0,313, + 314,7,0,0,0,314,315,3,158,79,0,315,317,5,133,0,0,316,318,3,8,4,0, + 317,316,1,0,0,0,317,318,1,0,0,0,318,319,1,0,0,0,319,320,5,152,0, + 0,320,321,3,36,18,0,321,29,1,0,0,0,322,323,3,4,2,0,323,324,5,118, + 0,0,324,325,5,125,0,0,325,326,3,4,2,0,326,31,1,0,0,0,327,329,3,4, + 2,0,328,330,5,153,0,0,329,328,1,0,0,0,329,330,1,0,0,0,330,33,1,0, + 0,0,331,332,5,153,0,0,332,35,1,0,0,0,333,337,5,131,0,0,334,336,3, + 2,1,0,335,334,1,0,0,0,336,339,1,0,0,0,337,335,1,0,0,0,337,338,1, + 0,0,0,338,340,1,0,0,0,339,337,1,0,0,0,340,341,5,150,0,0,341,37,1, + 0,0,0,342,343,3,4,2,0,343,344,5,118,0,0,344,345,3,4,2,0,345,39,1, + 0,0,0,346,351,3,38,19,0,347,348,5,119,0,0,348,350,3,38,19,0,349, + 347,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,351,352,1,0,0,0,352, + 355,1,0,0,0,353,351,1,0,0,0,354,356,5,119,0,0,355,354,1,0,0,0,355, + 356,1,0,0,0,356,41,1,0,0,0,357,361,3,48,24,0,358,361,3,50,25,0,359, + 361,3,122,61,0,360,357,1,0,0,0,360,358,1,0,0,0,360,359,1,0,0,0,361, + 362,1,0,0,0,362,363,5,0,0,1,363,43,1,0,0,0,364,371,3,50,25,0,365, + 366,5,133,0,0,366,367,3,48,24,0,367,368,5,152,0,0,368,371,1,0,0, + 0,369,371,3,162,81,0,370,364,1,0,0,0,370,365,1,0,0,0,370,369,1,0, + 0,0,371,45,1,0,0,0,372,377,5,27,0,0,373,374,5,98,0,0,374,377,5,1, + 0,0,375,377,5,47,0,0,376,372,1,0,0,0,376,373,1,0,0,0,376,375,1,0, + 0,0,377,378,1,0,0,0,378,379,3,44,22,0,379,47,1,0,0,0,380,384,3,44, + 22,0,381,383,3,46,23,0,382,381,1,0,0,0,383,386,1,0,0,0,384,382,1, + 0,0,0,384,385,1,0,0,0,385,49,1,0,0,0,386,384,1,0,0,0,387,389,3,52, + 26,0,388,387,1,0,0,0,388,389,1,0,0,0,389,390,1,0,0,0,390,392,5,82, + 0,0,391,393,5,24,0,0,392,391,1,0,0,0,392,393,1,0,0,0,393,395,1,0, + 0,0,394,396,3,54,27,0,395,394,1,0,0,0,395,396,1,0,0,0,396,397,1, + 0,0,0,397,399,3,116,58,0,398,400,3,56,28,0,399,398,1,0,0,0,399,400, + 1,0,0,0,400,402,1,0,0,0,401,403,3,58,29,0,402,401,1,0,0,0,402,403, + 1,0,0,0,403,405,1,0,0,0,404,406,3,62,31,0,405,404,1,0,0,0,405,406, + 1,0,0,0,406,408,1,0,0,0,407,409,3,64,32,0,408,407,1,0,0,0,408,409, + 1,0,0,0,409,411,1,0,0,0,410,412,3,66,33,0,411,410,1,0,0,0,411,412, + 1,0,0,0,412,415,1,0,0,0,413,414,5,105,0,0,414,416,7,1,0,0,415,413, + 1,0,0,0,415,416,1,0,0,0,416,419,1,0,0,0,417,418,5,105,0,0,418,420, + 5,92,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,423, + 3,68,34,0,422,421,1,0,0,0,422,423,1,0,0,0,423,425,1,0,0,0,424,426, + 3,60,30,0,425,424,1,0,0,0,425,426,1,0,0,0,426,428,1,0,0,0,427,429, + 3,70,35,0,428,427,1,0,0,0,428,429,1,0,0,0,429,432,1,0,0,0,430,433, + 3,74,37,0,431,433,3,76,38,0,432,430,1,0,0,0,432,431,1,0,0,0,432, + 433,1,0,0,0,433,435,1,0,0,0,434,436,3,78,39,0,435,434,1,0,0,0,435, + 436,1,0,0,0,436,51,1,0,0,0,437,438,5,105,0,0,438,439,3,126,63,0, + 439,53,1,0,0,0,440,441,5,91,0,0,441,444,5,111,0,0,442,443,5,105, + 0,0,443,445,5,88,0,0,444,442,1,0,0,0,444,445,1,0,0,0,445,55,1,0, + 0,0,446,447,5,35,0,0,447,448,3,80,40,0,448,57,1,0,0,0,449,451,7, + 2,0,0,450,449,1,0,0,0,450,451,1,0,0,0,451,452,1,0,0,0,452,453,5, + 5,0,0,453,454,5,50,0,0,454,455,3,116,58,0,455,59,1,0,0,0,456,457, + 5,104,0,0,457,458,3,158,79,0,458,459,5,6,0,0,459,460,5,133,0,0,460, + 461,3,100,50,0,461,471,5,152,0,0,462,463,5,119,0,0,463,464,3,158, + 79,0,464,465,5,6,0,0,465,466,5,133,0,0,466,467,3,100,50,0,467,468, + 5,152,0,0,468,470,1,0,0,0,469,462,1,0,0,0,470,473,1,0,0,0,471,469, + 1,0,0,0,471,472,1,0,0,0,472,61,1,0,0,0,473,471,1,0,0,0,474,475,5, + 72,0,0,475,476,3,118,59,0,476,63,1,0,0,0,477,478,5,102,0,0,478,479, + 3,118,59,0,479,65,1,0,0,0,480,481,5,38,0,0,481,488,5,11,0,0,482, + 483,7,1,0,0,483,484,5,133,0,0,484,485,3,116,58,0,485,486,5,152,0, + 0,486,489,1,0,0,0,487,489,3,116,58,0,488,482,1,0,0,0,488,487,1,0, + 0,0,489,67,1,0,0,0,490,491,5,39,0,0,491,492,3,118,59,0,492,69,1, + 0,0,0,493,494,5,67,0,0,494,495,5,11,0,0,495,496,3,90,45,0,496,71, + 1,0,0,0,497,498,5,67,0,0,498,499,5,11,0,0,499,500,3,116,58,0,500, + 73,1,0,0,0,501,502,5,57,0,0,502,505,3,118,59,0,503,504,5,119,0,0, + 504,506,3,118,59,0,505,503,1,0,0,0,505,506,1,0,0,0,506,511,1,0,0, + 0,507,508,5,105,0,0,508,512,5,88,0,0,509,510,5,11,0,0,510,512,3, + 116,58,0,511,507,1,0,0,0,511,509,1,0,0,0,511,512,1,0,0,0,512,531, + 1,0,0,0,513,514,5,57,0,0,514,517,3,118,59,0,515,516,5,105,0,0,516, + 518,5,88,0,0,517,515,1,0,0,0,517,518,1,0,0,0,518,519,1,0,0,0,519, + 520,5,64,0,0,520,521,3,118,59,0,521,531,1,0,0,0,522,523,5,57,0,0, + 523,524,3,118,59,0,524,525,5,64,0,0,525,528,3,118,59,0,526,527,5, + 11,0,0,527,529,3,116,58,0,528,526,1,0,0,0,528,529,1,0,0,0,529,531, + 1,0,0,0,530,501,1,0,0,0,530,513,1,0,0,0,530,522,1,0,0,0,531,75,1, + 0,0,0,532,533,5,64,0,0,533,534,3,118,59,0,534,77,1,0,0,0,535,536, + 5,84,0,0,536,537,3,96,48,0,537,79,1,0,0,0,538,539,6,40,-1,0,539, + 541,3,134,67,0,540,542,5,29,0,0,541,540,1,0,0,0,541,542,1,0,0,0, + 542,544,1,0,0,0,543,545,3,88,44,0,544,543,1,0,0,0,544,545,1,0,0, + 0,545,551,1,0,0,0,546,547,5,133,0,0,547,548,3,80,40,0,548,549,5, + 152,0,0,549,551,1,0,0,0,550,538,1,0,0,0,550,546,1,0,0,0,551,566, + 1,0,0,0,552,553,10,3,0,0,553,554,3,84,42,0,554,555,3,80,40,4,555, + 565,1,0,0,0,556,558,10,4,0,0,557,559,3,82,41,0,558,557,1,0,0,0,558, + 559,1,0,0,0,559,560,1,0,0,0,560,561,5,50,0,0,561,562,3,80,40,0,562, + 563,3,86,43,0,563,565,1,0,0,0,564,552,1,0,0,0,564,556,1,0,0,0,565, + 568,1,0,0,0,566,564,1,0,0,0,566,567,1,0,0,0,567,81,1,0,0,0,568,566, + 1,0,0,0,569,571,7,3,0,0,570,569,1,0,0,0,570,571,1,0,0,0,571,572, + 1,0,0,0,572,579,5,46,0,0,573,575,5,46,0,0,574,576,7,3,0,0,575,574, + 1,0,0,0,575,576,1,0,0,0,576,579,1,0,0,0,577,579,7,3,0,0,578,570, + 1,0,0,0,578,573,1,0,0,0,578,577,1,0,0,0,579,613,1,0,0,0,580,582, + 7,4,0,0,581,580,1,0,0,0,581,582,1,0,0,0,582,583,1,0,0,0,583,585, + 7,5,0,0,584,586,5,68,0,0,585,584,1,0,0,0,585,586,1,0,0,0,586,595, + 1,0,0,0,587,589,7,5,0,0,588,590,5,68,0,0,589,588,1,0,0,0,589,590, + 1,0,0,0,590,592,1,0,0,0,591,593,7,4,0,0,592,591,1,0,0,0,592,593, + 1,0,0,0,593,595,1,0,0,0,594,581,1,0,0,0,594,587,1,0,0,0,595,613, + 1,0,0,0,596,598,7,6,0,0,597,596,1,0,0,0,597,598,1,0,0,0,598,599, + 1,0,0,0,599,601,5,36,0,0,600,602,5,68,0,0,601,600,1,0,0,0,601,602, + 1,0,0,0,602,611,1,0,0,0,603,605,5,36,0,0,604,606,5,68,0,0,605,604, + 1,0,0,0,605,606,1,0,0,0,606,608,1,0,0,0,607,609,7,6,0,0,608,607, + 1,0,0,0,608,609,1,0,0,0,609,611,1,0,0,0,610,597,1,0,0,0,610,603, + 1,0,0,0,611,613,1,0,0,0,612,578,1,0,0,0,612,594,1,0,0,0,612,610, + 1,0,0,0,613,83,1,0,0,0,614,615,5,17,0,0,615,618,5,50,0,0,616,618, + 5,119,0,0,617,614,1,0,0,0,617,616,1,0,0,0,618,85,1,0,0,0,619,620, + 5,65,0,0,620,629,3,116,58,0,621,622,5,99,0,0,622,623,5,133,0,0,623, + 624,3,116,58,0,624,625,5,152,0,0,625,629,1,0,0,0,626,627,5,99,0, + 0,627,629,3,116,58,0,628,619,1,0,0,0,628,621,1,0,0,0,628,626,1,0, + 0,0,629,87,1,0,0,0,630,631,5,80,0,0,631,634,3,94,47,0,632,633,5, + 64,0,0,633,635,3,94,47,0,634,632,1,0,0,0,634,635,1,0,0,0,635,89, + 1,0,0,0,636,641,3,92,46,0,637,638,5,119,0,0,638,640,3,92,46,0,639, + 637,1,0,0,0,640,643,1,0,0,0,641,639,1,0,0,0,641,642,1,0,0,0,642, + 91,1,0,0,0,643,641,1,0,0,0,644,646,3,118,59,0,645,647,7,7,0,0,646, + 645,1,0,0,0,646,647,1,0,0,0,647,650,1,0,0,0,648,649,5,63,0,0,649, + 651,7,8,0,0,650,648,1,0,0,0,650,651,1,0,0,0,651,654,1,0,0,0,652, + 653,5,16,0,0,653,655,5,113,0,0,654,652,1,0,0,0,654,655,1,0,0,0,655, + 93,1,0,0,0,656,663,3,162,81,0,657,660,3,146,73,0,658,659,5,154,0, + 0,659,661,3,146,73,0,660,658,1,0,0,0,660,661,1,0,0,0,661,663,1,0, + 0,0,662,656,1,0,0,0,662,657,1,0,0,0,663,95,1,0,0,0,664,669,3,98, + 49,0,665,666,5,119,0,0,666,668,3,98,49,0,667,665,1,0,0,0,668,671, + 1,0,0,0,669,667,1,0,0,0,669,670,1,0,0,0,670,97,1,0,0,0,671,669,1, + 0,0,0,672,673,3,158,79,0,673,674,5,125,0,0,674,675,3,148,74,0,675, + 99,1,0,0,0,676,678,3,102,51,0,677,676,1,0,0,0,677,678,1,0,0,0,678, + 680,1,0,0,0,679,681,3,104,52,0,680,679,1,0,0,0,680,681,1,0,0,0,681, + 683,1,0,0,0,682,684,3,106,53,0,683,682,1,0,0,0,683,684,1,0,0,0,684, + 101,1,0,0,0,685,686,5,70,0,0,686,687,5,11,0,0,687,688,3,116,58,0, + 688,103,1,0,0,0,689,690,5,67,0,0,690,691,5,11,0,0,691,692,3,90,45, + 0,692,105,1,0,0,0,693,694,7,9,0,0,694,695,3,108,54,0,695,107,1,0, + 0,0,696,703,3,110,55,0,697,698,5,9,0,0,698,699,3,110,55,0,699,700, + 5,2,0,0,700,701,3,110,55,0,701,703,1,0,0,0,702,696,1,0,0,0,702,697, + 1,0,0,0,703,109,1,0,0,0,704,705,5,19,0,0,705,717,5,78,0,0,706,707, + 5,97,0,0,707,717,5,71,0,0,708,709,5,97,0,0,709,717,5,33,0,0,710, + 711,3,146,73,0,711,712,5,71,0,0,712,717,1,0,0,0,713,714,3,146,73, + 0,714,715,5,33,0,0,715,717,1,0,0,0,716,704,1,0,0,0,716,706,1,0,0, + 0,716,708,1,0,0,0,716,710,1,0,0,0,716,713,1,0,0,0,717,111,1,0,0, + 0,718,719,3,118,59,0,719,720,5,0,0,1,720,113,1,0,0,0,721,778,3,158, + 79,0,722,723,3,158,79,0,723,724,5,133,0,0,724,725,3,158,79,0,725, + 732,3,114,57,0,726,727,5,119,0,0,727,728,3,158,79,0,728,729,3,114, + 57,0,729,731,1,0,0,0,730,726,1,0,0,0,731,734,1,0,0,0,732,730,1,0, + 0,0,732,733,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,735,737,5,119, + 0,0,736,735,1,0,0,0,736,737,1,0,0,0,737,738,1,0,0,0,738,739,5,152, + 0,0,739,778,1,0,0,0,740,741,3,158,79,0,741,742,5,133,0,0,742,747, + 3,160,80,0,743,744,5,119,0,0,744,746,3,160,80,0,745,743,1,0,0,0, + 746,749,1,0,0,0,747,745,1,0,0,0,747,748,1,0,0,0,748,751,1,0,0,0, + 749,747,1,0,0,0,750,752,5,119,0,0,751,750,1,0,0,0,751,752,1,0,0, + 0,752,753,1,0,0,0,753,754,5,152,0,0,754,778,1,0,0,0,755,756,3,158, + 79,0,756,757,5,133,0,0,757,762,3,114,57,0,758,759,5,119,0,0,759, + 761,3,114,57,0,760,758,1,0,0,0,761,764,1,0,0,0,762,760,1,0,0,0,762, + 763,1,0,0,0,763,766,1,0,0,0,764,762,1,0,0,0,765,767,5,119,0,0,766, + 765,1,0,0,0,766,767,1,0,0,0,767,768,1,0,0,0,768,769,5,152,0,0,769, + 778,1,0,0,0,770,771,3,158,79,0,771,773,5,133,0,0,772,774,3,116,58, + 0,773,772,1,0,0,0,773,774,1,0,0,0,774,775,1,0,0,0,775,776,5,152, + 0,0,776,778,1,0,0,0,777,721,1,0,0,0,777,722,1,0,0,0,777,740,1,0, + 0,0,777,755,1,0,0,0,777,770,1,0,0,0,778,115,1,0,0,0,779,784,3,118, + 59,0,780,781,5,119,0,0,781,783,3,118,59,0,782,780,1,0,0,0,783,786, + 1,0,0,0,784,782,1,0,0,0,784,785,1,0,0,0,785,788,1,0,0,0,786,784, + 1,0,0,0,787,789,5,119,0,0,788,787,1,0,0,0,788,789,1,0,0,0,789,117, + 1,0,0,0,790,791,6,59,-1,0,791,793,5,12,0,0,792,794,3,118,59,0,793, + 792,1,0,0,0,793,794,1,0,0,0,794,800,1,0,0,0,795,796,5,101,0,0,796, + 797,3,118,59,0,797,798,5,86,0,0,798,799,3,118,59,0,799,801,1,0,0, + 0,800,795,1,0,0,0,801,802,1,0,0,0,802,800,1,0,0,0,802,803,1,0,0, + 0,803,806,1,0,0,0,804,805,5,25,0,0,805,807,3,118,59,0,806,804,1, + 0,0,0,806,807,1,0,0,0,807,808,1,0,0,0,808,809,5,26,0,0,809,941,1, + 0,0,0,810,811,5,13,0,0,811,812,5,133,0,0,812,813,3,118,59,0,813, + 814,5,6,0,0,814,815,3,114,57,0,815,816,5,152,0,0,816,941,1,0,0,0, + 817,818,5,20,0,0,818,941,5,113,0,0,819,820,5,48,0,0,820,821,3,118, + 59,0,821,822,3,150,75,0,822,941,1,0,0,0,823,824,5,85,0,0,824,825, + 5,133,0,0,825,826,3,118,59,0,826,827,5,35,0,0,827,830,3,118,59,0, + 828,829,5,34,0,0,829,831,3,118,59,0,830,828,1,0,0,0,830,831,1,0, + 0,0,831,832,1,0,0,0,832,833,5,152,0,0,833,941,1,0,0,0,834,835,5, + 89,0,0,835,941,5,113,0,0,836,837,5,94,0,0,837,838,5,133,0,0,838, + 839,7,10,0,0,839,840,3,164,82,0,840,841,5,35,0,0,841,842,3,118,59, + 0,842,843,5,152,0,0,843,941,1,0,0,0,844,845,3,158,79,0,845,847,5, + 133,0,0,846,848,3,116,58,0,847,846,1,0,0,0,847,848,1,0,0,0,848,849, + 1,0,0,0,849,850,5,152,0,0,850,859,1,0,0,0,851,853,5,133,0,0,852, + 854,5,24,0,0,853,852,1,0,0,0,853,854,1,0,0,0,854,856,1,0,0,0,855, + 857,3,116,58,0,856,855,1,0,0,0,856,857,1,0,0,0,857,858,1,0,0,0,858, + 860,5,152,0,0,859,851,1,0,0,0,859,860,1,0,0,0,860,861,1,0,0,0,861, + 862,5,69,0,0,862,863,5,133,0,0,863,864,3,100,50,0,864,865,5,152, + 0,0,865,941,1,0,0,0,866,867,3,158,79,0,867,869,5,133,0,0,868,870, + 3,116,58,0,869,868,1,0,0,0,869,870,1,0,0,0,870,871,1,0,0,0,871,872, + 5,152,0,0,872,881,1,0,0,0,873,875,5,133,0,0,874,876,5,24,0,0,875, + 874,1,0,0,0,875,876,1,0,0,0,876,878,1,0,0,0,877,879,3,116,58,0,878, + 877,1,0,0,0,878,879,1,0,0,0,879,880,1,0,0,0,880,882,5,152,0,0,881, + 873,1,0,0,0,881,882,1,0,0,0,882,883,1,0,0,0,883,884,5,69,0,0,884, + 885,3,158,79,0,885,941,1,0,0,0,886,892,3,158,79,0,887,889,5,133, + 0,0,888,890,3,116,58,0,889,888,1,0,0,0,889,890,1,0,0,0,890,891,1, + 0,0,0,891,893,5,152,0,0,892,887,1,0,0,0,892,893,1,0,0,0,893,894, + 1,0,0,0,894,896,5,133,0,0,895,897,5,24,0,0,896,895,1,0,0,0,896,897, + 1,0,0,0,897,899,1,0,0,0,898,900,3,116,58,0,899,898,1,0,0,0,899,900, + 1,0,0,0,900,901,1,0,0,0,901,902,5,152,0,0,902,941,1,0,0,0,903,941, + 3,122,61,0,904,941,3,166,83,0,905,941,3,148,74,0,906,907,5,121,0, + 0,907,941,3,118,59,20,908,909,5,61,0,0,909,941,3,118,59,14,910,911, + 3,138,69,0,911,912,5,123,0,0,912,914,1,0,0,0,913,910,1,0,0,0,913, + 914,1,0,0,0,914,915,1,0,0,0,915,941,5,115,0,0,916,917,5,133,0,0, + 917,918,3,48,24,0,918,919,5,152,0,0,919,941,1,0,0,0,920,921,5,133, + 0,0,921,922,3,118,59,0,922,923,5,152,0,0,923,941,1,0,0,0,924,925, + 5,133,0,0,925,926,3,116,58,0,926,927,5,152,0,0,927,941,1,0,0,0,928, + 930,5,132,0,0,929,931,3,116,58,0,930,929,1,0,0,0,930,931,1,0,0,0, + 931,932,1,0,0,0,932,941,5,151,0,0,933,935,5,131,0,0,934,936,3,40, + 20,0,935,934,1,0,0,0,935,936,1,0,0,0,936,937,1,0,0,0,937,941,5,150, + 0,0,938,941,3,120,60,0,939,941,3,130,65,0,940,790,1,0,0,0,940,810, + 1,0,0,0,940,817,1,0,0,0,940,819,1,0,0,0,940,823,1,0,0,0,940,834, + 1,0,0,0,940,836,1,0,0,0,940,844,1,0,0,0,940,866,1,0,0,0,940,886, + 1,0,0,0,940,903,1,0,0,0,940,904,1,0,0,0,940,905,1,0,0,0,940,906, + 1,0,0,0,940,908,1,0,0,0,940,913,1,0,0,0,940,916,1,0,0,0,940,920, + 1,0,0,0,940,924,1,0,0,0,940,928,1,0,0,0,940,933,1,0,0,0,940,938, + 1,0,0,0,940,939,1,0,0,0,941,1052,1,0,0,0,942,946,10,19,0,0,943,947, + 5,115,0,0,944,947,5,154,0,0,945,947,5,141,0,0,946,943,1,0,0,0,946, + 944,1,0,0,0,946,945,1,0,0,0,947,948,1,0,0,0,948,1051,3,118,59,20, + 949,953,10,18,0,0,950,954,5,142,0,0,951,954,5,121,0,0,952,954,5, + 120,0,0,953,950,1,0,0,0,953,951,1,0,0,0,953,952,1,0,0,0,954,955, + 1,0,0,0,955,1051,3,118,59,19,956,981,10,17,0,0,957,982,5,124,0,0, + 958,982,5,125,0,0,959,982,5,136,0,0,960,982,5,134,0,0,961,982,5, + 135,0,0,962,982,5,126,0,0,963,982,5,127,0,0,964,966,5,61,0,0,965, + 964,1,0,0,0,965,966,1,0,0,0,966,967,1,0,0,0,967,969,5,44,0,0,968, + 970,5,15,0,0,969,968,1,0,0,0,969,970,1,0,0,0,970,982,1,0,0,0,971, + 973,5,61,0,0,972,971,1,0,0,0,972,973,1,0,0,0,973,974,1,0,0,0,974, + 982,7,11,0,0,975,982,5,148,0,0,976,982,5,149,0,0,977,982,5,138,0, + 0,978,982,5,129,0,0,979,982,5,130,0,0,980,982,5,137,0,0,981,957, + 1,0,0,0,981,958,1,0,0,0,981,959,1,0,0,0,981,960,1,0,0,0,981,961, + 1,0,0,0,981,962,1,0,0,0,981,963,1,0,0,0,981,965,1,0,0,0,981,972, + 1,0,0,0,981,975,1,0,0,0,981,976,1,0,0,0,981,977,1,0,0,0,981,978, + 1,0,0,0,981,979,1,0,0,0,981,980,1,0,0,0,982,983,1,0,0,0,983,1051, + 3,118,59,18,984,985,10,15,0,0,985,986,5,140,0,0,986,1051,3,118,59, + 16,987,988,10,13,0,0,988,989,5,2,0,0,989,1051,3,118,59,14,990,991, + 10,12,0,0,991,992,5,66,0,0,992,1051,3,118,59,13,993,995,10,11,0, + 0,994,996,5,61,0,0,995,994,1,0,0,0,995,996,1,0,0,0,996,997,1,0,0, + 0,997,998,5,9,0,0,998,999,3,118,59,0,999,1000,5,2,0,0,1000,1001, + 3,118,59,12,1001,1051,1,0,0,0,1002,1003,10,10,0,0,1003,1004,5,143, + 0,0,1004,1005,3,118,59,0,1005,1006,5,118,0,0,1006,1007,3,118,59, + 10,1007,1051,1,0,0,0,1008,1009,10,30,0,0,1009,1011,5,133,0,0,1010, + 1012,3,116,58,0,1011,1010,1,0,0,0,1011,1012,1,0,0,0,1012,1013,1, + 0,0,0,1013,1051,5,152,0,0,1014,1015,10,26,0,0,1015,1016,5,132,0, + 0,1016,1017,3,118,59,0,1017,1018,5,151,0,0,1018,1051,1,0,0,0,1019, + 1020,10,25,0,0,1020,1021,5,123,0,0,1021,1051,5,111,0,0,1022,1023, + 10,24,0,0,1023,1024,5,123,0,0,1024,1051,3,158,79,0,1025,1026,10, + 23,0,0,1026,1027,5,139,0,0,1027,1028,5,132,0,0,1028,1029,3,118,59, + 0,1029,1030,5,151,0,0,1030,1051,1,0,0,0,1031,1032,10,22,0,0,1032, + 1033,5,139,0,0,1033,1051,5,111,0,0,1034,1035,10,21,0,0,1035,1036, + 5,139,0,0,1036,1051,3,158,79,0,1037,1038,10,16,0,0,1038,1040,5,49, + 0,0,1039,1041,5,61,0,0,1040,1039,1,0,0,0,1040,1041,1,0,0,0,1041, + 1042,1,0,0,0,1042,1051,5,62,0,0,1043,1048,10,9,0,0,1044,1045,5,6, + 0,0,1045,1049,3,158,79,0,1046,1047,5,6,0,0,1047,1049,5,113,0,0,1048, + 1044,1,0,0,0,1048,1046,1,0,0,0,1049,1051,1,0,0,0,1050,942,1,0,0, + 0,1050,949,1,0,0,0,1050,956,1,0,0,0,1050,984,1,0,0,0,1050,987,1, + 0,0,0,1050,990,1,0,0,0,1050,993,1,0,0,0,1050,1002,1,0,0,0,1050,1008, + 1,0,0,0,1050,1014,1,0,0,0,1050,1019,1,0,0,0,1050,1022,1,0,0,0,1050, + 1025,1,0,0,0,1050,1031,1,0,0,0,1050,1034,1,0,0,0,1050,1037,1,0,0, + 0,1050,1043,1,0,0,0,1051,1054,1,0,0,0,1052,1050,1,0,0,0,1052,1053, + 1,0,0,0,1053,119,1,0,0,0,1054,1052,1,0,0,0,1055,1056,5,133,0,0,1056, + 1061,3,158,79,0,1057,1058,5,119,0,0,1058,1060,3,158,79,0,1059,1057, + 1,0,0,0,1060,1063,1,0,0,0,1061,1059,1,0,0,0,1061,1062,1,0,0,0,1062, + 1065,1,0,0,0,1063,1061,1,0,0,0,1064,1066,5,119,0,0,1065,1064,1,0, + 0,0,1065,1066,1,0,0,0,1066,1067,1,0,0,0,1067,1068,5,152,0,0,1068, + 1083,1,0,0,0,1069,1074,3,158,79,0,1070,1071,5,119,0,0,1071,1073, + 3,158,79,0,1072,1070,1,0,0,0,1073,1076,1,0,0,0,1074,1072,1,0,0,0, + 1074,1075,1,0,0,0,1075,1078,1,0,0,0,1076,1074,1,0,0,0,1077,1079, + 5,119,0,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079,1083,1,0,0,0, + 1080,1081,5,133,0,0,1081,1083,5,152,0,0,1082,1055,1,0,0,0,1082,1069, + 1,0,0,0,1082,1080,1,0,0,0,1083,1084,1,0,0,0,1084,1087,5,114,0,0, + 1085,1088,3,118,59,0,1086,1088,3,36,18,0,1087,1085,1,0,0,0,1087, + 1086,1,0,0,0,1088,121,1,0,0,0,1089,1090,5,135,0,0,1090,1094,3,158, + 79,0,1091,1093,3,124,62,0,1092,1091,1,0,0,0,1093,1096,1,0,0,0,1094, + 1092,1,0,0,0,1094,1095,1,0,0,0,1095,1097,1,0,0,0,1096,1094,1,0,0, + 0,1097,1098,5,154,0,0,1098,1099,5,127,0,0,1099,1122,1,0,0,0,1100, + 1101,5,135,0,0,1101,1105,3,158,79,0,1102,1104,3,124,62,0,1103,1102, + 1,0,0,0,1104,1107,1,0,0,0,1105,1103,1,0,0,0,1105,1106,1,0,0,0,1106, + 1108,1,0,0,0,1107,1105,1,0,0,0,1108,1114,5,127,0,0,1109,1115,3,122, + 61,0,1110,1111,5,131,0,0,1111,1112,3,118,59,0,1112,1113,5,150,0, + 0,1113,1115,1,0,0,0,1114,1109,1,0,0,0,1114,1110,1,0,0,0,1114,1115, + 1,0,0,0,1115,1116,1,0,0,0,1116,1117,5,135,0,0,1117,1118,5,154,0, + 0,1118,1119,3,158,79,0,1119,1120,5,127,0,0,1120,1122,1,0,0,0,1121, + 1089,1,0,0,0,1121,1100,1,0,0,0,1122,123,1,0,0,0,1123,1124,3,158, + 79,0,1124,1125,5,125,0,0,1125,1126,3,164,82,0,1126,1135,1,0,0,0, + 1127,1128,3,158,79,0,1128,1129,5,125,0,0,1129,1130,5,131,0,0,1130, + 1131,3,118,59,0,1131,1132,5,150,0,0,1132,1135,1,0,0,0,1133,1135, + 3,158,79,0,1134,1123,1,0,0,0,1134,1127,1,0,0,0,1134,1133,1,0,0,0, + 1135,125,1,0,0,0,1136,1141,3,128,64,0,1137,1138,5,119,0,0,1138,1140, + 3,128,64,0,1139,1137,1,0,0,0,1140,1143,1,0,0,0,1141,1139,1,0,0,0, + 1141,1142,1,0,0,0,1142,1145,1,0,0,0,1143,1141,1,0,0,0,1144,1146, + 5,119,0,0,1145,1144,1,0,0,0,1145,1146,1,0,0,0,1146,127,1,0,0,0,1147, + 1148,3,158,79,0,1148,1149,5,6,0,0,1149,1150,5,133,0,0,1150,1151, + 3,48,24,0,1151,1152,5,152,0,0,1152,1158,1,0,0,0,1153,1154,3,118, + 59,0,1154,1155,5,6,0,0,1155,1156,3,158,79,0,1156,1158,1,0,0,0,1157, + 1147,1,0,0,0,1157,1153,1,0,0,0,1158,129,1,0,0,0,1159,1167,3,162, + 81,0,1160,1161,3,138,69,0,1161,1162,5,123,0,0,1162,1164,1,0,0,0, + 1163,1160,1,0,0,0,1163,1164,1,0,0,0,1164,1165,1,0,0,0,1165,1167, + 3,132,66,0,1166,1159,1,0,0,0,1166,1163,1,0,0,0,1167,131,1,0,0,0, + 1168,1173,3,158,79,0,1169,1170,5,123,0,0,1170,1172,3,158,79,0,1171, + 1169,1,0,0,0,1172,1175,1,0,0,0,1173,1171,1,0,0,0,1173,1174,1,0,0, + 0,1174,133,1,0,0,0,1175,1173,1,0,0,0,1176,1177,6,67,-1,0,1177,1186, + 3,138,69,0,1178,1186,3,136,68,0,1179,1180,5,133,0,0,1180,1181,3, + 48,24,0,1181,1182,5,152,0,0,1182,1186,1,0,0,0,1183,1186,3,122,61, + 0,1184,1186,3,162,81,0,1185,1176,1,0,0,0,1185,1178,1,0,0,0,1185, + 1179,1,0,0,0,1185,1183,1,0,0,0,1185,1184,1,0,0,0,1186,1195,1,0,0, + 0,1187,1191,10,3,0,0,1188,1192,3,156,78,0,1189,1190,5,6,0,0,1190, + 1192,3,158,79,0,1191,1188,1,0,0,0,1191,1189,1,0,0,0,1192,1194,1, + 0,0,0,1193,1187,1,0,0,0,1194,1197,1,0,0,0,1195,1193,1,0,0,0,1195, + 1196,1,0,0,0,1196,135,1,0,0,0,1197,1195,1,0,0,0,1198,1199,3,158, + 79,0,1199,1201,5,133,0,0,1200,1202,3,140,70,0,1201,1200,1,0,0,0, + 1201,1202,1,0,0,0,1202,1203,1,0,0,0,1203,1204,5,152,0,0,1204,137, + 1,0,0,0,1205,1206,3,142,71,0,1206,1207,5,123,0,0,1207,1209,1,0,0, + 0,1208,1205,1,0,0,0,1208,1209,1,0,0,0,1209,1210,1,0,0,0,1210,1211, + 3,158,79,0,1211,139,1,0,0,0,1212,1217,3,118,59,0,1213,1214,5,119, + 0,0,1214,1216,3,118,59,0,1215,1213,1,0,0,0,1216,1219,1,0,0,0,1217, + 1215,1,0,0,0,1217,1218,1,0,0,0,1218,1221,1,0,0,0,1219,1217,1,0,0, + 0,1220,1222,5,119,0,0,1221,1220,1,0,0,0,1221,1222,1,0,0,0,1222,141, + 1,0,0,0,1223,1224,3,158,79,0,1224,143,1,0,0,0,1225,1234,5,109,0, + 0,1226,1227,5,123,0,0,1227,1234,7,12,0,0,1228,1229,5,111,0,0,1229, + 1231,5,123,0,0,1230,1232,7,12,0,0,1231,1230,1,0,0,0,1231,1232,1, + 0,0,0,1232,1234,1,0,0,0,1233,1225,1,0,0,0,1233,1226,1,0,0,0,1233, + 1228,1,0,0,0,1234,145,1,0,0,0,1235,1237,7,13,0,0,1236,1235,1,0,0, + 0,1236,1237,1,0,0,0,1237,1244,1,0,0,0,1238,1245,3,144,72,0,1239, + 1245,5,110,0,0,1240,1245,5,111,0,0,1241,1245,5,112,0,0,1242,1245, + 5,45,0,0,1243,1245,5,60,0,0,1244,1238,1,0,0,0,1244,1239,1,0,0,0, + 1244,1240,1,0,0,0,1244,1241,1,0,0,0,1244,1242,1,0,0,0,1244,1243, + 1,0,0,0,1245,147,1,0,0,0,1246,1250,3,146,73,0,1247,1250,5,113,0, + 0,1248,1250,5,62,0,0,1249,1246,1,0,0,0,1249,1247,1,0,0,0,1249,1248, + 1,0,0,0,1250,149,1,0,0,0,1251,1252,7,14,0,0,1252,151,1,0,0,0,1253, + 1254,7,15,0,0,1254,153,1,0,0,0,1255,1256,7,16,0,0,1256,155,1,0,0, + 0,1257,1260,5,108,0,0,1258,1260,3,154,77,0,1259,1257,1,0,0,0,1259, + 1258,1,0,0,0,1260,157,1,0,0,0,1261,1265,5,108,0,0,1262,1265,3,150, + 75,0,1263,1265,3,152,76,0,1264,1261,1,0,0,0,1264,1262,1,0,0,0,1264, + 1263,1,0,0,0,1265,159,1,0,0,0,1266,1267,3,164,82,0,1267,1268,5,125, + 0,0,1268,1269,3,146,73,0,1269,161,1,0,0,0,1270,1271,5,131,0,0,1271, + 1272,3,118,59,0,1272,1273,5,150,0,0,1273,163,1,0,0,0,1274,1277,5, + 113,0,0,1275,1277,3,166,83,0,1276,1274,1,0,0,0,1276,1275,1,0,0,0, + 1277,165,1,0,0,0,1278,1282,5,145,0,0,1279,1281,3,168,84,0,1280,1279, + 1,0,0,0,1281,1284,1,0,0,0,1282,1280,1,0,0,0,1282,1283,1,0,0,0,1283, + 1285,1,0,0,0,1284,1282,1,0,0,0,1285,1286,5,147,0,0,1286,167,1,0, + 0,0,1287,1288,5,160,0,0,1288,1289,3,118,59,0,1289,1290,5,150,0,0, + 1290,1293,1,0,0,0,1291,1293,5,159,0,0,1292,1287,1,0,0,0,1292,1291, + 1,0,0,0,1293,169,1,0,0,0,1294,1298,5,146,0,0,1295,1297,3,172,86, + 0,1296,1295,1,0,0,0,1297,1300,1,0,0,0,1298,1296,1,0,0,0,1298,1299, + 1,0,0,0,1299,1301,1,0,0,0,1300,1298,1,0,0,0,1301,1302,5,0,0,1,1302, + 171,1,0,0,0,1303,1304,5,162,0,0,1304,1305,3,118,59,0,1305,1306,5, + 150,0,0,1306,1309,1,0,0,0,1307,1309,5,161,0,0,1308,1303,1,0,0,0, + 1308,1307,1,0,0,0,1309,173,1,0,0,0,168,177,184,193,200,204,218,222, + 225,229,232,239,243,252,257,266,274,281,285,291,296,304,311,317, + 329,337,351,355,360,370,376,384,388,392,395,399,402,405,408,411, + 415,419,422,425,428,432,435,444,450,471,488,505,511,517,528,530, + 541,544,550,558,564,566,570,575,578,581,585,589,592,594,597,601, + 605,608,610,612,617,628,634,641,646,650,654,660,662,669,677,680, + 683,702,716,732,736,747,751,762,766,773,777,784,788,793,802,806, + 830,847,853,856,859,869,875,878,881,889,892,896,899,913,930,935, + 940,946,953,965,969,972,981,995,1011,1040,1048,1050,1052,1061,1065, + 1074,1078,1082,1087,1094,1105,1114,1121,1134,1141,1145,1157,1163, + 1166,1173,1185,1191,1195,1201,1208,1217,1221,1231,1233,1236,1244, + 1249,1259,1264,1276,1282,1292,1298,1308 ] class HogQLParser ( Parser ): @@ -576,44 +579,46 @@ class HogQLParser ( Parser ): "", "", "", "", "", "", "", "", "", "", "", "", - "'->'", "'*'", "'`'", "'\\'", "':'", "','", "'||'", - "'-'", "'$'", "'.'", "'=='", "'='", "'>='", "'>'", - "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", - "'<'", "", "'!~*'", "'!~'", "'?.'", "'??'", - "'%'", "'+'", "'?'", "'\"'", "'f''", "'F''", "'''", - "'~'", "'=~'", "'}'", "']'", "')'", "';'", "'/'", "'_'" ] + "", "", "'->'", "'*'", "'`'", "'\\'", + "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", + "'='", "'>='", "'>'", "'#'", "'~*'", "'=~*'", "'{'", + "'['", "'('", "'<='", "'<'", "", "'!~*'", + "'!~'", "'?.'", "'??'", "'%'", "'+'", "'?'", "'\"'", + "'f''", "'F''", "'''", "'~'", "'=~'", "'}'", "']'", + "')'", "';'", "'/'", "'_'" ] symbolicNames = [ "", "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", - "DISTINCT", "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", - "FIRST", "FN", "FOLLOWING", "FOR", "FROM", "FULL", - "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", "ILIKE", - "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", - "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", - "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", - "OFFSET", "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", - "PRECEDING", "PREWHERE", "QUARTER", "RANGE", "RETURN", - "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", - "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", - "THROW", "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", - "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", - "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", - "FLOATING_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", - "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", - "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", - "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", - "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", - "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", - "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", "NULLISH", - "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", - "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", - "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", - "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", - "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", - "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] + "DISTINCT", "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", + "FINALLY", "FIRST", "FN", "FOLLOWING", "FOR", "FROM", + "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", + "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", + "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", "NOT", + "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", + "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", + "ROWS", "SAMPLE", "SECOND", "SELECT", "SEMI", "SETTINGS", + "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", + "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", + "WHERE", "WHILE", "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", + "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", + "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", + "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", + "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", + "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", + "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", + "NULLISH", "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", + "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", + "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", + "RBRACKET", "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", + "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", "WHITESPACE", + "STRING_TEXT", "STRING_ESCAPE_TRIGGER", "FULL_STRING_TEXT", + "FULL_STRING_ESCAPE_TRIGGER" ] RULE_program = 0 RULE_declaration = 1 @@ -637,94 +642,95 @@ class HogQLParser ( Parser ): RULE_kvPair = 19 RULE_kvPairList = 20 RULE_select = 21 - RULE_selectUnionStmt = 22 - RULE_selectStmtWithParens = 23 - RULE_selectStmt = 24 - RULE_withClause = 25 - RULE_topClause = 26 - RULE_fromClause = 27 - RULE_arrayJoinClause = 28 - RULE_windowClause = 29 - RULE_prewhereClause = 30 - RULE_whereClause = 31 - RULE_groupByClause = 32 - RULE_havingClause = 33 - RULE_orderByClause = 34 - RULE_projectionOrderByClause = 35 - RULE_limitAndOffsetClause = 36 - RULE_offsetOnlyClause = 37 - RULE_settingsClause = 38 - RULE_joinExpr = 39 - RULE_joinOp = 40 - RULE_joinOpCross = 41 - RULE_joinConstraintClause = 42 - RULE_sampleClause = 43 - RULE_orderExprList = 44 - RULE_orderExpr = 45 - RULE_ratioExpr = 46 - RULE_settingExprList = 47 - RULE_settingExpr = 48 - RULE_windowExpr = 49 - RULE_winPartitionByClause = 50 - RULE_winOrderByClause = 51 - RULE_winFrameClause = 52 - RULE_winFrameExtend = 53 - RULE_winFrameBound = 54 - RULE_expr = 55 - RULE_columnTypeExpr = 56 - RULE_columnExprList = 57 - RULE_columnExpr = 58 - RULE_columnLambdaExpr = 59 - RULE_hogqlxTagElement = 60 - RULE_hogqlxTagAttribute = 61 - RULE_withExprList = 62 - RULE_withExpr = 63 - RULE_columnIdentifier = 64 - RULE_nestedIdentifier = 65 - RULE_tableExpr = 66 - RULE_tableFunctionExpr = 67 - RULE_tableIdentifier = 68 - RULE_tableArgList = 69 - RULE_databaseIdentifier = 70 - RULE_floatingLiteral = 71 - RULE_numberLiteral = 72 - RULE_literal = 73 - RULE_interval = 74 - RULE_keyword = 75 - RULE_keywordForAlias = 76 - RULE_alias = 77 - RULE_identifier = 78 - RULE_enumValue = 79 - RULE_placeholder = 80 - RULE_string = 81 - RULE_templateString = 82 - RULE_stringContents = 83 - RULE_fullTemplateString = 84 - RULE_stringContentsFull = 85 + RULE_selectStmtWithParens = 22 + RULE_subsequentSelectSetClause = 23 + RULE_selectSetStmt = 24 + RULE_selectStmt = 25 + RULE_withClause = 26 + RULE_topClause = 27 + RULE_fromClause = 28 + RULE_arrayJoinClause = 29 + RULE_windowClause = 30 + RULE_prewhereClause = 31 + RULE_whereClause = 32 + RULE_groupByClause = 33 + RULE_havingClause = 34 + RULE_orderByClause = 35 + RULE_projectionOrderByClause = 36 + RULE_limitAndOffsetClause = 37 + RULE_offsetOnlyClause = 38 + RULE_settingsClause = 39 + RULE_joinExpr = 40 + RULE_joinOp = 41 + RULE_joinOpCross = 42 + RULE_joinConstraintClause = 43 + RULE_sampleClause = 44 + RULE_orderExprList = 45 + RULE_orderExpr = 46 + RULE_ratioExpr = 47 + RULE_settingExprList = 48 + RULE_settingExpr = 49 + RULE_windowExpr = 50 + RULE_winPartitionByClause = 51 + RULE_winOrderByClause = 52 + RULE_winFrameClause = 53 + RULE_winFrameExtend = 54 + RULE_winFrameBound = 55 + RULE_expr = 56 + RULE_columnTypeExpr = 57 + RULE_columnExprList = 58 + RULE_columnExpr = 59 + RULE_columnLambdaExpr = 60 + RULE_hogqlxTagElement = 61 + RULE_hogqlxTagAttribute = 62 + RULE_withExprList = 63 + RULE_withExpr = 64 + RULE_columnIdentifier = 65 + RULE_nestedIdentifier = 66 + RULE_tableExpr = 67 + RULE_tableFunctionExpr = 68 + RULE_tableIdentifier = 69 + RULE_tableArgList = 70 + RULE_databaseIdentifier = 71 + RULE_floatingLiteral = 72 + RULE_numberLiteral = 73 + RULE_literal = 74 + RULE_interval = 75 + RULE_keyword = 76 + RULE_keywordForAlias = 77 + RULE_alias = 78 + RULE_identifier = 79 + RULE_enumValue = 80 + RULE_placeholder = 81 + RULE_string = 82 + RULE_templateString = 83 + RULE_stringContents = 84 + RULE_fullTemplateString = 85 + RULE_stringContentsFull = 86 ruleNames = [ "program", "declaration", "expression", "varDecl", "identifierList", "statement", "returnStmt", "throwStmt", "catchBlock", "tryCatchStmt", "ifStmt", "whileStmt", "forStmt", "forInStmt", "funcStmt", "varAssignment", "exprStmt", "emptyStmt", - "block", "kvPair", "kvPairList", "select", "selectUnionStmt", - "selectStmtWithParens", "selectStmt", "withClause", "topClause", - "fromClause", "arrayJoinClause", "windowClause", "prewhereClause", - "whereClause", "groupByClause", "havingClause", "orderByClause", - "projectionOrderByClause", "limitAndOffsetClause", "offsetOnlyClause", - "settingsClause", "joinExpr", "joinOp", "joinOpCross", - "joinConstraintClause", "sampleClause", "orderExprList", - "orderExpr", "ratioExpr", "settingExprList", "settingExpr", - "windowExpr", "winPartitionByClause", "winOrderByClause", - "winFrameClause", "winFrameExtend", "winFrameBound", - "expr", "columnTypeExpr", "columnExprList", "columnExpr", - "columnLambdaExpr", "hogqlxTagElement", "hogqlxTagAttribute", - "withExprList", "withExpr", "columnIdentifier", "nestedIdentifier", - "tableExpr", "tableFunctionExpr", "tableIdentifier", - "tableArgList", "databaseIdentifier", "floatingLiteral", - "numberLiteral", "literal", "interval", "keyword", "keywordForAlias", - "alias", "identifier", "enumValue", "placeholder", "string", - "templateString", "stringContents", "fullTemplateString", - "stringContentsFull" ] + "block", "kvPair", "kvPairList", "select", "selectStmtWithParens", + "subsequentSelectSetClause", "selectSetStmt", "selectStmt", + "withClause", "topClause", "fromClause", "arrayJoinClause", + "windowClause", "prewhereClause", "whereClause", "groupByClause", + "havingClause", "orderByClause", "projectionOrderByClause", + "limitAndOffsetClause", "offsetOnlyClause", "settingsClause", + "joinExpr", "joinOp", "joinOpCross", "joinConstraintClause", + "sampleClause", "orderExprList", "orderExpr", "ratioExpr", + "settingExprList", "settingExpr", "windowExpr", "winPartitionByClause", + "winOrderByClause", "winFrameClause", "winFrameExtend", + "winFrameBound", "expr", "columnTypeExpr", "columnExprList", + "columnExpr", "columnLambdaExpr", "hogqlxTagElement", + "hogqlxTagAttribute", "withExprList", "withExpr", "columnIdentifier", + "nestedIdentifier", "tableExpr", "tableFunctionExpr", + "tableIdentifier", "tableArgList", "databaseIdentifier", + "floatingLiteral", "numberLiteral", "literal", "interval", + "keyword", "keywordForAlias", "alias", "identifier", + "enumValue", "placeholder", "string", "templateString", + "stringContents", "fullTemplateString", "stringContentsFull" ] EOF = Token.EOF ALL=1 @@ -753,140 +759,142 @@ class HogQLParser ( Parser ): DISTINCT=24 ELSE=25 END=26 - EXTRACT=27 - FINAL=28 - FINALLY=29 - FIRST=30 - FN=31 - FOLLOWING=32 - FOR=33 - FROM=34 - FULL=35 - FUN=36 - GROUP=37 - HAVING=38 - HOUR=39 - ID=40 - IF=41 - ILIKE=42 - IN=43 - INF=44 - INNER=45 - INTERVAL=46 - IS=47 - JOIN=48 - KEY=49 - LAST=50 - LEADING=51 - LEFT=52 - LET=53 - LIKE=54 - LIMIT=55 - MINUTE=56 - MONTH=57 - NAN_SQL=58 - NOT=59 - NULL_SQL=60 - NULLS=61 - OFFSET=62 - ON=63 - OR=64 - ORDER=65 - OUTER=66 - OVER=67 - PARTITION=68 - PRECEDING=69 - PREWHERE=70 - QUARTER=71 - RANGE=72 - RETURN=73 - RIGHT=74 - ROLLUP=75 - ROW=76 - ROWS=77 - SAMPLE=78 - SECOND=79 - SELECT=80 - SEMI=81 - SETTINGS=82 - SUBSTRING=83 - THEN=84 - THROW=85 - TIES=86 - TIMESTAMP=87 - TO=88 - TOP=89 - TOTALS=90 - TRAILING=91 - TRIM=92 - TRUNCATE=93 - TRY=94 - UNBOUNDED=95 - UNION=96 - USING=97 - WEEK=98 - WHEN=99 - WHERE=100 - WHILE=101 - WINDOW=102 - WITH=103 - YEAR=104 - ESCAPE_CHAR_COMMON=105 - IDENTIFIER=106 - FLOATING_LITERAL=107 - OCTAL_LITERAL=108 - DECIMAL_LITERAL=109 - HEXADECIMAL_LITERAL=110 - STRING_LITERAL=111 - ARROW=112 - ASTERISK=113 - BACKQUOTE=114 - BACKSLASH=115 - COLON=116 - COMMA=117 - CONCAT=118 - DASH=119 - DOLLAR=120 - DOT=121 - EQ_DOUBLE=122 - EQ_SINGLE=123 - GT_EQ=124 - GT=125 - HASH=126 - IREGEX_SINGLE=127 - IREGEX_DOUBLE=128 - LBRACE=129 - LBRACKET=130 - LPAREN=131 - LT_EQ=132 - LT=133 - NOT_EQ=134 - NOT_IREGEX=135 - NOT_REGEX=136 - NULL_PROPERTY=137 - NULLISH=138 - PERCENT=139 - PLUS=140 - QUERY=141 - QUOTE_DOUBLE=142 - QUOTE_SINGLE_TEMPLATE=143 - QUOTE_SINGLE_TEMPLATE_FULL=144 - QUOTE_SINGLE=145 - REGEX_SINGLE=146 - REGEX_DOUBLE=147 - RBRACE=148 - RBRACKET=149 - RPAREN=150 - SEMICOLON=151 - SLASH=152 - UNDERSCORE=153 - MULTI_LINE_COMMENT=154 - SINGLE_LINE_COMMENT=155 - WHITESPACE=156 - STRING_TEXT=157 - STRING_ESCAPE_TRIGGER=158 - FULL_STRING_TEXT=159 - FULL_STRING_ESCAPE_TRIGGER=160 + EXCEPT=27 + EXTRACT=28 + FINAL=29 + FINALLY=30 + FIRST=31 + FN=32 + FOLLOWING=33 + FOR=34 + FROM=35 + FULL=36 + FUN=37 + GROUP=38 + HAVING=39 + HOUR=40 + ID=41 + IF=42 + ILIKE=43 + IN=44 + INF=45 + INNER=46 + INTERSECT=47 + INTERVAL=48 + IS=49 + JOIN=50 + KEY=51 + LAST=52 + LEADING=53 + LEFT=54 + LET=55 + LIKE=56 + LIMIT=57 + MINUTE=58 + MONTH=59 + NAN_SQL=60 + NOT=61 + NULL_SQL=62 + NULLS=63 + OFFSET=64 + ON=65 + OR=66 + ORDER=67 + OUTER=68 + OVER=69 + PARTITION=70 + PRECEDING=71 + PREWHERE=72 + QUARTER=73 + RANGE=74 + RETURN=75 + RIGHT=76 + ROLLUP=77 + ROW=78 + ROWS=79 + SAMPLE=80 + SECOND=81 + SELECT=82 + SEMI=83 + SETTINGS=84 + SUBSTRING=85 + THEN=86 + THROW=87 + TIES=88 + TIMESTAMP=89 + TO=90 + TOP=91 + TOTALS=92 + TRAILING=93 + TRIM=94 + TRUNCATE=95 + TRY=96 + UNBOUNDED=97 + UNION=98 + USING=99 + WEEK=100 + WHEN=101 + WHERE=102 + WHILE=103 + WINDOW=104 + WITH=105 + YEAR=106 + ESCAPE_CHAR_COMMON=107 + IDENTIFIER=108 + FLOATING_LITERAL=109 + OCTAL_LITERAL=110 + DECIMAL_LITERAL=111 + HEXADECIMAL_LITERAL=112 + STRING_LITERAL=113 + ARROW=114 + ASTERISK=115 + BACKQUOTE=116 + BACKSLASH=117 + COLON=118 + COMMA=119 + CONCAT=120 + DASH=121 + DOLLAR=122 + DOT=123 + EQ_DOUBLE=124 + EQ_SINGLE=125 + GT_EQ=126 + GT=127 + HASH=128 + IREGEX_SINGLE=129 + IREGEX_DOUBLE=130 + LBRACE=131 + LBRACKET=132 + LPAREN=133 + LT_EQ=134 + LT=135 + NOT_EQ=136 + NOT_IREGEX=137 + NOT_REGEX=138 + NULL_PROPERTY=139 + NULLISH=140 + PERCENT=141 + PLUS=142 + QUERY=143 + QUOTE_DOUBLE=144 + QUOTE_SINGLE_TEMPLATE=145 + QUOTE_SINGLE_TEMPLATE_FULL=146 + QUOTE_SINGLE=147 + REGEX_SINGLE=148 + REGEX_DOUBLE=149 + RBRACE=150 + RBRACKET=151 + RPAREN=152 + SEMICOLON=153 + SLASH=154 + UNDERSCORE=155 + MULTI_LINE_COMMENT=156 + SINGLE_LINE_COMMENT=157 + WHITESPACE=158 + STRING_TEXT=159 + STRING_ESCAPE_TRIGGER=160 + FULL_STRING_TEXT=161 + FULL_STRING_ESCAPE_TRIGGER=162 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -933,17 +941,17 @@ def program(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 175 + self.state = 177 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -536887298) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986211001696255) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 4212759) != 0): - self.state = 172 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -140738696331266) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944844006785023) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 4212759) != 0): + self.state = 174 self.declaration() - self.state = 177 + self.state = 179 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 178 + self.state = 180 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -986,17 +994,17 @@ def declaration(self): localctx = HogQLParser.DeclarationContext(self, self._ctx, self.state) self.enterRule(localctx, 2, self.RULE_declaration) try: - self.state = 182 + self.state = 184 self._errHandler.sync(self) token = self._input.LA(1) - if token in [53]: + if token in [55]: self.enterOuterAlt(localctx, 1) - self.state = 180 + self.state = 182 self.varDecl() pass - elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 113, 119, 121, 129, 130, 131, 133, 140, 143, 151]: + elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112, 113, 115, 121, 123, 131, 132, 133, 135, 142, 145, 153]: self.enterOuterAlt(localctx, 2) - self.state = 181 + self.state = 183 self.statement() pass else: @@ -1040,7 +1048,7 @@ def expression(self): self.enterRule(localctx, 4, self.RULE_expression) try: self.enterOuterAlt(localctx, 1) - self.state = 184 + self.state = 186 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -1094,19 +1102,19 @@ def varDecl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 186 + self.state = 188 self.match(HogQLParser.LET) - self.state = 187 + self.state = 189 self.identifier() - self.state = 191 + self.state = 193 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==116: - self.state = 188 + if _la==118: + self.state = 190 self.match(HogQLParser.COLON) - self.state = 189 + self.state = 191 self.match(HogQLParser.EQ_SINGLE) - self.state = 190 + self.state = 192 self.expression() @@ -1158,26 +1166,26 @@ def identifierList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 193 + self.state = 195 self.identifier() - self.state = 198 + self.state = 200 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,3,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 194 + self.state = 196 self.match(HogQLParser.COMMA) - self.state = 195 + self.state = 197 self.identifier() - self.state = 200 + self.state = 202 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,3,self._ctx) - self.state = 202 + self.state = 204 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 201 + if _la==119: + self.state = 203 self.match(HogQLParser.COMMA) @@ -1262,78 +1270,78 @@ def statement(self): localctx = HogQLParser.StatementContext(self, self._ctx, self.state) self.enterRule(localctx, 10, self.RULE_statement) try: - self.state = 216 + self.state = 218 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,5,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 204 + self.state = 206 self.returnStmt() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 205 + self.state = 207 self.throwStmt() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 206 + self.state = 208 self.tryCatchStmt() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 207 + self.state = 209 self.ifStmt() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 208 + self.state = 210 self.whileStmt() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 209 + self.state = 211 self.forInStmt() pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 210 + self.state = 212 self.forStmt() pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 211 + self.state = 213 self.funcStmt() pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 212 + self.state = 214 self.varAssignment() pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 213 + self.state = 215 self.block() pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 214 + self.state = 216 self.exprStmt() pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 215 + self.state = 217 self.emptyStmt() pass @@ -1382,21 +1390,21 @@ def returnStmt(self): self.enterRule(localctx, 12, self.RULE_returnStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 218 - self.match(HogQLParser.RETURN) self.state = 220 + self.match(HogQLParser.RETURN) + self.state = 222 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,6,self._ctx) if la_ == 1: - self.state = 219 + self.state = 221 self.expression() - self.state = 223 + self.state = 225 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,7,self._ctx) if la_ == 1: - self.state = 222 + self.state = 224 self.match(HogQLParser.SEMICOLON) @@ -1444,21 +1452,21 @@ def throwStmt(self): self.enterRule(localctx, 14, self.RULE_throwStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 225 - self.match(HogQLParser.THROW) self.state = 227 + self.match(HogQLParser.THROW) + self.state = 229 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,8,self._ctx) if la_ == 1: - self.state = 226 + self.state = 228 self.expression() - self.state = 230 + self.state = 232 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,9,self._ctx) if la_ == 1: - self.state = 229 + self.state = 231 self.match(HogQLParser.SEMICOLON) @@ -1523,31 +1531,31 @@ def catchBlock(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 232 + self.state = 234 self.match(HogQLParser.CATCH) - self.state = 241 + self.state = 243 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==131: - self.state = 233 + if _la==133: + self.state = 235 self.match(HogQLParser.LPAREN) - self.state = 234 + self.state = 236 localctx.catchVar = self.identifier() - self.state = 237 + self.state = 239 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==116: - self.state = 235 + if _la==118: + self.state = 237 self.match(HogQLParser.COLON) - self.state = 236 + self.state = 238 localctx.catchType = self.identifier() - self.state = 239 + self.state = 241 self.match(HogQLParser.RPAREN) - self.state = 243 + self.state = 245 localctx.catchStmt = self.block() except RecognitionException as re: localctx.exception = re @@ -1606,27 +1614,27 @@ def tryCatchStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 245 + self.state = 247 self.match(HogQLParser.TRY) - self.state = 246 + self.state = 248 localctx.tryStmt = self.block() - self.state = 250 + self.state = 252 self._errHandler.sync(self) _la = self._input.LA(1) while _la==14: - self.state = 247 + self.state = 249 self.catchBlock() - self.state = 252 + self.state = 254 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 255 + self.state = 257 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==29: - self.state = 253 + if _la==30: + self.state = 255 self.match(HogQLParser.FINALLY) - self.state = 254 + self.state = 256 localctx.finallyStmt = self.block() @@ -1687,23 +1695,23 @@ def ifStmt(self): self.enterRule(localctx, 20, self.RULE_ifStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 257 + self.state = 259 self.match(HogQLParser.IF) - self.state = 258 + self.state = 260 self.match(HogQLParser.LPAREN) - self.state = 259 + self.state = 261 self.expression() - self.state = 260 + self.state = 262 self.match(HogQLParser.RPAREN) - self.state = 261 + self.state = 263 self.statement() - self.state = 264 + self.state = 266 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,14,self._ctx) if la_ == 1: - self.state = 262 + self.state = 264 self.match(HogQLParser.ELSE) - self.state = 263 + self.state = 265 self.statement() @@ -1761,21 +1769,21 @@ def whileStmt(self): self.enterRule(localctx, 22, self.RULE_whileStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 266 + self.state = 268 self.match(HogQLParser.WHILE) - self.state = 267 + self.state = 269 self.match(HogQLParser.LPAREN) - self.state = 268 + self.state = 270 self.expression() - self.state = 269 + self.state = 271 self.match(HogQLParser.RPAREN) - self.state = 270 - self.statement() self.state = 272 + self.statement() + self.state = 274 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,15,self._ctx) if la_ == 1: - self.state = 271 + self.state = 273 self.match(HogQLParser.SEMICOLON) @@ -1861,63 +1869,63 @@ def forStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 274 + self.state = 276 self.match(HogQLParser.FOR) - self.state = 275 + self.state = 277 self.match(HogQLParser.LPAREN) - self.state = 279 + self.state = 281 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,16,self._ctx) if la_ == 1: - self.state = 276 + self.state = 278 localctx.initializerVarDeclr = self.varDecl() elif la_ == 2: - self.state = 277 + self.state = 279 localctx.initializerVarAssignment = self.varAssignment() elif la_ == 3: - self.state = 278 + self.state = 280 localctx.initializerExpression = self.expression() - self.state = 281 - self.match(HogQLParser.SEMICOLON) self.state = 283 + self.match(HogQLParser.SEMICOLON) + self.state = 285 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 282 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 284 localctx.condition = self.expression() - self.state = 285 + self.state = 287 self.match(HogQLParser.SEMICOLON) - self.state = 289 + self.state = 291 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,18,self._ctx) if la_ == 1: - self.state = 286 + self.state = 288 localctx.incrementVarDeclr = self.varDecl() elif la_ == 2: - self.state = 287 + self.state = 289 localctx.incrementVarAssignment = self.varAssignment() elif la_ == 3: - self.state = 288 + self.state = 290 localctx.incrementExpression = self.expression() - self.state = 291 + self.state = 293 self.match(HogQLParser.RPAREN) - self.state = 292 - self.statement() self.state = 294 + self.statement() + self.state = 296 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,19,self._ctx) if la_ == 1: - self.state = 293 + self.state = 295 self.match(HogQLParser.SEMICOLON) @@ -1992,37 +2000,37 @@ def forInStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 296 + self.state = 298 self.match(HogQLParser.FOR) - self.state = 297 + self.state = 299 self.match(HogQLParser.LPAREN) - self.state = 298 + self.state = 300 self.match(HogQLParser.LET) - self.state = 299 + self.state = 301 self.identifier() - self.state = 302 + self.state = 304 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 300 + if _la==119: + self.state = 302 self.match(HogQLParser.COMMA) - self.state = 301 + self.state = 303 self.identifier() - self.state = 304 + self.state = 306 self.match(HogQLParser.IN) - self.state = 305 + self.state = 307 self.expression() - self.state = 306 + self.state = 308 self.match(HogQLParser.RPAREN) - self.state = 307 - self.statement() self.state = 309 + self.statement() + self.state = 311 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,21,self._ctx) if la_ == 1: - self.state = 308 + self.state = 310 self.match(HogQLParser.SEMICOLON) @@ -2085,28 +2093,28 @@ def funcStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 311 + self.state = 313 _la = self._input.LA(1) - if not(_la==31 or _la==36): + if not(_la==32 or _la==37): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 312 + self.state = 314 self.identifier() - self.state = 313 - self.match(HogQLParser.LPAREN) self.state = 315 + self.match(HogQLParser.LPAREN) + self.state = 317 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 314 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 316 self.identifierList() - self.state = 317 + self.state = 319 self.match(HogQLParser.RPAREN) - self.state = 318 + self.state = 320 self.block() except RecognitionException as re: localctx.exception = re @@ -2155,13 +2163,13 @@ def varAssignment(self): self.enterRule(localctx, 30, self.RULE_varAssignment) try: self.enterOuterAlt(localctx, 1) - self.state = 320 + self.state = 322 self.expression() - self.state = 321 + self.state = 323 self.match(HogQLParser.COLON) - self.state = 322 + self.state = 324 self.match(HogQLParser.EQ_SINGLE) - self.state = 323 + self.state = 325 self.expression() except RecognitionException as re: localctx.exception = re @@ -2204,13 +2212,13 @@ def exprStmt(self): self.enterRule(localctx, 32, self.RULE_exprStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 325 - self.expression() self.state = 327 + self.expression() + self.state = 329 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,23,self._ctx) if la_ == 1: - self.state = 326 + self.state = 328 self.match(HogQLParser.SEMICOLON) @@ -2251,7 +2259,7 @@ def emptyStmt(self): self.enterRule(localctx, 34, self.RULE_emptyStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 329 + self.state = 331 self.match(HogQLParser.SEMICOLON) except RecognitionException as re: localctx.exception = re @@ -2301,19 +2309,19 @@ def block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 331 + self.state = 333 self.match(HogQLParser.LBRACE) - self.state = 335 + self.state = 337 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -536887298) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986211001696255) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 4212759) != 0): - self.state = 332 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -140738696331266) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944844006785023) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 4212759) != 0): + self.state = 334 self.declaration() - self.state = 337 + self.state = 339 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 338 + self.state = 340 self.match(HogQLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -2359,11 +2367,11 @@ def kvPair(self): self.enterRule(localctx, 38, self.RULE_kvPair) try: self.enterOuterAlt(localctx, 1) - self.state = 340 + self.state = 342 self.expression() - self.state = 341 + self.state = 343 self.match(HogQLParser.COLON) - self.state = 342 + self.state = 344 self.expression() except RecognitionException as re: localctx.exception = re @@ -2413,26 +2421,26 @@ def kvPairList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 344 + self.state = 346 self.kvPair() - self.state = 349 + self.state = 351 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,25,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 345 + self.state = 347 self.match(HogQLParser.COMMA) - self.state = 346 + self.state = 348 self.kvPair() - self.state = 351 + self.state = 353 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,25,self._ctx) - self.state = 353 + self.state = 355 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 352 + if _la==119: + self.state = 354 self.match(HogQLParser.COMMA) @@ -2455,8 +2463,8 @@ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): def EOF(self): return self.getToken(HogQLParser.EOF, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def selectStmt(self): @@ -2485,26 +2493,26 @@ def select(self): self.enterRule(localctx, 42, self.RULE_select) try: self.enterOuterAlt(localctx, 1) - self.state = 358 + self.state = 360 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,27,self._ctx) if la_ == 1: - self.state = 355 - self.selectUnionStmt() + self.state = 357 + self.selectSetStmt() pass elif la_ == 2: - self.state = 356 + self.state = 358 self.selectStmt() pass elif la_ == 3: - self.state = 357 + self.state = 359 self.hogqlxTagElement() pass - self.state = 360 + self.state = 362 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -2515,66 +2523,72 @@ def select(self): return localctx - class SelectUnionStmtContext(ParserRuleContext): + class SelectStmtWithParensContext(ParserRuleContext): __slots__ = 'parser' def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): super().__init__(parent, invokingState) self.parser = parser - def selectStmtWithParens(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(HogQLParser.SelectStmtWithParensContext) - else: - return self.getTypedRuleContext(HogQLParser.SelectStmtWithParensContext,i) + def selectStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectStmtContext,0) - def UNION(self, i:int=None): - if i is None: - return self.getTokens(HogQLParser.UNION) - else: - return self.getToken(HogQLParser.UNION, i) + def LPAREN(self): + return self.getToken(HogQLParser.LPAREN, 0) + + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) + + + def RPAREN(self): + return self.getToken(HogQLParser.RPAREN, 0) + + def placeholder(self): + return self.getTypedRuleContext(HogQLParser.PlaceholderContext,0) - def ALL(self, i:int=None): - if i is None: - return self.getTokens(HogQLParser.ALL) - else: - return self.getToken(HogQLParser.ALL, i) def getRuleIndex(self): - return HogQLParser.RULE_selectUnionStmt + return HogQLParser.RULE_selectStmtWithParens def accept(self, visitor:ParseTreeVisitor): - if hasattr( visitor, "visitSelectUnionStmt" ): - return visitor.visitSelectUnionStmt(self) + if hasattr( visitor, "visitSelectStmtWithParens" ): + return visitor.visitSelectStmtWithParens(self) else: return visitor.visitChildren(self) - def selectUnionStmt(self): + def selectStmtWithParens(self): - localctx = HogQLParser.SelectUnionStmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_selectUnionStmt) - self._la = 0 # Token type + localctx = HogQLParser.SelectStmtWithParensContext(self, self._ctx, self.state) + self.enterRule(localctx, 44, self.RULE_selectStmtWithParens) try: - self.enterOuterAlt(localctx, 1) - self.state = 362 - self.selectStmtWithParens() - self.state = 368 + self.state = 370 self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==96: - self.state = 363 - self.match(HogQLParser.UNION) + token = self._input.LA(1) + if token in [82, 105]: + self.enterOuterAlt(localctx, 1) self.state = 364 - self.match(HogQLParser.ALL) + self.selectStmt() + pass + elif token in [133]: + self.enterOuterAlt(localctx, 2) self.state = 365 - self.selectStmtWithParens() - self.state = 370 - self._errHandler.sync(self) - _la = self._input.LA(1) + self.match(HogQLParser.LPAREN) + self.state = 366 + self.selectSetStmt() + self.state = 367 + self.match(HogQLParser.RPAREN) + pass + elif token in [131]: + self.enterOuterAlt(localctx, 3) + self.state = 369 + self.placeholder() + pass + else: + raise NoViableAltException(self) except RecognitionException as re: localctx.exception = re @@ -2585,73 +2599,127 @@ def selectUnionStmt(self): return localctx - class SelectStmtWithParensContext(ParserRuleContext): + class SubsequentSelectSetClauseContext(ParserRuleContext): __slots__ = 'parser' def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): super().__init__(parent, invokingState) self.parser = parser - def selectStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectStmtContext,0) - + def selectStmtWithParens(self): + return self.getTypedRuleContext(HogQLParser.SelectStmtWithParensContext,0) - def LPAREN(self): - return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def EXCEPT(self): + return self.getToken(HogQLParser.EXCEPT, 0) + def UNION(self): + return self.getToken(HogQLParser.UNION, 0) - def RPAREN(self): - return self.getToken(HogQLParser.RPAREN, 0) - - def placeholder(self): - return self.getTypedRuleContext(HogQLParser.PlaceholderContext,0) + def ALL(self): + return self.getToken(HogQLParser.ALL, 0) + def INTERSECT(self): + return self.getToken(HogQLParser.INTERSECT, 0) def getRuleIndex(self): - return HogQLParser.RULE_selectStmtWithParens + return HogQLParser.RULE_subsequentSelectSetClause def accept(self, visitor:ParseTreeVisitor): - if hasattr( visitor, "visitSelectStmtWithParens" ): - return visitor.visitSelectStmtWithParens(self) + if hasattr( visitor, "visitSubsequentSelectSetClause" ): + return visitor.visitSubsequentSelectSetClause(self) else: return visitor.visitChildren(self) - def selectStmtWithParens(self): + def subsequentSelectSetClause(self): - localctx = HogQLParser.SelectStmtWithParensContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_selectStmtWithParens) + localctx = HogQLParser.SubsequentSelectSetClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 46, self.RULE_subsequentSelectSetClause) try: - self.state = 377 + self.enterOuterAlt(localctx, 1) + self.state = 376 self._errHandler.sync(self) token = self._input.LA(1) - if token in [80, 103]: - self.enterOuterAlt(localctx, 1) - self.state = 371 - self.selectStmt() - pass - elif token in [131]: - self.enterOuterAlt(localctx, 2) + if token in [27]: self.state = 372 - self.match(HogQLParser.LPAREN) + self.match(HogQLParser.EXCEPT) + pass + elif token in [98]: self.state = 373 - self.selectUnionStmt() + self.match(HogQLParser.UNION) self.state = 374 - self.match(HogQLParser.RPAREN) + self.match(HogQLParser.ALL) pass - elif token in [129]: - self.enterOuterAlt(localctx, 3) - self.state = 376 - self.placeholder() + elif token in [47]: + self.state = 375 + self.match(HogQLParser.INTERSECT) pass else: raise NoViableAltException(self) + self.state = 378 + self.selectStmtWithParens() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class SelectSetStmtContext(ParserRuleContext): + __slots__ = 'parser' + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def selectStmtWithParens(self): + return self.getTypedRuleContext(HogQLParser.SelectStmtWithParensContext,0) + + + def subsequentSelectSetClause(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(HogQLParser.SubsequentSelectSetClauseContext) + else: + return self.getTypedRuleContext(HogQLParser.SubsequentSelectSetClauseContext,i) + + + def getRuleIndex(self): + return HogQLParser.RULE_selectSetStmt + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitSelectSetStmt" ): + return visitor.visitSelectSetStmt(self) + else: + return visitor.visitChildren(self) + + + + + def selectSetStmt(self): + + localctx = HogQLParser.SelectSetStmtContext(self, self._ctx, self.state) + self.enterRule(localctx, 48, self.RULE_selectSetStmt) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 380 + self.selectStmtWithParens() + self.state = 384 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==27 or _la==47 or _la==98: + self.state = 381 + self.subsequentSelectSetClause() + self.state = 386 + self._errHandler.sync(self) + _la = self._input.LA(1) + except RecognitionException as re: localctx.exception = re self._errHandler.reportError(self, re) @@ -2764,147 +2832,147 @@ def accept(self, visitor:ParseTreeVisitor): def selectStmt(self): localctx = HogQLParser.SelectStmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 48, self.RULE_selectStmt) + self.enterRule(localctx, 50, self.RULE_selectStmt) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 380 + self.state = 388 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==103: - self.state = 379 + if _la==105: + self.state = 387 localctx.with_ = self.withClause() - self.state = 382 + self.state = 390 self.match(HogQLParser.SELECT) - self.state = 384 + self.state = 392 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,31,self._ctx) + la_ = self._interp.adaptivePredict(self._input,32,self._ctx) if la_ == 1: - self.state = 383 + self.state = 391 self.match(HogQLParser.DISTINCT) - self.state = 387 + self.state = 395 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,32,self._ctx) + la_ = self._interp.adaptivePredict(self._input,33,self._ctx) if la_ == 1: - self.state = 386 + self.state = 394 self.topClause() - self.state = 389 + self.state = 397 localctx.columns = self.columnExprList() - self.state = 391 + self.state = 399 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==34: - self.state = 390 + if _la==35: + self.state = 398 localctx.from_ = self.fromClause() - self.state = 394 + self.state = 402 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 4538783999459360) != 0): - self.state = 393 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 18084767253659680) != 0): + self.state = 401 self.arrayJoinClause() - self.state = 397 + self.state = 405 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==70: - self.state = 396 + if _la==72: + self.state = 404 self.prewhereClause() - self.state = 400 + self.state = 408 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==100: - self.state = 399 + if _la==102: + self.state = 407 localctx.where = self.whereClause() - self.state = 403 + self.state = 411 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==37: - self.state = 402 + if _la==38: + self.state = 410 self.groupByClause() - self.state = 407 + self.state = 415 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,38,self._ctx) + la_ = self._interp.adaptivePredict(self._input,39,self._ctx) if la_ == 1: - self.state = 405 + self.state = 413 self.match(HogQLParser.WITH) - self.state = 406 + self.state = 414 _la = self._input.LA(1) - if not(_la==18 or _la==75): + if not(_la==18 or _la==77): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 411 + self.state = 419 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==103: - self.state = 409 + if _la==105: + self.state = 417 self.match(HogQLParser.WITH) - self.state = 410 + self.state = 418 self.match(HogQLParser.TOTALS) - self.state = 414 + self.state = 422 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==38: - self.state = 413 + if _la==39: + self.state = 421 self.havingClause() - self.state = 417 + self.state = 425 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==102: - self.state = 416 + if _la==104: + self.state = 424 self.windowClause() - self.state = 420 + self.state = 428 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==65: - self.state = 419 + if _la==67: + self.state = 427 self.orderByClause() - self.state = 424 + self.state = 432 self._errHandler.sync(self) token = self._input.LA(1) - if token in [55]: - self.state = 422 + if token in [57]: + self.state = 430 self.limitAndOffsetClause() pass - elif token in [62]: - self.state = 423 + elif token in [64]: + self.state = 431 self.offsetOnlyClause() pass - elif token in [-1, 82, 96, 150]: + elif token in [-1, 27, 47, 84, 98, 152]: pass else: pass - self.state = 427 + self.state = 435 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==82: - self.state = 426 + if _la==84: + self.state = 434 self.settingsClause() @@ -2946,12 +3014,12 @@ def accept(self, visitor:ParseTreeVisitor): def withClause(self): localctx = HogQLParser.WithClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_withClause) + self.enterRule(localctx, 52, self.RULE_withClause) try: self.enterOuterAlt(localctx, 1) - self.state = 429 + self.state = 437 self.match(HogQLParser.WITH) - self.state = 430 + self.state = 438 self.withExprList() except RecognitionException as re: localctx.exception = re @@ -2996,20 +3064,20 @@ def accept(self, visitor:ParseTreeVisitor): def topClause(self): localctx = HogQLParser.TopClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_topClause) + self.enterRule(localctx, 54, self.RULE_topClause) try: self.enterOuterAlt(localctx, 1) - self.state = 432 + self.state = 440 self.match(HogQLParser.TOP) - self.state = 433 + self.state = 441 self.match(HogQLParser.DECIMAL_LITERAL) - self.state = 436 + self.state = 444 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,45,self._ctx) + la_ = self._interp.adaptivePredict(self._input,46,self._ctx) if la_ == 1: - self.state = 434 + self.state = 442 self.match(HogQLParser.WITH) - self.state = 435 + self.state = 443 self.match(HogQLParser.TIES) @@ -3051,12 +3119,12 @@ def accept(self, visitor:ParseTreeVisitor): def fromClause(self): localctx = HogQLParser.FromClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_fromClause) + self.enterRule(localctx, 56, self.RULE_fromClause) try: self.enterOuterAlt(localctx, 1) - self.state = 438 + self.state = 446 self.match(HogQLParser.FROM) - self.state = 439 + self.state = 447 self.joinExpr(0) except RecognitionException as re: localctx.exception = re @@ -3105,28 +3173,28 @@ def accept(self, visitor:ParseTreeVisitor): def arrayJoinClause(self): localctx = HogQLParser.ArrayJoinClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 56, self.RULE_arrayJoinClause) + self.enterRule(localctx, 58, self.RULE_arrayJoinClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 442 + self.state = 450 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==45 or _la==52: - self.state = 441 + if _la==46 or _la==54: + self.state = 449 _la = self._input.LA(1) - if not(_la==45 or _la==52): + if not(_la==46 or _la==54): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 444 + self.state = 452 self.match(HogQLParser.ARRAY) - self.state = 445 + self.state = 453 self.match(HogQLParser.JOIN) - self.state = 446 + self.state = 454 self.columnExprList() except RecognitionException as re: localctx.exception = re @@ -3200,39 +3268,39 @@ def accept(self, visitor:ParseTreeVisitor): def windowClause(self): localctx = HogQLParser.WindowClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 58, self.RULE_windowClause) + self.enterRule(localctx, 60, self.RULE_windowClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 448 + self.state = 456 self.match(HogQLParser.WINDOW) - self.state = 449 + self.state = 457 self.identifier() - self.state = 450 + self.state = 458 self.match(HogQLParser.AS) - self.state = 451 + self.state = 459 self.match(HogQLParser.LPAREN) - self.state = 452 + self.state = 460 self.windowExpr() - self.state = 453 + self.state = 461 self.match(HogQLParser.RPAREN) - self.state = 463 + self.state = 471 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==117: - self.state = 454 + while _la==119: + self.state = 462 self.match(HogQLParser.COMMA) - self.state = 455 + self.state = 463 self.identifier() - self.state = 456 + self.state = 464 self.match(HogQLParser.AS) - self.state = 457 + self.state = 465 self.match(HogQLParser.LPAREN) - self.state = 458 + self.state = 466 self.windowExpr() - self.state = 459 + self.state = 467 self.match(HogQLParser.RPAREN) - self.state = 465 + self.state = 473 self._errHandler.sync(self) _la = self._input.LA(1) @@ -3274,12 +3342,12 @@ def accept(self, visitor:ParseTreeVisitor): def prewhereClause(self): localctx = HogQLParser.PrewhereClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 60, self.RULE_prewhereClause) + self.enterRule(localctx, 62, self.RULE_prewhereClause) try: self.enterOuterAlt(localctx, 1) - self.state = 466 + self.state = 474 self.match(HogQLParser.PREWHERE) - self.state = 467 + self.state = 475 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3319,12 +3387,12 @@ def accept(self, visitor:ParseTreeVisitor): def whereClause(self): localctx = HogQLParser.WhereClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 62, self.RULE_whereClause) + self.enterRule(localctx, 64, self.RULE_whereClause) try: self.enterOuterAlt(localctx, 1) - self.state = 469 + self.state = 477 self.match(HogQLParser.WHERE) - self.state = 470 + self.state = 478 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3379,35 +3447,35 @@ def accept(self, visitor:ParseTreeVisitor): def groupByClause(self): localctx = HogQLParser.GroupByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 64, self.RULE_groupByClause) + self.enterRule(localctx, 66, self.RULE_groupByClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 472 + self.state = 480 self.match(HogQLParser.GROUP) - self.state = 473 + self.state = 481 self.match(HogQLParser.BY) - self.state = 480 + self.state = 488 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,48,self._ctx) + la_ = self._interp.adaptivePredict(self._input,49,self._ctx) if la_ == 1: - self.state = 474 + self.state = 482 _la = self._input.LA(1) - if not(_la==18 or _la==75): + if not(_la==18 or _la==77): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 475 + self.state = 483 self.match(HogQLParser.LPAREN) - self.state = 476 + self.state = 484 self.columnExprList() - self.state = 477 + self.state = 485 self.match(HogQLParser.RPAREN) pass elif la_ == 2: - self.state = 479 + self.state = 487 self.columnExprList() pass @@ -3450,12 +3518,12 @@ def accept(self, visitor:ParseTreeVisitor): def havingClause(self): localctx = HogQLParser.HavingClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 66, self.RULE_havingClause) + self.enterRule(localctx, 68, self.RULE_havingClause) try: self.enterOuterAlt(localctx, 1) - self.state = 482 + self.state = 490 self.match(HogQLParser.HAVING) - self.state = 483 + self.state = 491 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3498,14 +3566,14 @@ def accept(self, visitor:ParseTreeVisitor): def orderByClause(self): localctx = HogQLParser.OrderByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_orderByClause) + self.enterRule(localctx, 70, self.RULE_orderByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 485 + self.state = 493 self.match(HogQLParser.ORDER) - self.state = 486 + self.state = 494 self.match(HogQLParser.BY) - self.state = 487 + self.state = 495 self.orderExprList() except RecognitionException as re: localctx.exception = re @@ -3548,14 +3616,14 @@ def accept(self, visitor:ParseTreeVisitor): def projectionOrderByClause(self): localctx = HogQLParser.ProjectionOrderByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_projectionOrderByClause) + self.enterRule(localctx, 72, self.RULE_projectionOrderByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 489 + self.state = 497 self.match(HogQLParser.ORDER) - self.state = 490 + self.state = 498 self.match(HogQLParser.BY) - self.state = 491 + self.state = 499 self.columnExprList() except RecognitionException as re: localctx.exception = re @@ -3617,44 +3685,44 @@ def accept(self, visitor:ParseTreeVisitor): def limitAndOffsetClause(self): localctx = HogQLParser.LimitAndOffsetClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 72, self.RULE_limitAndOffsetClause) + self.enterRule(localctx, 74, self.RULE_limitAndOffsetClause) self._la = 0 # Token type try: - self.state = 522 + self.state = 530 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,53,self._ctx) + la_ = self._interp.adaptivePredict(self._input,54,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 493 + self.state = 501 self.match(HogQLParser.LIMIT) - self.state = 494 + self.state = 502 self.columnExpr(0) - self.state = 497 + self.state = 505 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 495 + if _la==119: + self.state = 503 self.match(HogQLParser.COMMA) - self.state = 496 + self.state = 504 self.columnExpr(0) - self.state = 503 + self.state = 511 self._errHandler.sync(self) token = self._input.LA(1) - if token in [103]: - self.state = 499 + if token in [105]: + self.state = 507 self.match(HogQLParser.WITH) - self.state = 500 + self.state = 508 self.match(HogQLParser.TIES) pass elif token in [11]: - self.state = 501 + self.state = 509 self.match(HogQLParser.BY) - self.state = 502 + self.state = 510 self.columnExprList() pass - elif token in [-1, 82, 96, 150]: + elif token in [-1, 27, 47, 84, 98, 152]: pass else: pass @@ -3662,43 +3730,43 @@ def limitAndOffsetClause(self): elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 505 + self.state = 513 self.match(HogQLParser.LIMIT) - self.state = 506 + self.state = 514 self.columnExpr(0) - self.state = 509 + self.state = 517 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==103: - self.state = 507 + if _la==105: + self.state = 515 self.match(HogQLParser.WITH) - self.state = 508 + self.state = 516 self.match(HogQLParser.TIES) - self.state = 511 + self.state = 519 self.match(HogQLParser.OFFSET) - self.state = 512 + self.state = 520 self.columnExpr(0) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 514 + self.state = 522 self.match(HogQLParser.LIMIT) - self.state = 515 + self.state = 523 self.columnExpr(0) - self.state = 516 + self.state = 524 self.match(HogQLParser.OFFSET) - self.state = 517 + self.state = 525 self.columnExpr(0) - self.state = 520 + self.state = 528 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 518 + self.state = 526 self.match(HogQLParser.BY) - self.state = 519 + self.state = 527 self.columnExprList() @@ -3743,12 +3811,12 @@ def accept(self, visitor:ParseTreeVisitor): def offsetOnlyClause(self): localctx = HogQLParser.OffsetOnlyClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 74, self.RULE_offsetOnlyClause) + self.enterRule(localctx, 76, self.RULE_offsetOnlyClause) try: self.enterOuterAlt(localctx, 1) - self.state = 524 + self.state = 532 self.match(HogQLParser.OFFSET) - self.state = 525 + self.state = 533 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3788,12 +3856,12 @@ def accept(self, visitor:ParseTreeVisitor): def settingsClause(self): localctx = HogQLParser.SettingsClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 76, self.RULE_settingsClause) + self.enterRule(localctx, 78, self.RULE_settingsClause) try: self.enterOuterAlt(localctx, 1) - self.state = 527 + self.state = 535 self.match(HogQLParser.SETTINGS) - self.state = 528 + self.state = 536 self.settingExprList() except RecognitionException as re: localctx.exception = re @@ -3920,34 +3988,34 @@ def joinExpr(self, _p:int=0): _parentState = self.state localctx = HogQLParser.JoinExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 78 - self.enterRecursionRule(localctx, 78, self.RULE_joinExpr, _p) + _startState = 80 + self.enterRecursionRule(localctx, 80, self.RULE_joinExpr, _p) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 542 + self.state = 550 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,56,self._ctx) + la_ = self._interp.adaptivePredict(self._input,57,self._ctx) if la_ == 1: localctx = HogQLParser.JoinExprTableContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 531 + self.state = 539 self.tableExpr(0) - self.state = 533 + self.state = 541 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,54,self._ctx) + la_ = self._interp.adaptivePredict(self._input,55,self._ctx) if la_ == 1: - self.state = 532 + self.state = 540 self.match(HogQLParser.FINAL) - self.state = 536 + self.state = 544 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,55,self._ctx) + la_ = self._interp.adaptivePredict(self._input,56,self._ctx) if la_ == 1: - self.state = 535 + self.state = 543 self.sampleClause() @@ -3957,67 +4025,67 @@ def joinExpr(self, _p:int=0): localctx = HogQLParser.JoinExprParensContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 538 + self.state = 546 self.match(HogQLParser.LPAREN) - self.state = 539 + self.state = 547 self.joinExpr(0) - self.state = 540 + self.state = 548 self.match(HogQLParser.RPAREN) pass self._ctx.stop = self._input.LT(-1) - self.state = 558 + self.state = 566 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,59,self._ctx) + _alt = self._interp.adaptivePredict(self._input,60,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 556 + self.state = 564 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,58,self._ctx) + la_ = self._interp.adaptivePredict(self._input,59,self._ctx) if la_ == 1: localctx = HogQLParser.JoinExprCrossOpContext(self, HogQLParser.JoinExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_joinExpr) - self.state = 544 + self.state = 552 if not self.precpred(self._ctx, 3): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") - self.state = 545 + self.state = 553 self.joinOpCross() - self.state = 546 + self.state = 554 self.joinExpr(4) pass elif la_ == 2: localctx = HogQLParser.JoinExprOpContext(self, HogQLParser.JoinExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_joinExpr) - self.state = 548 + self.state = 556 if not self.precpred(self._ctx, 4): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 4)") - self.state = 550 + self.state = 558 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 4538818359197978) != 0) or _la==74 or _la==81: - self.state = 549 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 18084835973136666) != 0) or _la==76 or _la==83: + self.state = 557 self.joinOp() - self.state = 552 + self.state = 560 self.match(HogQLParser.JOIN) - self.state = 553 + self.state = 561 self.joinExpr(0) - self.state = 554 + self.state = 562 self.joinConstraintClause() pass - self.state = 560 + self.state = 568 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,59,self._ctx) + _alt = self._interp.adaptivePredict(self._input,60,self._ctx) except RecognitionException as re: localctx.exception = re @@ -4123,24 +4191,24 @@ def accept(self, visitor:ParseTreeVisitor): def joinOp(self): localctx = HogQLParser.JoinOpContext(self, self._ctx, self.state) - self.enterRule(localctx, 80, self.RULE_joinOp) + self.enterRule(localctx, 82, self.RULE_joinOp) self._la = 0 # Token type try: - self.state = 604 + self.state = 612 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,73,self._ctx) + la_ = self._interp.adaptivePredict(self._input,74,self._ctx) if la_ == 1: localctx = HogQLParser.JoinOpInnerContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 570 + self.state = 578 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,62,self._ctx) + la_ = self._interp.adaptivePredict(self._input,63,self._ctx) if la_ == 1: - self.state = 562 + self.state = 570 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0): - self.state = 561 + self.state = 569 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0)): self._errHandler.recoverInline(self) @@ -4149,18 +4217,18 @@ def joinOp(self): self.consume() - self.state = 564 + self.state = 572 self.match(HogQLParser.INNER) pass elif la_ == 2: - self.state = 565 + self.state = 573 self.match(HogQLParser.INNER) - self.state = 567 + self.state = 575 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0): - self.state = 566 + self.state = 574 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0)): self._errHandler.recoverInline(self) @@ -4172,7 +4240,7 @@ def joinOp(self): pass elif la_ == 3: - self.state = 569 + self.state = 577 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0)): self._errHandler.recoverInline(self) @@ -4187,63 +4255,63 @@ def joinOp(self): elif la_ == 2: localctx = HogQLParser.JoinOpLeftRightContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 586 + self.state = 594 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,67,self._ctx) + la_ = self._interp.adaptivePredict(self._input,68,self._ctx) if la_ == 1: - self.state = 573 + self.state = 581 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81: - self.state = 572 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83: + self.state = 580 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 575 + self.state = 583 _la = self._input.LA(1) - if not(_la==52 or _la==74): + if not(_la==54 or _la==76): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 577 + self.state = 585 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 576 + if _la==68: + self.state = 584 self.match(HogQLParser.OUTER) pass elif la_ == 2: - self.state = 579 + self.state = 587 _la = self._input.LA(1) - if not(_la==52 or _la==74): + if not(_la==54 or _la==76): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 581 + self.state = 589 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 580 + if _la==68: + self.state = 588 self.match(HogQLParser.OUTER) - self.state = 584 + self.state = 592 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81: - self.state = 583 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83: + self.state = 591 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -4258,15 +4326,15 @@ def joinOp(self): elif la_ == 3: localctx = HogQLParser.JoinOpFullContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 602 + self.state = 610 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,72,self._ctx) + la_ = self._interp.adaptivePredict(self._input,73,self._ctx) if la_ == 1: - self.state = 589 + self.state = 597 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1 or _la==4: - self.state = 588 + self.state = 596 _la = self._input.LA(1) if not(_la==1 or _la==4): self._errHandler.recoverInline(self) @@ -4275,34 +4343,34 @@ def joinOp(self): self.consume() - self.state = 591 + self.state = 599 self.match(HogQLParser.FULL) - self.state = 593 + self.state = 601 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 592 + if _la==68: + self.state = 600 self.match(HogQLParser.OUTER) pass elif la_ == 2: - self.state = 595 + self.state = 603 self.match(HogQLParser.FULL) - self.state = 597 + self.state = 605 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 596 + if _la==68: + self.state = 604 self.match(HogQLParser.OUTER) - self.state = 600 + self.state = 608 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1 or _la==4: - self.state = 599 + self.state = 607 _la = self._input.LA(1) if not(_la==1 or _la==4): self._errHandler.recoverInline(self) @@ -4357,21 +4425,21 @@ def accept(self, visitor:ParseTreeVisitor): def joinOpCross(self): localctx = HogQLParser.JoinOpCrossContext(self, self._ctx, self.state) - self.enterRule(localctx, 82, self.RULE_joinOpCross) + self.enterRule(localctx, 84, self.RULE_joinOpCross) try: - self.state = 609 + self.state = 617 self._errHandler.sync(self) token = self._input.LA(1) if token in [17]: self.enterOuterAlt(localctx, 1) - self.state = 606 + self.state = 614 self.match(HogQLParser.CROSS) - self.state = 607 + self.state = 615 self.match(HogQLParser.JOIN) pass - elif token in [117]: + elif token in [119]: self.enterOuterAlt(localctx, 2) - self.state = 608 + self.state = 616 self.match(HogQLParser.COMMA) pass else: @@ -4424,36 +4492,36 @@ def accept(self, visitor:ParseTreeVisitor): def joinConstraintClause(self): localctx = HogQLParser.JoinConstraintClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 84, self.RULE_joinConstraintClause) + self.enterRule(localctx, 86, self.RULE_joinConstraintClause) try: - self.state = 620 + self.state = 628 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,75,self._ctx) + la_ = self._interp.adaptivePredict(self._input,76,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 611 + self.state = 619 self.match(HogQLParser.ON) - self.state = 612 + self.state = 620 self.columnExprList() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 613 + self.state = 621 self.match(HogQLParser.USING) - self.state = 614 + self.state = 622 self.match(HogQLParser.LPAREN) - self.state = 615 + self.state = 623 self.columnExprList() - self.state = 616 + self.state = 624 self.match(HogQLParser.RPAREN) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 618 + self.state = 626 self.match(HogQLParser.USING) - self.state = 619 + self.state = 627 self.columnExprList() pass @@ -4502,20 +4570,20 @@ def accept(self, visitor:ParseTreeVisitor): def sampleClause(self): localctx = HogQLParser.SampleClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 86, self.RULE_sampleClause) + self.enterRule(localctx, 88, self.RULE_sampleClause) try: self.enterOuterAlt(localctx, 1) - self.state = 622 + self.state = 630 self.match(HogQLParser.SAMPLE) - self.state = 623 + self.state = 631 self.ratioExpr() - self.state = 626 + self.state = 634 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,76,self._ctx) + la_ = self._interp.adaptivePredict(self._input,77,self._ctx) if la_ == 1: - self.state = 624 + self.state = 632 self.match(HogQLParser.OFFSET) - self.state = 625 + self.state = 633 self.ratioExpr() @@ -4563,21 +4631,21 @@ def accept(self, visitor:ParseTreeVisitor): def orderExprList(self): localctx = HogQLParser.OrderExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 88, self.RULE_orderExprList) + self.enterRule(localctx, 90, self.RULE_orderExprList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 628 + self.state = 636 self.orderExpr() - self.state = 633 + self.state = 641 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==117: - self.state = 629 + while _la==119: + self.state = 637 self.match(HogQLParser.COMMA) - self.state = 630 + self.state = 638 self.orderExpr() - self.state = 635 + self.state = 643 self._errHandler.sync(self) _la = self._input.LA(1) @@ -4640,17 +4708,17 @@ def accept(self, visitor:ParseTreeVisitor): def orderExpr(self): localctx = HogQLParser.OrderExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 90, self.RULE_orderExpr) + self.enterRule(localctx, 92, self.RULE_orderExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 636 + self.state = 644 self.columnExpr(0) - self.state = 638 + self.state = 646 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & 12583040) != 0): - self.state = 637 + self.state = 645 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 12583040) != 0)): self._errHandler.recoverInline(self) @@ -4659,28 +4727,28 @@ def orderExpr(self): self.consume() - self.state = 642 + self.state = 650 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==61: - self.state = 640 + if _la==63: + self.state = 648 self.match(HogQLParser.NULLS) - self.state = 641 + self.state = 649 _la = self._input.LA(1) - if not(_la==30 or _la==50): + if not(_la==31 or _la==52): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 646 + self.state = 654 self._errHandler.sync(self) _la = self._input.LA(1) if _la==16: - self.state = 644 + self.state = 652 self.match(HogQLParser.COLLATE) - self.state = 645 + self.state = 653 self.match(HogQLParser.STRING_LITERAL) @@ -4729,27 +4797,27 @@ def accept(self, visitor:ParseTreeVisitor): def ratioExpr(self): localctx = HogQLParser.RatioExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 92, self.RULE_ratioExpr) + self.enterRule(localctx, 94, self.RULE_ratioExpr) try: - self.state = 654 + self.state = 662 self._errHandler.sync(self) token = self._input.LA(1) - if token in [129]: + if token in [131]: self.enterOuterAlt(localctx, 1) - self.state = 648 + self.state = 656 self.placeholder() pass - elif token in [44, 58, 107, 108, 109, 110, 119, 121, 140]: + elif token in [45, 60, 109, 110, 111, 112, 121, 123, 142]: self.enterOuterAlt(localctx, 2) - self.state = 649 + self.state = 657 self.numberLiteral() - self.state = 652 + self.state = 660 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,81,self._ctx) + la_ = self._interp.adaptivePredict(self._input,82,self._ctx) if la_ == 1: - self.state = 650 + self.state = 658 self.match(HogQLParser.SLASH) - self.state = 651 + self.state = 659 self.numberLiteral() @@ -4801,21 +4869,21 @@ def accept(self, visitor:ParseTreeVisitor): def settingExprList(self): localctx = HogQLParser.SettingExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 94, self.RULE_settingExprList) + self.enterRule(localctx, 96, self.RULE_settingExprList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 656 + self.state = 664 self.settingExpr() - self.state = 661 + self.state = 669 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==117: - self.state = 657 + while _la==119: + self.state = 665 self.match(HogQLParser.COMMA) - self.state = 658 + self.state = 666 self.settingExpr() - self.state = 663 + self.state = 671 self._errHandler.sync(self) _la = self._input.LA(1) @@ -4861,14 +4929,14 @@ def accept(self, visitor:ParseTreeVisitor): def settingExpr(self): localctx = HogQLParser.SettingExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 96, self.RULE_settingExpr) + self.enterRule(localctx, 98, self.RULE_settingExpr) try: self.enterOuterAlt(localctx, 1) - self.state = 664 + self.state = 672 self.identifier() - self.state = 665 + self.state = 673 self.match(HogQLParser.EQ_SINGLE) - self.state = 666 + self.state = 674 self.literal() except RecognitionException as re: localctx.exception = re @@ -4913,31 +4981,31 @@ def accept(self, visitor:ParseTreeVisitor): def windowExpr(self): localctx = HogQLParser.WindowExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 98, self.RULE_windowExpr) + self.enterRule(localctx, 100, self.RULE_windowExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 669 + self.state = 677 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==68: - self.state = 668 + if _la==70: + self.state = 676 self.winPartitionByClause() - self.state = 672 + self.state = 680 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==65: - self.state = 671 + if _la==67: + self.state = 679 self.winOrderByClause() - self.state = 675 + self.state = 683 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==72 or _la==77: - self.state = 674 + if _la==74 or _la==79: + self.state = 682 self.winFrameClause() @@ -4982,14 +5050,14 @@ def accept(self, visitor:ParseTreeVisitor): def winPartitionByClause(self): localctx = HogQLParser.WinPartitionByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 100, self.RULE_winPartitionByClause) + self.enterRule(localctx, 102, self.RULE_winPartitionByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 677 + self.state = 685 self.match(HogQLParser.PARTITION) - self.state = 678 + self.state = 686 self.match(HogQLParser.BY) - self.state = 679 + self.state = 687 self.columnExprList() except RecognitionException as re: localctx.exception = re @@ -5032,14 +5100,14 @@ def accept(self, visitor:ParseTreeVisitor): def winOrderByClause(self): localctx = HogQLParser.WinOrderByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 102, self.RULE_winOrderByClause) + self.enterRule(localctx, 104, self.RULE_winOrderByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 681 + self.state = 689 self.match(HogQLParser.ORDER) - self.state = 682 + self.state = 690 self.match(HogQLParser.BY) - self.state = 683 + self.state = 691 self.orderExprList() except RecognitionException as re: localctx.exception = re @@ -5082,18 +5150,18 @@ def accept(self, visitor:ParseTreeVisitor): def winFrameClause(self): localctx = HogQLParser.WinFrameClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 104, self.RULE_winFrameClause) + self.enterRule(localctx, 106, self.RULE_winFrameClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 685 + self.state = 693 _la = self._input.LA(1) - if not(_la==72 or _la==77): + if not(_la==74 or _la==79): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 686 + self.state = 694 self.winFrameExtend() except RecognitionException as re: localctx.exception = re @@ -5166,27 +5234,27 @@ def accept(self, visitor:ParseTreeVisitor): def winFrameExtend(self): localctx = HogQLParser.WinFrameExtendContext(self, self._ctx, self.state) - self.enterRule(localctx, 106, self.RULE_winFrameExtend) + self.enterRule(localctx, 108, self.RULE_winFrameExtend) try: - self.state = 694 + self.state = 702 self._errHandler.sync(self) token = self._input.LA(1) - if token in [19, 44, 58, 95, 107, 108, 109, 110, 119, 121, 140]: + if token in [19, 45, 60, 97, 109, 110, 111, 112, 121, 123, 142]: localctx = HogQLParser.FrameStartContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 688 + self.state = 696 self.winFrameBound() pass elif token in [9]: localctx = HogQLParser.FrameBetweenContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 689 + self.state = 697 self.match(HogQLParser.BETWEEN) - self.state = 690 + self.state = 698 self.winFrameBound() - self.state = 691 + self.state = 699 self.match(HogQLParser.AND) - self.state = 692 + self.state = 700 self.winFrameBound() pass else: @@ -5242,44 +5310,44 @@ def accept(self, visitor:ParseTreeVisitor): def winFrameBound(self): localctx = HogQLParser.WinFrameBoundContext(self, self._ctx, self.state) - self.enterRule(localctx, 108, self.RULE_winFrameBound) + self.enterRule(localctx, 110, self.RULE_winFrameBound) try: self.enterOuterAlt(localctx, 1) - self.state = 708 + self.state = 716 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,88,self._ctx) + la_ = self._interp.adaptivePredict(self._input,89,self._ctx) if la_ == 1: - self.state = 696 + self.state = 704 self.match(HogQLParser.CURRENT) - self.state = 697 + self.state = 705 self.match(HogQLParser.ROW) pass elif la_ == 2: - self.state = 698 + self.state = 706 self.match(HogQLParser.UNBOUNDED) - self.state = 699 + self.state = 707 self.match(HogQLParser.PRECEDING) pass elif la_ == 3: - self.state = 700 + self.state = 708 self.match(HogQLParser.UNBOUNDED) - self.state = 701 + self.state = 709 self.match(HogQLParser.FOLLOWING) pass elif la_ == 4: - self.state = 702 + self.state = 710 self.numberLiteral() - self.state = 703 + self.state = 711 self.match(HogQLParser.PRECEDING) pass elif la_ == 5: - self.state = 705 + self.state = 713 self.numberLiteral() - self.state = 706 + self.state = 714 self.match(HogQLParser.FOLLOWING) pass @@ -5322,12 +5390,12 @@ def accept(self, visitor:ParseTreeVisitor): def expr(self): localctx = HogQLParser.ExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 110, self.RULE_expr) + self.enterRule(localctx, 112, self.RULE_expr) try: self.enterOuterAlt(localctx, 1) - self.state = 710 + self.state = 718 self.columnExpr(0) - self.state = 711 + self.state = 719 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -5499,141 +5567,141 @@ def accept(self, visitor:ParseTreeVisitor): def columnTypeExpr(self): localctx = HogQLParser.ColumnTypeExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 112, self.RULE_columnTypeExpr) + self.enterRule(localctx, 114, self.RULE_columnTypeExpr) self._la = 0 # Token type try: - self.state = 769 + self.state = 777 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,96,self._ctx) + la_ = self._interp.adaptivePredict(self._input,97,self._ctx) if la_ == 1: localctx = HogQLParser.ColumnTypeExprSimpleContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 713 + self.state = 721 self.identifier() pass elif la_ == 2: localctx = HogQLParser.ColumnTypeExprNestedContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 714 + self.state = 722 self.identifier() - self.state = 715 + self.state = 723 self.match(HogQLParser.LPAREN) - self.state = 716 + self.state = 724 self.identifier() - self.state = 717 + self.state = 725 self.columnTypeExpr() - self.state = 724 + self.state = 732 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,89,self._ctx) + _alt = self._interp.adaptivePredict(self._input,90,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 718 + self.state = 726 self.match(HogQLParser.COMMA) - self.state = 719 + self.state = 727 self.identifier() - self.state = 720 + self.state = 728 self.columnTypeExpr() - self.state = 726 + self.state = 734 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,89,self._ctx) + _alt = self._interp.adaptivePredict(self._input,90,self._ctx) - self.state = 728 + self.state = 736 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 727 + if _la==119: + self.state = 735 self.match(HogQLParser.COMMA) - self.state = 730 + self.state = 738 self.match(HogQLParser.RPAREN) pass elif la_ == 3: localctx = HogQLParser.ColumnTypeExprEnumContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 732 + self.state = 740 self.identifier() - self.state = 733 + self.state = 741 self.match(HogQLParser.LPAREN) - self.state = 734 + self.state = 742 self.enumValue() - self.state = 739 + self.state = 747 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,91,self._ctx) + _alt = self._interp.adaptivePredict(self._input,92,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 735 + self.state = 743 self.match(HogQLParser.COMMA) - self.state = 736 + self.state = 744 self.enumValue() - self.state = 741 + self.state = 749 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,91,self._ctx) + _alt = self._interp.adaptivePredict(self._input,92,self._ctx) - self.state = 743 + self.state = 751 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 742 + if _la==119: + self.state = 750 self.match(HogQLParser.COMMA) - self.state = 745 + self.state = 753 self.match(HogQLParser.RPAREN) pass elif la_ == 4: localctx = HogQLParser.ColumnTypeExprComplexContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 747 + self.state = 755 self.identifier() - self.state = 748 + self.state = 756 self.match(HogQLParser.LPAREN) - self.state = 749 + self.state = 757 self.columnTypeExpr() - self.state = 754 + self.state = 762 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,93,self._ctx) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 750 + self.state = 758 self.match(HogQLParser.COMMA) - self.state = 751 + self.state = 759 self.columnTypeExpr() - self.state = 756 + self.state = 764 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,93,self._ctx) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) - self.state = 758 + self.state = 766 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 757 + if _la==119: + self.state = 765 self.match(HogQLParser.COMMA) - self.state = 760 + self.state = 768 self.match(HogQLParser.RPAREN) pass elif la_ == 5: localctx = HogQLParser.ColumnTypeExprParamContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 762 + self.state = 770 self.identifier() - self.state = 763 + self.state = 771 self.match(HogQLParser.LPAREN) - self.state = 765 + self.state = 773 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 764 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 772 self.columnExprList() - self.state = 767 + self.state = 775 self.match(HogQLParser.RPAREN) pass @@ -5682,29 +5750,29 @@ def accept(self, visitor:ParseTreeVisitor): def columnExprList(self): localctx = HogQLParser.ColumnExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 114, self.RULE_columnExprList) + self.enterRule(localctx, 116, self.RULE_columnExprList) try: self.enterOuterAlt(localctx, 1) - self.state = 771 + self.state = 779 self.columnExpr(0) - self.state = 776 + self.state = 784 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,97,self._ctx) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 772 + self.state = 780 self.match(HogQLParser.COMMA) - self.state = 773 + self.state = 781 self.columnExpr(0) - self.state = 778 + self.state = 786 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,97,self._ctx) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) - self.state = 780 + self.state = 788 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,98,self._ctx) + la_ = self._interp.adaptivePredict(self._input,99,self._ctx) if la_ == 1: - self.state = 779 + self.state = 787 self.match(HogQLParser.COMMA) @@ -5829,8 +5897,8 @@ def __init__(self, parser, ctx:ParserRuleContext): # actually a HogQLParser.Colu def LPAREN(self): return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def RPAREN(self): return self.getToken(HogQLParser.RPAREN, 0) @@ -6739,58 +6807,58 @@ def columnExpr(self, _p:int=0): _parentState = self.state localctx = HogQLParser.ColumnExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 116 - self.enterRecursionRule(localctx, 116, self.RULE_columnExpr, _p) + _startState = 118 + self.enterRecursionRule(localctx, 118, self.RULE_columnExpr, _p) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 932 + self.state = 940 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,118,self._ctx) + la_ = self._interp.adaptivePredict(self._input,119,self._ctx) if la_ == 1: localctx = HogQLParser.ColumnExprCaseContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 783 + self.state = 791 self.match(HogQLParser.CASE) - self.state = 785 + self.state = 793 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,99,self._ctx) + la_ = self._interp.adaptivePredict(self._input,100,self._ctx) if la_ == 1: - self.state = 784 + self.state = 792 localctx.caseExpr = self.columnExpr(0) - self.state = 792 + self.state = 800 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 787 + self.state = 795 self.match(HogQLParser.WHEN) - self.state = 788 + self.state = 796 localctx.whenExpr = self.columnExpr(0) - self.state = 789 + self.state = 797 self.match(HogQLParser.THEN) - self.state = 790 + self.state = 798 localctx.thenExpr = self.columnExpr(0) - self.state = 794 + self.state = 802 self._errHandler.sync(self) _la = self._input.LA(1) - if not (_la==99): + if not (_la==101): break - self.state = 798 + self.state = 806 self._errHandler.sync(self) _la = self._input.LA(1) if _la==25: - self.state = 796 + self.state = 804 self.match(HogQLParser.ELSE) - self.state = 797 + self.state = 805 localctx.elseExpr = self.columnExpr(0) - self.state = 800 + self.state = 808 self.match(HogQLParser.END) pass @@ -6798,17 +6866,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprCastContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 802 + self.state = 810 self.match(HogQLParser.CAST) - self.state = 803 + self.state = 811 self.match(HogQLParser.LPAREN) - self.state = 804 + self.state = 812 self.columnExpr(0) - self.state = 805 + self.state = 813 self.match(HogQLParser.AS) - self.state = 806 + self.state = 814 self.columnTypeExpr() - self.state = 807 + self.state = 815 self.match(HogQLParser.RPAREN) pass @@ -6816,9 +6884,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprDateContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 809 + self.state = 817 self.match(HogQLParser.DATE) - self.state = 810 + self.state = 818 self.match(HogQLParser.STRING_LITERAL) pass @@ -6826,11 +6894,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprIntervalContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 811 + self.state = 819 self.match(HogQLParser.INTERVAL) - self.state = 812 + self.state = 820 self.columnExpr(0) - self.state = 813 + self.state = 821 self.interval() pass @@ -6838,27 +6906,27 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprSubstringContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 815 + self.state = 823 self.match(HogQLParser.SUBSTRING) - self.state = 816 + self.state = 824 self.match(HogQLParser.LPAREN) - self.state = 817 + self.state = 825 self.columnExpr(0) - self.state = 818 + self.state = 826 self.match(HogQLParser.FROM) - self.state = 819 + self.state = 827 self.columnExpr(0) - self.state = 822 + self.state = 830 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==33: - self.state = 820 + if _la==34: + self.state = 828 self.match(HogQLParser.FOR) - self.state = 821 + self.state = 829 self.columnExpr(0) - self.state = 824 + self.state = 832 self.match(HogQLParser.RPAREN) pass @@ -6866,9 +6934,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTimestampContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 826 + self.state = 834 self.match(HogQLParser.TIMESTAMP) - self.state = 827 + self.state = 835 self.match(HogQLParser.STRING_LITERAL) pass @@ -6876,24 +6944,24 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTrimContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 828 + self.state = 836 self.match(HogQLParser.TRIM) - self.state = 829 + self.state = 837 self.match(HogQLParser.LPAREN) - self.state = 830 + self.state = 838 _la = self._input.LA(1) - if not(_la==10 or _la==51 or _la==91): + if not(_la==10 or _la==53 or _la==93): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 831 + self.state = 839 self.string() - self.state = 832 + self.state = 840 self.match(HogQLParser.FROM) - self.state = 833 + self.state = 841 self.columnExpr(0) - self.state = 834 + self.state = 842 self.match(HogQLParser.RPAREN) pass @@ -6901,54 +6969,54 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprWinFunctionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 836 + self.state = 844 self.identifier() - self.state = 837 + self.state = 845 self.match(HogQLParser.LPAREN) - self.state = 839 + self.state = 847 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 838 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 846 localctx.columnExprs = self.columnExprList() - self.state = 841 + self.state = 849 self.match(HogQLParser.RPAREN) - self.state = 851 + self.state = 859 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==131: - self.state = 843 + if _la==133: + self.state = 851 self.match(HogQLParser.LPAREN) - self.state = 845 + self.state = 853 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,104,self._ctx) + la_ = self._interp.adaptivePredict(self._input,105,self._ctx) if la_ == 1: - self.state = 844 + self.state = 852 self.match(HogQLParser.DISTINCT) - self.state = 848 + self.state = 856 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 847 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 855 localctx.columnArgList = self.columnExprList() - self.state = 850 + self.state = 858 self.match(HogQLParser.RPAREN) - self.state = 853 + self.state = 861 self.match(HogQLParser.OVER) - self.state = 854 + self.state = 862 self.match(HogQLParser.LPAREN) - self.state = 855 + self.state = 863 self.windowExpr() - self.state = 856 + self.state = 864 self.match(HogQLParser.RPAREN) pass @@ -6956,50 +7024,50 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprWinFunctionTargetContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 858 + self.state = 866 self.identifier() - self.state = 859 + self.state = 867 self.match(HogQLParser.LPAREN) - self.state = 861 + self.state = 869 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 860 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 868 localctx.columnExprs = self.columnExprList() - self.state = 863 + self.state = 871 self.match(HogQLParser.RPAREN) - self.state = 873 + self.state = 881 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==131: - self.state = 865 + if _la==133: + self.state = 873 self.match(HogQLParser.LPAREN) - self.state = 867 + self.state = 875 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,108,self._ctx) + la_ = self._interp.adaptivePredict(self._input,109,self._ctx) if la_ == 1: - self.state = 866 + self.state = 874 self.match(HogQLParser.DISTINCT) - self.state = 870 + self.state = 878 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 869 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 877 localctx.columnArgList = self.columnExprList() - self.state = 872 + self.state = 880 self.match(HogQLParser.RPAREN) - self.state = 875 + self.state = 883 self.match(HogQLParser.OVER) - self.state = 876 + self.state = 884 self.identifier() pass @@ -7007,45 +7075,45 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprFunctionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 878 + self.state = 886 self.identifier() - self.state = 884 + self.state = 892 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,112,self._ctx) + la_ = self._interp.adaptivePredict(self._input,113,self._ctx) if la_ == 1: - self.state = 879 + self.state = 887 self.match(HogQLParser.LPAREN) - self.state = 881 + self.state = 889 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 880 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 888 localctx.columnExprs = self.columnExprList() - self.state = 883 + self.state = 891 self.match(HogQLParser.RPAREN) - self.state = 886 + self.state = 894 self.match(HogQLParser.LPAREN) - self.state = 888 + self.state = 896 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,113,self._ctx) + la_ = self._interp.adaptivePredict(self._input,114,self._ctx) if la_ == 1: - self.state = 887 + self.state = 895 self.match(HogQLParser.DISTINCT) - self.state = 891 + self.state = 899 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 890 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 898 localctx.columnArgList = self.columnExprList() - self.state = 893 + self.state = 901 self.match(HogQLParser.RPAREN) pass @@ -7053,7 +7121,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTagElementContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 895 + self.state = 903 self.hogqlxTagElement() pass @@ -7061,7 +7129,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTemplateStringContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 896 + self.state = 904 self.templateString() pass @@ -7069,7 +7137,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprLiteralContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 897 + self.state = 905 self.literal() pass @@ -7077,9 +7145,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprNegateContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 898 + self.state = 906 self.match(HogQLParser.DASH) - self.state = 899 + self.state = 907 self.columnExpr(20) pass @@ -7087,9 +7155,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprNotContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 900 + self.state = 908 self.match(HogQLParser.NOT) - self.state = 901 + self.state = 909 self.columnExpr(14) pass @@ -7097,17 +7165,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprAsteriskContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 905 + self.state = 913 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 902 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 910 self.tableIdentifier() - self.state = 903 + self.state = 911 self.match(HogQLParser.DOT) - self.state = 907 + self.state = 915 self.match(HogQLParser.ASTERISK) pass @@ -7115,11 +7183,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprSubqueryContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 908 + self.state = 916 self.match(HogQLParser.LPAREN) - self.state = 909 - self.selectUnionStmt() - self.state = 910 + self.state = 917 + self.selectSetStmt() + self.state = 918 self.match(HogQLParser.RPAREN) pass @@ -7127,11 +7195,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprParensContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 912 + self.state = 920 self.match(HogQLParser.LPAREN) - self.state = 913 + self.state = 921 self.columnExpr(0) - self.state = 914 + self.state = 922 self.match(HogQLParser.RPAREN) pass @@ -7139,11 +7207,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTupleContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 916 + self.state = 924 self.match(HogQLParser.LPAREN) - self.state = 917 + self.state = 925 self.columnExprList() - self.state = 918 + self.state = 926 self.match(HogQLParser.RPAREN) pass @@ -7151,17 +7219,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprArrayContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 920 + self.state = 928 self.match(HogQLParser.LBRACKET) - self.state = 922 + self.state = 930 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 921 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 929 self.columnExprList() - self.state = 924 + self.state = 932 self.match(HogQLParser.RBRACKET) pass @@ -7169,17 +7237,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprDictContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 925 + self.state = 933 self.match(HogQLParser.LBRACE) - self.state = 927 + self.state = 935 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 926 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 934 self.kvPairList() - self.state = 929 + self.state = 937 self.match(HogQLParser.RBRACE) pass @@ -7187,7 +7255,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprLambdaContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 930 + self.state = 938 self.columnLambdaExpr() pass @@ -7195,50 +7263,50 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprIdentifierContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 931 + self.state = 939 self.columnIdentifier() pass self._ctx.stop = self._input.LT(-1) - self.state = 1044 + self.state = 1052 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,130,self._ctx) + _alt = self._interp.adaptivePredict(self._input,131,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 1042 + self.state = 1050 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,129,self._ctx) + la_ = self._interp.adaptivePredict(self._input,130,self._ctx) if la_ == 1: localctx = HogQLParser.ColumnExprPrecedence1Context(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) localctx.left = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 934 + self.state = 942 if not self.precpred(self._ctx, 19): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") - self.state = 938 + self.state = 946 self._errHandler.sync(self) token = self._input.LA(1) - if token in [113]: - self.state = 935 + if token in [115]: + self.state = 943 localctx.operator = self.match(HogQLParser.ASTERISK) pass - elif token in [152]: - self.state = 936 + elif token in [154]: + self.state = 944 localctx.operator = self.match(HogQLParser.SLASH) pass - elif token in [139]: - self.state = 937 + elif token in [141]: + self.state = 945 localctx.operator = self.match(HogQLParser.PERCENT) pass else: raise NoViableAltException(self) - self.state = 940 + self.state = 948 localctx.right = self.columnExpr(20) pass @@ -7246,29 +7314,29 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprPrecedence2Context(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) localctx.left = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 941 + self.state = 949 if not self.precpred(self._ctx, 18): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 18)") - self.state = 945 + self.state = 953 self._errHandler.sync(self) token = self._input.LA(1) - if token in [140]: - self.state = 942 + if token in [142]: + self.state = 950 localctx.operator = self.match(HogQLParser.PLUS) pass - elif token in [119]: - self.state = 943 + elif token in [121]: + self.state = 951 localctx.operator = self.match(HogQLParser.DASH) pass - elif token in [118]: - self.state = 944 + elif token in [120]: + self.state = 952 localctx.operator = self.match(HogQLParser.CONCAT) pass else: raise NoViableAltException(self) - self.state = 947 + self.state = 955 localctx.right = self.columnExpr(19) pass @@ -7276,81 +7344,81 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprPrecedence3Context(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) localctx.left = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 948 + self.state = 956 if not self.precpred(self._ctx, 17): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 17)") - self.state = 973 + self.state = 981 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,124,self._ctx) + la_ = self._interp.adaptivePredict(self._input,125,self._ctx) if la_ == 1: - self.state = 949 + self.state = 957 localctx.operator = self.match(HogQLParser.EQ_DOUBLE) pass elif la_ == 2: - self.state = 950 + self.state = 958 localctx.operator = self.match(HogQLParser.EQ_SINGLE) pass elif la_ == 3: - self.state = 951 + self.state = 959 localctx.operator = self.match(HogQLParser.NOT_EQ) pass elif la_ == 4: - self.state = 952 + self.state = 960 localctx.operator = self.match(HogQLParser.LT_EQ) pass elif la_ == 5: - self.state = 953 + self.state = 961 localctx.operator = self.match(HogQLParser.LT) pass elif la_ == 6: - self.state = 954 + self.state = 962 localctx.operator = self.match(HogQLParser.GT_EQ) pass elif la_ == 7: - self.state = 955 + self.state = 963 localctx.operator = self.match(HogQLParser.GT) pass elif la_ == 8: - self.state = 957 + self.state = 965 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 956 + if _la==61: + self.state = 964 localctx.operator = self.match(HogQLParser.NOT) - self.state = 959 + self.state = 967 self.match(HogQLParser.IN) - self.state = 961 + self.state = 969 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,122,self._ctx) + la_ = self._interp.adaptivePredict(self._input,123,self._ctx) if la_ == 1: - self.state = 960 + self.state = 968 self.match(HogQLParser.COHORT) pass elif la_ == 9: - self.state = 964 + self.state = 972 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 963 + if _la==61: + self.state = 971 localctx.operator = self.match(HogQLParser.NOT) - self.state = 966 + self.state = 974 _la = self._input.LA(1) - if not(_la==42 or _la==54): + if not(_la==43 or _la==56): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -7358,268 +7426,268 @@ def columnExpr(self, _p:int=0): pass elif la_ == 10: - self.state = 967 + self.state = 975 localctx.operator = self.match(HogQLParser.REGEX_SINGLE) pass elif la_ == 11: - self.state = 968 + self.state = 976 localctx.operator = self.match(HogQLParser.REGEX_DOUBLE) pass elif la_ == 12: - self.state = 969 + self.state = 977 localctx.operator = self.match(HogQLParser.NOT_REGEX) pass elif la_ == 13: - self.state = 970 + self.state = 978 localctx.operator = self.match(HogQLParser.IREGEX_SINGLE) pass elif la_ == 14: - self.state = 971 + self.state = 979 localctx.operator = self.match(HogQLParser.IREGEX_DOUBLE) pass elif la_ == 15: - self.state = 972 + self.state = 980 localctx.operator = self.match(HogQLParser.NOT_IREGEX) pass - self.state = 975 + self.state = 983 localctx.right = self.columnExpr(18) pass elif la_ == 4: localctx = HogQLParser.ColumnExprNullishContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 976 + self.state = 984 if not self.precpred(self._ctx, 15): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 977 + self.state = 985 self.match(HogQLParser.NULLISH) - self.state = 978 + self.state = 986 self.columnExpr(16) pass elif la_ == 5: localctx = HogQLParser.ColumnExprAndContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 979 + self.state = 987 if not self.precpred(self._ctx, 13): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") - self.state = 980 + self.state = 988 self.match(HogQLParser.AND) - self.state = 981 + self.state = 989 self.columnExpr(14) pass elif la_ == 6: localctx = HogQLParser.ColumnExprOrContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 982 + self.state = 990 if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 983 + self.state = 991 self.match(HogQLParser.OR) - self.state = 984 + self.state = 992 self.columnExpr(13) pass elif la_ == 7: localctx = HogQLParser.ColumnExprBetweenContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 985 + self.state = 993 if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 987 + self.state = 995 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 986 + if _la==61: + self.state = 994 self.match(HogQLParser.NOT) - self.state = 989 + self.state = 997 self.match(HogQLParser.BETWEEN) - self.state = 990 + self.state = 998 self.columnExpr(0) - self.state = 991 + self.state = 999 self.match(HogQLParser.AND) - self.state = 992 + self.state = 1000 self.columnExpr(12) pass elif la_ == 8: localctx = HogQLParser.ColumnExprTernaryOpContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 994 + self.state = 1002 if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 995 + self.state = 1003 self.match(HogQLParser.QUERY) - self.state = 996 + self.state = 1004 self.columnExpr(0) - self.state = 997 + self.state = 1005 self.match(HogQLParser.COLON) - self.state = 998 + self.state = 1006 self.columnExpr(10) pass elif la_ == 9: localctx = HogQLParser.ColumnExprCallContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1000 + self.state = 1008 if not self.precpred(self._ctx, 30): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 30)") - self.state = 1001 + self.state = 1009 self.match(HogQLParser.LPAREN) - self.state = 1003 + self.state = 1011 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 1002 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 1010 self.columnExprList() - self.state = 1005 + self.state = 1013 self.match(HogQLParser.RPAREN) pass elif la_ == 10: localctx = HogQLParser.ColumnExprArrayAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1006 + self.state = 1014 if not self.precpred(self._ctx, 26): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 1007 + self.state = 1015 self.match(HogQLParser.LBRACKET) - self.state = 1008 + self.state = 1016 self.columnExpr(0) - self.state = 1009 + self.state = 1017 self.match(HogQLParser.RBRACKET) pass elif la_ == 11: localctx = HogQLParser.ColumnExprTupleAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1011 + self.state = 1019 if not self.precpred(self._ctx, 25): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 1012 + self.state = 1020 self.match(HogQLParser.DOT) - self.state = 1013 + self.state = 1021 self.match(HogQLParser.DECIMAL_LITERAL) pass elif la_ == 12: localctx = HogQLParser.ColumnExprPropertyAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1014 + self.state = 1022 if not self.precpred(self._ctx, 24): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") - self.state = 1015 + self.state = 1023 self.match(HogQLParser.DOT) - self.state = 1016 + self.state = 1024 self.identifier() pass elif la_ == 13: localctx = HogQLParser.ColumnExprNullArrayAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1017 + self.state = 1025 if not self.precpred(self._ctx, 23): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 23)") - self.state = 1018 + self.state = 1026 self.match(HogQLParser.NULL_PROPERTY) - self.state = 1019 + self.state = 1027 self.match(HogQLParser.LBRACKET) - self.state = 1020 + self.state = 1028 self.columnExpr(0) - self.state = 1021 + self.state = 1029 self.match(HogQLParser.RBRACKET) pass elif la_ == 14: localctx = HogQLParser.ColumnExprNullTupleAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1023 + self.state = 1031 if not self.precpred(self._ctx, 22): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 22)") - self.state = 1024 + self.state = 1032 self.match(HogQLParser.NULL_PROPERTY) - self.state = 1025 + self.state = 1033 self.match(HogQLParser.DECIMAL_LITERAL) pass elif la_ == 15: localctx = HogQLParser.ColumnExprNullPropertyAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1026 + self.state = 1034 if not self.precpred(self._ctx, 21): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 21)") - self.state = 1027 + self.state = 1035 self.match(HogQLParser.NULL_PROPERTY) - self.state = 1028 + self.state = 1036 self.identifier() pass elif la_ == 16: localctx = HogQLParser.ColumnExprIsNullContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1029 + self.state = 1037 if not self.precpred(self._ctx, 16): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") - self.state = 1030 + self.state = 1038 self.match(HogQLParser.IS) - self.state = 1032 + self.state = 1040 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 1031 + if _la==61: + self.state = 1039 self.match(HogQLParser.NOT) - self.state = 1034 + self.state = 1042 self.match(HogQLParser.NULL_SQL) pass elif la_ == 17: localctx = HogQLParser.ColumnExprAliasContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1035 + self.state = 1043 if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 1040 + self.state = 1048 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,128,self._ctx) + la_ = self._interp.adaptivePredict(self._input,129,self._ctx) if la_ == 1: - self.state = 1036 + self.state = 1044 self.match(HogQLParser.AS) - self.state = 1037 + self.state = 1045 self.identifier() pass elif la_ == 2: - self.state = 1038 + self.state = 1046 self.match(HogQLParser.AS) - self.state = 1039 + self.state = 1047 self.match(HogQLParser.STRING_LITERAL) pass @@ -7627,9 +7695,9 @@ def columnExpr(self, _p:int=0): pass - self.state = 1046 + self.state = 1054 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,130,self._ctx) + _alt = self._interp.adaptivePredict(self._input,131,self._ctx) except RecognitionException as re: localctx.exception = re @@ -7692,89 +7760,89 @@ def accept(self, visitor:ParseTreeVisitor): def columnLambdaExpr(self): localctx = HogQLParser.ColumnLambdaExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 118, self.RULE_columnLambdaExpr) + self.enterRule(localctx, 120, self.RULE_columnLambdaExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1074 + self.state = 1082 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,135,self._ctx) + la_ = self._interp.adaptivePredict(self._input,136,self._ctx) if la_ == 1: - self.state = 1047 + self.state = 1055 self.match(HogQLParser.LPAREN) - self.state = 1048 + self.state = 1056 self.identifier() - self.state = 1053 + self.state = 1061 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,131,self._ctx) + _alt = self._interp.adaptivePredict(self._input,132,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1049 + self.state = 1057 self.match(HogQLParser.COMMA) - self.state = 1050 + self.state = 1058 self.identifier() - self.state = 1055 + self.state = 1063 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,131,self._ctx) + _alt = self._interp.adaptivePredict(self._input,132,self._ctx) - self.state = 1057 + self.state = 1065 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1056 + if _la==119: + self.state = 1064 self.match(HogQLParser.COMMA) - self.state = 1059 + self.state = 1067 self.match(HogQLParser.RPAREN) pass elif la_ == 2: - self.state = 1061 + self.state = 1069 self.identifier() - self.state = 1066 + self.state = 1074 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,133,self._ctx) + _alt = self._interp.adaptivePredict(self._input,134,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1062 + self.state = 1070 self.match(HogQLParser.COMMA) - self.state = 1063 + self.state = 1071 self.identifier() - self.state = 1068 + self.state = 1076 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,133,self._ctx) + _alt = self._interp.adaptivePredict(self._input,134,self._ctx) - self.state = 1070 + self.state = 1078 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1069 + if _la==119: + self.state = 1077 self.match(HogQLParser.COMMA) pass elif la_ == 3: - self.state = 1072 + self.state = 1080 self.match(HogQLParser.LPAREN) - self.state = 1073 + self.state = 1081 self.match(HogQLParser.RPAREN) pass - self.state = 1076 + self.state = 1084 self.match(HogQLParser.ARROW) - self.state = 1079 + self.state = 1087 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,136,self._ctx) + la_ = self._interp.adaptivePredict(self._input,137,self._ctx) if la_ == 1: - self.state = 1077 + self.state = 1085 self.columnExpr(0) pass elif la_ == 2: - self.state = 1078 + self.state = 1086 self.block() pass @@ -7886,77 +7954,77 @@ def accept(self, visitor:ParseTreeVisitor): def hogqlxTagElement(self): localctx = HogQLParser.HogqlxTagElementContext(self, self._ctx, self.state) - self.enterRule(localctx, 120, self.RULE_hogqlxTagElement) + self.enterRule(localctx, 122, self.RULE_hogqlxTagElement) self._la = 0 # Token type try: - self.state = 1113 + self.state = 1121 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,140,self._ctx) + la_ = self._interp.adaptivePredict(self._input,141,self._ctx) if la_ == 1: localctx = HogQLParser.HogqlxTagElementClosedContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1081 + self.state = 1089 self.match(HogQLParser.LT) - self.state = 1082 + self.state = 1090 self.identifier() - self.state = 1086 + self.state = 1094 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 1083 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 1091 self.hogqlxTagAttribute() - self.state = 1088 + self.state = 1096 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1089 + self.state = 1097 self.match(HogQLParser.SLASH) - self.state = 1090 + self.state = 1098 self.match(HogQLParser.GT) pass elif la_ == 2: localctx = HogQLParser.HogqlxTagElementNestedContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1092 + self.state = 1100 self.match(HogQLParser.LT) - self.state = 1093 + self.state = 1101 self.identifier() - self.state = 1097 + self.state = 1105 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 1094 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 1102 self.hogqlxTagAttribute() - self.state = 1099 + self.state = 1107 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1100 + self.state = 1108 self.match(HogQLParser.GT) - self.state = 1106 + self.state = 1114 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,139,self._ctx) + la_ = self._interp.adaptivePredict(self._input,140,self._ctx) if la_ == 1: - self.state = 1101 + self.state = 1109 self.hogqlxTagElement() elif la_ == 2: - self.state = 1102 + self.state = 1110 self.match(HogQLParser.LBRACE) - self.state = 1103 + self.state = 1111 self.columnExpr(0) - self.state = 1104 + self.state = 1112 self.match(HogQLParser.RBRACE) - self.state = 1108 + self.state = 1116 self.match(HogQLParser.LT) - self.state = 1109 + self.state = 1117 self.match(HogQLParser.SLASH) - self.state = 1110 + self.state = 1118 self.identifier() - self.state = 1111 + self.state = 1119 self.match(HogQLParser.GT) pass @@ -8013,38 +8081,38 @@ def accept(self, visitor:ParseTreeVisitor): def hogqlxTagAttribute(self): localctx = HogQLParser.HogqlxTagAttributeContext(self, self._ctx, self.state) - self.enterRule(localctx, 122, self.RULE_hogqlxTagAttribute) + self.enterRule(localctx, 124, self.RULE_hogqlxTagAttribute) try: - self.state = 1126 + self.state = 1134 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,141,self._ctx) + la_ = self._interp.adaptivePredict(self._input,142,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 1115 + self.state = 1123 self.identifier() - self.state = 1116 + self.state = 1124 self.match(HogQLParser.EQ_SINGLE) - self.state = 1117 + self.state = 1125 self.string() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 1119 + self.state = 1127 self.identifier() - self.state = 1120 + self.state = 1128 self.match(HogQLParser.EQ_SINGLE) - self.state = 1121 + self.state = 1129 self.match(HogQLParser.LBRACE) - self.state = 1122 + self.state = 1130 self.columnExpr(0) - self.state = 1123 + self.state = 1131 self.match(HogQLParser.RBRACE) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 1125 + self.state = 1133 self.identifier() pass @@ -8093,30 +8161,30 @@ def accept(self, visitor:ParseTreeVisitor): def withExprList(self): localctx = HogQLParser.WithExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 124, self.RULE_withExprList) + self.enterRule(localctx, 126, self.RULE_withExprList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1128 + self.state = 1136 self.withExpr() - self.state = 1133 + self.state = 1141 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,142,self._ctx) + _alt = self._interp.adaptivePredict(self._input,143,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1129 + self.state = 1137 self.match(HogQLParser.COMMA) - self.state = 1130 + self.state = 1138 self.withExpr() - self.state = 1135 + self.state = 1143 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,142,self._ctx) + _alt = self._interp.adaptivePredict(self._input,143,self._ctx) - self.state = 1137 + self.state = 1145 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1136 + if _la==119: + self.state = 1144 self.match(HogQLParser.COMMA) @@ -8181,8 +8249,8 @@ def AS(self): return self.getToken(HogQLParser.AS, 0) def LPAREN(self): return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def RPAREN(self): return self.getToken(HogQLParser.RPAREN, 0) @@ -8198,34 +8266,34 @@ def accept(self, visitor:ParseTreeVisitor): def withExpr(self): localctx = HogQLParser.WithExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 126, self.RULE_withExpr) + self.enterRule(localctx, 128, self.RULE_withExpr) try: - self.state = 1149 + self.state = 1157 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,144,self._ctx) + la_ = self._interp.adaptivePredict(self._input,145,self._ctx) if la_ == 1: localctx = HogQLParser.WithExprSubqueryContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1139 + self.state = 1147 self.identifier() - self.state = 1140 + self.state = 1148 self.match(HogQLParser.AS) - self.state = 1141 + self.state = 1149 self.match(HogQLParser.LPAREN) - self.state = 1142 - self.selectUnionStmt() - self.state = 1143 + self.state = 1150 + self.selectSetStmt() + self.state = 1151 self.match(HogQLParser.RPAREN) pass elif la_ == 2: localctx = HogQLParser.WithExprColumnContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1145 + self.state = 1153 self.columnExpr(0) - self.state = 1146 + self.state = 1154 self.match(HogQLParser.AS) - self.state = 1147 + self.state = 1155 self.identifier() pass @@ -8276,29 +8344,29 @@ def accept(self, visitor:ParseTreeVisitor): def columnIdentifier(self): localctx = HogQLParser.ColumnIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 128, self.RULE_columnIdentifier) + self.enterRule(localctx, 130, self.RULE_columnIdentifier) try: - self.state = 1158 + self.state = 1166 self._errHandler.sync(self) token = self._input.LA(1) - if token in [129]: + if token in [131]: self.enterOuterAlt(localctx, 1) - self.state = 1151 + self.state = 1159 self.placeholder() pass - elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 103, 104, 106]: + elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 104, 105, 106, 108]: self.enterOuterAlt(localctx, 2) - self.state = 1155 + self.state = 1163 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,145,self._ctx) + la_ = self._interp.adaptivePredict(self._input,146,self._ctx) if la_ == 1: - self.state = 1152 + self.state = 1160 self.tableIdentifier() - self.state = 1153 + self.state = 1161 self.match(HogQLParser.DOT) - self.state = 1157 + self.state = 1165 self.nestedIdentifier() pass else: @@ -8348,23 +8416,23 @@ def accept(self, visitor:ParseTreeVisitor): def nestedIdentifier(self): localctx = HogQLParser.NestedIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 130, self.RULE_nestedIdentifier) + self.enterRule(localctx, 132, self.RULE_nestedIdentifier) try: self.enterOuterAlt(localctx, 1) - self.state = 1160 + self.state = 1168 self.identifier() - self.state = 1165 + self.state = 1173 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,147,self._ctx) + _alt = self._interp.adaptivePredict(self._input,148,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1161 + self.state = 1169 self.match(HogQLParser.DOT) - self.state = 1162 + self.state = 1170 self.identifier() - self.state = 1167 + self.state = 1175 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,147,self._ctx) + _alt = self._interp.adaptivePredict(self._input,148,self._ctx) except RecognitionException as re: localctx.exception = re @@ -8450,8 +8518,8 @@ def __init__(self, parser, ctx:ParserRuleContext): # actually a HogQLParser.Tabl def LPAREN(self): return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def RPAREN(self): return self.getToken(HogQLParser.RPAREN, 0) @@ -8511,19 +8579,19 @@ def tableExpr(self, _p:int=0): _parentState = self.state localctx = HogQLParser.TableExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 132 - self.enterRecursionRule(localctx, 132, self.RULE_tableExpr, _p) + _startState = 134 + self.enterRecursionRule(localctx, 134, self.RULE_tableExpr, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 1177 + self.state = 1185 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,148,self._ctx) + la_ = self._interp.adaptivePredict(self._input,149,self._ctx) if la_ == 1: localctx = HogQLParser.TableExprIdentifierContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1169 + self.state = 1177 self.tableIdentifier() pass @@ -8531,7 +8599,7 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprFunctionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1170 + self.state = 1178 self.tableFunctionExpr() pass @@ -8539,11 +8607,11 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprSubqueryContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1171 + self.state = 1179 self.match(HogQLParser.LPAREN) - self.state = 1172 - self.selectUnionStmt() - self.state = 1173 + self.state = 1180 + self.selectSetStmt() + self.state = 1181 self.match(HogQLParser.RPAREN) pass @@ -8551,7 +8619,7 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprTagContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1175 + self.state = 1183 self.hogqlxTagElement() pass @@ -8559,15 +8627,15 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprPlaceholderContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1176 + self.state = 1184 self.placeholder() pass self._ctx.stop = self._input.LT(-1) - self.state = 1187 + self.state = 1195 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,150,self._ctx) + _alt = self._interp.adaptivePredict(self._input,151,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: @@ -8575,29 +8643,29 @@ def tableExpr(self, _p:int=0): _prevctx = localctx localctx = HogQLParser.TableExprAliasContext(self, HogQLParser.TableExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_tableExpr) - self.state = 1179 + self.state = 1187 if not self.precpred(self._ctx, 3): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") - self.state = 1183 + self.state = 1191 self._errHandler.sync(self) token = self._input.LA(1) - if token in [20, 30, 40, 49, 106]: - self.state = 1180 + if token in [20, 31, 41, 51, 108]: + self.state = 1188 self.alias() pass elif token in [6]: - self.state = 1181 + self.state = 1189 self.match(HogQLParser.AS) - self.state = 1182 + self.state = 1190 self.identifier() pass else: raise NoViableAltException(self) - self.state = 1189 + self.state = 1197 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,150,self._ctx) + _alt = self._interp.adaptivePredict(self._input,151,self._ctx) except RecognitionException as re: localctx.exception = re @@ -8644,23 +8712,23 @@ def accept(self, visitor:ParseTreeVisitor): def tableFunctionExpr(self): localctx = HogQLParser.TableFunctionExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 134, self.RULE_tableFunctionExpr) + self.enterRule(localctx, 136, self.RULE_tableFunctionExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1190 + self.state = 1198 self.identifier() - self.state = 1191 + self.state = 1199 self.match(HogQLParser.LPAREN) - self.state = 1193 + self.state = 1201 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 1192 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 1200 self.tableArgList() - self.state = 1195 + self.state = 1203 self.match(HogQLParser.RPAREN) except RecognitionException as re: localctx.exception = re @@ -8704,20 +8772,20 @@ def accept(self, visitor:ParseTreeVisitor): def tableIdentifier(self): localctx = HogQLParser.TableIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 136, self.RULE_tableIdentifier) + self.enterRule(localctx, 138, self.RULE_tableIdentifier) try: self.enterOuterAlt(localctx, 1) - self.state = 1200 + self.state = 1208 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,152,self._ctx) + la_ = self._interp.adaptivePredict(self._input,153,self._ctx) if la_ == 1: - self.state = 1197 + self.state = 1205 self.databaseIdentifier() - self.state = 1198 + self.state = 1206 self.match(HogQLParser.DOT) - self.state = 1202 + self.state = 1210 self.identifier() except RecognitionException as re: localctx.exception = re @@ -8763,30 +8831,30 @@ def accept(self, visitor:ParseTreeVisitor): def tableArgList(self): localctx = HogQLParser.TableArgListContext(self, self._ctx, self.state) - self.enterRule(localctx, 138, self.RULE_tableArgList) + self.enterRule(localctx, 140, self.RULE_tableArgList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1204 + self.state = 1212 self.columnExpr(0) - self.state = 1209 + self.state = 1217 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,153,self._ctx) + _alt = self._interp.adaptivePredict(self._input,154,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1205 + self.state = 1213 self.match(HogQLParser.COMMA) - self.state = 1206 + self.state = 1214 self.columnExpr(0) - self.state = 1211 + self.state = 1219 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,153,self._ctx) + _alt = self._interp.adaptivePredict(self._input,154,self._ctx) - self.state = 1213 + self.state = 1221 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1212 + if _la==119: + self.state = 1220 self.match(HogQLParser.COMMA) @@ -8825,10 +8893,10 @@ def accept(self, visitor:ParseTreeVisitor): def databaseIdentifier(self): localctx = HogQLParser.DatabaseIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 140, self.RULE_databaseIdentifier) + self.enterRule(localctx, 142, self.RULE_databaseIdentifier) try: self.enterOuterAlt(localctx, 1) - self.state = 1215 + self.state = 1223 self.identifier() except RecognitionException as re: localctx.exception = re @@ -8876,42 +8944,42 @@ def accept(self, visitor:ParseTreeVisitor): def floatingLiteral(self): localctx = HogQLParser.FloatingLiteralContext(self, self._ctx, self.state) - self.enterRule(localctx, 142, self.RULE_floatingLiteral) + self.enterRule(localctx, 144, self.RULE_floatingLiteral) self._la = 0 # Token type try: - self.state = 1225 + self.state = 1233 self._errHandler.sync(self) token = self._input.LA(1) - if token in [107]: + if token in [109]: self.enterOuterAlt(localctx, 1) - self.state = 1217 + self.state = 1225 self.match(HogQLParser.FLOATING_LITERAL) pass - elif token in [121]: + elif token in [123]: self.enterOuterAlt(localctx, 2) - self.state = 1218 + self.state = 1226 self.match(HogQLParser.DOT) - self.state = 1219 + self.state = 1227 _la = self._input.LA(1) - if not(_la==108 or _la==109): + if not(_la==110 or _la==111): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() pass - elif token in [109]: + elif token in [111]: self.enterOuterAlt(localctx, 3) - self.state = 1220 + self.state = 1228 self.match(HogQLParser.DECIMAL_LITERAL) - self.state = 1221 + self.state = 1229 self.match(HogQLParser.DOT) - self.state = 1223 + self.state = 1231 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,155,self._ctx) + la_ = self._interp.adaptivePredict(self._input,156,self._ctx) if la_ == 1: - self.state = 1222 + self.state = 1230 _la = self._input.LA(1) - if not(_la==108 or _la==109): + if not(_la==110 or _la==111): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -8978,53 +9046,53 @@ def accept(self, visitor:ParseTreeVisitor): def numberLiteral(self): localctx = HogQLParser.NumberLiteralContext(self, self._ctx, self.state) - self.enterRule(localctx, 144, self.RULE_numberLiteral) + self.enterRule(localctx, 146, self.RULE_numberLiteral) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1228 + self.state = 1236 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==119 or _la==140: - self.state = 1227 + if _la==121 or _la==142: + self.state = 1235 _la = self._input.LA(1) - if not(_la==119 or _la==140): + if not(_la==121 or _la==142): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 1236 + self.state = 1244 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,158,self._ctx) + la_ = self._interp.adaptivePredict(self._input,159,self._ctx) if la_ == 1: - self.state = 1230 + self.state = 1238 self.floatingLiteral() pass elif la_ == 2: - self.state = 1231 + self.state = 1239 self.match(HogQLParser.OCTAL_LITERAL) pass elif la_ == 3: - self.state = 1232 + self.state = 1240 self.match(HogQLParser.DECIMAL_LITERAL) pass elif la_ == 4: - self.state = 1233 + self.state = 1241 self.match(HogQLParser.HEXADECIMAL_LITERAL) pass elif la_ == 5: - self.state = 1234 + self.state = 1242 self.match(HogQLParser.INF) pass elif la_ == 6: - self.state = 1235 + self.state = 1243 self.match(HogQLParser.NAN_SQL) pass @@ -9070,24 +9138,24 @@ def accept(self, visitor:ParseTreeVisitor): def literal(self): localctx = HogQLParser.LiteralContext(self, self._ctx, self.state) - self.enterRule(localctx, 146, self.RULE_literal) + self.enterRule(localctx, 148, self.RULE_literal) try: - self.state = 1241 + self.state = 1249 self._errHandler.sync(self) token = self._input.LA(1) - if token in [44, 58, 107, 108, 109, 110, 119, 121, 140]: + if token in [45, 60, 109, 110, 111, 112, 121, 123, 142]: self.enterOuterAlt(localctx, 1) - self.state = 1238 + self.state = 1246 self.numberLiteral() pass - elif token in [111]: + elif token in [113]: self.enterOuterAlt(localctx, 2) - self.state = 1239 + self.state = 1247 self.match(HogQLParser.STRING_LITERAL) pass - elif token in [60]: + elif token in [62]: self.enterOuterAlt(localctx, 3) - self.state = 1240 + self.state = 1248 self.match(HogQLParser.NULL_SQL) pass else: @@ -9148,13 +9216,13 @@ def accept(self, visitor:ParseTreeVisitor): def interval(self): localctx = HogQLParser.IntervalContext(self, self._ctx, self.state) - self.enterRule(localctx, 148, self.RULE_interval) + self.enterRule(localctx, 150, self.RULE_interval) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1243 + self.state = 1251 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 216173331871694848) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & 8724152577) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 864692227968860160) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & 8724152577) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -9445,13 +9513,13 @@ def accept(self, visitor:ParseTreeVisitor): def keyword(self): localctx = HogQLParser.KeywordContext(self, self._ctx, self.state) - self.enterRule(localctx, 150, self.RULE_keyword) + self.enterRule(localctx, 152, self.RULE_keyword) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1245 + self.state = 1253 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -1666350075474886658) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 943816933247) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -6665504612824399874) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 3775267732991) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -9499,13 +9567,13 @@ def accept(self, visitor:ParseTreeVisitor): def keywordForAlias(self): localctx = HogQLParser.KeywordForAliasContext(self, self._ctx, self.state) - self.enterRule(localctx, 152, self.RULE_keywordForAlias) + self.enterRule(localctx, 154, self.RULE_keywordForAlias) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1247 + self.state = 1255 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 564050539839488) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 2254000985473024) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -9548,19 +9616,19 @@ def accept(self, visitor:ParseTreeVisitor): def alias(self): localctx = HogQLParser.AliasContext(self, self._ctx, self.state) - self.enterRule(localctx, 154, self.RULE_alias) + self.enterRule(localctx, 156, self.RULE_alias) try: - self.state = 1251 + self.state = 1259 self._errHandler.sync(self) token = self._input.LA(1) - if token in [106]: + if token in [108]: self.enterOuterAlt(localctx, 1) - self.state = 1249 + self.state = 1257 self.match(HogQLParser.IDENTIFIER) pass - elif token in [20, 30, 40, 49]: + elif token in [20, 31, 41, 51]: self.enterOuterAlt(localctx, 2) - self.state = 1250 + self.state = 1258 self.keywordForAlias() pass else: @@ -9608,24 +9676,24 @@ def accept(self, visitor:ParseTreeVisitor): def identifier(self): localctx = HogQLParser.IdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 156, self.RULE_identifier) + self.enterRule(localctx, 158, self.RULE_identifier) try: - self.state = 1256 + self.state = 1264 self._errHandler.sync(self) token = self._input.LA(1) - if token in [106]: + if token in [108]: self.enterOuterAlt(localctx, 1) - self.state = 1253 + self.state = 1261 self.match(HogQLParser.IDENTIFIER) pass - elif token in [21, 39, 56, 57, 71, 79, 98, 104]: + elif token in [21, 40, 58, 59, 73, 81, 100, 106]: self.enterOuterAlt(localctx, 2) - self.state = 1254 + self.state = 1262 self.interval() pass - elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 76, 77, 78, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 99, 100, 102, 103]: + elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 29, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 101, 102, 104, 105]: self.enterOuterAlt(localctx, 3) - self.state = 1255 + self.state = 1263 self.keyword() pass else: @@ -9673,14 +9741,14 @@ def accept(self, visitor:ParseTreeVisitor): def enumValue(self): localctx = HogQLParser.EnumValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 158, self.RULE_enumValue) + self.enterRule(localctx, 160, self.RULE_enumValue) try: self.enterOuterAlt(localctx, 1) - self.state = 1258 + self.state = 1266 self.string() - self.state = 1259 + self.state = 1267 self.match(HogQLParser.EQ_SINGLE) - self.state = 1260 + self.state = 1268 self.numberLiteral() except RecognitionException as re: localctx.exception = re @@ -9723,14 +9791,14 @@ def accept(self, visitor:ParseTreeVisitor): def placeholder(self): localctx = HogQLParser.PlaceholderContext(self, self._ctx, self.state) - self.enterRule(localctx, 160, self.RULE_placeholder) + self.enterRule(localctx, 162, self.RULE_placeholder) try: self.enterOuterAlt(localctx, 1) - self.state = 1262 + self.state = 1270 self.match(HogQLParser.LBRACE) - self.state = 1263 + self.state = 1271 self.columnExpr(0) - self.state = 1264 + self.state = 1272 self.match(HogQLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -9770,19 +9838,19 @@ def accept(self, visitor:ParseTreeVisitor): def string(self): localctx = HogQLParser.StringContext(self, self._ctx, self.state) - self.enterRule(localctx, 162, self.RULE_string) + self.enterRule(localctx, 164, self.RULE_string) try: - self.state = 1268 + self.state = 1276 self._errHandler.sync(self) token = self._input.LA(1) - if token in [111]: + if token in [113]: self.enterOuterAlt(localctx, 1) - self.state = 1266 + self.state = 1274 self.match(HogQLParser.STRING_LITERAL) pass - elif token in [143]: + elif token in [145]: self.enterOuterAlt(localctx, 2) - self.state = 1267 + self.state = 1275 self.templateString() pass else: @@ -9832,23 +9900,23 @@ def accept(self, visitor:ParseTreeVisitor): def templateString(self): localctx = HogQLParser.TemplateStringContext(self, self._ctx, self.state) - self.enterRule(localctx, 164, self.RULE_templateString) + self.enterRule(localctx, 166, self.RULE_templateString) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1270 + self.state = 1278 self.match(HogQLParser.QUOTE_SINGLE_TEMPLATE) - self.state = 1274 + self.state = 1282 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==157 or _la==158: - self.state = 1271 + while _la==159 or _la==160: + self.state = 1279 self.stringContents() - self.state = 1276 + self.state = 1284 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1277 + self.state = 1285 self.match(HogQLParser.QUOTE_SINGLE) except RecognitionException as re: localctx.exception = re @@ -9894,23 +9962,23 @@ def accept(self, visitor:ParseTreeVisitor): def stringContents(self): localctx = HogQLParser.StringContentsContext(self, self._ctx, self.state) - self.enterRule(localctx, 166, self.RULE_stringContents) + self.enterRule(localctx, 168, self.RULE_stringContents) try: - self.state = 1284 + self.state = 1292 self._errHandler.sync(self) token = self._input.LA(1) - if token in [158]: + if token in [160]: self.enterOuterAlt(localctx, 1) - self.state = 1279 + self.state = 1287 self.match(HogQLParser.STRING_ESCAPE_TRIGGER) - self.state = 1280 + self.state = 1288 self.columnExpr(0) - self.state = 1281 + self.state = 1289 self.match(HogQLParser.RBRACE) pass - elif token in [157]: + elif token in [159]: self.enterOuterAlt(localctx, 2) - self.state = 1283 + self.state = 1291 self.match(HogQLParser.STRING_TEXT) pass else: @@ -9960,23 +10028,23 @@ def accept(self, visitor:ParseTreeVisitor): def fullTemplateString(self): localctx = HogQLParser.FullTemplateStringContext(self, self._ctx, self.state) - self.enterRule(localctx, 168, self.RULE_fullTemplateString) + self.enterRule(localctx, 170, self.RULE_fullTemplateString) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1286 + self.state = 1294 self.match(HogQLParser.QUOTE_SINGLE_TEMPLATE_FULL) - self.state = 1290 + self.state = 1298 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==159 or _la==160: - self.state = 1287 + while _la==161 or _la==162: + self.state = 1295 self.stringContentsFull() - self.state = 1292 + self.state = 1300 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1293 + self.state = 1301 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -10022,23 +10090,23 @@ def accept(self, visitor:ParseTreeVisitor): def stringContentsFull(self): localctx = HogQLParser.StringContentsFullContext(self, self._ctx, self.state) - self.enterRule(localctx, 170, self.RULE_stringContentsFull) + self.enterRule(localctx, 172, self.RULE_stringContentsFull) try: - self.state = 1300 + self.state = 1308 self._errHandler.sync(self) token = self._input.LA(1) - if token in [160]: + if token in [162]: self.enterOuterAlt(localctx, 1) - self.state = 1295 + self.state = 1303 self.match(HogQLParser.FULL_STRING_ESCAPE_TRIGGER) - self.state = 1296 + self.state = 1304 self.columnExpr(0) - self.state = 1297 + self.state = 1305 self.match(HogQLParser.RBRACE) pass - elif token in [159]: + elif token in [161]: self.enterOuterAlt(localctx, 2) - self.state = 1299 + self.state = 1307 self.match(HogQLParser.FULL_STRING_TEXT) pass else: @@ -10057,9 +10125,9 @@ def stringContentsFull(self): def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): if self._predicates == None: self._predicates = dict() - self._predicates[39] = self.joinExpr_sempred - self._predicates[58] = self.columnExpr_sempred - self._predicates[66] = self.tableExpr_sempred + self._predicates[40] = self.joinExpr_sempred + self._predicates[59] = self.columnExpr_sempred + self._predicates[67] = self.tableExpr_sempred pred = self._predicates.get(ruleIndex, None) if pred is None: raise Exception("No predicate with index:" + str(ruleIndex)) diff --git a/posthog/hogql/grammar/HogQLParser.tokens b/posthog/hogql/grammar/HogQLParser.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/posthog/hogql/grammar/HogQLParser.tokens +++ b/posthog/hogql/grammar/HogQLParser.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/posthog/hogql/grammar/HogQLParserVisitor.py b/posthog/hogql/grammar/HogQLParserVisitor.py index be0ba9f0e29da..98cef12617913 100644 --- a/posthog/hogql/grammar/HogQLParserVisitor.py +++ b/posthog/hogql/grammar/HogQLParserVisitor.py @@ -119,13 +119,18 @@ def visitSelect(self, ctx:HogQLParser.SelectContext): return self.visitChildren(ctx) - # Visit a parse tree produced by HogQLParser#selectUnionStmt. - def visitSelectUnionStmt(self, ctx:HogQLParser.SelectUnionStmtContext): + # Visit a parse tree produced by HogQLParser#selectStmtWithParens. + def visitSelectStmtWithParens(self, ctx:HogQLParser.SelectStmtWithParensContext): return self.visitChildren(ctx) - # Visit a parse tree produced by HogQLParser#selectStmtWithParens. - def visitSelectStmtWithParens(self, ctx:HogQLParser.SelectStmtWithParensContext): + # Visit a parse tree produced by HogQLParser#subsequentSelectSetClause. + def visitSubsequentSelectSetClause(self, ctx:HogQLParser.SubsequentSelectSetClauseContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by HogQLParser#selectSetStmt. + def visitSelectSetStmt(self, ctx:HogQLParser.SelectSetStmtContext): return self.visitChildren(ctx) diff --git a/posthog/hogql/metadata.py b/posthog/hogql/metadata.py index 34730b7b1a19b..fdfaa8bcde774 100644 --- a/posthog/hogql/metadata.py +++ b/posthog/hogql/metadata.py @@ -13,6 +13,7 @@ from posthog.hogql.visitor import clone_expr from posthog.hogql_queries.query_runner import get_query_runner from posthog.models import Team +from posthog.hogql.resolver_utils import extract_select_queries from posthog.schema import HogQLMetadataResponse, HogQLMetadata, HogQLNotice, HogLanguage from posthog.hogql import ast @@ -99,7 +100,7 @@ def get_hogql_metadata( def process_expr_on_table( node: ast.Expr, context: HogQLContext, - source_query: Optional[ast.SelectQuery | ast.SelectUnionQuery] = None, + source_query: Optional[ast.SelectQuery | ast.SelectSetQuery] = None, ): try: if source_query is not None: @@ -114,15 +115,9 @@ def process_expr_on_table( raise -def is_valid_view(select_query: ast.SelectQuery | ast.SelectUnionQuery) -> bool: - if isinstance(select_query, ast.SelectQuery): - for field in select_query.select: +def is_valid_view(select_query: ast.SelectQuery | ast.SelectSetQuery) -> bool: + for query in extract_select_queries(select_query): + for field in query.select: if not isinstance(field, ast.Alias): return False - elif isinstance(select_query, ast.SelectUnionQuery): - for select in select_query.select_queries: - for field in select.select: - if not isinstance(field, ast.Alias): - return False - return True diff --git a/posthog/hogql/parser.py b/posthog/hogql/parser.py index 960dbe3ebf824..29a0d4dd09130 100644 --- a/posthog/hogql/parser.py +++ b/posthog/hogql/parser.py @@ -6,6 +6,7 @@ from prometheus_client import Histogram from posthog.hogql import ast +from posthog.hogql.ast import SelectSetNode from posthog.hogql.base import AST from posthog.hogql.constants import RESERVED_KEYWORDS from posthog.hogql.errors import BaseHogQLError, NotImplementedError, SyntaxError @@ -132,7 +133,7 @@ def parse_select( timings: Optional[HogQLTimings] = None, *, backend: Literal["python", "cpp"] = "cpp", -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: if timings is None: timings = HogQLTimings() with timings.measure(f"parse_select_{backend}"): @@ -327,28 +328,33 @@ def visitBlock(self, ctx: HogQLParser.BlockContext): ##### HogQL rules def visitSelect(self, ctx: HogQLParser.SelectContext): - return self.visit(ctx.selectUnionStmt() or ctx.selectStmt() or ctx.hogqlxTagElement()) - - def visitSelectUnionStmt(self, ctx: HogQLParser.SelectUnionStmtContext): - select_queries: list[ast.SelectQuery | ast.SelectUnionQuery | ast.Placeholder] = [ - self.visit(select) for select in ctx.selectStmtWithParens() - ] - flattened_queries: list[ast.SelectQuery] = [] - for query in select_queries: - if isinstance(query, ast.SelectQuery): - flattened_queries.append(query) - elif isinstance(query, ast.SelectUnionQuery): - flattened_queries.extend(query.select_queries) - elif isinstance(query, ast.Placeholder): - flattened_queries.append(query) # type: ignore + return self.visit(ctx.selectSetStmt() or ctx.selectStmt() or ctx.hogqlxTagElement()) + + def visitSelectSetStmt(self, ctx: HogQLParser.SelectSetStmtContext): + select_queries: list[SelectSetNode] = [] + + initial_query = self.visit(ctx.selectStmtWithParens()) + + for subsequent in ctx.subsequentSelectSetClause(): + if subsequent.UNION() and subsequent.ALL(): + union_type = "UNION ALL" + elif subsequent.INTERSECT(): + union_type = "INTERSECT" + elif subsequent.EXCEPT(): + union_type = "EXCEPT" else: - raise Exception(f"Unexpected query node type {type(query).__name__}") - if len(flattened_queries) == 1: - return flattened_queries[0] - return ast.SelectUnionQuery(select_queries=flattened_queries) + raise SyntaxError("Set operator must be one of UNION ALL, INTERSECT, and EXCEPT") + select_query = self.visit(subsequent.selectStmtWithParens()) + select_queries.append( + SelectSetNode(select_query=select_query, set_operator=cast(ast.SetOperator, union_type)) + ) + + if len(select_queries) == 0: + return initial_query + return ast.SelectSetQuery(initial_select_query=initial_query, subsequent_select_queries=select_queries) def visitSelectStmtWithParens(self, ctx: HogQLParser.SelectStmtWithParensContext): - return self.visit(ctx.selectStmt() or ctx.selectUnionStmt() or ctx.placeholder()) + return self.visit(ctx.selectStmt() or ctx.selectSetStmt() or ctx.placeholder()) def visitSelectStmt(self, ctx: HogQLParser.SelectStmtContext): select_query = ast.SelectQuery( @@ -673,7 +679,7 @@ def visitColumnExprDict(self, ctx: HogQLParser.ColumnExprDictContext): return ast.Dict(items=self.visit(ctx.kvPairList()) if ctx.kvPairList() else []) def visitColumnExprSubquery(self, ctx: HogQLParser.ColumnExprSubqueryContext): - return self.visit(ctx.selectUnionStmt()) + return self.visit(ctx.selectSetStmt()) def visitColumnExprLiteral(self, ctx: HogQLParser.ColumnExprLiteralContext): return self.visitChildren(ctx) @@ -958,7 +964,7 @@ def visitWithExprList(self, ctx: HogQLParser.WithExprListContext): return ctes def visitWithExprSubquery(self, ctx: HogQLParser.WithExprSubqueryContext): - subquery = self.visit(ctx.selectUnionStmt()) + subquery = self.visit(ctx.selectSetStmt()) name = self.visit(ctx.identifier()) return ast.CTE(name=name, expr=subquery, cte_type="subquery") @@ -992,7 +998,7 @@ def visitTableExprIdentifier(self, ctx: HogQLParser.TableExprIdentifierContext): return ast.Field(chain=chain) def visitTableExprSubquery(self, ctx: HogQLParser.TableExprSubqueryContext): - return self.visit(ctx.selectUnionStmt()) + return self.visit(ctx.selectSetStmt()) def visitTableExprPlaceholder(self, ctx: HogQLParser.TableExprPlaceholderContext): return self.visit(ctx.placeholder()) diff --git a/posthog/hogql/printer.py b/posthog/hogql/printer.py index 535057b8feea1..66f662f225fcc 100644 --- a/posthog/hogql/printer.py +++ b/posthog/hogql/printer.py @@ -266,7 +266,7 @@ def visit(self, node: AST | None): self.stack.pop() if len(self.stack) == 0 and self.dialect == "clickhouse" and self.settings: - if not isinstance(node, ast.SelectQuery) and not isinstance(node, ast.SelectUnionQuery): + if not isinstance(node, ast.SelectQuery) and not isinstance(node, ast.SelectSetQuery): raise QueryError("Settings can only be applied to SELECT queries") settings = self._print_settings(self.settings) if settings is not None: @@ -274,17 +274,25 @@ def visit(self, node: AST | None): return response - def visit_select_union_query(self, node: ast.SelectUnionQuery): + def visit_select_set_query(self, node: ast.SelectSetQuery): self._indent -= 1 - queries = [self.visit(expr) for expr in node.select_queries] + ret = self.visit(node.initial_select_query) if self.pretty: - query = f"\n{self.indent(1)}UNION ALL\n{self.indent(1)}".join([query.strip() for query in queries]) - else: - query = " UNION ALL ".join(queries) + ret = ret.strip() + for expr in node.subsequent_select_queries: + query = self.visit(expr.select_query) + if self.pretty: + query = query.strip() + if expr.set_operator is not None: + if self.pretty: + ret += f"\n{self.indent(1)}{expr.set_operator}\n{self.indent(1)}" + else: + ret += f" {expr.set_operator} " + ret += query self._indent += 1 if len(self.stack) > 1: - return f"({query.strip()})" - return query + return f"({ret.strip()})" + return ret def visit_select_query(self, node: ast.SelectQuery): if self.dialect == "clickhouse": @@ -293,8 +301,8 @@ def visit_select_query(self, node: ast.SelectQuery): if not self.context.team_id: raise InternalHogQLError("Full SELECT queries are disabled if context.team_id is not set") - # if we are the first parsed node in the tree, or a child of a SelectUnionQuery, mark us as a top level query - part_of_select_union = len(self.stack) >= 2 and isinstance(self.stack[-2], ast.SelectUnionQuery) + # if we are the first parsed node in the tree, or a child of a SelectSetQuery, mark us as a top level query + part_of_select_union = len(self.stack) >= 2 and isinstance(self.stack[-2], ast.SelectSetQuery) is_top_level_query = len(self.stack) <= 1 or (len(self.stack) == 2 and part_of_select_union) # We will add extra clauses onto this from the joined tables @@ -507,7 +515,7 @@ def visit_join_expr(self, node: ast.JoinExpr) -> JoinExprResponse: elif isinstance(node.type, ast.SelectQueryType): join_strings.append(self.visit(node.table)) - elif isinstance(node.type, ast.SelectUnionQueryType): + elif isinstance(node.type, ast.SelectSetQueryType): join_strings.append(self.visit(node.table)) elif isinstance(node.type, ast.SelectViewType) and node.alias is not None: @@ -1251,7 +1259,7 @@ def visit_field_type(self, type: ast.FieldType): isinstance(type.table_type, ast.SelectQueryType) or isinstance(type.table_type, ast.SelectQueryAliasType) or isinstance(type.table_type, ast.SelectViewType) - or isinstance(type.table_type, ast.SelectUnionQueryType) + or isinstance(type.table_type, ast.SelectSetQueryType) ): field_sql = self._print_identifier(type.name) if isinstance(type.table_type, ast.SelectQueryAliasType) or isinstance(type.table_type, ast.SelectViewType): diff --git a/posthog/hogql/query.py b/posthog/hogql/query.py index 2516d8007d815..1a556e1298b28 100644 --- a/posthog/hogql/query.py +++ b/posthog/hogql/query.py @@ -19,6 +19,7 @@ from posthog.hogql.timings import HogQLTimings from posthog.hogql.variables import replace_variables from posthog.hogql.visitor import clone_expr +from posthog.hogql.resolver_utils import extract_select_queries from posthog.models.team import Team from posthog.clickhouse.query_tagging import tag_queries from posthog.client import sync_execute @@ -35,7 +36,7 @@ def execute_hogql_query( - query: Union[str, ast.SelectQuery, ast.SelectUnionQuery], + query: Union[str, ast.SelectQuery, ast.SelectSetQuery], team: Team, *, query_type: str = "hogql_query", @@ -65,7 +66,7 @@ def execute_hogql_query( metadata: Optional[HogQLMetadataResponse] = None with timings.measure("query"): - if isinstance(query, ast.SelectQuery) or isinstance(query, ast.SelectUnionQuery): + if isinstance(query, ast.SelectQuery) or isinstance(query, ast.SelectSetQuery): select_query = query query = None else: @@ -105,10 +106,7 @@ def execute_hogql_query( select_query = replace_placeholders(select_query, placeholders) with timings.measure("max_limit"): - select_queries = ( - select_query.select_queries if isinstance(select_query, ast.SelectUnionQuery) else [select_query] - ) - for one_query in select_queries: + for one_query in extract_select_queries(select_query): if one_query.limit is None: one_query.limit = ast.Constant(value=get_default_limit_for_context(limit_context)) @@ -138,8 +136,8 @@ def execute_hogql_query( ) print_columns = [] columns_query = ( - select_query_hogql.select_queries[0] - if isinstance(select_query_hogql, ast.SelectUnionQuery) + next(extract_select_queries(select_query_hogql)) + if isinstance(select_query_hogql, ast.SelectSetQuery) else select_query_hogql ) for node in columns_query.select: diff --git a/posthog/hogql/resolver.py b/posthog/hogql/resolver.py index b263843598f87..e1ddae4c545f0 100644 --- a/posthog/hogql/resolver.py +++ b/posthog/hogql/resolver.py @@ -24,7 +24,12 @@ from posthog.hogql.functions.sparkline import sparkline from posthog.hogql.hogqlx import HOGQLX_COMPONENTS, convert_to_hx from posthog.hogql.parser import parse_select -from posthog.hogql.resolver_utils import expand_hogqlx_query, lookup_cte_by_name, lookup_field_by_name +from posthog.hogql.resolver_utils import ( + expand_hogqlx_query, + lookup_cte_by_name, + lookup_field_by_name, + extract_select_queries, +) from posthog.hogql.visitor import CloningVisitor, TraversingVisitor, clone_expr from posthog.models.utils import UUIDT @@ -123,15 +128,17 @@ def visit(self, node: ast.AST | None): raise QueryError("Too many CTE expansions (50+). Probably a CTE loop.") return super().visit(node) - def visit_select_union_query(self, node: ast.SelectUnionQuery): + def visit_select_set_query(self, node: ast.SelectSetQuery): # all expressions combined by UNION ALL can use CTEs from the first expression # so we put these CTEs to the scope - default_ctes = node.select_queries[0].ctes if node.select_queries else None + default_ctes = next(extract_select_queries(node)).ctes if default_ctes: self.scopes.append(ast.SelectQueryType(ctes=default_ctes)) - node = super().visit_select_union_query(node) - node.type = ast.SelectUnionQueryType(types=[expr.type for expr in node.select_queries]) + node = super().visit_select_set_query(node) + node.type = ast.SelectSetQueryType( + types=[node.initial_select_query.type, *(x.select_query.type for x in node.subsequent_select_queries)] # type: ignore + ) if default_ctes: self.scopes.pop() @@ -254,7 +261,7 @@ def _asterisk_columns(self, asterisk: ast.AsteriskType) -> list[ast.Expr]: database_fields = table.get_asterisk() return [ast.Field(chain=[key]) for key in database_fields.keys()] elif ( - isinstance(asterisk.table_type, ast.SelectUnionQueryType) + isinstance(asterisk.table_type, ast.SelectSetQueryType) or isinstance(asterisk.table_type, ast.SelectQueryType) or isinstance(asterisk.table_type, ast.SelectQueryAliasType) or isinstance(asterisk.table_type, ast.SelectViewType) @@ -262,7 +269,7 @@ def _asterisk_columns(self, asterisk: ast.AsteriskType) -> list[ast.Expr]: select = asterisk.table_type while isinstance(select, ast.SelectQueryAliasType) or isinstance(select, ast.SelectViewType): select = select.select_query_type - if isinstance(select, ast.SelectUnionQueryType): + if isinstance(select, ast.SelectSetQueryType): select = select.types[0] if isinstance(select, ast.SelectQueryType): return [ast.Field(chain=[key]) for key in select.columns.keys()] @@ -369,7 +376,7 @@ def visit_join_expr(self, node: ast.JoinExpr): return node - elif isinstance(node.table, ast.SelectQuery) or isinstance(node.table, ast.SelectUnionQuery): + elif isinstance(node.table, ast.SelectQuery) or isinstance(node.table, ast.SelectSetQuery): node = cast(ast.JoinExpr, clone_expr(node)) if node.constraint and node.constraint.constraint_type == "USING": # visit USING constraint before adding the table to avoid ambiguous names diff --git a/posthog/hogql/resolver_utils.py b/posthog/hogql/resolver_utils.py index f67f683449b02..6ed44a9643d2a 100644 --- a/posthog/hogql/resolver_utils.py +++ b/posthog/hogql/resolver_utils.py @@ -1,4 +1,5 @@ from typing import Optional +from collections.abc import Generator from posthog import schema from posthog.hogql import ast @@ -86,3 +87,12 @@ def expand_hogqlx_query(node: ast.HogQLXTag, team_id: Optional[int]): return query except Exception as e: raise ResolutionError(f"Error parsing query tag: {e}", start=node.start, end=node.end) + + +def extract_select_queries(select: ast.SelectSetQuery | ast.SelectQuery) -> Generator[ast.SelectQuery, None, None]: + if isinstance(select, ast.SelectQuery): + yield select + else: + yield from extract_select_queries(select.initial_select_query) + for select_query in select.subsequent_select_queries: + yield from extract_select_queries(select_query.select_query) diff --git a/posthog/hogql/test/__snapshots__/test_resolver.ambr b/posthog/hogql/test/__snapshots__/test_resolver.ambr index d38d909cc43e7..0131376631bcc 100644 --- a/posthog/hogql/test/__snapshots__/test_resolver.ambr +++ b/posthog/hogql/test/__snapshots__/test_resolver.ambr @@ -2065,925 +2065,928 @@ ] select_from: { table: { - select_queries: [ - { - select: [ - { - alias: "uuid" - expr: { - chain: [ - "uuid" - ] - type: - } - hidden: True + initial_select_query: { + select: [ + { + alias: "uuid" + expr: { + chain: [ + "uuid" + ] type: - }, - { - alias: "event" - expr: { - chain: [ - "event" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "event" + expr: { + chain: [ + "event" + ] type: - }, - { - alias: "properties" - expr: { - chain: [ - "properties" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "properties" + expr: { + chain: [ + "properties" + ] type: - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "timestamp" + expr: { + chain: [ + "timestamp" + ] type: - }, - { - alias: "distinct_id" - expr: { - chain: [ - "distinct_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "distinct_id" + expr: { + chain: [ + "distinct_id" + ] type: - }, - { - alias: "elements_chain" - expr: { - chain: [ - "elements_chain" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain" + expr: { + chain: [ + "elements_chain" + ] type: - }, - { - alias: "created_at" - expr: { - chain: [ - "created_at" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "created_at" + expr: { + chain: [ + "created_at" + ] type: - }, - { - alias: "$session_id" - expr: { - chain: [ - "$session_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$session_id" + expr: { + chain: [ + "$session_id" + ] type: - }, - { - alias: "$window_id" - expr: { - chain: [ - "$window_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$window_id" + expr: { + chain: [ + "$window_id" + ] type: - }, - { - alias: "person_id" - expr: { - args: [ - { - args: [ - { - args: [ - { - alias: "distinct_id" - expr: { - chain: [ - "override", - "distinct_id" - ] - type: { - name: "distinct_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None - } - table_type: + } + hidden: True + type: + }, + { + alias: "person_id" + expr: { + args: [ + { + args: [ + { + args: [ + { + alias: "distinct_id" + expr: { + chain: [ + "override", + "distinct_id" + ] + type: { + name: "distinct_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None } + table_type: } } - hidden: True - type: { - alias: "distinct_id" - type: - } } - ] - distinct: False - name: "empty" - type: { - arg_types: [ - { - data_type: "str" - nullable: False - } - ] - name: "empty" - return_type: { - data_type: "unknown" - nullable: True + hidden: True + type: { + alias: "distinct_id" + type: } } - } - ] - distinct: False - name: "not" - type: { - arg_types: [ - - ] - name: "not" - return_type: - } - }, - { - alias: "person_id" - expr: { - chain: [ - "override", - "person_id" ] + distinct: False + name: "empty" type: { - name: "person_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None + arg_types: [ + { + data_type: "str" + nullable: False } - table_type: + ] + name: "empty" + return_type: { + data_type: "unknown" + nullable: True } } } - hidden: True + ] + distinct: False + name: "not" + type: { + arg_types: [ + + ] + name: "not" + return_type: + } + }, + { + alias: "person_id" + expr: { + chain: [ + "override", + "person_id" + ] type: { - alias: "person_id" - type: - } - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] - type: { - name: "event_person_id" + name: "person_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None + } table_type: } } - hidden: True + } + hidden: True + type: { + alias: "person_id" + type: + } + }, + { + alias: "event_person_id" + expr: { + chain: [ + "event_person_id" + ] type: { - alias: "event_person_id" - type: + name: "event_person_id" + table_type: } } - ] - distinct: False - name: "if" - type: - } - hidden: True - type: - }, - { - alias: "$group_0" - expr: { - chain: [ - "$group_0" - ] - type: - } - hidden: True + hidden: True + type: { + alias: "event_person_id" + type: + } + } + ] + distinct: False + name: "if" type: - }, - { - alias: "$group_1" - expr: { - chain: [ - "$group_1" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_0" + expr: { + chain: [ + "$group_0" + ] type: - }, - { - alias: "$group_2" - expr: { - chain: [ - "$group_2" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_1" + expr: { + chain: [ + "$group_1" + ] type: - }, - { - alias: "$group_3" - expr: { - chain: [ - "$group_3" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_2" + expr: { + chain: [ + "$group_2" + ] type: - }, - { - alias: "$group_4" - expr: { - chain: [ - "$group_4" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_3" + expr: { + chain: [ + "$group_3" + ] type: - }, - { - alias: "elements_chain_href" - expr: { - chain: [ - "elements_chain_href" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_4" + expr: { + chain: [ + "$group_4" + ] type: - }, - { - alias: "elements_chain_texts" - expr: { - chain: [ - "elements_chain_texts" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_href" + expr: { + chain: [ + "elements_chain_href" + ] type: - }, - { - alias: "elements_chain_ids" - expr: { - chain: [ - "elements_chain_ids" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_texts" + expr: { + chain: [ + "elements_chain_texts" + ] type: - }, - { - alias: "elements_chain_elements" - expr: { - chain: [ - "elements_chain_elements" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_ids" + expr: { + chain: [ + "elements_chain_ids" + ] type: - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_elements" + expr: { + chain: [ + "elements_chain_elements" + ] type: } - ] - select_from: { - table: { + hidden: True + type: + }, + { + alias: "event_person_id" + expr: { chain: [ - "events" + "event_person_id" ] type: } + hidden: True + type: + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } type: - }, + } + type: + } + subsequent_select_queries: [ { - select: [ - { - alias: "uuid" - expr: { - chain: [ - "uuid" - ] - type: { - name: "uuid" - table_type: { - table: { - fields: { - $group_0: {}, - $group_1: {}, - $group_2: {}, - $group_3: {}, - $group_4: {}, - $session_id: {}, - $window_id: {}, - created_at: {}, - distinct_id: {}, - elements_chain: {}, - elements_chain_elements: {}, - elements_chain_href: {}, - elements_chain_ids: {}, - elements_chain_texts: {}, - event: {}, - event_person_id: {}, - goe_0: {}, - goe_1: {}, - goe_2: {}, - goe_3: {}, - goe_4: {}, - group_0: {}, - group_1: {}, - group_2: {}, - group_3: {}, - group_4: {}, - override: {}, - pdi: {}, - person: {}, - person_id: {}, - poe: {}, - properties: {}, - session: {}, - team_id: {}, - timestamp: {}, - uuid: {} + select_query: { + select: [ + { + alias: "uuid" + expr: { + chain: [ + "uuid" + ] + type: { + name: "uuid" + table_type: { + table: { + fields: { + $group_0: {}, + $group_1: {}, + $group_2: {}, + $group_3: {}, + $group_4: {}, + $session_id: {}, + $window_id: {}, + created_at: {}, + distinct_id: {}, + elements_chain: {}, + elements_chain_elements: {}, + elements_chain_href: {}, + elements_chain_ids: {}, + elements_chain_texts: {}, + event: {}, + event_person_id: {}, + goe_0: {}, + goe_1: {}, + goe_2: {}, + goe_3: {}, + goe_4: {}, + group_0: {}, + group_1: {}, + group_2: {}, + group_3: {}, + group_4: {}, + override: {}, + pdi: {}, + person: {}, + person_id: {}, + poe: {}, + properties: {}, + session: {}, + team_id: {}, + timestamp: {}, + uuid: {} + } } } } } - } - hidden: True - type: { - alias: "uuid" - type: - } - }, - { - alias: "event" - expr: { - chain: [ - "event" - ] + hidden: True type: { - name: "event" - table_type: + alias: "uuid" + type: } - } - hidden: True - type: { + }, + { alias: "event" - type: - } - }, - { - alias: "properties" - expr: { - chain: [ - "properties" - ] + expr: { + chain: [ + "event" + ] + type: { + name: "event" + table_type: + } + } + hidden: True type: { - name: "properties" - table_type: + alias: "event" + type: } - } - hidden: True - type: { + }, + { alias: "properties" - type: - } - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] + expr: { + chain: [ + "properties" + ] + type: { + name: "properties" + table_type: + } + } + hidden: True type: { - name: "timestamp" - table_type: + alias: "properties" + type: } - } - hidden: True - type: { + }, + { alias: "timestamp" - type: - } - }, - { - alias: "distinct_id" - expr: { - chain: [ - "distinct_id" - ] + expr: { + chain: [ + "timestamp" + ] + type: { + name: "timestamp" + table_type: + } + } + hidden: True type: { - name: "distinct_id" - table_type: + alias: "timestamp" + type: } - } - hidden: True - type: { + }, + { alias: "distinct_id" - type: - } - }, - { - alias: "elements_chain" - expr: { - chain: [ - "elements_chain" - ] + expr: { + chain: [ + "distinct_id" + ] + type: { + name: "distinct_id" + table_type: + } + } + hidden: True type: { - name: "elements_chain" - table_type: + alias: "distinct_id" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain" - type: - } - }, - { - alias: "created_at" - expr: { - chain: [ - "created_at" - ] + expr: { + chain: [ + "elements_chain" + ] + type: { + name: "elements_chain" + table_type: + } + } + hidden: True type: { - name: "created_at" - table_type: + alias: "elements_chain" + type: } - } - hidden: True - type: { + }, + { alias: "created_at" - type: - } - }, - { - alias: "$session_id" - expr: { - chain: [ - "$session_id" - ] + expr: { + chain: [ + "created_at" + ] + type: { + name: "created_at" + table_type: + } + } + hidden: True type: { - name: "$session_id" - table_type: + alias: "created_at" + type: } - } - hidden: True - type: { + }, + { alias: "$session_id" - type: - } - }, - { - alias: "$window_id" - expr: { - chain: [ - "$window_id" - ] + expr: { + chain: [ + "$session_id" + ] + type: { + name: "$session_id" + table_type: + } + } + hidden: True type: { - name: "$window_id" - table_type: + alias: "$session_id" + type: } - } - hidden: True - type: { + }, + { alias: "$window_id" - type: - } - }, - { - alias: "person_id" - expr: { - args: [ - { - args: [ - { - args: [ - { - alias: "distinct_id" - expr: { - chain: [ - "override", - "distinct_id" - ] - type: { - name: "distinct_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None + expr: { + chain: [ + "$window_id" + ] + type: { + name: "$window_id" + table_type: + } + } + hidden: True + type: { + alias: "$window_id" + type: + } + }, + { + alias: "person_id" + expr: { + args: [ + { + args: [ + { + args: [ + { + alias: "distinct_id" + expr: { + chain: [ + "override", + "distinct_id" + ] + type: { + name: "distinct_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None + } + table_type: } - table_type: } } - } - hidden: True - type: { - alias: "distinct_id" - type: - } - } - ] - distinct: False - name: "empty" - type: { - arg_types: [ - { - data_type: "str" - nullable: False + hidden: True + type: { + alias: "distinct_id" + type: + } } ] + distinct: False name: "empty" - return_type: { - data_type: "unknown" - nullable: True + type: { + arg_types: [ + { + data_type: "str" + nullable: False + } + ] + name: "empty" + return_type: { + data_type: "unknown" + nullable: True + } } } - } - ] - distinct: False - name: "not" - type: { - arg_types: [ - ] + distinct: False name: "not" - return_type: { - data_type: "unknown" - nullable: True - } - } - }, - { - alias: "person_id" - expr: { - chain: [ - "override", - "person_id" - ] type: { - name: "person_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None - } - table_type: + arg_types: [ + + ] + name: "not" + return_type: { + data_type: "unknown" + nullable: True } } - } - hidden: True - type: { + }, + { alias: "person_id" - type: - } - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] + expr: { + chain: [ + "override", + "person_id" + ] + type: { + name: "person_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None + } + table_type: + } + } + } + hidden: True type: { - name: "event_person_id" - table_type: + alias: "person_id" + type: } - } - hidden: True - type: { - alias: "event_person_id" - type: - } - } - ] - distinct: False - name: "if" - type: { - arg_types: [ - , - { - data_type: "str" - nullable: False }, { - data_type: "str" - nullable: False + alias: "event_person_id" + expr: { + chain: [ + "event_person_id" + ] + type: { + name: "event_person_id" + table_type: + } + } + hidden: True + type: { + alias: "event_person_id" + type: + } } ] + distinct: False name: "if" - return_type: { - data_type: "unknown" - nullable: True + type: { + arg_types: [ + , + { + data_type: "str" + nullable: False + }, + { + data_type: "str" + nullable: False + } + ] + name: "if" + return_type: { + data_type: "unknown" + nullable: True + } } } - } - hidden: True - type: { - alias: "person_id" - type: - } - }, - { - alias: "$group_0" - expr: { - chain: [ - "$group_0" - ] + hidden: True type: { - name: "$group_0" - table_type: + alias: "person_id" + type: } - } - hidden: True - type: { + }, + { alias: "$group_0" - type: - } - }, - { - alias: "$group_1" - expr: { - chain: [ - "$group_1" - ] + expr: { + chain: [ + "$group_0" + ] + type: { + name: "$group_0" + table_type: + } + } + hidden: True type: { - name: "$group_1" - table_type: + alias: "$group_0" + type: } - } - hidden: True - type: { + }, + { alias: "$group_1" - type: - } - }, - { - alias: "$group_2" - expr: { - chain: [ - "$group_2" - ] + expr: { + chain: [ + "$group_1" + ] + type: { + name: "$group_1" + table_type: + } + } + hidden: True type: { - name: "$group_2" - table_type: + alias: "$group_1" + type: } - } - hidden: True - type: { + }, + { alias: "$group_2" - type: - } - }, - { - alias: "$group_3" - expr: { - chain: [ - "$group_3" - ] + expr: { + chain: [ + "$group_2" + ] + type: { + name: "$group_2" + table_type: + } + } + hidden: True type: { - name: "$group_3" - table_type: + alias: "$group_2" + type: } - } - hidden: True - type: { + }, + { alias: "$group_3" - type: - } - }, - { - alias: "$group_4" - expr: { - chain: [ - "$group_4" - ] + expr: { + chain: [ + "$group_3" + ] + type: { + name: "$group_3" + table_type: + } + } + hidden: True type: { - name: "$group_4" - table_type: + alias: "$group_3" + type: } - } - hidden: True - type: { + }, + { alias: "$group_4" - type: - } - }, - { - alias: "elements_chain_href" - expr: { - chain: [ - "elements_chain_href" - ] + expr: { + chain: [ + "$group_4" + ] + type: { + name: "$group_4" + table_type: + } + } + hidden: True type: { - name: "elements_chain_href" - table_type: + alias: "$group_4" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_href" - type: - } - }, - { - alias: "elements_chain_texts" - expr: { - chain: [ - "elements_chain_texts" - ] + expr: { + chain: [ + "elements_chain_href" + ] + type: { + name: "elements_chain_href" + table_type: + } + } + hidden: True type: { - name: "elements_chain_texts" - table_type: + alias: "elements_chain_href" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_texts" - type: - } - }, - { - alias: "elements_chain_ids" - expr: { - chain: [ - "elements_chain_ids" - ] + expr: { + chain: [ + "elements_chain_texts" + ] + type: { + name: "elements_chain_texts" + table_type: + } + } + hidden: True type: { - name: "elements_chain_ids" - table_type: + alias: "elements_chain_texts" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_ids" - type: - } - }, - { - alias: "elements_chain_elements" - expr: { - chain: [ - "elements_chain_elements" - ] + expr: { + chain: [ + "elements_chain_ids" + ] + type: { + name: "elements_chain_ids" + table_type: + } + } + hidden: True type: { - name: "elements_chain_elements" - table_type: + alias: "elements_chain_ids" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_elements" - type: - } - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] + expr: { + chain: [ + "elements_chain_elements" + ] + type: { + name: "elements_chain_elements" + table_type: + } + } + hidden: True type: { - name: "event_person_id" - table_type: + alias: "elements_chain_elements" + type: } - } - hidden: True - type: { + }, + { alias: "event_person_id" + expr: { + chain: [ + "event_person_id" + ] + type: { + name: "event_person_id" + table_type: + } + } + hidden: True + type: { + alias: "event_person_id" + type: + } + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } - } - ] - select_from: { - table: { - chain: [ - "events" - ] type: } - type: - } - type: { - aliases: {} - anonymous_tables: [] - columns: { - $group_0: , - $group_1: , - $group_2: , - $group_3: , - $group_4: , - $session_id: , - $window_id: , - created_at: , - distinct_id: , - elements_chain: , - elements_chain_elements: , - elements_chain_href: , - elements_chain_ids: , - elements_chain_texts: , - event: , - event_person_id: , - person_id: , - properties: , - timestamp: , - uuid: - } - ctes: {} - tables: { - events: + type: { + aliases: {} + anonymous_tables: [] + columns: { + $group_0: , + $group_1: , + $group_2: , + $group_3: , + $group_4: , + $session_id: , + $window_id: , + created_at: , + distinct_id: , + elements_chain: , + elements_chain_elements: , + elements_chain_href: , + elements_chain_ids: , + elements_chain_texts: , + event: , + event_person_id: , + person_id: , + properties: , + timestamp: , + uuid: + } + ctes: {} + tables: { + events: + } } } + set_operator: "UNION ALL" } ] type: { @@ -6128,206 +6131,209 @@ # name: TestResolver.test_resolve_union_all ''' { - select_queries: [ - { - select: [ - { - alias: "event" - expr: { - chain: [ - "event" - ] - type: { - name: "event" - table_type: { - table: { - fields: { - $group_0: {}, - $group_1: {}, - $group_2: {}, - $group_3: {}, - $group_4: {}, - $session_id: {}, - $window_id: {}, - created_at: {}, - distinct_id: {}, - elements_chain: {}, - elements_chain_elements: {}, - elements_chain_href: {}, - elements_chain_ids: {}, - elements_chain_texts: {}, - event: {}, - event_person_id: {}, - goe_0: {}, - goe_1: {}, - goe_2: {}, - goe_3: {}, - goe_4: {}, - group_0: {}, - group_1: {}, - group_2: {}, - group_3: {}, - group_4: {}, - override: {}, - pdi: {}, - person: {}, - person_id: {}, - poe: {}, - properties: {}, - session: {}, - team_id: {}, - timestamp: {}, - uuid: {} - } + initial_select_query: { + select: [ + { + alias: "event" + expr: { + chain: [ + "event" + ] + type: { + name: "event" + table_type: { + table: { + fields: { + $group_0: {}, + $group_1: {}, + $group_2: {}, + $group_3: {}, + $group_4: {}, + $session_id: {}, + $window_id: {}, + created_at: {}, + distinct_id: {}, + elements_chain: {}, + elements_chain_elements: {}, + elements_chain_href: {}, + elements_chain_ids: {}, + elements_chain_texts: {}, + event: {}, + event_person_id: {}, + goe_0: {}, + goe_1: {}, + goe_2: {}, + goe_3: {}, + goe_4: {}, + group_0: {}, + group_1: {}, + group_2: {}, + group_3: {}, + group_4: {}, + override: {}, + pdi: {}, + person: {}, + person_id: {}, + poe: {}, + properties: {}, + session: {}, + team_id: {}, + timestamp: {}, + uuid: {} } } } } - hidden: True - type: { - alias: "event" - type: - } - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] - type: { - name: "timestamp" - table_type: - } - } - hidden: True - type: { - alias: "timestamp" - type: - } } - ] - select_from: { - table: { + hidden: True + type: { + alias: "event" + type: + } + }, + { + alias: "timestamp" + expr: { chain: [ - "events" + "timestamp" ] + type: { + name: "timestamp" + table_type: + } + } + hidden: True + type: { + alias: "timestamp" type: } + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } - type: { - aliases: {} - anonymous_tables: [] - columns: { - event: , - timestamp: - } - ctes: {} - tables: { - events: - } + type: + } + type: { + aliases: {} + anonymous_tables: [] + columns: { + event: , + timestamp: } - }, + ctes: {} + tables: { + events: + } + } + } + subsequent_select_queries: [ { - select: [ - { - alias: "event" - expr: { - chain: [ - "event" - ] - type: { - name: "event" - table_type: { - table: { - fields: { - $group_0: {}, - $group_1: {}, - $group_2: {}, - $group_3: {}, - $group_4: {}, - $session_id: {}, - $window_id: {}, - created_at: {}, - distinct_id: {}, - elements_chain: {}, - elements_chain_elements: {}, - elements_chain_href: {}, - elements_chain_ids: {}, - elements_chain_texts: {}, - event: {}, - event_person_id: {}, - goe_0: {}, - goe_1: {}, - goe_2: {}, - goe_3: {}, - goe_4: {}, - group_0: {}, - group_1: {}, - group_2: {}, - group_3: {}, - group_4: {}, - override: {}, - pdi: {}, - person: {}, - person_id: {}, - poe: {}, - properties: {}, - session: {}, - team_id: {}, - timestamp: {}, - uuid: {} + select_query: { + select: [ + { + alias: "event" + expr: { + chain: [ + "event" + ] + type: { + name: "event" + table_type: { + table: { + fields: { + $group_0: {}, + $group_1: {}, + $group_2: {}, + $group_3: {}, + $group_4: {}, + $session_id: {}, + $window_id: {}, + created_at: {}, + distinct_id: {}, + elements_chain: {}, + elements_chain_elements: {}, + elements_chain_href: {}, + elements_chain_ids: {}, + elements_chain_texts: {}, + event: {}, + event_person_id: {}, + goe_0: {}, + goe_1: {}, + goe_2: {}, + goe_3: {}, + goe_4: {}, + group_0: {}, + group_1: {}, + group_2: {}, + group_3: {}, + group_4: {}, + override: {}, + pdi: {}, + person: {}, + person_id: {}, + poe: {}, + properties: {}, + session: {}, + team_id: {}, + timestamp: {}, + uuid: {} + } } } } } - } - hidden: True - type: { - alias: "event" - type: - } - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] + hidden: True type: { - name: "timestamp" - table_type: + alias: "event" + type: } - } - hidden: True - type: { + }, + { alias: "timestamp" + expr: { + chain: [ + "timestamp" + ] + type: { + name: "timestamp" + table_type: + } + } + hidden: True + type: { + alias: "timestamp" + type: + } + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } - } - ] - select_from: { - table: { - chain: [ - "events" - ] type: } - type: - } - type: { - aliases: {} - anonymous_tables: [] - columns: { - event: , - timestamp: - } - ctes: {} - tables: { - events: + type: { + aliases: {} + anonymous_tables: [] + columns: { + event: , + timestamp: + } + ctes: {} + tables: { + events: + } } } + set_operator: "UNION ALL" } ] type: { diff --git a/posthog/hogql/test/_test_parser.py b/posthog/hogql/test/_test_parser.py index 03f8dee976152..b86fca986a963 100644 --- a/posthog/hogql/test/_test_parser.py +++ b/posthog/hogql/test/_test_parser.py @@ -21,6 +21,8 @@ Array, Dict, VariableDeclaration, + SelectSetNode, + SelectSetQuery, ) from posthog.hogql.parser import parse_program @@ -50,9 +52,9 @@ def _expr(self, expr: str, placeholders: Optional[dict[str, ast.Expr]] = None) - def _select( self, query: str, placeholders: Optional[dict[str, ast.Expr]] = None - ) -> ast.SelectQuery | ast.SelectUnionQuery | ast.HogQLXTag: + ) -> ast.SelectQuery | ast.SelectSetQuery | ast.HogQLXTag: return cast( - ast.SelectQuery | ast.SelectUnionQuery | ast.HogQLXTag, + ast.SelectQuery | ast.SelectSetQuery | ast.HogQLXTag, clear_locations(parse_select(query, placeholders=placeholders, backend=backend)), ) @@ -1381,12 +1383,48 @@ def test_placeholder_expressions(self): def test_select_union_all(self): self.assertEqual( self._select("select 1 union all select 2 union all select 3"), - ast.SelectUnionQuery( - select_queries=[ - ast.SelectQuery(select=[ast.Constant(value=1)]), - ast.SelectQuery(select=[ast.Constant(value=2)]), - ast.SelectQuery(select=[ast.Constant(value=3)]), - ] + ast.SelectSetQuery( + initial_select_query=ast.SelectQuery(select=[ast.Constant(value=1)]), + subsequent_select_queries=[ + SelectSetNode(set_operator="UNION ALL", select_query=query) + for query in ( + ast.SelectQuery(select=[ast.Constant(value=2)]), + ast.SelectQuery(select=[ast.Constant(value=3)]), + ) + ], + ), + ) + + def test_nested_selects(self): + self.assertEqual( + self._select("(select 1 intersect select 2) union all (select 3 except select 4)"), + SelectSetQuery( + initial_select_query=SelectSetQuery( + initial_select_query=SelectQuery(select=[Constant(value=1)]), + subsequent_select_queries=[ + SelectSetNode( + select_query=SelectQuery( + select=[Constant(value=2)], + ), + set_operator="INTERSECT", + ) + ], + ), + subsequent_select_queries=[ + SelectSetNode( + select_query=SelectSetQuery( + initial_select_query=SelectQuery( + select=[Constant(value=3)], + ), + subsequent_select_queries=[ + SelectSetNode( + select_query=SelectQuery(select=[Constant(value=4)]), set_operator="EXCEPT" + ) + ], + ), + set_operator="UNION ALL", + ) + ], ), ) diff --git a/posthog/hogql/test/test_printer.py b/posthog/hogql/test/test_printer.py index 0a829c470d877..a26ac3ac0352b 100644 --- a/posthog/hogql/test/test_printer.py +++ b/posthog/hogql/test/test_printer.py @@ -114,6 +114,136 @@ def test_to_printed_hogql(self): repsponse, f"SELECT\n plus(1, 2),\n 3\nFROM\n events\nLIMIT {MAX_SELECT_RETURNED_ROWS}" ) + def test_intersect(self): + expr = parse_select("""select 1 as id intersect select 2 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + f"SELECT\n 1 AS id\nLIMIT 50000\nINTERSECT\nSELECT\n 2 AS id\nLIMIT {MAX_SELECT_RETURNED_ROWS}", + ) + + def test_except(self): + expr = parse_select("""select 1 as id except select 2 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + f"SELECT\n 1 AS id\nLIMIT 50000\nEXCEPT\nSELECT\n 2 AS id\nLIMIT {MAX_SELECT_RETURNED_ROWS}", + ) + + # these share the same priority, should stay in order + def test_except_and_union(self): + expr = parse_select("""select 1 as id except select 2 as id union all select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + ( + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "EXCEPT\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000" + ), + ) + + def test_union_and_except(self): + expr = parse_select("""select 1 as id union all select 2 as id except select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + ( + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "EXCEPT\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000" + ), + ) + + def test_intersect3(self): + expr = parse_select("""select 1 as id intersect select 2 as id intersect select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000", + ) + + def test_union3(self): + expr = parse_select("""select 1 as id union all select 2 as id union all select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000", + ) + + def test_intersect_and_union_parens(self): + expr = parse_select("""select 1 as id intersect (select 2 as id union all select 3 as id)""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "(SELECT\n" + " 2 AS id\n" + "UNION ALL\n" + "SELECT\n" + " 3 AS id)", + ) + + # INTERSECT has higher priority than union + def test_intersect_and_union(self): + expr = parse_select("""select 1 as id union all select 2 as id intersect select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + ( + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000" + ), + ) + def test_print_to_string(self): assert str(parse_select("select 1 + 2, 3 from events")) == "sql(SELECT plus(1, 2), 3 FROM events)" assert str(parse_expr("1 + 2")) == "sql(plus(1, 2))" @@ -1076,7 +1206,7 @@ def test_select_union_all(self): ) self.assertEqual( self._select("SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1) UNION ALL SELECT 1"), - f"SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS}", + f"SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL (SELECT 1 UNION ALL SELECT 1) UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS}", ) self.assertEqual( self._select("SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1"), diff --git a/posthog/hogql/visitor.py b/posthog/hogql/visitor.py index 565346a169137..6b763b1d0812c 100644 --- a/posthog/hogql/visitor.py +++ b/posthog/hogql/visitor.py @@ -2,6 +2,7 @@ from typing import Optional, TypeVar, Generic, Any from posthog.hogql import ast +from posthog.hogql.ast import SelectSetNode from posthog.hogql.base import AST, Expr from posthog.hogql.errors import BaseHogQLError @@ -151,9 +152,10 @@ def visit_select_query(self, node: ast.SelectQuery): for expr in (node.window_exprs or {}).values(): self.visit(expr) - def visit_select_union_query(self, node: ast.SelectUnionQuery): - for expr in node.select_queries: - self.visit(expr) + def visit_select_set_query(self, node: ast.SelectSetQuery): + self.visit(node.initial_select_query) + for expr in node.subsequent_select_queries: + self.visit(expr.select_query) def visit_lambda_argument_type(self, node: ast.LambdaArgumentType): pass @@ -174,7 +176,7 @@ def visit_select_query_type(self, node: ast.SelectQueryType): for expr in node.columns.values(): self.visit(expr) - def visit_select_union_query_type(self, node: ast.SelectUnionQueryType): + def visit_select_set_query_type(self, node: ast.SelectSetQueryType): for type in node.types: self.visit(type) @@ -600,12 +602,16 @@ def visit_select_query(self, node: ast.SelectQuery): view_name=node.view_name, ) - def visit_select_union_query(self, node: ast.SelectUnionQuery): - return ast.SelectUnionQuery( + def visit_select_set_query(self, node: ast.SelectSetQuery): + return ast.SelectSetQuery( start=None if self.clear_locations else node.start, end=None if self.clear_locations else node.end, type=None if self.clear_types else node.type, - select_queries=[self.visit(expr) for expr in node.select_queries], + initial_select_query=self.visit(node.initial_select_query), + subsequent_select_queries=[ + SelectSetNode(set_operator=expr.set_operator, select_query=self.visit(expr.select_query)) + for expr in node.subsequent_select_queries + ], ) def visit_window_expr(self, node: ast.WindowExpr): diff --git a/posthog/hogql_queries/actors_query_runner.py b/posthog/hogql_queries/actors_query_runner.py index ba7301b5e0c51..cec4b7019f212 100644 --- a/posthog/hogql_queries/actors_query_runner.py +++ b/posthog/hogql_queries/actors_query_runner.py @@ -6,6 +6,7 @@ from posthog.hogql.constants import HogQLGlobalSettings from posthog.hogql.parser import parse_expr, parse_order_expr from posthog.hogql.property import has_aggregation +from posthog.hogql.resolver_utils import extract_select_queries from posthog.hogql_queries.actor_strategies import ActorStrategy, PersonStrategy, GroupStrategy from posthog.hogql_queries.insights.funnels.funnels_query_runner import FunnelsQueryRunner from posthog.hogql_queries.insights.insight_actors_query_runner import InsightActorsQueryRunner @@ -142,12 +143,12 @@ def input_columns(self) -> list[str]: return self.strategy.input_columns() # TODO: Figure out a more sure way of getting the actor id than using the alias or chain name - def source_id_column(self, source_query: ast.SelectQuery | ast.SelectUnionQuery) -> list[str]: + def source_id_column(self, source_query: ast.SelectQuery | ast.SelectSetQuery) -> list[str]: # Figure out the id column of the source query, first column that has id in the name if isinstance(source_query, ast.SelectQuery): select = source_query.select else: - select = source_query.select_queries[0].select + select = next(extract_select_queries(source_query)).select for column in select: if isinstance(column, ast.Alias) and (column.alias in ("group_key", "actor_id", "person_id")): diff --git a/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py b/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py index 1fdd2be57db54..167d1100f1558 100644 --- a/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py +++ b/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py @@ -49,7 +49,7 @@ def calculate(self): modifiers=self.modifiers, ) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: query = ast.SelectQuery( select=[ ast.Call(name="groupArray", args=[ast.Field(chain=["prop"])], params=[ast.Constant(value=5)]), diff --git a/posthog/hogql_queries/ai/event_taxonomy_query_runner.py b/posthog/hogql_queries/ai/event_taxonomy_query_runner.py index 17677d23fa5d2..c00f2a4f771c4 100644 --- a/posthog/hogql_queries/ai/event_taxonomy_query_runner.py +++ b/posthog/hogql_queries/ai/event_taxonomy_query_runner.py @@ -49,7 +49,7 @@ def calculate(self): modifiers=self.modifiers, ) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: query = parse_select( """ SELECT diff --git a/posthog/hogql_queries/ai/team_taxonomy_query_runner.py b/posthog/hogql_queries/ai/team_taxonomy_query_runner.py index e4c0823616898..17314fb0c74a8 100644 --- a/posthog/hogql_queries/ai/team_taxonomy_query_runner.py +++ b/posthog/hogql_queries/ai/team_taxonomy_query_runner.py @@ -43,7 +43,7 @@ def calculate(self): results=results, timings=response.timings, hogql=hogql, modifiers=self.modifiers ) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: query = parse_select( """ SELECT diff --git a/posthog/hogql_queries/insights/funnels/base.py b/posthog/hogql_queries/insights/funnels/base.py index 9ddc1b4f26af2..87d7c2a4b0597 100644 --- a/posthog/hogql_queries/insights/funnels/base.py +++ b/posthog/hogql_queries/insights/funnels/base.py @@ -532,7 +532,7 @@ def _get_cohort_breakdown_join(self) -> ast.JoinExpr: return ast.JoinExpr( join_type="INNER JOIN", - table=ast.SelectUnionQuery(select_queries=cohort_queries), + table=ast.SelectSetQuery.create_from_queries(cohort_queries, "UNION ALL"), alias="cohort_join", constraint=ast.JoinConstraint( expr=ast.CompareOperation( diff --git a/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py b/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py index a633941817af0..f218976ad941c 100644 --- a/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py +++ b/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py @@ -332,7 +332,7 @@ def serialize_event_with_property(self, event: str) -> EventDefinition: return EventDefinition(event=event, properties={}, elements=[]) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: """ Returns a query string and params, which are used to generate the contingency table. The query returns success and failure count for event / property values, along with total success and failure counts. @@ -345,7 +345,7 @@ def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: return self.get_event_query() - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: assert self.correlation_actors_query is not None if self.query.funnelCorrelationType == FunnelCorrelationResultsType.PROPERTIES: @@ -362,7 +362,7 @@ def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: else: return self.events_actor_query() - def events_actor_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def events_actor_query(self) -> ast.SelectQuery | ast.SelectSetQuery: assert self.correlation_actors_query is not None if not self.correlation_actors_query.funnelCorrelationPersonEntity: @@ -431,7 +431,7 @@ def events_actor_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: def properties_actor_query( self, - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: assert self.correlation_actors_query is not None if not self.correlation_actors_query.funnelCorrelationPropertyValues: @@ -470,7 +470,7 @@ def properties_actor_query( return query - def get_event_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_event_query(self) -> ast.SelectQuery | ast.SelectSetQuery: funnel_persons_query = self.get_funnel_actors_cte() event_join_query = self._get_events_join_query() target_step = self.context.max_steps @@ -548,7 +548,7 @@ def get_event_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: return event_correlation_query - def get_event_property_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_event_property_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if not self.query.funnelCorrelationEventNames: raise ValidationError("Event Property Correlation expects atleast one event name to run correlation on") @@ -646,7 +646,7 @@ def get_event_property_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: return query - def get_properties_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_properties_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if not self.query.funnelCorrelationNames: raise ValidationError("Property Correlation expects atleast one Property to run correlation on") diff --git a/posthog/hogql_queries/insights/funnels/funnel_unordered.py b/posthog/hogql_queries/insights/funnels/funnel_unordered.py index f718c7fe3e4df..8d39428c02449 100644 --- a/posthog/hogql_queries/insights/funnels/funnel_unordered.py +++ b/posthog/hogql_queries/insights/funnels/funnel_unordered.py @@ -115,7 +115,7 @@ def get_step_counts_without_aggregation_query(self): entities_to_use.append(entities_to_use.pop(0)) union_queries.append(formatted_query) - return ast.SelectUnionQuery(select_queries=union_queries) + return ast.SelectSetQuery.create_from_queries(union_queries, "UNION ALL") def _get_step_times(self, max_steps: int) -> list[ast.Expr]: windowInterval = self.context.funnelWindowInterval diff --git a/posthog/hogql_queries/insights/funnels/funnels_query_runner.py b/posthog/hogql_queries/insights/funnels/funnels_query_runner.py index 0e8a7919a76ec..ebafdace3acbc 100644 --- a/posthog/hogql_queries/insights/funnels/funnels_query_runner.py +++ b/posthog/hogql_queries/insights/funnels/funnels_query_runner.py @@ -76,7 +76,7 @@ def _refresh_frequency(self): def to_query(self) -> ast.SelectQuery: return self.funnel_class.get_query() - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return self.funnel_actor_class.actor_query() def calculate(self): diff --git a/posthog/hogql_queries/insights/insight_actors_query_options_runner.py b/posthog/hogql_queries/insights/insight_actors_query_options_runner.py index 81cf2895d8c43..cb14a284774a0 100644 --- a/posthog/hogql_queries/insights/insight_actors_query_options_runner.py +++ b/posthog/hogql_queries/insights/insight_actors_query_options_runner.py @@ -21,7 +21,7 @@ class InsightActorsQueryOptionsRunner(QueryRunner): def source_runner(self) -> QueryRunner: return get_query_runner(self.query.source.source, self.team, self.timings, self.limit_context) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: raise ValueError(f"Cannot convert source query of type {self.query.source.kind} to query") def calculate(self) -> InsightActorsQueryOptionsResponse: diff --git a/posthog/hogql_queries/insights/insight_actors_query_runner.py b/posthog/hogql_queries/insights/insight_actors_query_runner.py index c07c1e3687ab0..cc6ddca0fd0fd 100644 --- a/posthog/hogql_queries/insights/insight_actors_query_runner.py +++ b/posthog/hogql_queries/insights/insight_actors_query_runner.py @@ -33,7 +33,7 @@ class InsightActorsQueryRunner(QueryRunner): def source_runner(self) -> QueryRunner: return get_query_runner(self.query.source, self.team, self.timings, self.limit_context, self.modifiers) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if isinstance(self.source_runner, TrendsQueryRunner): trends_runner = cast(TrendsQueryRunner, self.source_runner) query = cast(InsightActorsQuery, self.query) @@ -73,7 +73,7 @@ def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: raise ValueError(f"Cannot convert source query of type {self.query.source.kind} to persons query") - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return self.to_query() @property diff --git a/posthog/hogql_queries/insights/lifecycle_query_runner.py b/posthog/hogql_queries/insights/lifecycle_query_runner.py index 1aaf3db5d01c7..d691074d3a032 100644 --- a/posthog/hogql_queries/insights/lifecycle_query_runner.py +++ b/posthog/hogql_queries/insights/lifecycle_query_runner.py @@ -33,7 +33,7 @@ class LifecycleQueryRunner(QueryRunner): response: LifecycleQueryResponse cached_response: CachedLifecycleQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if self.query.samplingFactor == 0: counts_with_sampling = ast.Constant(value=0) elif self.query.samplingFactor is not None and self.query.samplingFactor != 1: @@ -95,7 +95,7 @@ def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: def to_actors_query( self, day: Optional[str] = None, status: Optional[str] = None - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("actors_query"): exprs = [] if day is not None: diff --git a/posthog/hogql_queries/insights/paths_query_runner.py b/posthog/hogql_queries/insights/paths_query_runner.py index dfacf5e90665f..09ad850140ef0 100644 --- a/posthog/hogql_queries/insights/paths_query_runner.py +++ b/posthog/hogql_queries/insights/paths_query_runner.py @@ -750,7 +750,7 @@ def get_edge_weight_exprs(self) -> list[ast.Expr]: ) return conditions - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: placeholders: dict[str, ast.Expr] = { "paths_per_person_query": self.paths_per_person_query(), } @@ -876,7 +876,7 @@ def calculate(self) -> PathsQueryResponse: def extra_event_fields_and_properties(self) -> list[str]: return self.extra_event_fields + self.extra_event_properties - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: # To include matching_events, we need to add extra fields and properties # TODO: Make sure going via self is the best way to do this self.extra_event_fields = ["uuid", "timestamp"] diff --git a/posthog/hogql_queries/insights/retention_query_runner.py b/posthog/hogql_queries/insights/retention_query_runner.py index 9f96ef654199b..5f1fbd57b4d95 100644 --- a/posthog/hogql_queries/insights/retention_query_runner.py +++ b/posthog/hogql_queries/insights/retention_query_runner.py @@ -316,7 +316,7 @@ def actor_query(self, breakdown_values_filter: Optional[int] = None, cumulative: return inner_query - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("retention_query"): if self.query.retentionFilter.cumulative: actor_query = parse_select( diff --git a/posthog/hogql_queries/insights/stickiness_query_runner.py b/posthog/hogql_queries/insights/stickiness_query_runner.py index f0fc017165e8d..43928a4bd90e6 100644 --- a/posthog/hogql_queries/insights/stickiness_query_runner.py +++ b/posthog/hogql_queries/insights/stickiness_query_runner.py @@ -128,8 +128,8 @@ def _events_query(self, series_with_extra: SeriesWithExtras) -> ast.SelectQuery: return cast(ast.SelectQuery, select_query) - def to_query(self) -> ast.SelectUnionQuery: - return ast.SelectUnionQuery(select_queries=self.to_queries()) + def to_query(self) -> ast.SelectSetQuery: + return ast.SelectSetQuery.create_from_queries(self.to_queries(), "UNION ALL") def to_queries(self) -> list[ast.SelectQuery]: queries = [] @@ -170,7 +170,7 @@ def to_queries(self) -> list[ast.SelectQuery]: return queries - def to_actors_query(self, interval_num: Optional[int] = None) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self, interval_num: Optional[int] = None) -> ast.SelectQuery | ast.SelectSetQuery: queries: list[ast.SelectQuery] = [] for series in self.series: @@ -194,7 +194,7 @@ def to_actors_query(self, interval_num: Optional[int] = None) -> ast.SelectQuery queries.append(events_query) - return ast.SelectUnionQuery(select_queries=queries) + return ast.SelectSetQuery.create_from_queries(queries, "UNION ALL") def calculate(self): queries = self.to_queries() diff --git a/posthog/hogql_queries/insights/trends/aggregation_operations.py b/posthog/hogql_queries/insights/trends/aggregation_operations.py index bea5230e45a1a..84e7c181f7c13 100644 --- a/posthog/hogql_queries/insights/trends/aggregation_operations.py +++ b/posthog/hogql_queries/insights/trends/aggregation_operations.py @@ -187,8 +187,8 @@ def _interval_function_name(self) -> str: return f"toStartOf{self.query_date_range.interval_name.title()}" def _actors_parent_select_query( - self, inner_query: ast.SelectQuery | ast.SelectUnionQuery - ) -> ast.SelectQuery | ast.SelectUnionQuery: + self, inner_query: ast.SelectQuery | ast.SelectSetQuery + ) -> ast.SelectQuery | ast.SelectSetQuery: if self.is_count_per_actor_variant(): query = parse_select( "SELECT total FROM {inner_query}", @@ -232,8 +232,8 @@ def _actors_parent_select_query( return query def _actors_inner_select_query( - self, cross_join_select_query: ast.SelectQuery | ast.SelectUnionQuery - ) -> ast.SelectQuery | ast.SelectUnionQuery: + self, cross_join_select_query: ast.SelectQuery | ast.SelectSetQuery + ) -> ast.SelectQuery | ast.SelectSetQuery: if self.is_count_per_actor_variant(): if self.series.math == "avg_count_per_actor": math_func = self._math_func("avg", ["total"]) @@ -308,7 +308,7 @@ def _actors_inner_select_query( def _actors_events_query( self, events_where_clause: ast.Expr, sample_value: ast.RatioExpr - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: date_from_with_lookback = "{date_from} - {inclusive_lookback}" if self.chart_display_type in NON_TIME_SERIES_DISPLAY_TYPES and self.series.math in ( BaseMathType.WEEKLY_ACTIVE, diff --git a/posthog/hogql_queries/insights/trends/display.py b/posthog/hogql_queries/insights/trends/display.py index 4a1229e7ba9c2..17d63daace954 100644 --- a/posthog/hogql_queries/insights/trends/display.py +++ b/posthog/hogql_queries/insights/trends/display.py @@ -31,7 +31,7 @@ def wrap_inner_query(self, inner_query: ast.SelectQuery, breakdown_enabled: bool def should_wrap_inner_query(self) -> bool: return self.display_type == ChartDisplayType.ACTIONS_LINE_GRAPH_CUMULATIVE - def _build_aggregate_dates(self, dates_queries: ast.SelectUnionQuery) -> ast.Expr: + def _build_aggregate_dates(self, dates_queries: ast.SelectSetQuery) -> ast.Expr: return parse_select( """ SELECT day_start @@ -49,7 +49,7 @@ def _build_aggregate_dates(self, dates_queries: ast.SelectUnionQuery) -> ast.Exp ) def modify_outer_query( - self, outer_query: ast.SelectQuery, inner_query: ast.SelectQuery, dates_queries: ast.SelectUnionQuery + self, outer_query: ast.SelectQuery, inner_query: ast.SelectQuery, dates_queries: ast.SelectSetQuery ) -> ast.SelectQuery: if not self.is_total_value(): return outer_query diff --git a/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py b/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py index 84f97da6e0c40..5cb5d2f669449 100644 --- a/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py +++ b/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py @@ -167,7 +167,7 @@ def is_explicit(self) -> bool: def is_total_value(self) -> bool: return self.trends_display.is_total_value() - def build_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def build_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return ast.SelectQuery( select=[ ast.Field(chain=["actor_id"]), diff --git a/posthog/hogql_queries/insights/trends/trends_query_builder.py b/posthog/hogql_queries/insights/trends/trends_query_builder.py index ee1165c41c624..ebc6f91d20186 100644 --- a/posthog/hogql_queries/insights/trends/trends_query_builder.py +++ b/posthog/hogql_queries/insights/trends/trends_query_builder.py @@ -60,7 +60,7 @@ def __init__( self.modifiers = modifiers self.limit_context = limit_context - def build_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def build_query(self) -> ast.SelectQuery | ast.SelectSetQuery: breakdown = self.breakdown events_query = self._get_events_subquery(False, is_actors_query=False, breakdown=breakdown) @@ -73,7 +73,7 @@ def build_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: def _get_wrapper_query( self, events_query: ast.SelectQuery, breakdown: Breakdown - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: if not breakdown.enabled: return events_query @@ -312,7 +312,7 @@ def _get_events_subquery( def _outer_select_query( self, breakdown: Breakdown, inner_query: ast.SelectQuery - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: total_array = parse_expr( """ arrayMap( @@ -453,7 +453,7 @@ def _get_breakdown_limit(self) -> int: ) or get_breakdown_limit_for_context(self.limit_context) def _inner_select_query( - self, breakdown: Breakdown, inner_query: ast.SelectQuery | ast.SelectUnionQuery + self, breakdown: Breakdown, inner_query: ast.SelectQuery | ast.SelectSetQuery ) -> ast.SelectQuery: query = cast( ast.SelectQuery, diff --git a/posthog/hogql_queries/insights/trends/trends_query_runner.py b/posthog/hogql_queries/insights/trends/trends_query_runner.py index 44cbf4cd5da0c..831adda7d5f14 100644 --- a/posthog/hogql_queries/insights/trends/trends_query_runner.py +++ b/posthog/hogql_queries/insights/trends/trends_query_runner.py @@ -110,16 +110,10 @@ def _refresh_frequency(self): return BASE_MINIMUM_INSIGHT_REFRESH_INTERVAL - def to_query(self) -> ast.SelectUnionQuery: - queries = [] - for query in self.to_queries(): - if isinstance(query, ast.SelectQuery): - queries.append(query) - else: - queries.extend(query.select_queries) - return ast.SelectUnionQuery(select_queries=queries) + def to_query(self) -> ast.SelectSetQuery: + return ast.SelectSetQuery.create_from_queries(self.to_queries(), "UNION ALL") - def to_queries(self) -> list[ast.SelectQuery | ast.SelectUnionQuery]: + def to_queries(self) -> list[ast.SelectQuery | ast.SelectSetQuery]: queries = [] with self.timings.measure("trends_to_query"): for series in self.series: @@ -154,7 +148,7 @@ def to_actors_query( breakdown_value: Optional[str | int | list[str]] = None, compare_value: Optional[Compare] = None, include_recordings: Optional[bool] = None, - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("trends_to_actors_query"): if self.query.breakdownFilter and self.query.breakdownFilter.breakdown_type == BreakdownType.COHORT: if self.query.breakdownFilter.breakdown in ("all", ["all"]) or breakdown_value == "all": @@ -300,18 +294,16 @@ def to_actors_query_options(self) -> InsightActorsQueryOptionsResponse: def calculate(self): queries = self.to_queries() - if len(queries) == 1: - response_hogql_query = queries[0] + if len(queries) == 0: + response_hogql = "" else: - response_hogql_query = ast.SelectUnionQuery(select_queries=[]) - for query in queries: - if isinstance(query, ast.SelectQuery): - response_hogql_query.select_queries.append(query) - else: - response_hogql_query.select_queries.extend(query.select_queries) + if len(queries) == 1: + response_hogql_query = queries[0] + else: + response_hogql_query = ast.SelectSetQuery.create_from_queries(queries, "UNION ALL") - with self.timings.measure("printing_hogql_for_response"): - response_hogql = to_printed_hogql(response_hogql_query, self.team, self.modifiers) + with self.timings.measure("printing_hogql_for_response"): + response_hogql = to_printed_hogql(response_hogql_query, self.team, self.modifiers) res_matrix: list[list[Any] | Any | None] = [None] * len(queries) timings_matrix: list[list[QueryTiming] | None] = [None] * (2 + len(queries)) @@ -320,7 +312,7 @@ def calculate(self): def run( index: int, - query: ast.SelectQuery | ast.SelectUnionQuery, + query: ast.SelectQuery | ast.SelectSetQuery, timings: HogQLTimings, is_parallel: bool, query_tags: Optional[dict] = None, diff --git a/posthog/hogql_queries/insights/utils/aggregations.py b/posthog/hogql_queries/insights/utils/aggregations.py index 084ee58905c20..cb4fd72377759 100644 --- a/posthog/hogql_queries/insights/utils/aggregations.py +++ b/posthog/hogql_queries/insights/utils/aggregations.py @@ -11,7 +11,7 @@ class QueryAlternator: _group_bys: list[ast.Expr] _select_from: ast.JoinExpr | None - def __init__(self, query: ast.SelectQuery | ast.SelectUnionQuery): + def __init__(self, query: ast.SelectQuery | ast.SelectSetQuery): assert isinstance(query, ast.SelectQuery) self._query = query @@ -19,7 +19,7 @@ def __init__(self, query: ast.SelectQuery | ast.SelectUnionQuery): self._group_bys = [] self._select_from = None - def build(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def build(self) -> ast.SelectQuery | ast.SelectSetQuery: if len(self._selects) > 0: self._query.select.extend(self._selects) diff --git a/posthog/hogql_queries/query_runner.py b/posthog/hogql_queries/query_runner.py index 44d5abfe3c16c..4c13f82346011 100644 --- a/posthog/hogql_queries/query_runner.py +++ b/posthog/hogql_queries/query_runner.py @@ -708,10 +708,10 @@ def run( return fresh_response @abstractmethod - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: raise NotImplementedError() - def to_actors_query(self, *args, **kwargs) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self, *args, **kwargs) -> ast.SelectQuery | ast.SelectSetQuery: # TODO: add support for selecting and filtering by breakdowns raise NotImplementedError() diff --git a/posthog/hogql_queries/web_analytics/top_clicks.py b/posthog/hogql_queries/web_analytics/top_clicks.py index c2324e7ec10f9..38c4e35dacd42 100644 --- a/posthog/hogql_queries/web_analytics/top_clicks.py +++ b/posthog/hogql_queries/web_analytics/top_clicks.py @@ -16,7 +16,7 @@ class WebTopClicksQueryRunner(WebAnalyticsQueryRunner): response: WebTopClicksQueryResponse cached_response: CachedWebTopClicksQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("top_clicks_query"): top_sources_query = parse_select( """ diff --git a/posthog/hogql_queries/web_analytics/web_goals.py b/posthog/hogql_queries/web_analytics/web_goals.py index 2b14c6236f6f8..0d03b8b0a64b4 100644 --- a/posthog/hogql_queries/web_analytics/web_goals.py +++ b/posthog/hogql_queries/web_analytics/web_goals.py @@ -24,7 +24,7 @@ class WebGoalsQueryRunner(WebAnalyticsQueryRunner): response: WebGoalsQueryResponse cached_response: CachedWebGoalsQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("date_expr"): start = self.query_date_range.date_from_as_hogql() end = self.query_date_range.date_to_as_hogql() diff --git a/posthog/hogql_queries/web_analytics/web_overview.py b/posthog/hogql_queries/web_analytics/web_overview.py index 022f918e0913e..6e7e3ac7d6bd5 100644 --- a/posthog/hogql_queries/web_analytics/web_overview.py +++ b/posthog/hogql_queries/web_analytics/web_overview.py @@ -28,7 +28,7 @@ class WebOverviewQueryRunner(WebAnalyticsQueryRunner): response: WebOverviewQueryResponse cached_response: CachedWebOverviewQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return self.outer_select def calculate(self): diff --git a/posthog/models/cohort/util.py b/posthog/models/cohort/util.py index 1d18d632bd030..6d8de53b0e8de 100644 --- a/posthog/models/cohort/util.py +++ b/posthog/models/cohort/util.py @@ -7,6 +7,8 @@ from django.conf import settings from django.utils import timezone from rest_framework.exceptions import ValidationError + +from posthog.hogql.resolver_utils import extract_select_queries from posthog.queries.util import PersonPropertiesMode from posthog.clickhouse.client.connection import Workload from posthog.clickhouse.query_tagging import tag_queries @@ -83,8 +85,7 @@ def print_cohort_hogql_query(cohort: Cohort, hogql_context: HogQLContext) -> str cast(dict, cohort.query), team=cast(Team, cohort.team), limit_context=LimitContext.COHORT_CALCULATION ).to_query() - select_queries: list[ast.SelectQuery] = [query] if isinstance(query, ast.SelectQuery) else query.select_queries - for select_query in select_queries: + for select_query in extract_select_queries(query): columns: dict[str, ast.Expr] = {} for expr in select_query.select: if isinstance(expr, ast.Alias): diff --git a/posthog/session_recordings/queries/session_recording_list_from_filters.py b/posthog/session_recordings/queries/session_recording_list_from_filters.py index 26649ef7165e3..46fb0664c56b7 100644 --- a/posthog/session_recordings/queries/session_recording_list_from_filters.py +++ b/posthog/session_recordings/queries/session_recording_list_from_filters.py @@ -328,7 +328,7 @@ def __init__(self, team: Team, filter: SessionRecordingsFilter, ttl_days: int): self._filter = filter self._ttl_days = ttl_days - def get_query(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query(self) -> ast.SelectQuery | ast.SelectSetQuery | None: if self.person_properties and not poe_is_active(self._team): return parse_select( """ @@ -383,7 +383,7 @@ def __init__(self, team: Team, filter: SessionRecordingsFilter, ttl_days: int): self._filter = filter self._ttl_days = ttl_days - def get_query(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query(self) -> ast.SelectQuery | ast.SelectSetQuery | None: if self.cohort_properties: return parse_select( self.raw_cohort_to_distinct_id, @@ -433,7 +433,7 @@ def get_operation(self) -> CompareOperation | None: right=q, ) - def get_query(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query(self) -> ast.SelectQuery | ast.SelectSetQuery | None: if not self._filter.person_uuid: return None @@ -529,14 +529,14 @@ def _select_from_events(self, select_expr: ast.Expr) -> ast.SelectQuery: group_by=[ast.Field(chain=["$session_id"])], ) - def get_query_for_session_id_matching(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query_for_session_id_matching(self) -> ast.SelectQuery | ast.SelectSetQuery | None: use_poe = poe_is_active(self._team) and self.person_properties if self._filter.entities or self.event_properties or self.group_properties or use_poe: return self._select_from_events(ast.Alias(alias="session_id", expr=ast.Field(chain=["$session_id"]))) else: return None - def get_query_for_event_id_matching(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_query_for_event_id_matching(self) -> ast.SelectQuery | ast.SelectSetQuery: return self._select_from_events(ast.Call(name="groupUniqArray", args=[ast.Field(chain=["uuid"])])) def get_event_ids_for_session(self) -> SessionRecordingQueryResult: diff --git a/posthog/warehouse/models/modeling.py b/posthog/warehouse/models/modeling.py index 3cc6272c3685f..9e7dcefa4c0a3 100644 --- a/posthog/warehouse/models/modeling.py +++ b/posthog/warehouse/models/modeling.py @@ -10,6 +10,7 @@ from posthog.hogql import ast from posthog.hogql.database.database import Database, create_hogql_database from posthog.hogql.parser import parse_select +from posthog.hogql.resolver_utils import extract_select_queries from posthog.models.team import Team from posthog.models.user import User from posthog.models.utils import ( @@ -99,8 +100,8 @@ def get_parents_from_model_query(model_query: str) -> set[str]: hogql_query = parse_select(model_query) - if isinstance(hogql_query, ast.SelectUnionQuery): - queries = hogql_query.select_queries + if isinstance(hogql_query, ast.SelectSetQuery): + queries = list(extract_select_queries(hogql_query)) else: queries = [hogql_query] @@ -114,8 +115,8 @@ def get_parents_from_model_query(model_query: str) -> set[str]: for name, cte in query.ctes.items(): ctes.add(name) - if isinstance(cte.expr, ast.SelectUnionQuery): - queries.extend(cte.expr.select_queries) + if isinstance(cte.expr, ast.SelectSetQuery): + queries.extend(list(extract_select_queries(cte.expr))) elif isinstance(cte.expr, ast.SelectQuery): queries.append(cte.expr) @@ -130,8 +131,8 @@ def get_parents_from_model_query(model_query: str) -> set[str]: continue queries.append(join.table) - elif isinstance(join.table, ast.SelectUnionQuery): - queries.extend(join.table.select_queries) + elif isinstance(join.table, ast.SelectSetQuery): + queries.extend(list(extract_select_queries(join.table))) while join is not None: parent_name = join.table.chain[0] # type: ignore diff --git a/requirements.in b/requirements.in index 619c6a06cdaaf..b0e87e51b2175 100644 --- a/requirements.in +++ b/requirements.in @@ -105,7 +105,7 @@ phonenumberslite==8.13.6 openai==1.51.2 tiktoken==0.8.0 nh3==0.2.14 -hogql-parser==1.0.45 +hogql-parser==1.0.46 zxcvbn==4.4.28 zstd==1.5.5.1 xmlsec==1.3.13 # Do not change this version - it will break SAML diff --git a/requirements.txt b/requirements.txt index 82798318498ef..ef080dcdeef7c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -282,7 +282,7 @@ h11==0.13.0 # wsproto hexbytes==1.0.0 # via dlt -hogql-parser==1.0.45 +hogql-parser==1.0.46 # via -r requirements.in httpcore==1.0.2 # via httpx From 8d01d5ef546b136be94e9567b06c241af8c59da9 Mon Sep 17 00:00:00 2001 From: Zach Waterfield Date: Tue, 29 Oct 2024 17:17:27 -0400 Subject: [PATCH 04/15] feat: rbac initial set up (#25745) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- ee/api/feature_flag_role_access.py | 6 +- .../organization_resource_access.py | 4 +- ee/api/{ => rbac}/role.py | 4 +- ee/api/test/test_feature_flag.py | 4 +- ee/api/test/test_feature_flag_role_access.py | 4 +- .../test/test_organization_resource_access.py | 2 +- ee/api/test/test_role.py | 4 +- ee/api/test/test_role_membership.py | 2 +- ee/models/__init__.py | 2 +- .../organization_resource_access.py | 2 + ee/models/{ => rbac}/role.py | 2 +- ee/urls.py | 5 +- frontend/src/lib/constants.tsx | 1 + .../settings/user/personalAPIKeysLogic.tsx | 4 +- frontend/src/types.ts | 31 ++++++++++ posthog/api/personal_api_key.py | 3 +- posthog/api/project.py | 2 +- posthog/api/routing.py | 2 +- posthog/api/team.py | 2 +- .../api/test/__snapshots__/test_api_docs.ambr | 6 +- .../test/test_organization_feature_flag.py | 2 +- posthog/models/feature_flag/permissions.py | 2 +- posthog/models/personal_api_key.py | 55 +---------------- posthog/models/scopes.py | 60 +++++++++++++++++++ posthog/permissions.py | 2 +- 25 files changed, 128 insertions(+), 85 deletions(-) rename ee/api/{ => rbac}/organization_resource_access.py (92%) rename ee/api/{ => rbac}/role.py (97%) rename ee/models/{ => rbac}/organization_resource_access.py (95%) rename ee/models/{ => rbac}/role.py (95%) create mode 100644 posthog/models/scopes.py diff --git a/ee/api/feature_flag_role_access.py b/ee/api/feature_flag_role_access.py index 6d03c7a4f361c..01aa98a05b9db 100644 --- a/ee/api/feature_flag_role_access.py +++ b/ee/api/feature_flag_role_access.py @@ -1,10 +1,10 @@ from rest_framework import exceptions, mixins, serializers, viewsets from rest_framework.permissions import SAFE_METHODS, BasePermission -from ee.api.role import RoleSerializer +from ee.api.rbac.role import RoleSerializer from ee.models.feature_flag_role_access import FeatureFlagRoleAccess -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role from posthog.api.feature_flag import FeatureFlagSerializer from posthog.api.routing import TeamAndOrgViewSetMixin from posthog.models import FeatureFlag diff --git a/ee/api/organization_resource_access.py b/ee/api/rbac/organization_resource_access.py similarity index 92% rename from ee/api/organization_resource_access.py rename to ee/api/rbac/organization_resource_access.py index bf886566605b5..9722fc7b02eac 100644 --- a/ee/api/organization_resource_access.py +++ b/ee/api/rbac/organization_resource_access.py @@ -1,7 +1,7 @@ from rest_framework import mixins, serializers, viewsets -from ee.api.role import RolePermissions -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.api.rbac.role import RolePermissions +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.api.routing import TeamAndOrgViewSetMixin diff --git a/ee/api/role.py b/ee/api/rbac/role.py similarity index 97% rename from ee/api/role.py rename to ee/api/rbac/role.py index 96041cd0109ef..ccf8acef1f1dc 100644 --- a/ee/api/role.py +++ b/ee/api/rbac/role.py @@ -5,8 +5,8 @@ from rest_framework.permissions import SAFE_METHODS, BasePermission from ee.models.feature_flag_role_access import FeatureFlagRoleAccess -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role, RoleMembership +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role, RoleMembership from posthog.api.organization_member import OrganizationMemberSerializer from posthog.api.routing import TeamAndOrgViewSetMixin from posthog.api.shared import UserBasicSerializer diff --git a/ee/api/test/test_feature_flag.py b/ee/api/test/test_feature_flag.py index e3dd5849d607c..0bc7292f7a875 100644 --- a/ee/api/test/test_feature_flag.py +++ b/ee/api/test/test_feature_flag.py @@ -1,6 +1,6 @@ from ee.api.test.base import APILicensedTest -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role, RoleMembership +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role, RoleMembership from posthog.models.feature_flag import FeatureFlag from posthog.models.organization import OrganizationMembership diff --git a/ee/api/test/test_feature_flag_role_access.py b/ee/api/test/test_feature_flag_role_access.py index 3cd4e947d90c9..d73c1c7384493 100644 --- a/ee/api/test/test_feature_flag_role_access.py +++ b/ee/api/test/test_feature_flag_role_access.py @@ -2,8 +2,8 @@ from ee.api.test.base import APILicensedTest from ee.models.feature_flag_role_access import FeatureFlagRoleAccess -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role from posthog.models.feature_flag import FeatureFlag from posthog.models.organization import OrganizationMembership from posthog.models.user import User diff --git a/ee/api/test/test_organization_resource_access.py b/ee/api/test/test_organization_resource_access.py index 9123214a092db..98206fe519f44 100644 --- a/ee/api/test/test_organization_resource_access.py +++ b/ee/api/test/test_organization_resource_access.py @@ -2,7 +2,7 @@ from rest_framework import status from ee.api.test.base import APILicensedTest -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.models.organization import Organization, OrganizationMembership from posthog.test.base import QueryMatchingTest, snapshot_postgres_queries, FuzzyInt diff --git a/ee/api/test/test_role.py b/ee/api/test/test_role.py index 1a3068ff4cf4f..96503162d5fe9 100644 --- a/ee/api/test/test_role.py +++ b/ee/api/test/test_role.py @@ -2,8 +2,8 @@ from rest_framework import status from ee.api.test.base import APILicensedTest -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role from posthog.models.organization import Organization, OrganizationMembership diff --git a/ee/api/test/test_role_membership.py b/ee/api/test/test_role_membership.py index f89796d9b7c4f..c3e67cf0514d2 100644 --- a/ee/api/test/test_role_membership.py +++ b/ee/api/test/test_role_membership.py @@ -1,7 +1,7 @@ from rest_framework import status from ee.api.test.base import APILicensedTest -from ee.models.role import Role, RoleMembership +from ee.models.rbac.role import Role, RoleMembership from posthog.models.organization import Organization, OrganizationMembership from posthog.models.user import User diff --git a/ee/models/__init__.py b/ee/models/__init__.py index fd87f76bd54eb..ff5a8fe2dff40 100644 --- a/ee/models/__init__.py +++ b/ee/models/__init__.py @@ -5,7 +5,7 @@ from .hook import Hook from .license import License from .property_definition import EnterprisePropertyDefinition -from .role import Role, RoleMembership +from .rbac.role import Role, RoleMembership __all__ = [ "EnterpriseEventDefinition", diff --git a/ee/models/organization_resource_access.py b/ee/models/rbac/organization_resource_access.py similarity index 95% rename from ee/models/organization_resource_access.py rename to ee/models/rbac/organization_resource_access.py index 924b3e9db2855..de4c86d95a8bc 100644 --- a/ee/models/organization_resource_access.py +++ b/ee/models/rbac/organization_resource_access.py @@ -2,6 +2,8 @@ from posthog.models.organization import Organization +# NOTE: This will be deprecated in favour of the AccessControl model + class OrganizationResourceAccess(models.Model): class AccessLevel(models.IntegerChoices): diff --git a/ee/models/role.py b/ee/models/rbac/role.py similarity index 95% rename from ee/models/role.py rename to ee/models/rbac/role.py index f37170818dbc3..97201835adb1a 100644 --- a/ee/models/role.py +++ b/ee/models/rbac/role.py @@ -1,6 +1,6 @@ from django.db import models -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.models.utils import UUIDModel diff --git a/ee/urls.py b/ee/urls.py index f0cf168acffb0..7c722bc31852f 100644 --- a/ee/urls.py +++ b/ee/urls.py @@ -6,6 +6,7 @@ from django.urls.conf import path from ee.api import integration +from .api.rbac import organization_resource_access, role from .api import ( authentication, @@ -15,8 +16,6 @@ feature_flag_role_access, hooks, license, - organization_resource_access, - role, sentry_stats, subscription, ) @@ -49,6 +48,7 @@ def extend_api_router() -> None: "organization_role_memberships", ["organization_id", "role_id"], ) + # Start: routes to be deprecated project_feature_flags_router.register( r"role_access", feature_flag_role_access.FeatureFlagRoleAccessViewSet, @@ -61,6 +61,7 @@ def extend_api_router() -> None: "organization_resource_access", ["organization_id"], ) + # End: routes to be deprecated register_grandfathered_environment_nested_viewset(r"hooks", hooks.HookViewSet, "environment_hooks", ["team_id"]) register_grandfathered_environment_nested_viewset( r"explicit_members", diff --git a/frontend/src/lib/constants.tsx b/frontend/src/lib/constants.tsx index 3d563ed32d7da..1ba86ab79c36b 100644 --- a/frontend/src/lib/constants.tsx +++ b/frontend/src/lib/constants.tsx @@ -220,6 +220,7 @@ export const FEATURE_FLAGS = { LEGACY_ACTION_WEBHOOKS: 'legacy-action-webhooks', // owner: @mariusandra #team-cdp SESSION_REPLAY_URL_TRIGGER: 'session-replay-url-trigger', // owner: @richard-better #team-replay REPLAY_TEMPLATES: 'replay-templates', // owner: @raquelmsmith #team-replay + ROLE_BASED_ACCESS_CONTROL: 'role-based-access-control', // owner: @zach EXPERIMENTS_HOLDOUTS: 'experiments-holdouts', // owner: @jurajmajerik #team-experiments MESSAGING: 'messaging', // owner @mariusandra #team-cdp SESSION_REPLAY_URL_BLOCKLIST: 'session-replay-url-blocklist', // owner: @richard-better #team-replay diff --git a/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx b/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx index e4f78f929def5..be47278635896 100644 --- a/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx +++ b/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx @@ -9,7 +9,7 @@ import { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast' import { urls } from 'scenes/urls' import { userLogic } from 'scenes/userLogic' -import { OrganizationBasicType, PersonalAPIKeyType, TeamBasicType } from '~/types' +import { APIScopeObject, OrganizationBasicType, PersonalAPIKeyType, TeamBasicType } from '~/types' import type { personalAPIKeysLogicType } from './personalAPIKeysLogicType' @@ -32,7 +32,7 @@ export const API_KEY_SCOPE_PRESETS = [ ] export type APIScope = { - key: string + key: APIScopeObject info?: string | JSX.Element disabledActions?: ('read' | 'write')[] disabledWhenProjectScoped?: boolean diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 6b78307b81774..eb839f5252bcd 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -3821,6 +3821,37 @@ export interface RoleMemberType { user_uuid: string } +export type APIScopeObject = + | 'action' + | 'activity_log' + | 'annotation' + | 'batch_export' + | 'cohort' + | 'dashboard' + | 'dashboard_template' + | 'early_access_feature' + | 'event_definition' + | 'experiment' + | 'export' + | 'feature_flag' + | 'group' + | 'insight' + | 'query' + | 'notebook' + | 'organization' + | 'organization_member' + | 'person' + | 'plugin' + | 'project' + | 'property_definition' + | 'session_recording' + | 'session_recording_playlist' + | 'sharing_configuration' + | 'subscription' + | 'survey' + | 'user' + | 'webhook' + export interface OrganizationResourcePermissionType { id: string resource: Resource diff --git a/posthog/api/personal_api_key.py b/posthog/api/personal_api_key.py index 23f6d531693a0..355d6cc1c189a 100644 --- a/posthog/api/personal_api_key.py +++ b/posthog/api/personal_api_key.py @@ -5,7 +5,8 @@ from rest_framework.permissions import IsAuthenticated from posthog.models import PersonalAPIKey, User -from posthog.models.personal_api_key import API_SCOPE_ACTIONS, API_SCOPE_OBJECTS, hash_key_value, mask_key_value +from posthog.models.personal_api_key import hash_key_value, mask_key_value +from posthog.models.scopes import API_SCOPE_ACTIONS, API_SCOPE_OBJECTS from posthog.models.team.team import Team from posthog.models.utils import generate_random_token_personal from posthog.permissions import TimeSensitiveActionPermission diff --git a/posthog/api/project.py b/posthog/api/project.py index 8efca11b21968..c740dc330801a 100644 --- a/posthog/api/project.py +++ b/posthog/api/project.py @@ -30,7 +30,7 @@ from posthog.models.async_deletion import AsyncDeletion, DeletionType from posthog.models.group_type_mapping import GroupTypeMapping from posthog.models.organization import OrganizationMembership -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.models.product_intent.product_intent import ProductIntent from posthog.models.project import Project from posthog.models.signals import mute_selected_signals diff --git a/posthog/api/routing.py b/posthog/api/routing.py index 9ff2fede76449..084ddcc94c3ae 100644 --- a/posthog/api/routing.py +++ b/posthog/api/routing.py @@ -18,7 +18,7 @@ SharingAccessTokenAuthentication, ) from posthog.models.organization import Organization -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.models.project import Project from posthog.models.team import Team from posthog.models.user import User diff --git a/posthog/api/team.py b/posthog/api/team.py index 148471919cbc0..88b7f5e28b5ec 100644 --- a/posthog/api/team.py +++ b/posthog/api/team.py @@ -28,7 +28,7 @@ from posthog.models.async_deletion import AsyncDeletion, DeletionType from posthog.models.group_type_mapping import GroupTypeMapping from posthog.models.organization import OrganizationMembership -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.models.project import Project from posthog.models.signals import mute_selected_signals from posthog.models.team.util import delete_batch_exports, delete_bulky_postgres_data diff --git a/posthog/api/test/__snapshots__/test_api_docs.ambr b/posthog/api/test/__snapshots__/test_api_docs.ambr index 6ef31c6530176..2abd070a74e07 100644 --- a/posthog/api/test/__snapshots__/test_api_docs.ambr +++ b/posthog/api/test/__snapshots__/test_api_docs.ambr @@ -70,9 +70,9 @@ '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: unable to resolve type hint for function "get_product_intents". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "organization_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_members". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/api/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_associated_flags". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/api/role.py: Warning [RoleMembershipViewSet]: could not derive type of path parameter "organization_id" because model "ee.models.role.RoleMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_members". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_associated_flags". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleMembershipViewSet]: could not derive type of path parameter "organization_id" because model "ee.models.rbac.role.RoleMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.action.action.Action" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet > ActionSerializer]: unable to resolve type hint for function "get_creation_context". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/activity_log.py: Warning [ActivityLogViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.activity_logging.activity_log.ActivityLog" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', diff --git a/posthog/api/test/test_organization_feature_flag.py b/posthog/api/test/test_organization_feature_flag.py index 83550c689d5ae..65c43575f9b7e 100644 --- a/posthog/api/test/test_organization_feature_flag.py +++ b/posthog/api/test/test_organization_feature_flag.py @@ -3,7 +3,7 @@ from rest_framework import status -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.api.dashboards.dashboard import Dashboard from posthog.constants import AvailableFeature from posthog.models import FeatureFlag diff --git a/posthog/models/feature_flag/permissions.py b/posthog/models/feature_flag/permissions.py index 8f766b4fccc60..d2b0bb858a403 100644 --- a/posthog/models/feature_flag/permissions.py +++ b/posthog/models/feature_flag/permissions.py @@ -6,7 +6,7 @@ def can_user_edit_feature_flag(request, feature_flag): # self hosted check for enterprise models that may not exist try: from ee.models.feature_flag_role_access import FeatureFlagRoleAccess - from ee.models.organization_resource_access import OrganizationResourceAccess + from ee.models.rbac.organization_resource_access import OrganizationResourceAccess except: return True else: diff --git a/posthog/models/personal_api_key.py b/posthog/models/personal_api_key.py index ea886b55757c6..cac5adefbc65d 100644 --- a/posthog/models/personal_api_key.py +++ b/posthog/models/personal_api_key.py @@ -1,4 +1,4 @@ -from typing import Optional, Literal, get_args +from typing import Optional, Literal import hashlib from django.contrib.auth.hashers import PBKDF2PasswordHasher @@ -66,56 +66,3 @@ class PersonalAPIKey(models.Model): null=True, blank=True, ) - - -## API Scopes -# These are the scopes that are used to define the permissions of the API tokens. -# Not every model needs a scope - it should more be for top-level things -# Typically each object should have `read` and `write` scopes, but some objects may have more specific scopes - -# WARNING: Make sure to keep in sync with the frontend! -APIScopeObject = Literal[ - "action", - "activity_log", - "annotation", - "batch_export", - "cohort", - "dashboard", - "dashboard_template", - "early_access_feature", - "event_definition", - "experiment", - "export", - "feature_flag", - "group", - "insight", - "query", # Covers query and events endpoints - "notebook", - "organization", - "organization_member", - "person", - "plugin", - "project", - "property_definition", - "session_recording", - "session_recording_playlist", - "sharing_configuration", - "subscription", - "survey", - "user", - "webhook", -] - -APIScopeActions = Literal[ - "read", - "write", -] - -APIScopeObjectOrNotSupported = Literal[ - APIScopeObject, - "INTERNAL", -] - - -API_SCOPE_OBJECTS: tuple[APIScopeObject, ...] = get_args(APIScopeObject) -API_SCOPE_ACTIONS: tuple[APIScopeActions, ...] = get_args(APIScopeActions) diff --git a/posthog/models/scopes.py b/posthog/models/scopes.py new file mode 100644 index 0000000000000..2bd0d48b405e5 --- /dev/null +++ b/posthog/models/scopes.py @@ -0,0 +1,60 @@ +## API Scopes +# These are the scopes that are used to define the permissions of the API tokens. +# Not every model needs a scope - it should more be for top-level things +# Typically each object should have `read` and `write` scopes, but some objects may have more specific scopes + +# WARNING: Make sure to keep in sync with the frontend! +from typing import Literal, get_args + + +## API Scopes +# These are the scopes that are used to define the permissions of the API tokens. +# Not every model needs a scope - it should more be for top-level things +# Typically each object should have `read` and `write` scopes, but some objects may have more specific scopes + +# WARNING: Make sure to keep in sync with the frontend! +APIScopeObject = Literal[ + "action", + "activity_log", + "annotation", + "batch_export", + "cohort", + "dashboard", + "dashboard_template", + "early_access_feature", + "event_definition", + "experiment", + "export", + "feature_flag", + "group", + "insight", + "query", # Covers query and events endpoints + "notebook", + "organization", + "organization_member", + "person", + "plugin", + "project", + "property_definition", + "session_recording", + "session_recording_playlist", + "sharing_configuration", + "subscription", + "survey", + "user", + "webhook", +] + +APIScopeActions = Literal[ + "read", + "write", +] + +APIScopeObjectOrNotSupported = Literal[ + APIScopeObject, + "INTERNAL", +] + + +API_SCOPE_OBJECTS: tuple[APIScopeObject, ...] = get_args(APIScopeObject) +API_SCOPE_ACTIONS: tuple[APIScopeActions, ...] = get_args(APIScopeActions) diff --git a/posthog/permissions.py b/posthog/permissions.py index 889832c13baa7..6de160e099567 100644 --- a/posthog/permissions.py +++ b/posthog/permissions.py @@ -19,7 +19,7 @@ from posthog.cloud_utils import is_cloud from posthog.exceptions import EnterpriseFeatureException from posthog.models import Organization, OrganizationMembership, Team, User -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.utils import get_can_create_org CREATE_METHODS = ["POST", "PUT"] From 13f48d74d07e8e925f73f7e0c5ae59091372e64f Mon Sep 17 00:00:00 2001 From: Phani Raj Date: Tue, 29 Oct 2024 17:05:25 -0500 Subject: [PATCH 05/15] fix(Surveys): Allow Personal API Keys to read responses_count for surveys (#25879) This PR fixes the api endpoint for responses_count to accept a person API token with the survey:read scope. Reported by a user on zendesk --- posthog/api/survey.py | 2 +- .../api/test/__snapshots__/test_api_docs.ambr | 2 +- posthog/api/test/test_survey.py | 36 ++++ .../test/__snapshots__/test_trends.ambr | 204 +++--------------- 4 files changed, 70 insertions(+), 174 deletions(-) diff --git a/posthog/api/survey.py b/posthog/api/survey.py index ea894a7dd30c0..4864612c2b438 100644 --- a/posthog/api/survey.py +++ b/posthog/api/survey.py @@ -597,7 +597,7 @@ def destroy(self, request: Request, *args: Any, **kwargs: Any) -> Response: return super().destroy(request, *args, **kwargs) - @action(methods=["GET"], detail=False) + @action(methods=["GET"], detail=False, required_scopes=["survey:read"]) def responses_count(self, request: request.Request, **kwargs): earliest_survey_start_date = Survey.objects.filter(team_id=self.team_id).aggregate(Min("start_date"))[ "start_date__min" diff --git a/posthog/api/test/__snapshots__/test_api_docs.ambr b/posthog/api/test/__snapshots__/test_api_docs.ambr index 2abd070a74e07..9221776ff38d1 100644 --- a/posthog/api/test/__snapshots__/test_api_docs.ambr +++ b/posthog/api/test/__snapshots__/test_api_docs.ambr @@ -97,8 +97,8 @@ '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet > SurveySerializer]: unable to resolve type hint for function "get_conditions". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/web_experiment.py: Warning [WebExperimentViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.web_experiment.WebExperiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', 'Warning: encountered multiple names for the same choice set (HrefMatchingEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind069Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind069Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "type". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "TypeF73Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (EffectivePrivilegeLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', diff --git a/posthog/api/test/test_survey.py b/posthog/api/test/test_survey.py index c6de95a44702e..c79ab601b3369 100644 --- a/posthog/api/test/test_survey.py +++ b/posthog/api/test/test_survey.py @@ -11,6 +11,7 @@ from rest_framework import status from posthog.api.survey import nh3_clean_with_allow_list +from posthog.api.test.test_personal_api_keys import PersonalAPIKeysBaseTest from posthog.constants import AvailableFeature from posthog.models import Action, FeatureFlag, Team from posthog.models.cohort.cohort import Cohort @@ -2783,6 +2784,41 @@ def test_list_surveys_excludes_description(self): assert surveys[1]["name"] == "Survey 2" +class TestSurveyAPITokens(PersonalAPIKeysBaseTest, APIBaseTest): + def setUp(self): + super().setUp() + self.key.scopes = ["survey:read"] + self.key.save() + + @freeze_time("2024-05-01 14:40:09") + def test_responses_count_works_with_survey_read(self): + survey_counts = { + "d63bb580-01af-4819-aae5-edcf7ef2044f": 3, + "fe7c4b62-8fc9-401e-b483-e4ff98fd13d5": 6, + "daed7689-d498-49fe-936f-e85554351b6c": 100, + } + + earliest_survey = Survey.objects.create(team_id=self.team.id) + earliest_survey.start_date = datetime.now() - timedelta(days=101) + earliest_survey.save() + + for survey_id, count in survey_counts.items(): + for _ in range(count): + _create_event( + event="survey sent", + team=self.team, + distinct_id=self.user.id, + properties={"$survey_id": survey_id}, + timestamp=datetime.now() - timedelta(days=count), + ) + + response = self._do_request(f"/api/projects/{self.team.id}/surveys/responses_count") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + data = response.json() + self.assertEqual(data, survey_counts) + + class TestResponsesCount(ClickhouseTestMixin, APIBaseTest): @snapshot_clickhouse_queries @freeze_time("2024-05-01 14:40:09") diff --git a/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr b/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr index 4ae57feb8cb96..6027f7ca7bb42 100644 --- a/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr +++ b/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr @@ -851,49 +851,14 @@ # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.1 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - breakdown_value AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value) - GROUP BY day_start, - breakdown_value - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE isNotNull(breakdown_value) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.10 @@ -1110,143 +1075,38 @@ # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.2 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - breakdown_value AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value) - GROUP BY day_start, - breakdown_value - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE isNotNull(breakdown_value) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.3 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - arrayMap(i -> if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', i), breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - [ifNull(toString(breakdown_value_1), '$$_posthog_breakdown_null_$$')] AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value_1 - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value_1) - GROUP BY day_start, - breakdown_value_1 - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE arrayExists(x -> isNotNull(x), breakdown_value) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.4 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - arrayMap(i -> if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', i), breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - [ifNull(toString(breakdown_value_1), '$$_posthog_breakdown_null_$$')] AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value_1 - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value_1) - GROUP BY day_start, - breakdown_value_1 - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE arrayExists(x -> isNotNull(x), breakdown_value) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.5 From bfa9c7bc7142f9ee5afb20ef97c97e683dd69f11 Mon Sep 17 00:00:00 2001 From: Robbie Date: Wed, 30 Oct 2024 10:14:30 +0000 Subject: [PATCH 06/15] fix(sessions): Limit the teams for which we ingest sessions v1 events (#25766) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- ...create_sessions_v1_after_limiting_teams.py | 8 ++ .../test/__snapshots__/test_schema.ambr | 2 +- .../clickhouse/test/test_sessions_model.py | 53 +++++---- .../database/schema/test/test_sessions_v1.py | 78 ++++-------- ...ssion_attribution_explorer_query_runner.py | 29 ++--- .../web_analytics/test/test_web_overview.py | 38 ++---- .../test/test_web_stats_table.py | 112 +++++------------- posthog/models/sessions/sql.py | 30 ++++- 8 files changed, 143 insertions(+), 207 deletions(-) create mode 100644 posthog/clickhouse/migrations/0083_recreate_sessions_v1_after_limiting_teams.py diff --git a/posthog/clickhouse/migrations/0083_recreate_sessions_v1_after_limiting_teams.py b/posthog/clickhouse/migrations/0083_recreate_sessions_v1_after_limiting_teams.py new file mode 100644 index 0000000000000..d0da2eb158b6d --- /dev/null +++ b/posthog/clickhouse/migrations/0083_recreate_sessions_v1_after_limiting_teams.py @@ -0,0 +1,8 @@ +from posthog.clickhouse.client.migration_tools import run_sql_with_exceptions +from posthog.models.sessions.sql import DROP_SESSION_MATERIALIZED_VIEW_SQL, SESSIONS_TABLE_MV_SQL + +operations = [ + # drop the mv, and recreate it with the new part of the WHERE clause + run_sql_with_exceptions(DROP_SESSION_MATERIALIZED_VIEW_SQL()), + run_sql_with_exceptions(SESSIONS_TABLE_MV_SQL()), +] diff --git a/posthog/clickhouse/test/__snapshots__/test_schema.ambr b/posthog/clickhouse/test/__snapshots__/test_schema.ambr index bc5a623ed0cdc..1fc54f30fdc78 100644 --- a/posthog/clickhouse/test/__snapshots__/test_schema.ambr +++ b/posthog/clickhouse/test/__snapshots__/test_schema.ambr @@ -2160,7 +2160,7 @@ sumIf(1, event='$autocapture') as autocapture_count FROM posthog_test.sharded_events - WHERE `$session_id` IS NOT NULL AND `$session_id` != '' + WHERE `$session_id` IS NOT NULL AND `$session_id` != '' AND team_id IN (1, 2, 13610, 19279, 21173, 29929, 32050, 9910, 11775, 21129, 31490) GROUP BY `$session_id`, team_id diff --git a/posthog/clickhouse/test/test_sessions_model.py b/posthog/clickhouse/test/test_sessions_model.py index 0e3631e0ab3cd..0042456a03d95 100644 --- a/posthog/clickhouse/test/test_sessions_model.py +++ b/posthog/clickhouse/test/test_sessions_model.py @@ -1,8 +1,10 @@ from posthog.clickhouse.client import sync_execute, query_with_columns +from posthog.models import Team from posthog.test.base import ( _create_event, ClickhouseTestMixin, BaseTest, + ClickhouseDestroyTablesMixin, ) distinct_id_counter = 0 @@ -21,7 +23,12 @@ def create_session_id(): return f"s{session_id_counter}" -class TestSessionsModel(ClickhouseTestMixin, BaseTest): +# only certain team ids can insert events into this legacy sessions table, see sessions/sql.py for more info +TEAM_ID = 2 +TEAM = Team(id=TEAM_ID) + + +class TestSessionsModel(ClickhouseDestroyTablesMixin, ClickhouseTestMixin, BaseTest): def select_by_session_id(self, session_id): return query_with_columns( """ @@ -34,7 +41,7 @@ def select_by_session_id(self, session_id): """, { "session_id": session_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) @@ -42,7 +49,7 @@ def test_it_creates_session_when_creating_event(self): distinct_id = create_distinct_id() session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/", "$session_id": session_id}, @@ -60,7 +67,7 @@ def test_it_creates_session_when_creating_event(self): """, { "distinct_id": distinct_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) @@ -72,14 +79,14 @@ def test_handles_different_distinct_id_across_same_session(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id1, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id2, properties={"$session_id": session_id}, @@ -96,28 +103,28 @@ def test_handles_entry_and_exit_urls(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/entry", "$session_id": session_id}, timestamp="2024-03-08:01", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/middle", "$session_id": session_id}, timestamp="2024-03-08:02", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/middle", "$session_id": session_id}, timestamp="2024-03-08:03", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/exit", "$session_id": session_id}, @@ -136,14 +143,14 @@ def test_handles_initial_utm_properties(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id, "utm_source": "source"}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id, "utm_source": "other_source"}, @@ -159,35 +166,35 @@ def test_counts_pageviews_autocaptures_and_events(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$autocapture", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$autocapture", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="other event", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageleave", distinct_id=distinct_id, properties={"$session_id": session_id}, @@ -209,14 +216,14 @@ def test_separates_sessions_across_same_user(self): session_id3 = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id1}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id2}, @@ -235,7 +242,7 @@ def test_select_from_sessions(self): distinct_id = create_distinct_id() session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id}, @@ -260,7 +267,7 @@ def test_select_from_sessions(self): """, { "session_id": session_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) self.assertEqual(len(responses), 1) @@ -270,7 +277,7 @@ def test_select_from_sessions_mv(self): distinct_id = create_distinct_id() session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id}, @@ -295,7 +302,7 @@ def test_select_from_sessions_mv(self): """, { "session_id": session_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) self.assertEqual(len(responses), 1) diff --git a/posthog/hogql/database/schema/test/test_sessions_v1.py b/posthog/hogql/database/schema/test/test_sessions_v1.py index eefd04197deab..77f41fd2f6bbc 100644 --- a/posthog/hogql/database/schema/test/test_sessions_v1.py +++ b/posthog/hogql/database/schema/test/test_sessions_v1.py @@ -8,6 +8,7 @@ ) from posthog.hogql.parser import parse_select from posthog.hogql.query import execute_hogql_query +from posthog.models import Team from posthog.models.property_definition import PropertyType from posthog.models.utils import uuid7 from posthog.schema import HogQLQueryModifiers, BounceRatePageViewMode, SessionTableVersion @@ -15,16 +16,20 @@ APIBaseTest, ClickhouseTestMixin, _create_event, - _create_person, + ClickhouseDestroyTablesMixin, ) +# only certain team ids can insert events into this legacy sessions table, see sessions/sql.py for more info +TEAM_ID = 2 +TEAM = Team(id=TEAM_ID, pk=TEAM_ID) -class TestSessionsV1(ClickhouseTestMixin, APIBaseTest): + +class TestSessionsV1(ClickhouseDestroyTablesMixin, ClickhouseTestMixin, APIBaseTest): def __execute(self, query): modifiers = HogQLQueryModifiers(sessionTableVersion=SessionTableVersion.V1) return execute_hogql_query( query=query, - team=self.team, + team=TEAM, modifiers=modifiers, ) @@ -33,7 +38,7 @@ def test_select_star(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$current_url": "https://example.com", "$session_id": session_id}, ) @@ -56,7 +61,7 @@ def test_select_event_sessions_star(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$current_url": "https://example.com", "$session_id": session_id}, ) @@ -93,7 +98,7 @@ def test_channel_type(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"gad_source": "1", "$session_id": session_id}, ) @@ -116,7 +121,7 @@ def test_event_dot_session_dot_channel_type(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"gad_source": "1", "$session_id": session_id}, ) @@ -139,7 +144,7 @@ def test_events_session_dot_channel_type(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"gad_source": "1", "$session_id": session_id}, ) @@ -157,57 +162,26 @@ def test_events_session_dot_channel_type(self): "Paid Search", ) - def test_persons_and_sessions_on_events(self): - p1 = _create_person(distinct_ids=["d1"], team=self.team) - p2 = _create_person(distinct_ids=["d2"], team=self.team) - - s1 = "session_test_persons_and_sessions_on_events_1" - s2 = "session_test_persons_and_sessions_on_events_2" - - _create_event( - event="$pageview", - team=self.team, - distinct_id="d1", - properties={"$session_id": s1, "utm_source": "source1"}, - ) - _create_event( - event="$pageview", - team=self.team, - distinct_id="d2", - properties={"$session_id": s2, "utm_source": "source2"}, - ) - - response = self.__execute( - parse_select( - "select events.person_id, session.$entry_utm_source from events where $session_id = {session_id} or $session_id = {session_id2} order by 2 asc", - placeholders={"session_id": ast.Constant(value=s1), "session_id2": ast.Constant(value=s2)}, - ), - ) - - [row1, row2] = response.results or [] - self.assertEqual(row1, (p1.uuid, "source1")) - self.assertEqual(row2, (p2.uuid, "source2")) - @parameterized.expand([(BounceRatePageViewMode.UNIQ_URLS,), (BounceRatePageViewMode.COUNT_PAGEVIEWS,)]) def test_bounce_rate(self, bounceRatePageViewMode): # person with 2 different sessions _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$session_id": "s1a", "$current_url": "https://example.com/1"}, timestamp="2023-12-02", ) _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$session_id": "s1a", "$current_url": "https://example.com/2"}, timestamp="2023-12-03", ) _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$session_id": "s1b", "$current_url": "https://example.com/3"}, timestamp="2023-12-12", @@ -215,7 +189,7 @@ def test_bounce_rate(self, bounceRatePageViewMode): # session with 1 pageview _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d2", properties={"$session_id": "s2", "$current_url": "https://example.com/4"}, timestamp="2023-12-11", @@ -223,14 +197,14 @@ def test_bounce_rate(self, bounceRatePageViewMode): # session with 1 pageview and 1 autocapture _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d3", properties={"$session_id": "s3", "$current_url": "https://example.com/5"}, timestamp="2023-12-11", ) _create_event( event="$autocapture", - team=self.team, + team=TEAM, distinct_id="d3", properties={"$session_id": "s3", "$current_url": "https://example.com/5"}, timestamp="2023-12-11", @@ -238,14 +212,14 @@ def test_bounce_rate(self, bounceRatePageViewMode): # short session with a pageleave _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d4", properties={"$session_id": "s4", "$current_url": "https://example.com/6"}, timestamp="2023-12-11T12:00:00", ) _create_event( event="$pageleave", - team=self.team, + team=TEAM, distinct_id="d4", properties={"$session_id": "s4", "$current_url": "https://example.com/6"}, timestamp="2023-12-11T12:00:01", @@ -253,14 +227,14 @@ def test_bounce_rate(self, bounceRatePageViewMode): # long session with a pageleave _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d5", properties={"$session_id": "s5", "$current_url": "https://example.com/7"}, timestamp="2023-12-11T12:00:00", ) _create_event( event="$pageleave", - team=self.team, + team=TEAM, distinct_id="d5", properties={"$session_id": "s5", "$current_url": "https://example.com/7"}, timestamp="2023-12-11T12:00:11", @@ -269,7 +243,7 @@ def test_bounce_rate(self, bounceRatePageViewMode): parse_select( "select $is_bounce, session_id from sessions ORDER BY session_id", ), - self.team, + TEAM, modifiers=HogQLQueryModifiers( bounceRatePageViewMode=bounceRatePageViewMode, sessionTableVersion=SessionTableVersion.V1 ), @@ -291,7 +265,7 @@ def test_can_use_v1_and_v2_fields(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={ "$current_url": "https://example.com/pathname", @@ -372,4 +346,4 @@ def test_entry_utm(self): def test_can_get_values_for_all(self): results = get_lazy_session_table_properties_v1(None) for prop in results: - get_lazy_session_table_values_v1(key=prop["id"], team=self.team, search_term=None) + get_lazy_session_table_values_v1(key=prop["id"], team=TEAM, search_term=None) diff --git a/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py b/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py index d285ff2aa25f3..06ba1ddfeabbe 100644 --- a/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py +++ b/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py @@ -1,6 +1,5 @@ from typing import Optional -from parameterized import parameterized from posthog.hogql.constants import LimitContext from posthog.hogql_queries.web_analytics.session_attribution_explorer_query_runner import ( @@ -80,7 +79,7 @@ def _run_session_attribution_query( self, date_from: Optional[str] = None, date_to: Optional[str] = None, - session_table_version: SessionTableVersion = SessionTableVersion.V1, + session_table_version: SessionTableVersion = SessionTableVersion.V2, group_by: Optional[list[SessionAttributionGroupBy]] = None, limit_context: Optional[LimitContext] = None, properties: Optional[list[SessionPropertyFilter]] = None, @@ -94,20 +93,14 @@ def _run_session_attribution_query( runner = SessionAttributionExplorerQueryRunner(team=self.team, query=query, limit_context=limit_context) return runner.calculate() - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion): - results = self._run_session_attribution_query( - session_table_version=session_table_version, - ).results + def test_no_crash_when_no_data(self): + results = self._run_session_attribution_query().results assert results == [(0, [], [], [], [], [], [], [])] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_group_by_nothing(self, session_table_version: SessionTableVersion): + def test_group_by_nothing(self): self._create_data() - results = self._run_session_attribution_query( - session_table_version=session_table_version, - ).results + results = self._run_session_attribution_query().results assert results == [ ( @@ -122,12 +115,10 @@ def test_group_by_nothing(self, session_table_version: SessionTableVersion): ) ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_group_by_initial_url(self, session_table_version: SessionTableVersion): + def test_group_by_initial_url(self): self._create_data() results = self._run_session_attribution_query( - session_table_version=session_table_version, group_by=[SessionAttributionGroupBy.INITIAL_URL], ).results @@ -164,12 +155,10 @@ def test_group_by_initial_url(self, session_table_version: SessionTableVersion): ), ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_group_channel_medium_source(self, session_table_version: SessionTableVersion): + def test_group_channel_medium_source(self): self._create_data() results = self._run_session_attribution_query( - session_table_version=session_table_version, group_by=[ SessionAttributionGroupBy.CHANNEL_TYPE, SessionAttributionGroupBy.MEDIUM, @@ -191,12 +180,10 @@ def test_group_channel_medium_source(self, session_table_version: SessionTableVe (1, "Referral", ["referring_domain2"], "source2", "medium2", ["campaign2"], [], ["http://example.com/2"]), ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_filters(self, session_table_version: SessionTableVersion): + def test_filters(self): self._create_data() results = self._run_session_attribution_query( - session_table_version=session_table_version, group_by=[ SessionAttributionGroupBy.CHANNEL_TYPE, SessionAttributionGroupBy.MEDIUM, diff --git a/posthog/hogql_queries/web_analytics/test/test_web_overview.py b/posthog/hogql_queries/web_analytics/test/test_web_overview.py index bc41d4d0a6785..3e9b570f57b9e 100644 --- a/posthog/hogql_queries/web_analytics/test/test_web_overview.py +++ b/posthog/hogql_queries/web_analytics/test/test_web_overview.py @@ -2,7 +2,6 @@ from unittest.mock import MagicMock, patch from freezegun import freeze_time -from parameterized import parameterized from posthog.clickhouse.client.execute import sync_execute from posthog.hogql.constants import LimitContext @@ -72,7 +71,7 @@ def _run_web_overview_query( self, date_from: str, date_to: str, - session_table_version: SessionTableVersion = SessionTableVersion.V1, + session_table_version: SessionTableVersion = SessionTableVersion.V2, compare: bool = True, limit_context: Optional[LimitContext] = None, filter_test_accounts: Optional[bool] = False, @@ -97,19 +96,16 @@ def _run_web_overview_query( runner = WebOverviewQueryRunner(team=self.team, query=query, limit_context=limit_context) return runner.calculate() - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion): + def test_no_crash_when_no_data(self): results = self._run_web_overview_query( "2023-12-08", "2023-12-15", - session_table_version=session_table_version, ).results assert [item.key for item in results] == ["visitors", "views", "sessions", "session duration", "bounce rate"] results = self._run_web_overview_query( "2023-12-08", "2023-12-15", - session_table_version=session_table_version, includeLCPScore=True, ).results assert [item.key for item in results] == [ @@ -132,9 +128,7 @@ def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion) } ], ) - results = self._run_web_overview_query( - "2023-12-08", "2023-12-15", session_table_version=session_table_version, action=action - ).results + results = self._run_web_overview_query("2023-12-08", "2023-12-15", action=action).results assert [item.key for item in results] == [ "visitors", @@ -143,8 +137,7 @@ def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion) "conversion rate", ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_increase_in_users(self, session_table_version: SessionTableVersion): + def test_increase_in_users(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-12")) s2 = str(uuid7("2023-12-11")) @@ -159,7 +152,6 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): results = self._run_web_overview_query( "2023-12-08", "2023-12-15", - session_table_version=session_table_version, ).results visitors = results[0] @@ -192,8 +184,7 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): self.assertEqual(0, bounce.previous) self.assertEqual(None, bounce.changeFromPreviousPct) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_all_time(self, session_table_version: SessionTableVersion): + def test_all_time(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-12")) s2 = str(uuid7("2023-12-11")) @@ -208,7 +199,6 @@ def test_all_time(self, session_table_version: SessionTableVersion): "all", "2023-12-15", compare=False, - session_table_version=session_table_version, ).results visitors = results[0] @@ -241,15 +231,12 @@ def test_all_time(self, session_table_version: SessionTableVersion): self.assertEqual(None, bounce.previous) self.assertEqual(None, bounce.changeFromPreviousPct) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1), ("2023-12-03", s1)])]) - results = self._run_web_overview_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=True - ).results + results = self._run_web_overview_query("2023-12-01", "2023-12-03", filter_test_accounts=True).results visitors = results[0] self.assertEqual(0, visitors.value) @@ -267,21 +254,17 @@ def test_filter_test_accounts(self, session_table_version: SessionTableVersion): self.assertEqual("bounce rate", bounce.key) self.assertEqual(None, bounce.value) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_dont_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_dont_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1), ("2023-12-03", s1)])]) - results = self._run_web_overview_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=False - ).results + results = self._run_web_overview_query("2023-12-01", "2023-12-03", filter_test_accounts=False).results visitors = results[0] self.assertEqual(1, visitors.value) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_correctly_counts_pageviews_in_long_running_session(self, session_table_version: SessionTableVersion): + def test_correctly_counts_pageviews_in_long_running_session(self): # this test is important when using the v1 sessions table as the raw sessions table will have 3 entries, one per day s1 = str(uuid7("2023-12-01")) self._create_events( @@ -293,7 +276,6 @@ def test_correctly_counts_pageviews_in_long_running_session(self, session_table_ results = self._run_web_overview_query( "2023-12-01", "2023-12-03", - session_table_version=session_table_version, ).results visitors = results[0] diff --git a/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py b/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py index 10ce9ab1ebcb4..865424f5bc862 100644 --- a/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py +++ b/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py @@ -1,7 +1,6 @@ from typing import Optional from freezegun import freeze_time -from parameterized import parameterized from posthog.hogql_queries.web_analytics.stats_table import WebStatsTableQueryRunner from posthog.models import Cohort @@ -108,7 +107,7 @@ def _run_web_stats_table_query( include_bounce_rate=False, include_scroll_depth=False, properties=None, - session_table_version: SessionTableVersion = SessionTableVersion.V1, + session_table_version: SessionTableVersion = SessionTableVersion.V2, filter_test_accounts: Optional[bool] = False, ): modifiers = HogQLQueryModifiers(sessionTableVersion=session_table_version) @@ -126,15 +125,14 @@ def _run_web_stats_table_query( runner = WebStatsTableQueryRunner(team=self.team, query=query, modifiers=modifiers) return runner.calculate() - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion): + def test_no_crash_when_no_data(self): results = self._run_web_stats_table_query( - "2023-12-08", "2023-12-15", session_table_version=session_table_version + "2023-12-08", + "2023-12-15", ).results self.assertEqual([], results) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_increase_in_users(self, session_table_version: SessionTableVersion): + def test_increase_in_users(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-13")) s2 = str(uuid7("2023-12-10")) @@ -145,9 +143,7 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): ] ) - results = self._run_web_stats_table_query( - "2023-12-01", "2023-12-11", session_table_version=session_table_version - ).results + results = self._run_web_stats_table_query("2023-12-01", "2023-12-11").results self.assertEqual( [ @@ -157,8 +153,7 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_all_time(self, session_table_version: SessionTableVersion): + def test_all_time(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-13")) s2 = str(uuid7("2023-12-10")) @@ -169,9 +164,7 @@ def test_all_time(self, session_table_version: SessionTableVersion): ] ) - results = self._run_web_stats_table_query( - "all", "2023-12-15", session_table_version=session_table_version - ).results + results = self._run_web_stats_table_query("all", "2023-12-15").results self.assertEqual( [ @@ -182,38 +175,31 @@ def test_all_time(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1, "/"), ("2023-12-03", s1, "/login")])]) - results = self._run_web_stats_table_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=True - ).results + results = self._run_web_stats_table_query("2023-12-01", "2023-12-03", filter_test_accounts=True).results self.assertEqual( [], results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_dont_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_dont_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1, "/"), ("2023-12-03", s1, "/login")])]) - results = self._run_web_stats_table_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=False - ).results + results = self._run_web_stats_table_query("2023-12-01", "2023-12-03", filter_test_accounts=False).results self.assertEqual( [["/", 1, 1], ["/login", 1, 1]], results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_breakdown_channel_type_doesnt_throw(self, session_table_version: SessionTableVersion): + def test_breakdown_channel_type_doesnt_throw(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-13")) s2 = str(uuid7("2023-12-10")) @@ -229,7 +215,6 @@ def test_breakdown_channel_type_doesnt_throw(self, session_table_version: Sessio "2023-12-01", "2023-12-03", breakdown_by=WebStatsBreakdown.INITIAL_CHANNEL_TYPE, - session_table_version=session_table_version, ).results self.assertEqual( @@ -237,8 +222,7 @@ def test_breakdown_channel_type_doesnt_throw(self, session_table_version: Sessio len(results), ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_limit(self, session_table_version: SessionTableVersion): + def test_limit(self): s1 = str(uuid7("2023-12-02")) s2 = str(uuid7("2023-12-10")) self._create_events( @@ -248,9 +232,7 @@ def test_limit(self, session_table_version: SessionTableVersion): ] ) - response_1 = self._run_web_stats_table_query( - "all", "2023-12-15", limit=1, session_table_version=session_table_version - ) + response_1 = self._run_web_stats_table_query("all", "2023-12-15", limit=1) self.assertEqual( [ ["/", 2, 2], @@ -269,8 +251,7 @@ def test_limit(self, session_table_version: SessionTableVersion): ) self.assertEqual(False, response_2.hasMore) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_path_filters(self, session_table_version: SessionTableVersion): + def test_path_filters(self): s1 = str(uuid7("2023-12-02")) s2 = str(uuid7("2023-12-10")) s3 = str(uuid7("2023-12-10")) @@ -295,7 +276,6 @@ def test_path_filters(self, session_table_version: SessionTableVersion): {"regex": "thing_a", "alias": "thing_b"}, {"regex": "thing_b", "alias": "thing_c"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -308,8 +288,7 @@ def test_path_filters(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate_one_user(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate_one_user(self): self._create_pageviews( "p1", [ @@ -325,7 +304,6 @@ def test_scroll_depth_bounce_rate_one_user(self, session_table_version: SessionT breakdown_by=WebStatsBreakdown.PAGE, include_scroll_depth=True, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -337,8 +315,7 @@ def test_scroll_depth_bounce_rate_one_user(self, session_table_version: SessionT results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate(self): self._create_pageviews( "p1", [ @@ -369,7 +346,6 @@ def test_scroll_depth_bounce_rate(self, session_table_version: SessionTableVersi breakdown_by=WebStatsBreakdown.PAGE, include_scroll_depth=True, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -381,8 +357,7 @@ def test_scroll_depth_bounce_rate(self, session_table_version: SessionTableVersi results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate_with_filter(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate_with_filter(self): self._create_pageviews( "p1", [ @@ -414,7 +389,6 @@ def test_scroll_depth_bounce_rate_with_filter(self, session_table_version: Sessi include_scroll_depth=True, include_bounce_rate=True, properties=[EventPropertyFilter(key="$pathname", operator=PropertyOperator.EXACT, value="/a")], - session_table_version=session_table_version, ).results self.assertEqual( @@ -424,8 +398,7 @@ def test_scroll_depth_bounce_rate_with_filter(self, session_table_version: Sessi results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate_path_cleaning(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate_path_cleaning(self): self._create_pageviews( "p1", [ @@ -446,7 +419,6 @@ def test_scroll_depth_bounce_rate_path_cleaning(self, session_table_version: Ses {"regex": "\\/b\\/\\d+", "alias": "/b/:id"}, {"regex": "\\/c\\/\\d+", "alias": "/c/:id"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -458,8 +430,7 @@ def test_scroll_depth_bounce_rate_path_cleaning(self, session_table_version: Ses results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate_one_user(self, session_table_version: SessionTableVersion): + def test_bounce_rate_one_user(self): self._create_pageviews( "p1", [ @@ -474,7 +445,6 @@ def test_bounce_rate_one_user(self, session_table_version: SessionTableVersion): "2023-12-15", breakdown_by=WebStatsBreakdown.PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -486,8 +456,7 @@ def test_bounce_rate_one_user(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate(self, session_table_version: SessionTableVersion): + def test_bounce_rate(self): self._create_pageviews( "p1", [ @@ -517,7 +486,6 @@ def test_bounce_rate(self, session_table_version: SessionTableVersion): "2023-12-15", breakdown_by=WebStatsBreakdown.PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -529,8 +497,7 @@ def test_bounce_rate(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate_with_property(self, session_table_version: SessionTableVersion): + def test_bounce_rate_with_property(self): self._create_pageviews( "p1", [ @@ -561,7 +528,6 @@ def test_bounce_rate_with_property(self, session_table_version: SessionTableVers breakdown_by=WebStatsBreakdown.PAGE, include_bounce_rate=True, properties=[EventPropertyFilter(key="$pathname", operator=PropertyOperator.EXACT, value="/a")], - session_table_version=session_table_version, ).results self.assertEqual( @@ -571,8 +537,7 @@ def test_bounce_rate_with_property(self, session_table_version: SessionTableVers results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate_path_cleaning(self, session_table_version: SessionTableVersion): + def test_bounce_rate_path_cleaning(self): self._create_pageviews( "p1", [ @@ -592,7 +557,6 @@ def test_bounce_rate_path_cleaning(self, session_table_version: SessionTableVers {"regex": "\\/b\\/\\d+", "alias": "/b/:id"}, {"regex": "\\/c\\/\\d+", "alias": "/c/:id"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -604,8 +568,7 @@ def test_bounce_rate_path_cleaning(self, session_table_version: SessionTableVers results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate_one_user(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate_one_user(self): self._create_pageviews( "p1", [ @@ -620,7 +583,6 @@ def test_entry_bounce_rate_one_user(self, session_table_version: SessionTableVer "2023-12-15", breakdown_by=WebStatsBreakdown.INITIAL_PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -630,8 +592,7 @@ def test_entry_bounce_rate_one_user(self, session_table_version: SessionTableVer results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate(self): self._create_pageviews( "p1", [ @@ -661,7 +622,6 @@ def test_entry_bounce_rate(self, session_table_version: SessionTableVersion): "2023-12-15", breakdown_by=WebStatsBreakdown.INITIAL_PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -671,8 +631,7 @@ def test_entry_bounce_rate(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate_with_property(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate_with_property(self): self._create_pageviews( "p1", [ @@ -703,7 +662,6 @@ def test_entry_bounce_rate_with_property(self, session_table_version: SessionTab breakdown_by=WebStatsBreakdown.INITIAL_PAGE, include_bounce_rate=True, properties=[EventPropertyFilter(key="$pathname", operator=PropertyOperator.EXACT, value="/a")], - session_table_version=session_table_version, ).results self.assertEqual( @@ -713,8 +671,7 @@ def test_entry_bounce_rate_with_property(self, session_table_version: SessionTab results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate_path_cleaning(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate_path_cleaning(self): self._create_pageviews( "p1", [ @@ -734,7 +691,6 @@ def test_entry_bounce_rate_path_cleaning(self, session_table_version: SessionTab {"regex": "\\/b\\/\\d+", "alias": "/b/:id"}, {"regex": "\\/c\\/\\d+", "alias": "/c/:id"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -744,8 +700,7 @@ def test_entry_bounce_rate_path_cleaning(self, session_table_version: SessionTab results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_source_medium_campaign(self, session_table_version: SessionTableVersion): + def test_source_medium_campaign(self): d1 = "d1" s1 = str(uuid7("2024-06-26")) @@ -785,7 +740,6 @@ def test_source_medium_campaign(self, session_table_version: SessionTableVersion "all", "2024-06-27", breakdown_by=WebStatsBreakdown.INITIAL_UTM_SOURCE_MEDIUM_CAMPAIGN, - session_table_version=session_table_version, ).results self.assertEqual( @@ -793,8 +747,7 @@ def test_source_medium_campaign(self, session_table_version: SessionTableVersion results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_null_in_utm_tags(self, session_table_version: SessionTableVersion): + def test_null_in_utm_tags(self): d1 = "d1" s1 = str(uuid7("2024-06-26")) @@ -836,7 +789,6 @@ def test_null_in_utm_tags(self, session_table_version: SessionTableVersion): "all", "2024-06-27", breakdown_by=WebStatsBreakdown.INITIAL_UTM_SOURCE, - session_table_version=session_table_version, ).results self.assertEqual( @@ -844,8 +796,7 @@ def test_null_in_utm_tags(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_is_not_set_filter(self, session_table_version: SessionTableVersion): + def test_is_not_set_filter(self): d1 = "d1" s1 = str(uuid7("2024-06-26")) @@ -888,7 +839,6 @@ def test_is_not_set_filter(self, session_table_version: SessionTableVersion): "2024-06-27", breakdown_by=WebStatsBreakdown.INITIAL_UTM_SOURCE, properties=[EventPropertyFilter(key="utm_source", operator=PropertyOperator.IS_NOT_SET)], - session_table_version=session_table_version, ).results self.assertEqual( diff --git a/posthog/models/sessions/sql.py b/posthog/models/sessions/sql.py index 680e1f7ff6f7b..93d3083a37763 100644 --- a/posthog/models/sessions/sql.py +++ b/posthog/models/sessions/sql.py @@ -7,6 +7,7 @@ AggregatingMergeTree, ) +# V1 Sessions table TABLE_BASE_NAME = "sessions" SESSIONS_DATA_TABLE = lambda: f"sharded_{TABLE_BASE_NAME}" @@ -21,6 +22,32 @@ ) DROP_SESSION_VIEW_SQL = lambda: f"DROP VIEW IF EXISTS {TABLE_BASE_NAME}_v ON CLUSTER '{settings.CLICKHOUSE_CLUSTER}'" +# Only teams that were grandfathered into the V1 sessions table are allowed to use it. Everyone else should use V2, +# i.e. raw_sessions. These teams were those who were seen to have changed their session table version in these metabase +# queries: +# US: https://metabase.prod-us.posthog.dev/question#eyJkYXRhc2V0X3F1ZXJ5Ijp7InR5cGUiOiJuYXRpdmUiLCJuYXRpdmUiOnsicXVlcnkiOiJTRUxFQ1QgdGVhbV9pZCwgc1xuRlJPTSAoXG4gICAgU0VMRUNUIG1vZGlmaWVycy0-PidzZXNzaW9uVGFibGVWZXJzaW9uJyBBUyBzLCBpZCBhcyB0ZWFtX2lkXG4gICAgRlJPTSBwb3N0aG9nX3RlYW1cbikgc3ViXG5XSEVSRSBzICE9ICcnIiwidGVtcGxhdGUtdGFncyI6e319LCJkYXRhYmFzZSI6MzR9LCJkaXNwbGF5IjoidGFibGUiLCJwYXJhbWV0ZXJzIjpbXSwidmlzdWFsaXphdGlvbl9zZXR0aW5ncyI6e319 +# EU: https://metabase.prod-eu.posthog.dev/question#eyJkYXRhc2V0X3F1ZXJ5Ijp7InR5cGUiOiJuYXRpdmUiLCJuYXRpdmUiOnsicXVlcnkiOiJTRUxFQ1QgdGVhbV9pZCwgc1xuRlJPTSAoXG4gICAgU0VMRUNUIG1vZGlmaWVycy0-PidzZXNzaW9uVGFibGVWZXJzaW9uJyBBUyBzLCBpZCBhcyB0ZWFtX2lkXG4gICAgRlJPTSBwb3N0aG9nX3RlYW1cbikgc3ViXG5XSEVSRSBzICE9ICcnIiwidGVtcGxhdGUtdGFncyI6e319LCJkYXRhYmFzZSI6MzR9LCJkaXNwbGF5IjoidGFibGUiLCJwYXJhbWV0ZXJzIjpbXSwidmlzdWFsaXphdGlvbl9zZXR0aW5ncyI6e319 +# or had contacted support about an issue. +# This list exists because we want to reduce the number of writes happening to this table, and so we don't write to it +# for any team not in this list. Adding a team to this is possible if needed, but would require changing this MV in +# production and backfilling this table with the management command backfill_sessions_table. +ALLOWED_TEAM_IDS = [ + # posthog + 1, + 2, + # US query + 13610, # zendesk: https://posthoghelp.zendesk.com/agent/tickets/18001 + 19279, + 21173, + 29929, + 32050, + # EU query + 9910, + 11775, + 21129, + 31490, +] +ALLOWED_TEAM_IDS_SQL = ", ".join(str(team_id) for team_id in ALLOWED_TEAM_IDS) # if updating these column definitions # you'll need to update the explicit column definitions in the materialized view creation statement below @@ -144,7 +171,7 @@ def source_column(column_name: str) -> str: sumIf(1, event='$autocapture') as autocapture_count FROM {database}.sharded_events -WHERE `$session_id` IS NOT NULL AND `$session_id` != '' +WHERE `$session_id` IS NOT NULL AND `$session_id` != '' AND team_id IN ({allowed_team_ids}) GROUP BY `$session_id`, team_id """.format( database=settings.CLICKHOUSE_DATABASE, @@ -168,6 +195,7 @@ def source_column(column_name: str) -> str: mc_cid_property=source_column("mc_cid"), igshid_property=source_column("igshid"), ttclid_property=source_column("ttclid"), + allowed_team_ids=ALLOWED_TEAM_IDS_SQL, ) ) From a0843f475b20166ea1ccb0ec626683178962496c Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Wed, 30 Oct 2024 11:30:50 +0100 Subject: [PATCH 07/15] fix: flappity snapshots begone (#25893) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../api/test/__snapshots__/test_api_docs.ambr | 180 +++++++++--------- posthog/api/test/test_api_docs.py | 2 +- 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/posthog/api/test/__snapshots__/test_api_docs.ambr b/posthog/api/test/__snapshots__/test_api_docs.ambr index 9221776ff38d1..9b7667ec6484b 100644 --- a/posthog/api/test/__snapshots__/test_api_docs.ambr +++ b/posthog/api/test/__snapshots__/test_api_docs.ambr @@ -1,137 +1,137 @@ # serializer version: 1 # name: TestAPIDocsSchema.test_api_docs_generation_warnings_snapshot list([ - '/home/runner/work/posthog/posthog/posthog/api/plugin_log_entry.py: Warning [PluginLogEntryViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '', + '/home/runner/work/posthog/posthog/ee/api/dashboard_collaborator.py: Warning [DashboardCollaboratorViewSet]: could not derive type of path parameter "project_id" because model "ee.models.dashboard_privilege.DashboardPrivilege" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/explicit_team_member.py: Warning [ExplicitTeamMemberViewSet]: could not derive type of path parameter "project_id" because model "ee.models.explicit_team_membership.ExplicitTeamMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/feature_flag_role_access.py: Warning [FeatureFlagRoleAccessViewSet]: could not derive type of path parameter "project_id" because model "ee.models.feature_flag_role_access.FeatureFlagRoleAccess" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleMembershipViewSet]: could not derive type of path parameter "organization_id" because model "ee.models.rbac.role.RoleMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_associated_flags". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_members". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet > SubscriptionSerializer]: unable to resolve type hint for function "summary". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.subscription.Subscription" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiment_holdouts.py: Warning [ExperimentHoldoutViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.ExperimentHoldout" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiments.py: Warning [EnterpriseExperimentsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.Experiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/groups.py: Warning [GroupsTypesViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.group_type_mapping.GroupTypeMapping" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/groups.py: Warning [GroupsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.group.group.Group" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/insights.py: Warning [EnterpriseInsightsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.insight.Insight" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/person.py: Warning [EnterprisePersonViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.person.person.Person" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "session_recording_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet > ActionSerializer]: unable to resolve type hint for function "get_creation_context". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.action.action.Action" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/activity_log.py: Warning [ActivityLogViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.activity_logging.activity_log.ActivityLog" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/annotation.py: Warning [AnnotationsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.annotation.Annotation" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', "/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Error [AppMetricsViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AppMetricsViewSet' should either include a `serializer_class` attribute, or override the `get_serializer_class()` method.)", - '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [AppMetricsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Error [HistoricalExportsAppMetricsViewSet]: unable to guess serializer. This is graceful fallback handling for APIViews. Consider using GenericAPIView as view base class, if view is under your control. Either way you may want to add a serializer_class (or method). Ignoring view for now.', - '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [AppMetricsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet > BatchExportSerializer]: could not resolve serializer field "HogQLSelectQueryField(required=False)". Defaulting to "string"', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportRunViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExportRun" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/cohort.py: Warning [CohortViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.cohort.cohort.Cohort" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/dashboards/dashboard.py: Warning [DashboardsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.dashboard.Dashboard" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/dashboard_collaborator.py: Warning [DashboardCollaboratorViewSet]: could not derive type of path parameter "project_id" because model "ee.models.dashboard_privilege.DashboardPrivilege" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/sharing.py: Warning [SharingConfigurationViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.sharing_configuration.SharingConfiguration" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/event.py: Warning [EventViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_distinct_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_properties". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_event". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_timestamp". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_person". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements_chain". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/dashboards/dashboard_templates.py: Warning [DashboardTemplateViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.dashboard_templates.DashboardTemplate" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/early_access_feature.py: Warning [EarlyAccessFeatureViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.early_access_feature.EarlyAccessFeature" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/event.py: Warning [EventViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/explicit_team_member.py: Warning [ExplicitTeamMemberViewSet]: could not derive type of path parameter "project_id" because model "ee.models.explicit_team_membership.ExplicitTeamMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.exported_asset.ExportedAsset" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet > ExportedAssetSerializer]: unable to resolve type hint for function "has_content". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/event.py: Warning [EventViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + "/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Error [EventDefinitionViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AnonymousUser' object has no attribute 'organization')", + '/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Warning [EventDefinitionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.event_definition.EventDefinition" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet > ExportedAssetSerializer]: unable to resolve type hint for function "filename". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/groups.py: Warning [GroupsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.group.group.Group" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/insights.py: Warning [EnterpriseInsightsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.insight.Insight" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_last_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet > ExportedAssetSerializer]: unable to resolve type hint for function "has_content". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.exported_asset.ExportedAsset" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/feature_flag.py: Warning [FeatureFlagViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feature_flag.feature_flag.FeatureFlag" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_cache_target_age". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_next_allowed_client_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_result". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hasMore". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_columns". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_timezone". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hasMore". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hogql". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_is_cached". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_last_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_next_allowed_client_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_query_status". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hogql". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_result". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_timezone". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_types". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/person.py: Warning [EnterprisePersonViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.person.person.Person" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/notebook.py: Warning [NotebookViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.notebook.notebook.Notebook" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_member_count". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_metadata". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/person.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer > MinimalPersonSerializer]: unable to resolve type hint for function "get_distinct_ids". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_config". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_delivery_rate_24h". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_error". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_plugin_info". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_delivery_rate_24h". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsViewSet > PluginSerializer]: unable to resolve type hint for function "get_hog_function_migration_available". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineFrontendAppsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineImportAppsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineTransformationsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PluginConfigViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py: Warning [QueryViewSet > ModelMetaclass]: Encountered 2 components with identical names "Person" and different classes and . This will very likely result in an incorrect schema. Try renaming one.', - '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/query.py: Error [QueryViewSet]: unable to guess serializer. This is graceful fallback handling for APIViews. Consider using GenericAPIView as view base class, if view is under your control. Either way you may want to add a serializer_class (or method). Ignoring view for now.', - '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording.SessionRecording" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/person.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer > MinimalPersonSerializer]: unable to resolve type hint for function "get_distinct_ids". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer]: unable to resolve type hint for function "storage". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/session.py: Warning [SessionViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.subscription.Subscription" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet > SubscriptionSerializer]: unable to resolve type hint for function "summary". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_metadata". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_member_count". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportOrganizationViewSet]: could not derive type of path parameter "organization_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsViewSet > PluginSerializer]: unable to resolve type hint for function "get_hog_function_migration_available". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: could not resolve field on model with path "person_on_events_querying_enabled". This is likely a custom field that does some unknown magic. Maybe consider annotating the field/property? Defaulting to "string". (Exception: Project has no field named \'person_on_events_querying_enabled\')', + '/home/runner/work/posthog/posthog/posthog/api/plugin_log_entry.py: Warning [PluginLogEntryViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: could not resolve field on model with path "default_modifiers". This is likely a custom field that does some unknown magic. Maybe consider annotating the field/property? Defaulting to "string". (Exception: Project has no field named \'default_modifiers\')', + '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: could not resolve field on model with path "person_on_events_querying_enabled". This is likely a custom field that does some unknown magic. Maybe consider annotating the field/property? Defaulting to "string". (Exception: Project has no field named \'person_on_events_querying_enabled\')', '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: unable to resolve type hint for function "get_product_intents". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "organization_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_members". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_associated_flags". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleMembershipViewSet]: could not derive type of path parameter "organization_id" because model "ee.models.rbac.role.RoleMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.action.action.Action" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet > ActionSerializer]: unable to resolve type hint for function "get_creation_context". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/activity_log.py: Warning [ActivityLogViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.activity_logging.activity_log.ActivityLog" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/annotation.py: Warning [AnnotationsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.annotation.Annotation" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/cohort.py: Warning [CohortViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.cohort.cohort.Cohort" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/dashboards/dashboard_templates.py: Warning [DashboardTemplateViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.dashboard_templates.DashboardTemplate" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/early_access_feature.py: Warning [EarlyAccessFeatureViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.early_access_feature.EarlyAccessFeature" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/team.py: Warning [TeamViewSet > TeamSerializer]: unable to resolve type hint for function "get_product_intents". Consider using a type hint or @extend_schema_field. Defaulting to string.', - "/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Error [EventDefinitionViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AnonymousUser' object has no attribute 'organization')", - '/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Warning [EventDefinitionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.event_definition.EventDefinition" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiment_holdouts.py: Warning [ExperimentHoldoutViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.ExperimentHoldout" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiments.py: Warning [EnterpriseExperimentsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.Experiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/feature_flag.py: Warning [FeatureFlagViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feature_flag.feature_flag.FeatureFlag" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/feature_flag_role_access.py: Warning [FeatureFlagRoleAccessViewSet]: could not derive type of path parameter "project_id" because model "ee.models.feature_flag_role_access.FeatureFlagRoleAccess" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/groups.py: Warning [GroupsTypesViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.group_type_mapping.GroupTypeMapping" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/notebook.py: Warning [NotebookViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.notebook.notebook.Notebook" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', "/home/runner/work/posthog/posthog/posthog/api/property_definition.py: Error [PropertyDefinitionViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AnonymousUser' object has no attribute 'organization')", '/home/runner/work/posthog/posthog/posthog/api/property_definition.py: Warning [PropertyDefinitionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.property_definition.PropertyDefinition" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "session_recording_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feedback.survey.Survey" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "organization_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/query.py: Error [QueryViewSet]: unable to guess serializer. This is graceful fallback handling for APIViews. Consider using GenericAPIView as view base class, if view is under your control. Either way you may want to add a serializer_class (or method). Ignoring view for now.', + '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/session.py: Warning [SessionViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/sharing.py: Warning [SharingConfigurationViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.sharing_configuration.SharingConfiguration" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet > SurveySerializer]: unable to resolve type hint for function "get_conditions". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feedback.survey.Survey" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/team.py: Warning [TeamViewSet > TeamSerializer]: unable to resolve type hint for function "get_product_intents". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/web_experiment.py: Warning [WebExperimentViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.web_experiment.WebExperiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportOrganizationViewSet]: could not derive type of path parameter "organization_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportRunViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExportRun" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet > BatchExportSerializer]: could not resolve serializer field "HogQLSelectQueryField(required=False)". Defaulting to "string"', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_distinct_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements_chain". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_event". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_person". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_properties". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_timestamp". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer]: unable to resolve type hint for function "storage". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording.SessionRecording" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py: Warning [QueryViewSet > ModelMetaclass]: Encountered 2 components with identical names "Person" and different classes and . This will very likely result in an incorrect schema. Try renaming one.', + 'Warning: encountered multiple names for the same choice set (EffectivePrivilegeLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (HrefMatchingEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind069Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "type". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "TypeF73Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: encountered multiple names for the same choice set (EffectivePrivilegeLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: operationId "environments_app_metrics_historical_exports_retrieve" has collisions [(\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "environments_insights_activity_retrieve" has collisions [(\'/api/environments/{project_id}/insights/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/insights/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "Funnels" has collisions [(\'/api/environments/{project_id}/insights/funnel/\', \'post\'), (\'/api/projects/{project_id}/insights/funnel/\', \'post\')]. resolving with numeral suffixes.', 'Warning: operationId "Trends" has collisions [(\'/api/environments/{project_id}/insights/trend/\', \'post\'), (\'/api/projects/{project_id}/insights/trend/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "environments_persons_activity_retrieve" has collisions [(\'/api/environments/{project_id}/persons/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/persons/activity/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "list" has collisions [(\'/api/organizations/\', \'get\'), (\'/api/organizations/{organization_id}/projects/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "create" has collisions [(\'/api/organizations/\', \'post\'), (\'/api/organizations/{organization_id}/projects/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "retrieve" has collisions [(\'/api/organizations/{id}/\', \'get\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "update" has collisions [(\'/api/organizations/{id}/\', \'put\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'put\')]. resolving with numeral suffixes.', - 'Warning: operationId "partial_update" has collisions [(\'/api/organizations/{id}/\', \'patch\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'patch\')]. resolving with numeral suffixes.', - 'Warning: operationId "destroy" has collisions [(\'/api/organizations/{id}/\', \'delete\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'delete\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_list" has collisions [(\'/api/organizations/{organization_id}/batch_exports/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "app_metrics_historical_exports_retrieve" has collisions [(\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_backfill_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/backfill/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/backfill/\', \'post\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_retrieve" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'put\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'put\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_partial_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'patch\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'patch\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_destroy" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'delete\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'delete\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_backfill_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/backfill/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/backfill/\', \'post\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_list" has collisions [(\'/api/organizations/{organization_id}/batch_exports/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_logs_retrieve" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/logs/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/{id}/logs/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_partial_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'patch\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'patch\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_pause_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/pause/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/pause/\', \'post\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_retrieve" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_unpause_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/unpause/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/unpause/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "app_metrics_historical_exports_retrieve" has collisions [(\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'put\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'put\')]. resolving with numeral suffixes.', 'Warning: operationId "cohorts_activity_retrieve" has collisions [(\'/api/projects/{project_id}/cohorts/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/cohorts/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "create" has collisions [(\'/api/organizations/\', \'post\'), (\'/api/organizations/{organization_id}/projects/\', \'post\')]. resolving with numeral suffixes.', + 'Warning: operationId "destroy" has collisions [(\'/api/organizations/{id}/\', \'delete\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'delete\')]. resolving with numeral suffixes.', + 'Warning: operationId "environments_app_metrics_historical_exports_retrieve" has collisions [(\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "environments_insights_activity_retrieve" has collisions [(\'/api/environments/{project_id}/insights/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/insights/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "environments_persons_activity_retrieve" has collisions [(\'/api/environments/{project_id}/persons/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/persons/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "event_definitions_retrieve" has collisions [(\'/api/projects/{project_id}/event_definitions/\', \'get\'), (\'/api/projects/{project_id}/event_definitions/{id}/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "feature_flags_activity_retrieve" has collisions [(\'/api/projects/{project_id}/feature_flags/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/feature_flags/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "insights_activity_retrieve" has collisions [(\'/api/projects/{project_id}/insights/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/insights/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "list" has collisions [(\'/api/organizations/\', \'get\'), (\'/api/organizations/{organization_id}/projects/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "notebooks_activity_retrieve" has collisions [(\'/api/projects/{project_id}/notebooks/{short_id}/activity/\', \'get\'), (\'/api/projects/{project_id}/notebooks/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "partial_update" has collisions [(\'/api/organizations/{id}/\', \'patch\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'patch\')]. resolving with numeral suffixes.', 'Warning: operationId "persons_activity_retrieve" has collisions [(\'/api/projects/{project_id}/persons/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/persons/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "property_definitions_retrieve" has collisions [(\'/api/projects/{project_id}/property_definitions/\', \'get\'), (\'/api/projects/{project_id}/property_definitions/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "retrieve" has collisions [(\'/api/organizations/{id}/\', \'get\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "surveys_activity_retrieve" has collisions [(\'/api/projects/{project_id}/surveys/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/surveys/activity/\', \'get\')]. resolving with numeral suffixes.', - '', + 'Warning: operationId "update" has collisions [(\'/api/organizations/{id}/\', \'put\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'put\')]. resolving with numeral suffixes.', ]) # --- diff --git a/posthog/api/test/test_api_docs.py b/posthog/api/test/test_api_docs.py index f7f7ab1d418b0..d5e1fc9b3bbf6 100644 --- a/posthog/api/test/test_api_docs.py +++ b/posthog/api/test/test_api_docs.py @@ -30,4 +30,4 @@ def test_api_docs_generation_warnings_snapshot(self) -> None: # we log lots of warnings when generating the schema warnings = self._capsys.readouterr().err.split("\n") - assert warnings == self._snapshot + assert sorted(warnings) == self._snapshot From 78ea7fb6274cb150241e5f3dd6ab6d90b07b1985 Mon Sep 17 00:00:00 2001 From: Marcus Hof <13001502+MarconLP@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:37:04 +0100 Subject: [PATCH 08/15] feat(cdp): add option to run a hog function per person per event (#25874) --- .../filters/HogFunctionFilters.tsx | 4 ++ plugin-server/tests/cdp/examples.ts | 12 +++++- plugin-server/tests/cdp/hog-masker.test.ts | 37 +++++++++++++++---- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx b/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx index 9dee4c767cc5e..ed98f0f3de14b 100644 --- a/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx +++ b/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx @@ -161,6 +161,10 @@ export function HogFunctionFilters(): JSX.Element { value: '{person.id}', label: 'Run once per person per interval', }, + { + value: '{concat(person.id, event.event)}', + label: 'Run once per person per event per interval', + }, ]} value={value?.hash ?? null} onChange={(val) => diff --git a/plugin-server/tests/cdp/examples.ts b/plugin-server/tests/cdp/examples.ts index fafafce472e3d..f92dd9ed4f97a 100644 --- a/plugin-server/tests/cdp/examples.ts +++ b/plugin-server/tests/cdp/examples.ts @@ -708,8 +708,16 @@ export const HOG_MASK_EXAMPLES: Record> person: { masking: { ttl: 30, - hash: '{person.uuid}', - bytecode: ['_h', 32, 'uuid', 32, 'person', 1, 2], + hash: '{person.id}', + bytecode: ['_h', 32, 'id', 32, 'person', 1, 2], + threshold: null, + }, + }, + personAndEvent: { + masking: { + ttl: 30, + hash: '{concat(person.id, event.event)}', + bytecode: ['_H', 1, 32, 'id', 32, 'person', 1, 2, 32, 'event', 32, 'event', 1, 2, 2, 'concat', 2], threshold: null, }, }, diff --git a/plugin-server/tests/cdp/hog-masker.test.ts b/plugin-server/tests/cdp/hog-masker.test.ts index df05043290e63..a3c7a955574db 100644 --- a/plugin-server/tests/cdp/hog-masker.test.ts +++ b/plugin-server/tests/cdp/hog-masker.test.ts @@ -118,6 +118,7 @@ describe('HogMasker', () => { describe('ttl', () => { let hogFunctionPerson: HogFunctionType let hogFunctionAll: HogFunctionType + let hogFunctionPersonAndEvent: HogFunctionType beforeEach(() => { hogFunctionPerson = createHogFunction({ @@ -127,6 +128,13 @@ describe('HogMasker', () => { }, }) + hogFunctionPersonAndEvent = createHogFunction({ + masking: { + ...HOG_MASK_EXAMPLES.personAndEvent.masking!, + ttl: 1, + }, + }) + hogFunctionAll = createHogFunction({ masking: { ...HOG_MASK_EXAMPLES.all.masking!, @@ -145,20 +153,33 @@ describe('HogMasker', () => { }) it('should mask with custom hog hash', async () => { - const globalsPerson1 = createHogExecutionGlobals({ person: { uuid: '1' } as any }) - const globalsPerson2 = createHogExecutionGlobals({ person: { uuid: '2' } as any }) + const globals1 = createHogExecutionGlobals({ + person: { id: '1' } as any, + event: { event: '$pageview' } as any, + }) + const globals2 = createHogExecutionGlobals({ + person: { id: '2' } as any, + event: { event: '$autocapture' } as any, + }) + const globals3 = createHogExecutionGlobals({ + person: { id: '2' } as any, + event: { event: '$pageview' } as any, + }) const invocations = [ - createInvocation(hogFunctionPerson, globalsPerson1), - createInvocation(hogFunctionAll, globalsPerson1), - createInvocation(hogFunctionPerson, globalsPerson2), - createInvocation(hogFunctionAll, globalsPerson2), + createInvocation(hogFunctionPerson, globals1), + createInvocation(hogFunctionAll, globals1), + createInvocation(hogFunctionPersonAndEvent, globals1), + createInvocation(hogFunctionPerson, globals2), + createInvocation(hogFunctionAll, globals2), + createInvocation(hogFunctionPersonAndEvent, globals2), + createInvocation(hogFunctionPersonAndEvent, globals3), ] const res = await masker.filterByMasking(invocations) expect(res.masked.length).toEqual(1) - expect(res.notMasked.length).toEqual(3) + expect(res.notMasked.length).toEqual(6) const res2 = await masker.filterByMasking(invocations) - expect(res2.masked.length).toEqual(4) + expect(res2.masked.length).toEqual(7) expect(res2.notMasked.length).toEqual(0) }) From 3946758c98b82f01435186a523bcd593771f636b Mon Sep 17 00:00:00 2001 From: Marcus Hof <13001502+MarconLP@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:14:32 +0100 Subject: [PATCH 09/15] rename per event trigger option label (#25896) --- .../scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx b/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx index ed98f0f3de14b..681e63a6239b2 100644 --- a/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx +++ b/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx @@ -163,7 +163,7 @@ export function HogFunctionFilters(): JSX.Element { }, { value: '{concat(person.id, event.event)}', - label: 'Run once per person per event per interval', + label: 'Run once per person per event name per interval', }, ]} value={value?.hash ?? null} From a9a77ace552df5492c1adc7b0f00728325d8d097 Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Wed, 30 Oct 2024 12:39:10 +0100 Subject: [PATCH 10/15] fix: session when impersonated (#25897) --- frontend/src/loadPostHogJS.tsx | 52 ++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/frontend/src/loadPostHogJS.tsx b/frontend/src/loadPostHogJS.tsx index 2c5a3285ef509..badabf1105246 100644 --- a/frontend/src/loadPostHogJS.tsx +++ b/frontend/src/loadPostHogJS.tsx @@ -29,16 +29,38 @@ export function loadPostHogJS(): void { bootstrap: window.POSTHOG_USER_IDENTITY_WITH_FLAGS ? window.POSTHOG_USER_IDENTITY_WITH_FLAGS : {}, opt_in_site_apps: true, api_transport: 'fetch', - loaded: (posthog) => { - if (posthog.sessionRecording) { - posthog.sessionRecording._forceAllowLocalhostNetworkCapture = true + loaded: (loadedInstance) => { + if (loadedInstance.sessionRecording) { + loadedInstance.sessionRecording._forceAllowLocalhostNetworkCapture = true } if (window.IMPERSONATED_SESSION) { - posthog.opt_out_capturing() + loadedInstance.sessionManager?.resetSessionId() + loadedInstance.opt_out_capturing() } else { - posthog.opt_in_capturing() + loadedInstance.opt_in_capturing() } + + const Cypress = (window as any).Cypress + + if (Cypress) { + Object.entries(Cypress.env()).forEach(([key, value]) => { + if (key.startsWith('POSTHOG_PROPERTY_')) { + loadedInstance.register_for_session({ + [key.replace('POSTHOG_PROPERTY_', 'E2E_TESTING_').toLowerCase()]: value, + }) + } + }) + } + + // This is a helpful flag to set to automatically reset the recording session on load for testing multiple recordings + const shouldResetSessionOnLoad = loadedInstance.getFeatureFlag(FEATURE_FLAGS.SESSION_RESET_ON_LOAD) + if (shouldResetSessionOnLoad) { + loadedInstance.sessionManager?.resetSessionId() + } + + // Make sure we have access to the object in window for debugging + window.posthog = loadedInstance }, scroll_root_selector: ['main', 'html'], autocapture: { @@ -52,26 +74,6 @@ export function loadPostHogJS(): void { : undefined, }) ) - - const Cypress = (window as any).Cypress - - if (Cypress) { - Object.entries(Cypress.env()).forEach(([key, value]) => { - if (key.startsWith('POSTHOG_PROPERTY_')) { - posthog.register_for_session({ - [key.replace('POSTHOG_PROPERTY_', 'E2E_TESTING_').toLowerCase()]: value, - }) - } - }) - } - - // This is a helpful flag to set to automatically reset the recording session on load for testing multiple recordings - const shouldResetSessionOnLoad = posthog.getFeatureFlag(FEATURE_FLAGS.SESSION_RESET_ON_LOAD) - if (shouldResetSessionOnLoad) { - posthog.sessionManager?.resetSessionId() - } - // Make sure we have access to the object in window for debugging - window.posthog = posthog } else { posthog.init('fake token', { autocapture: false, From 019d4dc71a29b8151e2c35e23c17ab8491cda5a1 Mon Sep 17 00:00:00 2001 From: Juraj Majerik Date: Wed, 30 Oct 2024 12:55:15 +0100 Subject: [PATCH 11/15] chore(experiments HogQL): render main goal from HogQL (#25852) --- ee/clickhouse/views/experiments.py | 1 + ...r-onboarding--onboarding-billing--dark.png | Bin 173264 -> 173185 bytes frontend/src/lib/constants.tsx | 1 + frontend/src/queries/schema.json | 160 +++++++- frontend/src/queries/schema.ts | 9 +- .../scenes/experiments/Experiment.stories.tsx | 3 + .../experiments/ExperimentView/Goal.tsx | 19 +- .../ExperimentView/SecondaryMetricsTable.tsx | 3 +- .../ExperimentView/SummaryTable.tsx | 4 +- .../experiments/ExperimentView/components.tsx | 122 ++++-- .../scenes/experiments/experimentLogic.tsx | 203 +++++++--- frontend/src/types.ts | 12 +- .../api/test/__snapshots__/test_api_docs.ambr | 2 + .../test/__snapshots__/test_in_cohort.ambr | 8 +- .../experiment_funnels_query_runner.py | 16 +- .../experiment_trends_query_runner.py | 9 +- .../test/__snapshots__/test_trends.ambr | 204 ++++++++-- posthog/schema.py | 355 ++++++++++-------- 18 files changed, 810 insertions(+), 321 deletions(-) diff --git a/ee/clickhouse/views/experiments.py b/ee/clickhouse/views/experiments.py index 6df24dc012cea..44fe8b72b5045 100644 --- a/ee/clickhouse/views/experiments.py +++ b/ee/clickhouse/views/experiments.py @@ -184,6 +184,7 @@ class Meta: "created_by", "created_at", "updated_at", + "metrics", ] read_only_fields = [ "id", diff --git a/frontend/__snapshots__/scenes-other-onboarding--onboarding-billing--dark.png b/frontend/__snapshots__/scenes-other-onboarding--onboarding-billing--dark.png index a11674466fae07c459640c0e6051b397481dd887..032e85e82d703a6f323726b67351abba84d04bcc 100644 GIT binary patch delta 155395 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 *BkX(X&bWuoD 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 z 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

$JPP;p#>RSlD5C} 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 X+VY%6h5iz}Nq1LS^LDY)Ur+xJexC+l diff --git a/frontend/src/lib/constants.tsx b/frontend/src/lib/constants.tsx index 1ba86ab79c36b..a13f3277ec41f 100644 --- a/frontend/src/lib/constants.tsx +++ b/frontend/src/lib/constants.tsx @@ -220,6 +220,7 @@ export const FEATURE_FLAGS = { LEGACY_ACTION_WEBHOOKS: 'legacy-action-webhooks', // owner: @mariusandra #team-cdp SESSION_REPLAY_URL_TRIGGER: 'session-replay-url-trigger', // owner: @richard-better #team-replay REPLAY_TEMPLATES: 'replay-templates', // owner: @raquelmsmith #team-replay + EXPERIMENTS_HOGQL: 'experiments-hogql', // owner: @jurajmajerik #team-experiments ROLE_BASED_ACCESS_CONTROL: 'role-based-access-control', // owner: @zach EXPERIMENTS_HOLDOUTS: 'experiments-holdouts', // owner: @jurajmajerik #team-experiments MESSAGING: 'messaging', // owner @mariusandra #team-cdp diff --git a/frontend/src/queries/schema.json b/frontend/src/queries/schema.json index 75b26c88bc4de..757097fa12025 100644 --- a/frontend/src/queries/schema.json +++ b/frontend/src/queries/schema.json @@ -1315,12 +1315,25 @@ "expected_loss": { "type": "number" }, + "funnels_query": { + "$ref": "#/definitions/FunnelsQuery" + }, "insight": { - "$ref": "#/definitions/FunnelsQueryResponse" + "items": { + "items": { + "type": "object" + }, + "type": "array" + }, + "type": "array" }, "is_cached": { "type": "boolean" }, + "kind": { + "const": "ExperimentFunnelsQuery", + "type": "string" + }, "last_refresh": { "format": "date-time", "type": "string" @@ -1361,6 +1374,7 @@ "expected_loss", "insight", "is_cached", + "kind", "last_refresh", "next_allowed_client_refresh", "probability", @@ -1385,6 +1399,9 @@ "description": "What triggered the calculation of the query, leave empty if user/immediate", "type": "string" }, + "count_query": { + "$ref": "#/definitions/TrendsQuery" + }, "credible_intervals": { "additionalProperties": { "items": { @@ -1396,12 +1413,22 @@ }, "type": "object" }, + "exposure_query": { + "$ref": "#/definitions/TrendsQuery" + }, "insight": { - "$ref": "#/definitions/TrendsQueryResponse" + "items": { + "type": "object" + }, + "type": "array" }, "is_cached": { "type": "boolean" }, + "kind": { + "const": "ExperimentTrendsQuery", + "type": "string" + }, "last_refresh": { "format": "date-time", "type": "string" @@ -1444,6 +1471,7 @@ "credible_intervals", "insight", "is_cached", + "kind", "last_refresh", "next_allowed_client_refresh", "p_value", @@ -3732,8 +3760,21 @@ "expected_loss": { "type": "number" }, + "funnels_query": { + "$ref": "#/definitions/FunnelsQuery" + }, "insight": { - "$ref": "#/definitions/FunnelsQueryResponse" + "items": { + "items": { + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentFunnelsQuery", + "type": "string" }, "probability": { "additionalProperties": { @@ -3758,6 +3799,7 @@ "credible_intervals", "expected_loss", "insight", + "kind", "probability", "significance_code", "significant", @@ -3768,6 +3810,9 @@ { "additionalProperties": false, "properties": { + "count_query": { + "$ref": "#/definitions/TrendsQuery" + }, "credible_intervals": { "additionalProperties": { "items": { @@ -3779,8 +3824,18 @@ }, "type": "object" }, + "exposure_query": { + "$ref": "#/definitions/TrendsQuery" + }, "insight": { - "$ref": "#/definitions/TrendsQueryResponse" + "items": { + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentTrendsQuery", + "type": "string" }, "p_value": { "type": "number" @@ -3807,6 +3862,7 @@ "required": [ "credible_intervals", "insight", + "kind", "p_value", "probability", "significance_code", @@ -5215,8 +5271,21 @@ "expected_loss": { "type": "number" }, + "funnels_query": { + "$ref": "#/definitions/FunnelsQuery" + }, "insight": { - "$ref": "#/definitions/FunnelsQueryResponse" + "items": { + "items": { + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentFunnelsQuery", + "type": "string" }, "probability": { "additionalProperties": { @@ -5238,6 +5307,7 @@ } }, "required": [ + "kind", "insight", "variants", "probability", @@ -5282,6 +5352,9 @@ "ExperimentTrendsQueryResponse": { "additionalProperties": false, "properties": { + "count_query": { + "$ref": "#/definitions/TrendsQuery" + }, "credible_intervals": { "additionalProperties": { "items": { @@ -5293,8 +5366,18 @@ }, "type": "object" }, + "exposure_query": { + "$ref": "#/definitions/TrendsQuery" + }, "insight": { - "$ref": "#/definitions/TrendsQueryResponse" + "items": { + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentTrendsQuery", + "type": "string" }, "p_value": { "type": "number" @@ -5319,6 +5402,7 @@ } }, "required": [ + "kind", "insight", "variants", "probability", @@ -8962,8 +9046,21 @@ "expected_loss": { "type": "number" }, + "funnels_query": { + "$ref": "#/definitions/FunnelsQuery" + }, "insight": { - "$ref": "#/definitions/FunnelsQueryResponse" + "items": { + "items": { + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentFunnelsQuery", + "type": "string" }, "probability": { "additionalProperties": { @@ -8985,6 +9082,7 @@ } }, "required": [ + "kind", "insight", "variants", "probability", @@ -8998,6 +9096,9 @@ { "additionalProperties": false, "properties": { + "count_query": { + "$ref": "#/definitions/TrendsQuery" + }, "credible_intervals": { "additionalProperties": { "items": { @@ -9009,8 +9110,18 @@ }, "type": "object" }, + "exposure_query": { + "$ref": "#/definitions/TrendsQuery" + }, "insight": { - "$ref": "#/definitions/TrendsQueryResponse" + "items": { + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentTrendsQuery", + "type": "string" }, "p_value": { "type": "number" @@ -9035,6 +9146,7 @@ } }, "required": [ + "kind", "insight", "variants", "probability", @@ -9607,8 +9719,21 @@ "expected_loss": { "type": "number" }, + "funnels_query": { + "$ref": "#/definitions/FunnelsQuery" + }, "insight": { - "$ref": "#/definitions/FunnelsQueryResponse" + "items": { + "items": { + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentFunnelsQuery", + "type": "string" }, "probability": { "additionalProperties": { @@ -9633,6 +9758,7 @@ "credible_intervals", "expected_loss", "insight", + "kind", "probability", "significance_code", "significant", @@ -9643,6 +9769,9 @@ { "additionalProperties": false, "properties": { + "count_query": { + "$ref": "#/definitions/TrendsQuery" + }, "credible_intervals": { "additionalProperties": { "items": { @@ -9654,8 +9783,18 @@ }, "type": "object" }, + "exposure_query": { + "$ref": "#/definitions/TrendsQuery" + }, "insight": { - "$ref": "#/definitions/TrendsQueryResponse" + "items": { + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "ExperimentTrendsQuery", + "type": "string" }, "p_value": { "type": "number" @@ -9682,6 +9821,7 @@ "required": [ "credible_intervals", "insight", + "kind", "p_value", "probability", "significance_code", diff --git a/frontend/src/queries/schema.ts b/frontend/src/queries/schema.ts index 273605a42f6d7..8fb58464d3ce4 100644 --- a/frontend/src/queries/schema.ts +++ b/frontend/src/queries/schema.ts @@ -1621,7 +1621,10 @@ export enum ExperimentSignificanceCode { } export interface ExperimentTrendsQueryResponse { - insight: TrendsQueryResponse + kind: NodeKind.ExperimentTrendsQuery + insight: Record[] + count_query?: TrendsQuery + exposure_query?: TrendsQuery variants: ExperimentVariantTrendsBaseStats[] probability: Record significant: boolean @@ -1633,7 +1636,9 @@ export interface ExperimentTrendsQueryResponse { export type CachedExperimentTrendsQueryResponse = CachedQueryResponse export interface ExperimentFunnelsQueryResponse { - insight: FunnelsQueryResponse + kind: NodeKind.ExperimentFunnelsQuery + insight: Record[][] + funnels_query?: FunnelsQuery variants: ExperimentVariantFunnelsBaseStats[] probability: Record significant: boolean diff --git a/frontend/src/scenes/experiments/Experiment.stories.tsx b/frontend/src/scenes/experiments/Experiment.stories.tsx index daab995ff3aa1..8d2aecd75ab1e 100644 --- a/frontend/src/scenes/experiments/Experiment.stories.tsx +++ b/frontend/src/scenes/experiments/Experiment.stories.tsx @@ -116,6 +116,7 @@ const MOCK_FUNNEL_EXPERIMENT: Experiment = { interval: 'day', filter_test_accounts: true, }, + metrics: [], archived: false, created_by: { id: 1, @@ -172,6 +173,7 @@ const MOCK_TREND_EXPERIMENT: Experiment = { }, }, }, + metrics: [], parameters: { feature_flag_variants: [ { @@ -277,6 +279,7 @@ const MOCK_TREND_EXPERIMENT_MANY_VARIANTS: Experiment = { }, }, }, + metrics: [], parameters: { feature_flag_variants: [ { diff --git a/frontend/src/scenes/experiments/ExperimentView/Goal.tsx b/frontend/src/scenes/experiments/ExperimentView/Goal.tsx index b0ef5701ec5c7..c68acb47f9df4 100644 --- a/frontend/src/scenes/experiments/ExperimentView/Goal.tsx +++ b/frontend/src/scenes/experiments/ExperimentView/Goal.tsx @@ -238,17 +238,16 @@ export function Goal(): JSX.Element { Change goal - {experimentInsightType === InsightType.TRENDS && - !experimentMathAggregationForTrends(experiment.filters) && ( - <> - -

-
- -
+ {experimentInsightType === InsightType.TRENDS && !experimentMathAggregationForTrends() && ( + <> + +
+
+
- - )} +
+ + )}
) diff --git a/frontend/src/scenes/experiments/ExperimentView/SecondaryMetricsTable.tsx b/frontend/src/scenes/experiments/ExperimentView/SecondaryMetricsTable.tsx index aadaebee40729..e9c19a72eb589 100644 --- a/frontend/src/scenes/experiments/ExperimentView/SecondaryMetricsTable.tsx +++ b/frontend/src/scenes/experiments/ExperimentView/SecondaryMetricsTable.tsx @@ -157,7 +157,6 @@ export function SecondaryMetricsTable({ experiment.secondary_metrics?.forEach((metric, idx) => { const targetResults = secondaryMetricResults?.[idx] - const targetResultFilters = targetResults?.filters const winningVariant = getHighestProbabilityVariant(targetResults || null) const Header = (): JSX.Element => ( @@ -206,7 +205,7 @@ export function SecondaryMetricsTable({ )} ] - {experimentMathAggregationForTrends(targetResultFilters) ? 'metric' : 'count'} + {experimentMathAggregationForTrends() ? 'metric' : 'count'} ), diff --git a/frontend/src/scenes/experiments/ExperimentView/SummaryTable.tsx b/frontend/src/scenes/experiments/ExperimentView/SummaryTable.tsx index e046d0f3a52fe..1814cb8717795 100644 --- a/frontend/src/scenes/experiments/ExperimentView/SummaryTable.tsx +++ b/frontend/src/scenes/experiments/ExperimentView/SummaryTable.tsx @@ -59,9 +59,7 @@ export function SummaryTable(): JSX.Element { {experimentResults.insight?.[0] && 'action' in experimentResults.insight[0] && ( )} - - {experimentMathAggregationForTrends(experimentResults?.filters) ? 'metric' : 'count'} - + {experimentMathAggregationForTrends() ? 'metric' : 'count'} ), render: function Key(_, variant): JSX.Element { diff --git a/frontend/src/scenes/experiments/ExperimentView/components.tsx b/frontend/src/scenes/experiments/ExperimentView/components.tsx index e61c32505c857..43a7b46e58f74 100644 --- a/frontend/src/scenes/experiments/ExperimentView/components.tsx +++ b/frontend/src/scenes/experiments/ExperimentView/components.tsx @@ -22,6 +22,7 @@ import { FEATURE_FLAGS } from 'lib/constants' import { dayjs } from 'lib/dayjs' import { IconAreaChart } from 'lib/lemon-ui/icons' import { More } from 'lib/lemon-ui/LemonButton/More' +import { featureFlagLogic } from 'lib/logic/featureFlagLogic' import { useEffect, useState } from 'react' import { urls } from 'scenes/urls' @@ -29,7 +30,15 @@ import { groupsModel } from '~/models/groupsModel' import { filtersToQueryNode } from '~/queries/nodes/InsightQuery/utils/filtersToQueryNode' import { queryFromFilters } from '~/queries/nodes/InsightViz/utils' import { Query } from '~/queries/Query/Query' -import { InsightVizNode, NodeKind } from '~/queries/schema' +import { + CachedExperimentFunnelsQueryResponse, + CachedExperimentTrendsQueryResponse, + ExperimentFunnelsQueryResponse, + ExperimentTrendsQueryResponse, + InsightQueryNode, + InsightVizNode, + NodeKind, +} from '~/queries/schema' import { Experiment, Experiment as ExperimentType, @@ -108,10 +117,54 @@ export function ResultsQuery({ targetResults, showTable, }: { - targetResults: ExperimentResults['result'] | null + targetResults: ExperimentResults['result'] | ExperimentTrendsQueryResponse | ExperimentFunnelsQueryResponse | null showTable: boolean }): JSX.Element { - if (!targetResults?.filters) { + const { featureFlags } = useValues(featureFlagLogic) + if (featureFlags[FEATURE_FLAGS.EXPERIMENTS_HOGQL]) { + const newQueryResults = targetResults as unknown as + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + + const query = + newQueryResults.kind === NodeKind.ExperimentTrendsQuery + ? newQueryResults.count_query + : newQueryResults.funnels_query + const fakeInsightId = Math.random().toString(36).substring(2, 15) + + return ( + + ) + } + + const oldQueryResults = targetResults as ExperimentResults['result'] + + if (!oldQueryResults?.filters) { return <> } @@ -119,22 +172,22 @@ export function ResultsQuery({ }: { icon?: JSX.Element }): JSX.Element { - const { experimentResults, experiment } = useValues(experimentLogic) + const { experimentResults, experiment, featureFlags } = useValues(experimentLogic) // keep in sync with https://github.com/PostHog/posthog/blob/master/ee/clickhouse/queries/experiments/funnel_experiment_result.py#L71 // :TRICKY: In the case of no results, we still want users to explore the query, so they can debug further. @@ -160,18 +213,41 @@ export function ExploreButton({ icon = }: { icon?: JSX.Element properties: [], } - const query: InsightVizNode = { - kind: NodeKind.InsightVizNode, - source: filtersToQueryNode( - transformResultFilters( - experimentResults?.filters - ? { ...experimentResults.filters, explicit_date: true } - : filtersFromExperiment - ) - ), - showTable: true, - showLastComputation: true, - showLastComputationRefresh: false, + let query: InsightVizNode + if (featureFlags[FEATURE_FLAGS.EXPERIMENTS_HOGQL]) { + const newQueryResults = experimentResults as unknown as + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + + const source = + newQueryResults.kind === NodeKind.ExperimentTrendsQuery + ? newQueryResults.count_query + : newQueryResults.funnels_query + + query = { + kind: NodeKind.InsightVizNode, + source: source as InsightQueryNode, + } + } else { + const oldQueryResults = experimentResults as ExperimentResults['result'] + + if (!oldQueryResults?.filters) { + return <> + } + + query = { + kind: NodeKind.InsightVizNode, + source: filtersToQueryNode( + transformResultFilters( + oldQueryResults?.filters + ? { ...oldQueryResults.filters, explicit_date: true } + : filtersFromExperiment + ) + ), + showTable: true, + showLastComputation: true, + showLastComputationRefresh: false, + } } return ( diff --git a/frontend/src/scenes/experiments/experimentLogic.tsx b/frontend/src/scenes/experiments/experimentLogic.tsx index 19e33aca83831..4db270269a634 100644 --- a/frontend/src/scenes/experiments/experimentLogic.tsx +++ b/frontend/src/scenes/experiments/experimentLogic.tsx @@ -5,6 +5,7 @@ import { loaders } from 'kea-loaders' import { router, urlToAction } from 'kea-router' import api from 'lib/api' import { EXPERIMENT_DEFAULT_DURATION, FunnelLayout } from 'lib/constants' +import { FEATURE_FLAGS } from 'lib/constants' import { dayjs } from 'lib/dayjs' import { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast' import { Tooltip } from 'lib/lemon-ui/Tooltip' @@ -27,7 +28,15 @@ import { cohortsModel } from '~/models/cohortsModel' import { groupsModel } from '~/models/groupsModel' import { filtersToQueryNode } from '~/queries/nodes/InsightQuery/utils/filtersToQueryNode' import { queryNodeToFilter } from '~/queries/nodes/InsightQuery/utils/queryNodeToFilter' -import { FunnelsQuery, InsightVizNode, TrendsQuery } from '~/queries/schema' +import { + CachedExperimentFunnelsQueryResponse, + CachedExperimentTrendsQueryResponse, + ExperimentTrendsQuery, + FunnelsQuery, + InsightVizNode, + NodeKind, + TrendsQuery, +} from '~/queries/schema' import { isFunnelsQuery } from '~/queries/utils' import { ActionFilter as ActionFilterType, @@ -62,6 +71,7 @@ const NEW_EXPERIMENT: Experiment = { name: '', feature_flag_key: '', filters: {}, + metrics: [], parameters: { feature_flag_variants: [ { key: 'control', rollout_percentage: 50 }, @@ -767,10 +777,36 @@ export const experimentLogic = kea([ }, }, experimentResults: [ - null as ExperimentResults['result'] | null, + null as + | ExperimentResults['result'] + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + | null, { - loadExperimentResults: async (refresh?: boolean) => { + loadExperimentResults: async ( + refresh?: boolean + ): Promise< + | ExperimentResults['result'] + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + | null + > => { try { + if (values.featureFlags[FEATURE_FLAGS.EXPERIMENTS_HOGQL]) { + const query = values.experiment.metrics[0].query + + const response: ExperimentResults = await api.create( + `api/projects/${values.currentTeamId}/query`, + { query } + ) + + return { + ...response, + fakeInsightId: Math.random().toString(36).substring(2, 15), + last_refresh: response.last_refresh || '', + } as unknown as CachedExperimentTrendsQueryResponse | CachedExperimentFunnelsQueryResponse + } + const refreshParam = refresh ? '?refresh=true' : '' const response: ExperimentResults = await api.get( `api/projects/${values.currentTeamId}/experiments/${values.experimentId}/results${refreshParam}` @@ -862,8 +898,13 @@ export const experimentLogic = kea([ (experimentId): Experiment['id'] => experimentId, ], experimentInsightType: [ - (s) => [s.experiment], - (experiment): InsightType => { + (s) => [s.experiment, s.featureFlags], + (experiment, featureFlags): InsightType => { + if (featureFlags[FEATURE_FLAGS.EXPERIMENTS_HOGQL]) { + const query = experiment?.metrics?.[0]?.query + return query?.kind === NodeKind.ExperimentTrendsQuery ? InsightType.TRENDS : InsightType.FUNNELS + } + return experiment?.filters?.insight || InsightType.FUNNELS }, ], @@ -909,31 +950,40 @@ export const experimentLogic = kea([ }, ], experimentMathAggregationForTrends: [ - () => [], - () => - (filters?: FilterType): PropertyMathType | CountPerActorMathType | undefined => { - // Find out if we're using count per actor math aggregates averages per user - const userMathValue = ( - [...(filters?.events || []), ...(filters?.actions || [])] as ActionFilterType[] - ).filter((entity) => - Object.values(CountPerActorMathType).includes(entity?.math as CountPerActorMathType) - )[0]?.math - - // alternatively, if we're using property math - // remove 'sum' property math from the list of math types - // since we can handle that as a regular case - const targetValues = Object.values(PropertyMathType).filter( - (value) => value !== PropertyMathType.Sum - ) - // sync with the backend at https://github.com/PostHog/posthog/blob/master/ee/clickhouse/queries/experiments/trend_experiment_result.py#L44 - // the function uses_math_aggregation_by_user_or_property_value + (s) => [s.experiment, s.featureFlags], + (experiment, featureFlags) => (): PropertyMathType | CountPerActorMathType | undefined => { + let entities: { math?: string }[] = [] + + if (featureFlags[FEATURE_FLAGS.EXPERIMENTS_HOGQL]) { + const query = experiment?.metrics?.[0]?.query as ExperimentTrendsQuery + if (!query) { + return undefined + } + entities = query.count_query?.series || [] + } else { + const filters = experiment?.filters + if (!filters) { + return undefined + } + entities = [...(filters?.events || []), ...(filters?.actions || [])] as ActionFilterType[] + } - const propertyMathValue = ( - [...(filters?.events || []), ...(filters?.actions || [])] as ActionFilterType[] - ).filter((entity) => targetValues.includes(entity?.math as PropertyMathType))[0]?.math + // Find out if we're using count per actor math aggregates averages per user + const userMathValue = entities.filter((entity) => + Object.values(CountPerActorMathType).includes(entity?.math as CountPerActorMathType) + )[0]?.math - return (userMathValue ?? propertyMathValue) as PropertyMathType | CountPerActorMathType | undefined - }, + // alternatively, if we're using property math + // remove 'sum' property math from the list of math types + // since we can handle that as a regular case + const targetValues = Object.values(PropertyMathType).filter((value) => value !== PropertyMathType.Sum) + + const propertyMathValue = entities.filter((entity) => + targetValues.includes(entity?.math as PropertyMathType) + )[0]?.math + + return (userMathValue ?? propertyMathValue) as PropertyMathType | CountPerActorMathType | undefined + }, ], minimumDetectableEffect: [ (s) => [s.experiment, s.experimentInsightType, s.conversionMetrics, s.trendResults], @@ -1126,7 +1176,14 @@ export const experimentLogic = kea([ conversionRateForVariant: [ () => [], () => - (experimentResults: Partial | null, variantKey: string): number | null => { + ( + experimentResults: + | Partial + | CachedExperimentFunnelsQueryResponse + | CachedExperimentTrendsQueryResponse + | null, + variantKey: string + ): number | null => { if (!experimentResults || !experimentResults.insight) { return null } @@ -1144,34 +1201,47 @@ export const experimentLogic = kea([ }, ], getIndexForVariant: [ - () => [], - () => - (experimentResults: Partial | null, variant: string): number | null => { - // TODO: Would be nice for every secondary metric to have the same colour for variants - const insightType = experimentResults?.filters?.insight - let result: number | null = null + (s) => [s.experimentInsightType], + (experimentInsightType) => + ( + experimentResults: + | Partial + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + | null, + variant: string + ): number | null => { // Ensures we get the right index from results, so the UI can // display the right colour for the variant if (!experimentResults || !experimentResults.insight) { return null } + let index = -1 - if (insightType === InsightType.FUNNELS) { + if (experimentInsightType === InsightType.FUNNELS) { // Funnel Insight is displayed in order of decreasing count - index = ([...experimentResults.insight] as FunnelStep[][]) - .sort((a, b) => b[0]?.count - a[0]?.count) - .findIndex( - (variantFunnel: FunnelStep[]) => variantFunnel[0]?.breakdown_value?.[0] === variant - ) + index = (Array.isArray(experimentResults.insight) ? [...experimentResults.insight] : []) + .sort((a, b) => { + const aCount = (a && Array.isArray(a) && a[0]?.count) || 0 + const bCount = (b && Array.isArray(b) && b[0]?.count) || 0 + return bCount - aCount + }) + .findIndex((variantFunnel) => { + if (!Array.isArray(variantFunnel) || !variantFunnel[0]?.breakdown_value) { + return false + } + const breakdownValue = variantFunnel[0].breakdown_value + return Array.isArray(breakdownValue) && breakdownValue[0] === variant + }) } else { index = (experimentResults.insight as TrendResult[]).findIndex( (variantTrend: TrendResult) => variantTrend.breakdown_value === variant ) } - result = index === -1 ? null : index + const result = index === -1 ? null : index - if (result !== null && insightType === InsightType.FUNNELS) { - result++ + if (result !== null && experimentInsightType === InsightType.FUNNELS) { + return result + 1 } return result }, @@ -1179,10 +1249,15 @@ export const experimentLogic = kea([ countDataForVariant: [ (s) => [s.experimentMathAggregationForTrends], (experimentMathAggregationForTrends) => - (experimentResults: Partial | null, variant: string): number | null => { - const usingMathAggregationType = experimentMathAggregationForTrends( - experimentResults?.filters || {} - ) + ( + experimentResults: + | Partial + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + | null, + variant: string + ): number | null => { + const usingMathAggregationType = experimentMathAggregationForTrends() if (!experimentResults || !experimentResults.insight) { return null } @@ -1223,7 +1298,14 @@ export const experimentLogic = kea([ exposureCountDataForVariant: [ () => [], () => - (experimentResults: Partial | null, variant: string): number | null => { + ( + experimentResults: + | Partial + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + | null, + variant: string + ): number | null => { if (!experimentResults || !experimentResults.variants) { return null } @@ -1241,14 +1323,21 @@ export const experimentLogic = kea([ ], getHighestProbabilityVariant: [ () => [], - () => (results: ExperimentResults['result'] | null) => { - if (results && results.probability) { - const maxValue = Math.max(...Object.values(results.probability)) - return Object.keys(results.probability).find( - (key) => Math.abs(results.probability[key] - maxValue) < Number.EPSILON - ) - } - }, + () => + ( + results: + | ExperimentResults['result'] + | CachedExperimentTrendsQueryResponse + | CachedExperimentFunnelsQueryResponse + | null + ) => { + if (results && results.probability) { + const maxValue = Math.max(...Object.values(results.probability)) + return Object.keys(results.probability).find( + (key) => Math.abs(results.probability[key] - maxValue) < Number.EPSILON + ) + } + }, ], sortedExperimentResultVariants: [ (s) => [s.experimentResults, s.experiment], diff --git a/frontend/src/types.ts b/frontend/src/types.ts index eb839f5252bcd..4a17a89a811cd 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -35,6 +35,8 @@ import { QueryContext } from '~/queries/types' import type { DashboardFilter, DatabaseSchemaField, + ExperimentFunnelsQuery, + ExperimentTrendsQuery, HogQLQuery, HogQLQueryModifiers, HogQLVariable, @@ -3242,6 +3244,11 @@ export interface Group { group_properties: Record } +export interface ExperimentMetric { + type: string + query: ExperimentTrendsQuery | ExperimentFunnelsQuery +} + export interface Experiment { id: number | 'new' name: string @@ -3250,6 +3257,7 @@ export interface Experiment { feature_flag?: FeatureFlagBasicType exposure_cohort?: number filters: FilterType + metrics: ExperimentMetric[] parameters: { minimum_detectable_effect?: number recommended_running_time?: number @@ -3294,7 +3302,7 @@ interface BaseExperimentResults { } export interface _TrendsExperimentResults extends BaseExperimentResults { - insight: TrendResult[] + insight: Record[] filters: TrendsFilterType variants: TrendExperimentVariant[] last_refresh?: string | null @@ -3302,7 +3310,7 @@ export interface _TrendsExperimentResults extends BaseExperimentResults { } export interface _FunnelExperimentResults extends BaseExperimentResults { - insight: FunnelStep[][] + insight: Record[] filters: FunnelsFilterType variants: FunnelExperimentVariant[] last_refresh?: string | null diff --git a/posthog/api/test/__snapshots__/test_api_docs.ambr b/posthog/api/test/__snapshots__/test_api_docs.ambr index 9b7667ec6484b..044ee43f1983e 100644 --- a/posthog/api/test/__snapshots__/test_api_docs.ambr +++ b/posthog/api/test/__snapshots__/test_api_docs.ambr @@ -101,6 +101,8 @@ 'Warning: encountered multiple names for the same choice set (HrefMatchingEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind069Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind0ddEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind496Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "type". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "TypeF73Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: operationId "Funnels" has collisions [(\'/api/environments/{project_id}/insights/funnel/\', \'post\'), (\'/api/projects/{project_id}/insights/funnel/\', \'post\')]. resolving with numeral suffixes.', diff --git a/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr b/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr index f018e96ef067a..06e46e0ca30b0 100644 --- a/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr +++ b/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr @@ -31,7 +31,7 @@ FROM events LEFT JOIN ( SELECT person_static_cohort.person_id AS cohort_person_id, 1 AS matched, person_static_cohort.cohort_id AS cohort_id FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [4]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) + WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [6]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) WHERE and(equals(events.team_id, 420), 1, ifNull(equals(__in_cohort.matched, 1), 0)) LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, format_csv_allow_double_quotes=0, max_ast_elements=4000000, max_expanded_ast_elements=4000000, max_bytes_before_external_group_by=0 @@ -42,7 +42,7 @@ FROM events LEFT JOIN ( SELECT person_id AS cohort_person_id, 1 AS matched, cohort_id FROM static_cohort_people - WHERE in(cohort_id, [4])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) + WHERE in(cohort_id, [6])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) WHERE and(1, equals(__in_cohort.matched, 1)) LIMIT 100 ''' @@ -55,7 +55,7 @@ FROM events LEFT JOIN ( SELECT person_static_cohort.person_id AS cohort_person_id, 1 AS matched, person_static_cohort.cohort_id AS cohort_id FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [5]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) + WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [7]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) WHERE and(equals(events.team_id, 420), 1, ifNull(equals(__in_cohort.matched, 1), 0)) LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, format_csv_allow_double_quotes=0, max_ast_elements=4000000, max_expanded_ast_elements=4000000, max_bytes_before_external_group_by=0 @@ -66,7 +66,7 @@ FROM events LEFT JOIN ( SELECT person_id AS cohort_person_id, 1 AS matched, cohort_id FROM static_cohort_people - WHERE in(cohort_id, [5])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) + WHERE in(cohort_id, [7])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) WHERE and(1, equals(__in_cohort.matched, 1)) LIMIT 100 ''' diff --git a/posthog/hogql_queries/experiments/experiment_funnels_query_runner.py b/posthog/hogql_queries/experiments/experiment_funnels_query_runner.py index c6783daa489e0..23ba38cd742a3 100644 --- a/posthog/hogql_queries/experiments/experiment_funnels_query_runner.py +++ b/posthog/hogql_queries/experiments/experiment_funnels_query_runner.py @@ -36,9 +36,9 @@ def __init__(self, *args, **kwargs): self.experiment = Experiment.objects.get(id=self.query.experiment_id) self.feature_flag = self.experiment.feature_flag self.variants = [variant["key"] for variant in self.feature_flag.variants] - self.prepared_funnel_query = self._prepare_funnel_query() + self.prepared_funnels_query = self._prepare_funnel_query() self.funnels_query_runner = FunnelsQueryRunner( - query=self.prepared_funnel_query, team=self.team, timings=self.timings, limit_context=self.limit_context + query=self.prepared_funnels_query, team=self.team, timings=self.timings, limit_context=self.limit_context ) def calculate(self) -> ExperimentFunnelsQueryResponse: @@ -53,7 +53,9 @@ def calculate(self) -> ExperimentFunnelsQueryResponse: credible_intervals = calculate_credible_intervals([control_variant, *test_variants]) return ExperimentFunnelsQueryResponse( - insight=funnels_result, + kind="ExperimentFunnelsQuery", + funnels_query=self.prepared_funnels_query, + insight=funnels_result.results, variants=[variant.model_dump() for variant in [control_variant, *test_variants]], probability={ variant.key: probability @@ -75,7 +77,7 @@ def _prepare_funnel_query(self) -> FunnelsQuery: to separate results for different experiment variants. """ # Clone the source query - prepared_funnel_query = FunnelsQuery(**self.query.source.model_dump()) + prepared_funnels_query = FunnelsQuery(**self.query.source.model_dump()) # Set the date range to match the experiment's duration, using the project's timezone if self.team.timezone: @@ -86,19 +88,19 @@ def _prepare_funnel_query(self) -> FunnelsQuery: start_date = self.experiment.start_date end_date = self.experiment.end_date - prepared_funnel_query.dateRange = InsightDateRange( + prepared_funnels_query.dateRange = InsightDateRange( date_from=start_date.isoformat() if start_date else None, date_to=end_date.isoformat() if end_date else None, explicitDate=True, ) # Configure the breakdown to use the feature flag key - prepared_funnel_query.breakdownFilter = BreakdownFilter( + prepared_funnels_query.breakdownFilter = BreakdownFilter( breakdown=f"$feature/{self.feature_flag.key}", breakdown_type="event", ) - return prepared_funnel_query + return prepared_funnels_query def _get_variants_with_base_stats( self, funnels_result: FunnelsQueryResponse diff --git a/posthog/hogql_queries/experiments/experiment_trends_query_runner.py b/posthog/hogql_queries/experiments/experiment_trends_query_runner.py index 7389b65a29bf6..2a74202b45f11 100644 --- a/posthog/hogql_queries/experiments/experiment_trends_query_runner.py +++ b/posthog/hogql_queries/experiments/experiment_trends_query_runner.py @@ -106,12 +106,11 @@ def _prepare_count_query(self) -> TrendsQuery: # :TRICKY: for `avg` aggregation, use `sum` data as an approximation if prepared_count_query.series[0].math == PropertyMathType.AVG: prepared_count_query.series[0].math = PropertyMathType.SUM - prepared_count_query.trendsFilter = TrendsFilter(display=ChartDisplayType.ACTIONS_LINE_GRAPH_CUMULATIVE) # TODO: revisit this; using the count data for the remaining aggregation types is likely wrong elif uses_math_aggregation: prepared_count_query.series[0].math = None - prepared_count_query.trendsFilter = TrendsFilter(display=ChartDisplayType.ACTIONS_LINE_GRAPH_CUMULATIVE) + prepared_count_query.trendsFilter = TrendsFilter(display=ChartDisplayType.ACTIONS_LINE_GRAPH_CUMULATIVE) prepared_count_query.dateRange = self._get_insight_date_range() prepared_count_query.breakdownFilter = self._get_breakdown_filter() prepared_count_query.properties = [ @@ -242,7 +241,6 @@ def run(query_runner: TrendsQueryRunner, result_key: str, is_parallel: bool): count_result = shared_results["count_result"] exposure_result = shared_results["exposure_result"] - if count_result is None or exposure_result is None: raise ValueError("One or both query runners failed to produce a response") @@ -255,7 +253,10 @@ def run(query_runner: TrendsQueryRunner, result_key: str, is_parallel: bool): credible_intervals = calculate_credible_intervals([control_variant, *test_variants]) return ExperimentTrendsQueryResponse( - insight=count_result, + kind="ExperimentTrendsQuery", + insight=count_result.results, + count_query=self.prepared_count_query, + exposure_query=self.prepared_exposure_query, variants=[variant.model_dump() for variant in [control_variant, *test_variants]], probability={ variant.key: probability diff --git a/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr b/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr index 6027f7ca7bb42..4ae57feb8cb96 100644 --- a/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr +++ b/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr @@ -851,14 +851,49 @@ # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.1 ''' - /* celery:posthog.tasks.tasks.sync_insight_caching_state */ - SELECT team_id, - date_diff('second', max(timestamp), now()) AS age - FROM events - WHERE timestamp > date_sub(DAY, 3, now()) - AND timestamp < now() - GROUP BY team_id - ORDER BY age; + SELECT groupArray(1)(date)[1] AS date, + arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, + if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', breakdown_value) AS breakdown_value + FROM + (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, + arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) + and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, + breakdown_value AS breakdown_value, + rowNumberInAllBlocks() AS row_number + FROM + (SELECT sum(total) AS count, + day_start AS day_start, + breakdown_value AS breakdown_value + FROM + (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, + toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, + ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value + FROM events AS e SAMPLE 1.0 + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, + person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 2) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) + WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) + GROUP BY day_start, + breakdown_value) + GROUP BY day_start, + breakdown_value + ORDER BY day_start ASC, breakdown_value ASC) + GROUP BY breakdown_value + ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) + WHERE isNotNull(breakdown_value) + GROUP BY breakdown_value + ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC + LIMIT 50000 SETTINGS readonly=2, + max_execution_time=60, + allow_experimental_object_type=1, + format_csv_allow_double_quotes=0, + max_ast_elements=4000000, + max_expanded_ast_elements=4000000, + max_bytes_before_external_group_by=0 ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.10 @@ -1075,38 +1110,143 @@ # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.2 ''' - /* celery:posthog.tasks.tasks.sync_insight_caching_state */ - SELECT team_id, - date_diff('second', max(timestamp), now()) AS age - FROM events - WHERE timestamp > date_sub(DAY, 3, now()) - AND timestamp < now() - GROUP BY team_id - ORDER BY age; + SELECT groupArray(1)(date)[1] AS date, + arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, + if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', breakdown_value) AS breakdown_value + FROM + (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, + arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) + and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, + breakdown_value AS breakdown_value, + rowNumberInAllBlocks() AS row_number + FROM + (SELECT sum(total) AS count, + day_start AS day_start, + breakdown_value AS breakdown_value + FROM + (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, + toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, + ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value + FROM events AS e SAMPLE 1.0 + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, + person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 2) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) + WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) + GROUP BY day_start, + breakdown_value) + GROUP BY day_start, + breakdown_value + ORDER BY day_start ASC, breakdown_value ASC) + GROUP BY breakdown_value + ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) + WHERE isNotNull(breakdown_value) + GROUP BY breakdown_value + ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC + LIMIT 50000 SETTINGS readonly=2, + max_execution_time=60, + allow_experimental_object_type=1, + format_csv_allow_double_quotes=0, + max_ast_elements=4000000, + max_expanded_ast_elements=4000000, + max_bytes_before_external_group_by=0 ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.3 ''' - /* celery:posthog.tasks.tasks.sync_insight_caching_state */ - SELECT team_id, - date_diff('second', max(timestamp), now()) AS age - FROM events - WHERE timestamp > date_sub(DAY, 3, now()) - AND timestamp < now() - GROUP BY team_id - ORDER BY age; + SELECT groupArray(1)(date)[1] AS date, + arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, + arrayMap(i -> if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', i), breakdown_value) AS breakdown_value + FROM + (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, + arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) + and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, + breakdown_value AS breakdown_value, + rowNumberInAllBlocks() AS row_number + FROM + (SELECT sum(total) AS count, + day_start AS day_start, + [ifNull(toString(breakdown_value_1), '$$_posthog_breakdown_null_$$')] AS breakdown_value + FROM + (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, + toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, + ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value_1 + FROM events AS e SAMPLE 1.0 + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, + person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 2) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) + WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) + GROUP BY day_start, + breakdown_value_1) + GROUP BY day_start, + breakdown_value_1 + ORDER BY day_start ASC, breakdown_value ASC) + GROUP BY breakdown_value + ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) + WHERE arrayExists(x -> isNotNull(x), breakdown_value) + GROUP BY breakdown_value + ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC + LIMIT 50000 SETTINGS readonly=2, + max_execution_time=60, + allow_experimental_object_type=1, + format_csv_allow_double_quotes=0, + max_ast_elements=4000000, + max_expanded_ast_elements=4000000, + max_bytes_before_external_group_by=0 ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.4 ''' - /* celery:posthog.tasks.tasks.sync_insight_caching_state */ - SELECT team_id, - date_diff('second', max(timestamp), now()) AS age - FROM events - WHERE timestamp > date_sub(DAY, 3, now()) - AND timestamp < now() - GROUP BY team_id - ORDER BY age; + SELECT groupArray(1)(date)[1] AS date, + arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, + arrayMap(i -> if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', i), breakdown_value) AS breakdown_value + FROM + (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, + arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) + and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, + breakdown_value AS breakdown_value, + rowNumberInAllBlocks() AS row_number + FROM + (SELECT sum(total) AS count, + day_start AS day_start, + [ifNull(toString(breakdown_value_1), '$$_posthog_breakdown_null_$$')] AS breakdown_value + FROM + (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, + toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, + ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value_1 + FROM events AS e SAMPLE 1.0 + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, + person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 2) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) + WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) + GROUP BY day_start, + breakdown_value_1) + GROUP BY day_start, + breakdown_value_1 + ORDER BY day_start ASC, breakdown_value ASC) + GROUP BY breakdown_value + ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) + WHERE arrayExists(x -> isNotNull(x), breakdown_value) + GROUP BY breakdown_value + ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC + LIMIT 50000 SETTINGS readonly=2, + max_execution_time=60, + allow_experimental_object_type=1, + format_csv_allow_double_quotes=0, + max_ast_elements=4000000, + max_expanded_ast_elements=4000000, + max_bytes_before_external_group_by=0 ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.5 diff --git a/posthog/schema.py b/posthog/schema.py index b386d5d6c8e97..199a19f1fdfe3 100644 --- a/posthog/schema.py +++ b/posthog/schema.py @@ -1951,31 +1951,6 @@ class CachedEventsQueryResponse(BaseModel): types: list[str] -class CachedExperimentTrendsQueryResponse(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - cache_key: str - cache_target_age: Optional[AwareDatetime] = None - calculation_trigger: Optional[str] = Field( - default=None, description="What triggered the calculation of the query, leave empty if user/immediate" - ) - credible_intervals: dict[str, list[float]] - insight: TrendsQueryResponse - is_cached: bool - last_refresh: AwareDatetime - next_allowed_client_refresh: AwareDatetime - p_value: float - probability: dict[str, float] - query_status: Optional[QueryStatus] = Field( - default=None, description="Query status indicates whether next to the provided data, a query is still running." - ) - significance_code: ExperimentSignificanceCode - significant: bool - timezone: str - variants: list[ExperimentVariantTrendsBaseStats] - - class CachedFunnelCorrelationResponse(BaseModel): model_config = ConfigDict( extra="forbid", @@ -2700,19 +2675,6 @@ class Response9(BaseModel): ) -class Response11(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - insight: TrendsQueryResponse - p_value: float - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantTrendsBaseStats] - - class DataWarehousePersonPropertyFilter(BaseModel): model_config = ConfigDict( extra="forbid", @@ -2863,19 +2825,6 @@ class EventsQueryResponse(BaseModel): types: list[str] -class ExperimentTrendsQueryResponse(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - insight: TrendsQueryResponse - p_value: float - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantTrendsBaseStats] - - class BreakdownFilter1(BaseModel): model_config = ConfigDict( extra="forbid", @@ -3466,32 +3415,6 @@ class QueryResponseAlternative15(BaseModel): ) -class QueryResponseAlternative16(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - expected_loss: float - insight: FunnelsQueryResponse - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantFunnelsBaseStats] - - -class QueryResponseAlternative17(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - insight: TrendsQueryResponse - p_value: float - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantTrendsBaseStats] - - class QueryResponseAlternative18(BaseModel): model_config = ConfigDict( extra="forbid", @@ -3728,32 +3651,6 @@ class QueryResponseAlternative27(BaseModel): ) -class QueryResponseAlternative28(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - expected_loss: float - insight: FunnelsQueryResponse - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantFunnelsBaseStats] - - -class QueryResponseAlternative29(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - insight: TrendsQueryResponse - p_value: float - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantTrendsBaseStats] - - class QueryResponseAlternative30(BaseModel): model_config = ConfigDict( extra="forbid", @@ -4256,31 +4153,6 @@ class AnyResponseType( ] -class CachedExperimentFunnelsQueryResponse(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - cache_key: str - cache_target_age: Optional[AwareDatetime] = None - calculation_trigger: Optional[str] = Field( - default=None, description="What triggered the calculation of the query, leave empty if user/immediate" - ) - credible_intervals: dict[str, list[float]] - expected_loss: float - insight: FunnelsQueryResponse - is_cached: bool - last_refresh: AwareDatetime - next_allowed_client_refresh: AwareDatetime - probability: dict[str, float] - query_status: Optional[QueryStatus] = Field( - default=None, description="Query status indicates whether next to the provided data, a query is still running." - ) - significance_code: ExperimentSignificanceCode - significant: bool - timezone: str - variants: list[ExperimentVariantFunnelsBaseStats] - - class CachedHogQLQueryResponse(BaseModel): model_config = ConfigDict( extra="forbid", @@ -4432,19 +4304,6 @@ class Response2(BaseModel): types: Optional[list] = Field(default=None, description="Types of returned columns") -class Response10(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - expected_loss: float - insight: FunnelsQueryResponse - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantFunnelsBaseStats] - - class DataWarehouseNode(BaseModel): model_config = ConfigDict( extra="forbid", @@ -4684,19 +4543,6 @@ class EventsNode(BaseModel): response: Optional[dict[str, Any]] = None -class ExperimentFunnelsQueryResponse(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - credible_intervals: dict[str, list[float]] - expected_loss: float - insight: FunnelsQueryResponse - probability: dict[str, float] - significance_code: ExperimentSignificanceCode - significant: bool - variants: list[ExperimentVariantFunnelsBaseStats] - - class FunnelExclusionActionsNode(BaseModel): model_config = ConfigDict( extra="forbid", @@ -5530,6 +5376,50 @@ class VisualizationMessage(BaseModel): type: Literal["ai/viz"] = "ai/viz" +class CachedExperimentTrendsQueryResponse(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + cache_key: str + cache_target_age: Optional[AwareDatetime] = None + calculation_trigger: Optional[str] = Field( + default=None, description="What triggered the calculation of the query, leave empty if user/immediate" + ) + count_query: Optional[TrendsQuery] = None + credible_intervals: dict[str, list[float]] + exposure_query: Optional[TrendsQuery] = None + insight: list[dict[str, Any]] + is_cached: bool + kind: Literal["ExperimentTrendsQuery"] = "ExperimentTrendsQuery" + last_refresh: AwareDatetime + next_allowed_client_refresh: AwareDatetime + p_value: float + probability: dict[str, float] + query_status: Optional[QueryStatus] = Field( + default=None, description="Query status indicates whether next to the provided data, a query is still running." + ) + significance_code: ExperimentSignificanceCode + significant: bool + timezone: str + variants: list[ExperimentVariantTrendsBaseStats] + + +class Response11(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + count_query: Optional[TrendsQuery] = None + credible_intervals: dict[str, list[float]] + exposure_query: Optional[TrendsQuery] = None + insight: list[dict[str, Any]] + kind: Literal["ExperimentTrendsQuery"] = "ExperimentTrendsQuery" + p_value: float + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantTrendsBaseStats] + + class ErrorTrackingQuery(BaseModel): model_config = ConfigDict( extra="forbid", @@ -5617,18 +5507,20 @@ class EventsQuery(BaseModel): where: Optional[list[str]] = Field(default=None, description="HogQL filters to apply on returned data") -class ExperimentTrendsQuery(BaseModel): +class ExperimentTrendsQueryResponse(BaseModel): model_config = ConfigDict( extra="forbid", ) - count_query: TrendsQuery - experiment_id: int + count_query: Optional[TrendsQuery] = None + credible_intervals: dict[str, list[float]] exposure_query: Optional[TrendsQuery] = None + insight: list[dict[str, Any]] kind: Literal["ExperimentTrendsQuery"] = "ExperimentTrendsQuery" - modifiers: Optional[HogQLQueryModifiers] = Field( - default=None, description="Modifiers used when performing the query" - ) - response: Optional[ExperimentTrendsQueryResponse] = None + p_value: float + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantTrendsBaseStats] class FunnelsQuery(BaseModel): @@ -5928,6 +5820,68 @@ class LifecycleQuery(BaseModel): ) +class QueryResponseAlternative16(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + credible_intervals: dict[str, list[float]] + expected_loss: float + funnels_query: Optional[FunnelsQuery] = None + insight: list[list[dict[str, Any]]] + kind: Literal["ExperimentFunnelsQuery"] = "ExperimentFunnelsQuery" + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantFunnelsBaseStats] + + +class QueryResponseAlternative17(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + count_query: Optional[TrendsQuery] = None + credible_intervals: dict[str, list[float]] + exposure_query: Optional[TrendsQuery] = None + insight: list[dict[str, Any]] + kind: Literal["ExperimentTrendsQuery"] = "ExperimentTrendsQuery" + p_value: float + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantTrendsBaseStats] + + +class QueryResponseAlternative28(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + credible_intervals: dict[str, list[float]] + expected_loss: float + funnels_query: Optional[FunnelsQuery] = None + insight: list[list[dict[str, Any]]] + kind: Literal["ExperimentFunnelsQuery"] = "ExperimentFunnelsQuery" + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantFunnelsBaseStats] + + +class QueryResponseAlternative29(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + count_query: Optional[TrendsQuery] = None + credible_intervals: dict[str, list[float]] + exposure_query: Optional[TrendsQuery] = None + insight: list[dict[str, Any]] + kind: Literal["ExperimentTrendsQuery"] = "ExperimentTrendsQuery" + p_value: float + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantTrendsBaseStats] + + class QueryResponseAlternative37(BaseModel): model_config = ConfigDict( extra="forbid", @@ -6036,6 +5990,48 @@ class RootAssistantMessage(RootModel[Union[VisualizationMessage, AssistantMessag root: Union[VisualizationMessage, AssistantMessage, HumanMessage] +class CachedExperimentFunnelsQueryResponse(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + cache_key: str + cache_target_age: Optional[AwareDatetime] = None + calculation_trigger: Optional[str] = Field( + default=None, description="What triggered the calculation of the query, leave empty if user/immediate" + ) + credible_intervals: dict[str, list[float]] + expected_loss: float + funnels_query: Optional[FunnelsQuery] = None + insight: list[list[dict[str, Any]]] + is_cached: bool + kind: Literal["ExperimentFunnelsQuery"] = "ExperimentFunnelsQuery" + last_refresh: AwareDatetime + next_allowed_client_refresh: AwareDatetime + probability: dict[str, float] + query_status: Optional[QueryStatus] = Field( + default=None, description="Query status indicates whether next to the provided data, a query is still running." + ) + significance_code: ExperimentSignificanceCode + significant: bool + timezone: str + variants: list[ExperimentVariantFunnelsBaseStats] + + +class Response10(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + credible_intervals: dict[str, list[float]] + expected_loss: float + funnels_query: Optional[FunnelsQuery] = None + insight: list[list[dict[str, Any]]] + kind: Literal["ExperimentFunnelsQuery"] = "ExperimentFunnelsQuery" + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantFunnelsBaseStats] + + class DatabaseSchemaQueryResponse(BaseModel): model_config = ConfigDict( extra="forbid", @@ -6052,17 +6048,33 @@ class DatabaseSchemaQueryResponse(BaseModel): ] -class ExperimentFunnelsQuery(BaseModel): +class ExperimentFunnelsQueryResponse(BaseModel): model_config = ConfigDict( extra="forbid", ) - experiment_id: int + credible_intervals: dict[str, list[float]] + expected_loss: float + funnels_query: Optional[FunnelsQuery] = None + insight: list[list[dict[str, Any]]] kind: Literal["ExperimentFunnelsQuery"] = "ExperimentFunnelsQuery" + probability: dict[str, float] + significance_code: ExperimentSignificanceCode + significant: bool + variants: list[ExperimentVariantFunnelsBaseStats] + + +class ExperimentTrendsQuery(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + count_query: TrendsQuery + experiment_id: int + exposure_query: Optional[TrendsQuery] = None + kind: Literal["ExperimentTrendsQuery"] = "ExperimentTrendsQuery" modifiers: Optional[HogQLQueryModifiers] = Field( default=None, description="Modifiers used when performing the query" ) - response: Optional[ExperimentFunnelsQueryResponse] = None - source: FunnelsQuery + response: Optional[ExperimentTrendsQueryResponse] = None class FunnelPathsFilter(BaseModel): @@ -6166,6 +6178,19 @@ class DatabaseSchemaQuery(BaseModel): response: Optional[DatabaseSchemaQueryResponse] = None +class ExperimentFunnelsQuery(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + experiment_id: int + kind: Literal["ExperimentFunnelsQuery"] = "ExperimentFunnelsQuery" + modifiers: Optional[HogQLQueryModifiers] = Field( + default=None, description="Modifiers used when performing the query" + ) + response: Optional[ExperimentFunnelsQueryResponse] = None + source: FunnelsQuery + + class FunnelCorrelationQuery(BaseModel): model_config = ConfigDict( extra="forbid", From 3ed93f7201ae93e748d156b6f0c65dcb9261bcc6 Mon Sep 17 00:00:00 2001 From: David Newell Date: Wed, 30 Oct 2024 12:13:10 +0000 Subject: [PATCH 12/15] chore: add kafka producer to context (#25899) --- rust/cymbal/src/app_context.rs | 24 ++++++++++++++++++------ rust/cymbal/src/main.rs | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/rust/cymbal/src/app_context.rs b/rust/cymbal/src/app_context.rs index 5d7d130b89c9a..381c4de941f6b 100644 --- a/rust/cymbal/src/app_context.rs +++ b/rust/cymbal/src/app_context.rs @@ -1,8 +1,11 @@ -use std::time::Duration; - -use common_kafka::kafka_consumer::SingleTopicConsumer; +use common_kafka::{ + kafka_consumer::SingleTopicConsumer, kafka_producer::create_kafka_producer, + kafka_producer::KafkaContext, +}; use health::{HealthHandle, HealthRegistry}; +use rdkafka::producer::FutureProducer; use sqlx::{postgres::PgPoolOptions, PgPool}; +use std::time::Duration; use tracing::info; use crate::{ @@ -14,7 +17,8 @@ use crate::{ pub struct AppContext { pub health_registry: HealthRegistry, pub worker_liveness: HealthHandle, - pub consumer: SingleTopicConsumer, + pub kafka_consumer: SingleTopicConsumer, + pub kafka_producer: FutureProducer, pub pool: PgPool, pub catalog: Catalog, } @@ -25,8 +29,15 @@ impl AppContext { let worker_liveness = health_registry .register("worker".to_string(), Duration::from_secs(60)) .await; + let kafka_liveness = health_registry + .register("rdkafka".to_string(), Duration::from_secs(30)) + .await; - let consumer = SingleTopicConsumer::new(config.kafka.clone(), config.consumer.clone())?; + let kafka_consumer = + SingleTopicConsumer::new(config.kafka.clone(), config.consumer.clone())?; + let kafka_producer = create_kafka_producer(&config.kafka, kafka_liveness) + .await + .expect("failed to create kafka producer"); let options = PgPoolOptions::new().max_connections(config.max_pg_connections); let pool = options.connect(&config.database_url).await?; @@ -44,7 +55,8 @@ impl AppContext { Ok(Self { health_registry, worker_liveness, - consumer, + kafka_consumer, + kafka_producer, pool, catalog, }) diff --git a/rust/cymbal/src/main.rs b/rust/cymbal/src/main.rs index 29086defed700..9ea6c02b4a065 100644 --- a/rust/cymbal/src/main.rs +++ b/rust/cymbal/src/main.rs @@ -64,7 +64,7 @@ async fn main() -> Result<(), Error> { context.worker_liveness.report_healthy().await; // Just grab the event as a serde_json::Value and immediately drop it, // we can work out a real type for it later (once we're deployed etc) - let (event, offset): (ClickHouseEvent, _) = match context.consumer.json_recv().await { + let (event, offset): (ClickHouseEvent, _) = match context.kafka_consumer.json_recv().await { Ok(r) => r, Err(RecvErr::Kafka(e)) => { return Err(e.into()); // Just die if we recieve a Kafka error From e7be5dc349186395e2fc0546cef8b490c34c0ba4 Mon Sep 17 00:00:00 2001 From: Oliver Browne Date: Wed, 30 Oct 2024 14:27:24 +0200 Subject: [PATCH 13/15] feat(cdp): better logging of fetch failures (#25665) Co-authored-by: Ben White --- plugin-server/src/cdp/cdp-api.ts | 4 +- plugin-server/src/cdp/fetch-executor.ts | 4 +- plugin-server/src/cdp/hog-executor.ts | 41 +++++++++++++++----- plugin-server/src/cdp/types.ts | 25 +++++++++++- plugin-server/src/cdp/utils.ts | 28 ++++--------- plugin-server/tests/cdp/cdp-api.test.ts | 7 ++-- plugin-server/tests/cdp/cdp-e2e.test.ts | 1 + plugin-server/tests/cdp/hog-executor.test.ts | 3 +- 8 files changed, 73 insertions(+), 40 deletions(-) diff --git a/plugin-server/src/cdp/cdp-api.ts b/plugin-server/src/cdp/cdp-api.ts index 0f4ea02b96814..ed4e60976b1e9 100644 --- a/plugin-server/src/cdp/cdp-api.ts +++ b/plugin-server/src/cdp/cdp-api.ts @@ -156,7 +156,7 @@ export class CdpApi { invocation: { ...invocation, queue: 'hog', - queueParameters: { response: { status: 200, body: '{}' } }, + queueParameters: { response: { status: 200, headers: {} }, body: '{}' }, }, finished: false, logs: [ @@ -185,7 +185,7 @@ export class CdpApi { res.json({ status: lastResponse.finished ? 'success' : 'error', - error: String(lastResponse.error), + error: lastResponse.error ? String(lastResponse.error) : null, logs: logs, }) } catch (e) { diff --git a/plugin-server/src/cdp/fetch-executor.ts b/plugin-server/src/cdp/fetch-executor.ts index 62f061e70c037..e4ad6a53a3613 100644 --- a/plugin-server/src/cdp/fetch-executor.ts +++ b/plugin-server/src/cdp/fetch-executor.ts @@ -95,6 +95,7 @@ export class FetchExecutor { const resParams: HogFunctionQueueParametersFetchResponse = { response: { status: 0, + headers: {}, }, error: null, timings: [], @@ -120,8 +121,9 @@ export class FetchExecutor { resParams.response = { status: fetchResponse.status, - body: responseBody, + headers: Object.fromEntries(fetchResponse.headers.entries()), } + resParams.body = responseBody } catch (err) { status.error('🦔', `[HogExecutor] Error during fetch`, { error: String(err) }) resParams.error = 'Something went wrong with the fetch request.' diff --git a/plugin-server/src/cdp/hog-executor.ts b/plugin-server/src/cdp/hog-executor.ts index c57d954460f66..92b38fb71c4a8 100644 --- a/plugin-server/src/cdp/hog-executor.ts +++ b/plugin-server/src/cdp/hog-executor.ts @@ -9,6 +9,7 @@ import { Hub, ValueMatcher } from '../types' import { status } from '../utils/status' import { HogFunctionManager } from './hog-function-manager' import { + CyclotronFetchFailureInfo, HogFunctionInvocation, HogFunctionInvocationGlobals, HogFunctionInvocationGlobalsWithInputs, @@ -217,25 +218,41 @@ export class HogExecutor { const { logs = [], response = null, + trace = [], error, timings = [], } = invocation.queueParameters as HogFunctionQueueParametersFetchResponse + + let body = invocation.queueParameters.body // Reset the queue parameters to be sure invocation.queue = 'hog' invocation.queueParameters = undefined - const status = typeof response?.status === 'number' ? response.status : 503 - - // Special handling for fetch - if (status >= 400) { - // Generic warn log for bad status codes + // If we got a trace, then the last "result" is the final attempt, and we should try to grab a status from it + // or any preceding attempts, and produce a log message for each of them + let status = null + if (trace.length > 0) { logs.push({ - level: 'warn', + level: 'error', timestamp: DateTime.now(), - message: `Fetch returned bad status: ${status}`, + message: `Fetch failed after ${trace.length} attempts`, }) + for (const attempt of trace) { + logs.push({ + level: 'warn', + timestamp: DateTime.now(), + message: fetchFailureToLogMessage(attempt), + }) + if (attempt.status) { + status = attempt.status + } + } } + // If we got a response from fetch, we know the response code was in the <300 range, + // but if we didn't (indicating a bug in the fetch worker), we use a default of 503 + status = response?.status ?? 503 + if (!invocation.vmState) { throw new Error("VM state wasn't provided for queue parameters") } @@ -244,9 +261,9 @@ export class HogExecutor { throw new Error(error) } - if (typeof response?.body === 'string') { + if (typeof body === 'string') { try { - response.body = JSON.parse(response.body) + body = JSON.parse(body) } catch (e) { // pass - if it isn't json we just pass it on } @@ -255,7 +272,7 @@ export class HogExecutor { // Finally we create the response object as the VM expects invocation.vmState!.stack.push({ status, - body: response?.body, + body: body, }) invocation.timings = invocation.timings.concat(timings) result.logs = [...logs, ...result.logs] @@ -556,3 +573,7 @@ export class HogExecutor { return values } } + +function fetchFailureToLogMessage(failure: CyclotronFetchFailureInfo): string { + return `Fetch failure of kind ${failure.kind} with status ${failure.status} and message ${failure.message}` +} diff --git a/plugin-server/src/cdp/types.ts b/plugin-server/src/cdp/types.ts index 037e08e7a9a54..8a675e605e017 100644 --- a/plugin-server/src/cdp/types.ts +++ b/plugin-server/src/cdp/types.ts @@ -169,14 +169,35 @@ export type HogFunctionQueueParametersFetchRequest = { headers?: Record } +export type CyclotronFetchFailureKind = + | 'timeout' + | 'timeoutgettingbody' + | 'missingparameters' + | 'invalidparameters' + | 'requesterror' + | 'failurestatus' + | 'invalidbody' + | 'responsetoolarge' + +export type CyclotronFetchFailureInfo = { + kind: CyclotronFetchFailureKind + message: string + headers?: Record + status?: number + timestamp: DateTime +} + export type HogFunctionQueueParametersFetchResponse = { /** An error message to indicate something went wrong and the invocation should be stopped */ error?: any - /** The data to be passed to the Hog function from the response */ + /** On success, the fetch worker returns only the successful response */ response?: { status: number - body?: string + headers: Record } | null + /** On failure, the fetch worker returns a list of info about the attempts made*/ + trace?: CyclotronFetchFailureInfo[] + body?: string // Both results AND failures can have a body timings?: HogFunctionTiming[] logs?: LogEntry[] } diff --git a/plugin-server/src/cdp/utils.ts b/plugin-server/src/cdp/utils.ts index f8031a043a1bc..6546db471d88f 100644 --- a/plugin-server/src/cdp/utils.ts +++ b/plugin-server/src/cdp/utils.ts @@ -317,21 +317,14 @@ function prepareQueueParams( let parameters: HogFunctionInvocation['queueParameters'] = _params let blob: CyclotronJobUpdate['blob'] = undefined - if (parameters && 'body' in parameters) { - // Fetch request - const { body, ...rest } = parameters - parameters = rest - blob = body ? Buffer.from(body) : undefined - } else if (parameters && 'response' in parameters && parameters.response) { - // Fetch response - const { body, ...rest } = parameters.response - parameters = { - ...parameters, - response: rest, - } - blob = body ? Buffer.from(body) : undefined + if (!parameters) { + return { parameters, blob } } + const { body, ...rest } = parameters + parameters = rest + blob = body ? Buffer.from(body) : undefined + return { parameters, blob, @@ -355,14 +348,7 @@ export function cyclotronJobToInvocation(job: CyclotronJob, hogFunction: HogFunc if (job.blob && params) { // Deserialize the blob into the params try { - const body = job.blob ? Buffer.from(job.blob).toString('utf-8') : undefined - if ('response' in params && params.response) { - // Fetch response - params.response.body = body - } else if ('method' in params) { - // Fetch request - params.body = body - } + params.body = job.blob ? Buffer.from(job.blob).toString('utf-8') : undefined } catch (e) { status.error('Error parsing blob', e, job.blob) captureException(e) diff --git a/plugin-server/tests/cdp/cdp-api.test.ts b/plugin-server/tests/cdp/cdp-api.test.ts index 94ccf642230a9..25599334cbc0f 100644 --- a/plugin-server/tests/cdp/cdp-api.test.ts +++ b/plugin-server/tests/cdp/cdp-api.test.ts @@ -166,7 +166,7 @@ describe('CDP API', () => { console.log(res.body.logs[3].message) expect(res.body).toMatchObject({ status: 'success', - error: 'undefined', + error: null, logs: [ { level: 'debug', @@ -205,6 +205,7 @@ describe('CDP API', () => { Promise.resolve({ status: 201, text: () => Promise.resolve(JSON.stringify({ real: true })), + headers: new Headers({ 'Content-Type': 'application/json' }), }) ) const res = await supertest(app) @@ -214,7 +215,7 @@ describe('CDP API', () => { expect(res.status).toEqual(200) expect(res.body).toMatchObject({ status: 'success', - error: 'undefined', + error: null, logs: [ { level: 'debug', @@ -260,7 +261,7 @@ describe('CDP API', () => { expect(res.status).toEqual(200) expect(res.body).toMatchObject({ status: 'success', - error: 'undefined', + error: null, logs: [ { level: 'debug', diff --git a/plugin-server/tests/cdp/cdp-e2e.test.ts b/plugin-server/tests/cdp/cdp-e2e.test.ts index db170f7ea8e1f..2dc228da8705d 100644 --- a/plugin-server/tests/cdp/cdp-e2e.test.ts +++ b/plugin-server/tests/cdp/cdp-e2e.test.ts @@ -20,6 +20,7 @@ jest.mock('../../src/utils/fetch', () => { Promise.resolve({ status: 200, text: () => Promise.resolve(JSON.stringify({ success: true })), + headers: new Headers({ 'Content-Type': 'application/json' }), json: () => Promise.resolve({ success: true }), }) ), diff --git a/plugin-server/tests/cdp/hog-executor.test.ts b/plugin-server/tests/cdp/hog-executor.test.ts index 94608b2f5bea1..9d1f5dea2bebf 100644 --- a/plugin-server/tests/cdp/hog-executor.test.ts +++ b/plugin-server/tests/cdp/hog-executor.test.ts @@ -31,8 +31,9 @@ const setupFetchResponse = (invocation: HogFunctionInvocation, options?: { statu ], response: { status: options?.status ?? 200, - body: options?.body ?? 'success', + headers: { 'Content-Type': 'application/json' }, }, + body: options?.body ?? 'success', } } From 0fef0fa080c25d6b9110b7a4ae5ade857b0b0aaf Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Wed, 30 Oct 2024 13:33:27 +0100 Subject: [PATCH 14/15] fix: yet another flappity should die (#25898) --- posthog/test/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posthog/test/base.py b/posthog/test/base.py index 1958c630aa33d..0c40adacae97b 100644 --- a/posthog/test/base.py +++ b/posthog/test/base.py @@ -563,7 +563,7 @@ def assertQueryMatchesSnapshot(self, query, params=None, replace_all_numbers=Fal #### Cohort replacements # replace cohort id lists in queries too query = re.sub( - r"in((.*)?cohort_id, \[\d+(, ?\d+)*\])", + r"in((.*?)cohort_id, \[\d+(, ?\d+)*\])", r"in(\1cohort_id, [1, 2, 3, 4, 5 /* ... */])", query, ) From 8de5762cd14b8ae738d5b6c7d95a5f66b8546757 Mon Sep 17 00:00:00 2001 From: Georgiy Tarasov Date: Wed, 30 Oct 2024 14:40:56 +0100 Subject: [PATCH 15/15] feat(product-assistant): trends generation failover (#25769) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- ee/hogai/assistant.py | 59 ++++-- ee/hogai/trends/nodes.py | 143 ++++++++----- ee/hogai/trends/parsers.py | 24 +++ ee/hogai/trends/prompts.py | 20 ++ ee/hogai/trends/test/test_nodes.py | 196 +++++++++++++++++- ee/hogai/trends/test/test_utils.py | 39 ++++ ee/hogai/trends/utils.py | 45 +++- ee/hogai/utils.py | 5 +- ...app-max-ai--empty-thread-loading--dark.png | Bin 11026 -> 11029 bytes ...pp-max-ai--empty-thread-loading--light.png | Bin 11162 -> 11160 bytes ...ax-ai--generation-failure-thread--dark.png | Bin 0 -> 44264 bytes ...x-ai--generation-failure-thread--light.png | Bin 0 -> 43409 bytes .../scenes-app-max-ai--thread--dark.png | Bin 65533 -> 68501 bytes .../scenes-app-max-ai--thread--light.png | Bin 63577 -> 65884 bytes ...i--thread-with-failed-generation--dark.png | Bin 0 -> 16149 bytes ...--thread-with-failed-generation--light.png | Bin 0 -> 16249 bytes frontend/src/queries/schema.json | 37 +++- frontend/src/queries/schema.ts | 22 +- frontend/src/scenes/max/Max.stories.tsx | 44 +++- frontend/src/scenes/max/Thread.tsx | 84 ++++++-- .../max/__mocks__/chatResponse.mocks.ts | 24 ++- .../scenes/max/__mocks__/failureResponse.json | 4 + frontend/src/scenes/max/maxLogic.ts | 96 +++++++-- frontend/src/scenes/max/utils.ts | 12 +- posthog/api/query.py | 15 +- posthog/schema.py | 30 ++- 26 files changed, 773 insertions(+), 126 deletions(-) create mode 100644 ee/hogai/trends/parsers.py create mode 100644 ee/hogai/trends/test/test_utils.py create mode 100644 frontend/__snapshots__/scenes-app-max-ai--generation-failure-thread--dark.png create mode 100644 frontend/__snapshots__/scenes-app-max-ai--generation-failure-thread--light.png create mode 100644 frontend/__snapshots__/scenes-app-max-ai--thread-with-failed-generation--dark.png create mode 100644 frontend/__snapshots__/scenes-app-max-ai--thread-with-failed-generation--light.png create mode 100644 frontend/src/scenes/max/__mocks__/failureResponse.json diff --git a/ee/hogai/assistant.py b/ee/hogai/assistant.py index e47020fdcdf04..d01181b937c4e 100644 --- a/ee/hogai/assistant.py +++ b/ee/hogai/assistant.py @@ -4,12 +4,18 @@ from langchain_core.messages import AIMessageChunk from langfuse.callback import CallbackHandler from langgraph.graph.state import StateGraph +from pydantic import BaseModel from ee import settings -from ee.hogai.trends.nodes import CreateTrendsPlanNode, CreateTrendsPlanToolsNode, GenerateTrendsNode +from ee.hogai.trends.nodes import ( + CreateTrendsPlanNode, + CreateTrendsPlanToolsNode, + GenerateTrendsNode, + GenerateTrendsToolsNode, +) from ee.hogai.utils import AssistantNodeName, AssistantState, Conversation from posthog.models.team.team import Team -from posthog.schema import VisualizationMessage +from posthog.schema import AssistantGenerationStatusEvent, AssistantGenerationStatusType, VisualizationMessage if settings.LANGFUSE_PUBLIC_KEY: langfuse_handler = CallbackHandler( @@ -39,6 +45,13 @@ def is_message_update( return len(update) == 2 and update[0] == "messages" +def is_state_update(update: list[Any]) -> TypeGuard[tuple[Literal["updates"], AssistantState]]: + """ + Update of the state. + """ + return len(update) == 2 and update[0] == "values" + + class Assistant: _team: Team _graph: StateGraph @@ -59,6 +72,10 @@ def _compile_graph(self): generate_trends_node = GenerateTrendsNode(self._team) builder.add_node(GenerateTrendsNode.name, generate_trends_node.run) + generate_trends_tools_node = GenerateTrendsToolsNode(self._team) + builder.add_node(GenerateTrendsToolsNode.name, generate_trends_tools_node.run) + builder.add_edge(GenerateTrendsToolsNode.name, GenerateTrendsNode.name) + builder.add_edge(AssistantNodeName.START, create_trends_plan_node.name) builder.add_conditional_edges(create_trends_plan_node.name, create_trends_plan_node.router) builder.add_conditional_edges(create_trends_plan_tools_node.name, create_trends_plan_tools_node.router) @@ -66,31 +83,45 @@ def _compile_graph(self): return builder.compile() - def stream(self, conversation: Conversation) -> Generator[str, None, None]: + def stream(self, conversation: Conversation) -> Generator[BaseModel, None, None]: assistant_graph = self._compile_graph() callbacks = [langfuse_handler] if langfuse_handler else [] messages = [message.root for message in conversation.messages] + chunks = AIMessageChunk(content="") + state: AssistantState = {"messages": messages, "intermediate_steps": None, "plan": None} + generator = assistant_graph.stream( - {"messages": messages}, + state, config={"recursion_limit": 24, "callbacks": callbacks}, - stream_mode=["messages", "updates"], + stream_mode=["messages", "values", "updates"], ) chunks = AIMessageChunk(content="") # Send a chunk to establish the connection avoiding the worker's timeout. - yield "" + yield AssistantGenerationStatusEvent(type=AssistantGenerationStatusType.ACK) for update in generator: - if is_value_update(update): + if is_state_update(update): + _, new_state = update + state = new_state + + elif is_value_update(update): _, state_update = update - if ( - AssistantNodeName.GENERATE_TRENDS in state_update - and "messages" in state_update[AssistantNodeName.GENERATE_TRENDS] - ): - message = cast(VisualizationMessage, state_update[AssistantNodeName.GENERATE_TRENDS]["messages"][0]) - yield message.model_dump_json() + + if AssistantNodeName.GENERATE_TRENDS in state_update: + # Reset chunks when schema validation fails. + chunks = AIMessageChunk(content="") + + if "messages" in state_update[AssistantNodeName.GENERATE_TRENDS]: + message = cast( + VisualizationMessage, state_update[AssistantNodeName.GENERATE_TRENDS]["messages"][0] + ) + yield message + elif state_update[AssistantNodeName.GENERATE_TRENDS].get("intermediate_steps", []): + yield AssistantGenerationStatusEvent(type=AssistantGenerationStatusType.GENERATION_ERROR) + elif is_message_update(update): langchain_message, langgraph_state = update[1] if langgraph_state["langgraph_node"] == AssistantNodeName.GENERATE_TRENDS and isinstance( @@ -101,4 +132,4 @@ def stream(self, conversation: Conversation) -> Generator[str, None, None]: if parsed_message: yield VisualizationMessage( reasoning_steps=parsed_message.reasoning_steps, answer=parsed_message.answer - ).model_dump_json() + ) diff --git a/ee/hogai/trends/nodes.py b/ee/hogai/trends/nodes.py index 845c71fe4ee5e..206b74173a192 100644 --- a/ee/hogai/trends/nodes.py +++ b/ee/hogai/trends/nodes.py @@ -1,8 +1,7 @@ import itertools -import json import xml.etree.ElementTree as ET from functools import cached_property -from typing import Union, cast +from typing import Optional, Union, cast from langchain.agents.format_scratchpad import format_log_to_str from langchain.agents.output_parsers import ReActJsonSingleInputOutputParser @@ -10,20 +9,21 @@ from langchain_core.exceptions import OutputParserException from langchain_core.messages import AIMessage as LangchainAssistantMessage from langchain_core.messages import BaseMessage, merge_message_runs -from langchain_core.messages import HumanMessage as LangchainHumanMessage -from langchain_core.output_parsers import PydanticOutputParser from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate -from langchain_core.runnables import RunnableConfig, RunnableLambda +from langchain_core.runnables import RunnableConfig from langchain_openai import ChatOpenAI from pydantic import ValidationError from ee.hogai.hardcoded_definitions import hardcoded_prop_defs +from ee.hogai.trends.parsers import PydanticOutputParserException, parse_generated_trends_output from ee.hogai.trends.prompts import ( react_definitions_prompt, react_follow_up_prompt, react_scratchpad_prompt, react_system_prompt, react_user_prompt, + trends_failover_output_prompt, + trends_failover_prompt, trends_group_mapping_prompt, trends_new_plan_prompt, trends_plan_prompt, @@ -35,7 +35,7 @@ TrendsAgentToolkit, TrendsAgentToolModel, ) -from ee.hogai.trends.utils import GenerateTrendOutputModel +from ee.hogai.trends.utils import GenerateTrendOutputModel, filter_trends_conversation from ee.hogai.utils import ( AssistantNode, AssistantNodeName, @@ -45,7 +45,12 @@ from posthog.hogql_queries.ai.team_taxonomy_query_runner import TeamTaxonomyQueryRunner from posthog.hogql_queries.query_runner import ExecutionMode from posthog.models.group_type_mapping import GroupTypeMapping -from posthog.schema import CachedTeamTaxonomyQueryResponse, HumanMessage, TeamTaxonomyQuery, VisualizationMessage +from posthog.schema import ( + CachedTeamTaxonomyQueryResponse, + FailureMessage, + TeamTaxonomyQuery, + VisualizationMessage, +) class CreateTrendsPlanNode(AssistantNode): @@ -170,26 +175,33 @@ def _reconstruct_conversation(self, state: AssistantState) -> list[BaseMessage]: """ Reconstruct the conversation for the agent. On this step we only care about previously asked questions and generated plans. All other messages are filtered out. """ - messages = state.get("messages", []) - if len(messages) == 0: + human_messages, visualization_messages = filter_trends_conversation(state.get("messages", [])) + + if not human_messages: return [] - conversation = [ - HumanMessagePromptTemplate.from_template(react_user_prompt, template_format="mustache").format( - question=messages[0].content if isinstance(messages[0], HumanMessage) else "" - ) - ] + conversation = [] - for message in messages[1:]: - if isinstance(message, HumanMessage): - conversation.append( - HumanMessagePromptTemplate.from_template( - react_follow_up_prompt, - template_format="mustache", - ).format(feedback=message.content) - ) - elif isinstance(message, VisualizationMessage): - conversation.append(LangchainAssistantMessage(content=message.plan or "")) + for idx, messages in enumerate(itertools.zip_longest(human_messages, visualization_messages)): + human_message, viz_message = messages + + if human_message: + if idx == 0: + conversation.append( + HumanMessagePromptTemplate.from_template(react_user_prompt, template_format="mustache").format( + question=human_message.content + ) + ) + else: + conversation.append( + HumanMessagePromptTemplate.from_template( + react_follow_up_prompt, + template_format="mustache", + ).format(feedback=human_message.content) + ) + + if viz_message: + conversation.append(LangchainAssistantMessage(content=viz_message.plan or "")) return conversation @@ -240,30 +252,38 @@ class GenerateTrendsNode(AssistantNode): def run(self, state: AssistantState, config: RunnableConfig): generated_plan = state.get("plan", "") + intermediate_steps = state.get("intermediate_steps") or [] + validation_error_message = intermediate_steps[-1][1] if intermediate_steps else None trends_generation_prompt = ChatPromptTemplate.from_messages( [ ("system", trends_system_prompt), ], template_format="mustache", - ) + self._reconstruct_conversation(state) + ) + self._reconstruct_conversation(state, validation_error_message=validation_error_message) merger = merge_message_runs() - chain = ( - trends_generation_prompt - | merger - | self._model - # Result from structured output is a parsed dict. Convert to a string since the output parser expects it. - | RunnableLambda(lambda x: json.dumps(x)) - # Validate a string input. - | PydanticOutputParser[GenerateTrendOutputModel](pydantic_object=GenerateTrendOutputModel) - ) + chain = trends_generation_prompt | merger | self._model | parse_generated_trends_output try: message: GenerateTrendOutputModel = chain.invoke({}, config) - except OutputParserException: + except PydanticOutputParserException as e: + # Generation step is expensive. After a second unsuccessful attempt, it's better to send a failure message. + if len(intermediate_steps) >= 2: + return { + "messages": [ + FailureMessage( + content="Oops! It looks like I’m having trouble generating this trends insight. Could you please try again?" + ) + ], + "intermediate_steps": None, + } + return { - "messages": [VisualizationMessage(plan=generated_plan, reasoning_steps=["Schema validation failed"])] + "intermediate_steps": [ + *intermediate_steps, + (AgentAction("handle_incorrect_response", e.llm_output, e.validation_message), None), + ], } return { @@ -273,11 +293,12 @@ def run(self, state: AssistantState, config: RunnableConfig): reasoning_steps=message.reasoning_steps, answer=message.answer, ) - ] + ], + "intermediate_steps": None, } def router(self, state: AssistantState): - if state.get("tool_argument") is not None: + if state.get("intermediate_steps") is not None: return AssistantNodeName.GENERATE_TRENDS_TOOLS return AssistantNodeName.END @@ -301,7 +322,9 @@ def _group_mapping_prompt(self) -> str: ) return ET.tostring(root, encoding="unicode") - def _reconstruct_conversation(self, state: AssistantState) -> list[BaseMessage]: + def _reconstruct_conversation( + self, state: AssistantState, validation_error_message: Optional[str] = None + ) -> list[BaseMessage]: """ Reconstruct the conversation for the generation. Take all previously generated questions, plans, and schemas, and return the history. """ @@ -317,22 +340,7 @@ def _reconstruct_conversation(self, state: AssistantState) -> list[BaseMessage]: ) ] - stack: list[LangchainHumanMessage] = [] - human_messages: list[LangchainHumanMessage] = [] - visualization_messages: list[VisualizationMessage] = [] - - for message in messages: - if isinstance(message, HumanMessage): - stack.append(LangchainHumanMessage(content=message.content)) - elif isinstance(message, VisualizationMessage) and message.answer: - if stack: - human_messages += merge_message_runs(stack) - stack = [] - visualization_messages.append(message) - - if stack: - human_messages += merge_message_runs(stack) - + human_messages, visualization_messages = filter_trends_conversation(messages) first_ai_message = True for human_message, ai_message in itertools.zip_longest(human_messages, visualization_messages): @@ -364,6 +372,13 @@ def _reconstruct_conversation(self, state: AssistantState) -> list[BaseMessage]: LangchainAssistantMessage(content=ai_message.answer.model_dump_json() if ai_message.answer else "") ) + if validation_error_message: + conversation.append( + HumanMessagePromptTemplate.from_template(trends_failover_prompt, template_format="mustache").format( + validation_error_message=validation_error_message + ) + ) + return conversation @classmethod @@ -382,4 +397,20 @@ class GenerateTrendsToolsNode(AssistantNode): name = AssistantNodeName.GENERATE_TRENDS_TOOLS def run(self, state: AssistantState, config: RunnableConfig): - return state + intermediate_steps = state.get("intermediate_steps", []) + if not intermediate_steps: + return state + + action, _ = intermediate_steps[-1] + prompt = ( + ChatPromptTemplate.from_template(trends_failover_output_prompt, template_format="mustache") + .format_messages(output=action.tool_input, exception_message=action.log)[0] + .content + ) + + return { + "intermediate_steps": [ + *intermediate_steps[:-1], + (action, prompt), + ] + } diff --git a/ee/hogai/trends/parsers.py b/ee/hogai/trends/parsers.py new file mode 100644 index 0000000000000..a461c692d8825 --- /dev/null +++ b/ee/hogai/trends/parsers.py @@ -0,0 +1,24 @@ +import json + +from pydantic import ValidationError + +from ee.hogai.trends.utils import GenerateTrendOutputModel + + +class PydanticOutputParserException(ValueError): + llm_output: str + """Serialized LLM output.""" + validation_message: str + """Pydantic validation error message.""" + + def __init__(self, llm_output: str, validation_message: str): + super().__init__(llm_output) + self.llm_output = llm_output + self.validation_message = validation_message + + +def parse_generated_trends_output(output: dict) -> GenerateTrendOutputModel: + try: + return GenerateTrendOutputModel.model_validate(output) + except ValidationError as e: + raise PydanticOutputParserException(llm_output=json.dumps(output), validation_message=e.json(include_url=False)) diff --git a/ee/hogai/trends/prompts.py b/ee/hogai/trends/prompts.py index c53ae5d3453a5..84c2bcedb544a 100644 --- a/ee/hogai/trends/prompts.py +++ b/ee/hogai/trends/prompts.py @@ -269,3 +269,23 @@ trends_question_prompt = """ Answer to this question: {{question}} """ + +trends_failover_output_prompt = """ +Generation output: +``` +{{output}} +``` + +Exception message: +``` +{{exception_message}} +``` +""" + +trends_failover_prompt = """ +The result of the previous generation raised the Pydantic validation exception. + +{{validation_error_message}} + +Fix the error and return the correct response. +""" diff --git a/ee/hogai/trends/test/test_nodes.py b/ee/hogai/trends/test/test_nodes.py index dc297570c1fd1..990f83ddca754 100644 --- a/ee/hogai/trends/test/test_nodes.py +++ b/ee/hogai/trends/test/test_nodes.py @@ -1,7 +1,20 @@ +import json +from unittest.mock import patch + from django.test import override_settings +from langchain_core.agents import AgentAction +from langchain_core.runnables import RunnableLambda -from ee.hogai.trends.nodes import CreateTrendsPlanNode, GenerateTrendsNode -from posthog.schema import AssistantMessage, ExperimentalAITrendsQuery, HumanMessage, VisualizationMessage +from ee.hogai.trends.nodes import CreateTrendsPlanNode, GenerateTrendsNode, GenerateTrendsToolsNode +from ee.hogai.trends.utils import GenerateTrendOutputModel +from ee.hogai.utils import AssistantNodeName +from posthog.schema import ( + AssistantMessage, + ExperimentalAITrendsQuery, + FailureMessage, + HumanMessage, + VisualizationMessage, +) from posthog.test.base import APIBaseTest, ClickhouseTestMixin, _create_event, _create_person @@ -68,6 +81,22 @@ def test_agent_reconstructs_conversation_and_omits_unknown_messages(self): self.assertIn("Text", history[0].content) self.assertNotIn("{{question}}", history[0].content) + def test_agent_reconstructs_conversation_with_failures(self): + node = CreateTrendsPlanNode(self.team) + history = node._reconstruct_conversation( + { + "messages": [ + HumanMessage(content="Text"), + FailureMessage(content="Error"), + HumanMessage(content="Text"), + ] + } + ) + self.assertEqual(len(history), 1) + self.assertEqual(history[0].type, "human") + self.assertIn("Text", history[0].content) + self.assertNotIn("{{question}}", history[0].content) + def test_agent_filters_out_low_count_events(self): _create_person(distinct_ids=["test"], team=self.team) for i in range(26): @@ -92,6 +121,27 @@ class TestGenerateTrendsNode(ClickhouseTestMixin, APIBaseTest): def setUp(self): self.schema = ExperimentalAITrendsQuery(series=[]) + def test_node_runs(self): + node = GenerateTrendsNode(self.team) + with patch("ee.hogai.trends.nodes.GenerateTrendsNode._model") as generator_model_mock: + generator_model_mock.return_value = RunnableLambda( + lambda _: GenerateTrendOutputModel(reasoning_steps=["step"], answer=self.schema).model_dump() + ) + new_state = node.run( + { + "messages": [HumanMessage(content="Text")], + "plan": "Plan", + }, + {}, + ) + self.assertEqual( + new_state, + { + "messages": [VisualizationMessage(answer=self.schema, plan="Plan", reasoning_steps=["step"])], + "intermediate_steps": None, + }, + ) + def test_agent_reconstructs_conversation(self): node = GenerateTrendsNode(self.team) history = node._reconstruct_conversation({"messages": [HumanMessage(content="Text")]}) @@ -203,3 +253,145 @@ def test_agent_reconstructs_conversation_and_merges_messages(self): self.assertIn("Answer to this question:", history[5].content) self.assertNotIn("{{question}}", history[5].content) self.assertIn("Follow\nUp", history[5].content) + + def test_failover_with_incorrect_schema(self): + node = GenerateTrendsNode(self.team) + with patch("ee.hogai.trends.nodes.GenerateTrendsNode._model") as generator_model_mock: + schema = GenerateTrendOutputModel(reasoning_steps=[], answer=None).model_dump() + # Emulate an incorrect JSON. It should be an object. + schema["answer"] = [] + generator_model_mock.return_value = RunnableLambda(lambda _: json.dumps(schema)) + + new_state = node.run({"messages": [HumanMessage(content="Text")]}, {}) + self.assertIn("intermediate_steps", new_state) + self.assertEqual(len(new_state["intermediate_steps"]), 1) + + new_state = node.run( + { + "messages": [HumanMessage(content="Text")], + "intermediate_steps": [(AgentAction(tool="", tool_input="", log="exception"), "exception")], + }, + {}, + ) + self.assertIn("intermediate_steps", new_state) + self.assertEqual(len(new_state["intermediate_steps"]), 2) + + def test_node_leaves_failover(self): + node = GenerateTrendsNode(self.team) + with patch( + "ee.hogai.trends.nodes.GenerateTrendsNode._model", + return_value=RunnableLambda( + lambda _: GenerateTrendOutputModel(reasoning_steps=[], answer=self.schema).model_dump() + ), + ): + new_state = node.run( + { + "messages": [HumanMessage(content="Text")], + "intermediate_steps": [(AgentAction(tool="", tool_input="", log="exception"), "exception")], + }, + {}, + ) + self.assertIsNone(new_state["intermediate_steps"]) + + new_state = node.run( + { + "messages": [HumanMessage(content="Text")], + "intermediate_steps": [ + (AgentAction(tool="", tool_input="", log="exception"), "exception"), + (AgentAction(tool="", tool_input="", log="exception"), "exception"), + ], + }, + {}, + ) + self.assertIsNone(new_state["intermediate_steps"]) + + def test_node_leaves_failover_after_second_unsuccessful_attempt(self): + node = GenerateTrendsNode(self.team) + with patch("ee.hogai.trends.nodes.GenerateTrendsNode._model") as generator_model_mock: + schema = GenerateTrendOutputModel(reasoning_steps=[], answer=None).model_dump() + # Emulate an incorrect JSON. It should be an object. + schema["answer"] = [] + generator_model_mock.return_value = RunnableLambda(lambda _: json.dumps(schema)) + + new_state = node.run( + { + "messages": [HumanMessage(content="Text")], + "intermediate_steps": [ + (AgentAction(tool="", tool_input="", log="exception"), "exception"), + (AgentAction(tool="", tool_input="", log="exception"), "exception"), + ], + }, + {}, + ) + self.assertIsNone(new_state["intermediate_steps"]) + self.assertEqual(len(new_state["messages"]), 1) + self.assertIsInstance(new_state["messages"][0], FailureMessage) + + def test_agent_reconstructs_conversation_with_failover(self): + action = AgentAction(tool="fix", tool_input="validation error", log="exception") + node = GenerateTrendsNode(self.team) + history = node._reconstruct_conversation( + { + "messages": [HumanMessage(content="Text")], + "plan": "randomplan", + "intermediate_steps": [(action, "uniqexception")], + }, + "uniqexception", + ) + self.assertEqual(len(history), 4) + self.assertEqual(history[0].type, "human") + self.assertIn("mapping", history[0].content) + self.assertEqual(history[1].type, "human") + self.assertIn("the plan", history[1].content) + self.assertNotIn("{{plan}}", history[1].content) + self.assertIn("randomplan", history[1].content) + self.assertEqual(history[2].type, "human") + self.assertIn("Answer to this question:", history[2].content) + self.assertNotIn("{{question}}", history[2].content) + self.assertIn("Text", history[2].content) + self.assertEqual(history[3].type, "human") + self.assertIn("Pydantic", history[3].content) + self.assertIn("uniqexception", history[3].content) + + def test_agent_reconstructs_conversation_with_failed_messages(self): + node = GenerateTrendsNode(self.team) + history = node._reconstruct_conversation( + { + "messages": [ + HumanMessage(content="Text"), + FailureMessage(content="Error"), + HumanMessage(content="Text"), + ], + "plan": "randomplan", + }, + ) + self.assertEqual(len(history), 3) + self.assertEqual(history[0].type, "human") + self.assertIn("mapping", history[0].content) + self.assertEqual(history[1].type, "human") + self.assertIn("the plan", history[1].content) + self.assertNotIn("{{plan}}", history[1].content) + self.assertIn("randomplan", history[1].content) + self.assertEqual(history[2].type, "human") + self.assertIn("Answer to this question:", history[2].content) + self.assertNotIn("{{question}}", history[2].content) + self.assertIn("Text", history[2].content) + + def test_router(self): + node = GenerateTrendsNode(self.team) + state = node.router({"messages": [], "intermediate_steps": None}) + self.assertEqual(state, AssistantNodeName.END) + state = node.router( + {"messages": [], "intermediate_steps": [(AgentAction(tool="", tool_input="", log=""), None)]} + ) + self.assertEqual(state, AssistantNodeName.GENERATE_TRENDS_TOOLS) + + +class TestGenerateTrendsToolsNode(ClickhouseTestMixin, APIBaseTest): + def test_tools_node(self): + node = GenerateTrendsToolsNode(self.team) + action = AgentAction(tool="fix", tool_input="validationerror", log="pydanticexception") + state = node.run({"messages": [], "intermediate_steps": [(action, None)]}, {}) + self.assertIsNotNone("validationerror", state["intermediate_steps"][0][1]) + self.assertIn("validationerror", state["intermediate_steps"][0][1]) + self.assertIn("pydanticexception", state["intermediate_steps"][0][1]) diff --git a/ee/hogai/trends/test/test_utils.py b/ee/hogai/trends/test/test_utils.py new file mode 100644 index 0000000000000..de9b8733129ec --- /dev/null +++ b/ee/hogai/trends/test/test_utils.py @@ -0,0 +1,39 @@ +from langchain_core.messages import HumanMessage as LangchainHumanMessage + +from ee.hogai.trends import utils +from posthog.schema import ExperimentalAITrendsQuery, FailureMessage, HumanMessage, VisualizationMessage +from posthog.test.base import BaseTest + + +class TestTrendsUtils(BaseTest): + def test_merge_human_messages(self): + res = utils.merge_human_messages( + [ + LangchainHumanMessage(content="Text"), + LangchainHumanMessage(content="Text"), + LangchainHumanMessage(content="Te"), + LangchainHumanMessage(content="xt"), + ] + ) + self.assertEqual(len(res), 1) + self.assertEqual(res, [LangchainHumanMessage(content="Text\nTe\nxt")]) + + def test_filter_trends_conversation(self): + human_messages, visualization_messages = utils.filter_trends_conversation( + [ + HumanMessage(content="Text"), + FailureMessage(content="Error"), + HumanMessage(content="Text"), + VisualizationMessage(answer=ExperimentalAITrendsQuery(series=[]), plan="plan"), + HumanMessage(content="Text2"), + VisualizationMessage(answer=None, plan="plan"), + ] + ) + self.assertEqual(len(human_messages), 2) + self.assertEqual(len(visualization_messages), 1) + self.assertEqual( + human_messages, [LangchainHumanMessage(content="Text"), LangchainHumanMessage(content="Text2")] + ) + self.assertEqual( + visualization_messages, [VisualizationMessage(answer=ExperimentalAITrendsQuery(series=[]), plan="plan")] + ) diff --git a/ee/hogai/trends/utils.py b/ee/hogai/trends/utils.py index 080f85f0256d0..5e1a8052707c8 100644 --- a/ee/hogai/trends/utils.py +++ b/ee/hogai/trends/utils.py @@ -1,10 +1,53 @@ +from collections.abc import Sequence from typing import Optional +from langchain_core.messages import HumanMessage as LangchainHumanMessage +from langchain_core.messages import merge_message_runs from pydantic import BaseModel -from posthog.schema import ExperimentalAITrendsQuery +from ee.hogai.utils import AssistantMessageUnion +from posthog.schema import ExperimentalAITrendsQuery, HumanMessage, VisualizationMessage class GenerateTrendOutputModel(BaseModel): reasoning_steps: Optional[list[str]] = None answer: Optional[ExperimentalAITrendsQuery] = None + + +def merge_human_messages(messages: list[LangchainHumanMessage]) -> list[LangchainHumanMessage]: + """ + Filters out duplicated human messages and merges them into one message. + """ + contents = set() + filtered_messages = [] + for message in messages: + if message.content in contents: + continue + contents.add(message.content) + filtered_messages.append(message) + return merge_message_runs(filtered_messages) + + +def filter_trends_conversation( + messages: Sequence[AssistantMessageUnion], +) -> tuple[list[LangchainHumanMessage], list[VisualizationMessage]]: + """ + Splits, filters and merges the message history to be consumable by agents. + """ + stack: list[LangchainHumanMessage] = [] + human_messages: list[LangchainHumanMessage] = [] + visualization_messages: list[VisualizationMessage] = [] + + for message in messages: + if isinstance(message, HumanMessage): + stack.append(LangchainHumanMessage(content=message.content)) + elif isinstance(message, VisualizationMessage) and message.answer: + if stack: + human_messages += merge_human_messages(stack) + stack = [] + visualization_messages.append(message) + + if stack: + human_messages += merge_human_messages(stack) + + return human_messages, visualization_messages diff --git a/ee/hogai/utils.py b/ee/hogai/utils.py index 65de9303b3ffc..70d1ea969621a 100644 --- a/ee/hogai/utils.py +++ b/ee/hogai/utils.py @@ -10,9 +10,9 @@ from pydantic import BaseModel, Field from posthog.models.team.team import Team -from posthog.schema import AssistantMessage, HumanMessage, RootAssistantMessage, VisualizationMessage +from posthog.schema import AssistantMessage, FailureMessage, HumanMessage, RootAssistantMessage, VisualizationMessage -AssistantMessageUnion = Union[AssistantMessage, HumanMessage, VisualizationMessage] +AssistantMessageUnion = Union[AssistantMessage, HumanMessage, VisualizationMessage, FailureMessage] class Conversation(BaseModel): @@ -24,7 +24,6 @@ class AssistantState(TypedDict): messages: Annotated[Sequence[AssistantMessageUnion], operator.add] intermediate_steps: Optional[list[tuple[AgentAction, Optional[str]]]] plan: Optional[str] - tool_argument: Optional[str] class AssistantNodeName(StrEnum): diff --git a/frontend/__snapshots__/scenes-app-max-ai--empty-thread-loading--dark.png b/frontend/__snapshots__/scenes-app-max-ai--empty-thread-loading--dark.png index d6fe88cab16e5ab72ee2c6a6eb8fe2c4e74e056c..eedf3e01916a0813e55301444130f3eacaceb829 100644 GIT binary patch literal 11029 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 diff --git a/frontend/__snapshots__/scenes-app-max-ai--empty-thread-loading--light.png b/frontend/__snapshots__/scenes-app-max-ai--empty-thread-loading--light.png index 50e2dea81e948c0c709a1fb9cf8349af1b4f87bf..c19e174167b7c6e20dc5afe6a585ff4eaa678cce 100644 GIT binary patch literal 11160 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 literal 11162 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 diff --git a/frontend/__snapshots__/scenes-app-max-ai--generation-failure-thread--dark.png b/frontend/__snapshots__/scenes-app-max-ai--generation-failure-thread--dark.png new file mode 100644 index 0000000000000000000000000000000000000000..84a2a7828cdd505539313bc2566214e0560aed93 GIT binary patch literal 44264 zcmdpeWmH`2wj~jQg+KxUf`(v$;2Jzs0t9!r;O@aKf+QihySuwfg1Z&&?pjblVf}H= zyZ7C9?s?s#dvyQl8W|%+$*#RWS!>R@=Gxz7rA0B(3DJ>|kTAvGzmrEoLIzLogrnXC z|E&rTtlj=)FE0u~D(olTL_&IwB=$~7(K&u+)fke)Z zL@7=;={TdQ4sB0GSop~lnvb}t&SPQtu6$wZzLELK#d5X&9=kmcn^b_g!2Y<$?0BzQ z;`#;sdbIU=@3Tnd>A?HoC&6Pur6cm=pHGpHPVS&F|M~nqGG+6h&z?UGM!NUM(@%*TRQOxHq(FYY=j=i1wqAhk-nf&!$yi~M~ZOW3@L9EY?V~3#?OyopkIq6PB4)`-?R(ZR zjXW-1(p3hBnNQSKti8K9l#A+D)6fv-;Xy+Br1R{_hhVd|w*CE?E(-7HSooTnq1lv% zh={MNf9gp+h3ly=JENuAyIcogW~bqZ{TFqB6`JMD-Tuv7w>Ty4MzG}?%$O79#u}xG$$*sr6Hbob9X3BVIkvXUjw|e=W=b=T)}%gH zS*6eQ^ayy;*BcM)c?Ylc#ky42rBmy;9WO}hL5`P%VUs)i#wnGS<=GzmGg{8w;bCDt zO>WC=WtVB9kD$V%#8PpbF@o08D;aDxRc!Xw#v{c8ejy<&X|q zS%C@$CQUW)dLz&uP|>VEI!Sdf|EzTf?Bxo|S0LO_?yU92W047zn+&BU#h9v|>6)d~ z)~a8?r@VuM2M?4B6sM}j_vQz7wnkOWEKm2easCC-r0b6BAp9T-V3BQ2hH{Nu) z=?Gg^U`}pj>RhQR{gzLzS>E7PU9H3J?@4*ltOl@)F3^^V*BQm7q>5OcsHsf~2Kv}D z=ElXs!6dmKPkf*D#9E`bm=-Z#{Xu0}u3n_s5Qu$r+19f|#D(ehY(iDT#Tj86#c7jV z^X1E3@|E5gn1dWghE`qWA`0BZylR<#b4s|$9RKP&eA&1^_Tus!qu-8SD*>kiOHSu* z7UN_E7!=VUtFI_nHnDZpsi~>$&rNq`N_=X$Be7F6GPo_b(nBaLjQbLkVjSLj%lgn& zMz(TXnJ}9o!Mg3J_${ET)-K~S$wdE>w;L;DPEsI^GZvP($k^lwrJkLo>!iHRQ_ui z&CBh9X2a=+#92Nb7itreGCiH0sfDZz+U!YXQec|Ey6EZdzCK^iqmod8lf8xxo3$3s zk}K+!nXOvKGhhZ>JR>|!(-sxcTJ+Q)f$4GIhQ5>Sab%3B*cgq6q;0eB=sg!#^BiN1)Z^NlW);NsU?i?>+B zl-}%S(2d@lGzN9{q^1u!E?zz0$aqg1D7+=3nIr8V@Apok(qXYMZ~W4lVxCU%4rbD6 ze5Vyyn3hY#X;ExFz-hVbxVpMZ^tJL~39%K6!9;s91NfVS$7FxDA>iUDAuB5{G*nMm z*vIS5;3uK67T=(0GS^^i)>gg2`*kHRev))-3{fEBPGK-CLIYiWa0K6gxSpP#I4%ECXjSZE)z6dbV@o^bs0=EU8eQCIsUqdG7`NG@T8F9k8F9+$XT zujJuF*GBjAAJ}$_kZ`{^iLVbZEiCh`=6X|pm<=X>Zd(xY4t}MgFW`ZAr&H9aG#x-T zU6Mvh-s;dWULq(hFU&u4U0r?F(3E7n-cQmIKyuP?r~p0Ee!!1P9ulIG-3ty(!?h1v zmpQUK^12>@K>|obVMcwC*OfmIZ;?1Uu3a^7%YUgzNjaomoq3S!{`T#zpHP1?ew_9z z{b_GYw25F~?dH^M%jw{vKJ>R}5FCUXtcM3{IqKP8zjPfhu;?Rj#~t!kR#xcf=rqS% zWY?d8otKSKefQy;r6L;73wXeVd9#sGrZ@Ihn3cLKb%aw)+-b%U3&q=eLV};dgM%dv zo5E$11Tu^bO%ZqUhk@R?7E6*O#!TG{4f~`CKxK4=~AFr>4ZcWn=I)B$i@5*`v$9xDdQ8@WqB) zyI#OMhn8nFu5B+B8L-fGv;3NpvZ}^ixw&h`i!i9AV{PFx$ZHfY(^x{VVn`67;9$E z8(#Y@Hac2Uzu|>SLE3a;w@tR7kBy>|lA+;jamBOTyphjkHm8YKcdoTTRLP=jqo$-Z zHZU?YFi<#s1RW0WDs;1V2ch`Y#oB@HnB}zDcWgSCURx@BBeEXEBP8?8sZ4rjhV2xOcEf_(vbgCjIgH69hc$UOj!< z{~OFjBEQ>Qp_WES-19=ch;XwrOnF-m^YEgLXmhU{t>Jt%1tOxnnff|bR#xT6uW01! z{W>dRimehQ!WaMA`85@fP{}fgBCu*YX*$Pa= z#l>@((nC}6`ZT`XUbJ~mpb-Zbb-@QxUp)-rt*GX_D76M_AD)-qv7}HnAMB-NqHjC+ zNJz<~&+j~V4juo5&lEeJEtdv%b?-%t9pjCB_5~@Jwc`_BIW*>ZvNw7r=d9~({%emR ztYubUajwA=X4VIEJQ2rT09sqhBilZ`xNdP9RW2yhk}WYojV4amQmHU0*e^W?3xC9jT4!0O;l`T-?Q+>?coJWQ%{&F{N&3vJB-MZM z{R|=#q@$(fG@mMWjgg8wxc)9W@%793v8?3@znqN3fPp+Km|5tPCm)a?s9lY=+g@Hb zvmgO{zIPE9O>j7~sHu8JEqEi8CGDyliO25-f9~CScyX8cEg%>;5P5}>U7EfH?YZ=+ z4y*6D7iU8X;F=W`6$u2Y#CH1Q{fn!}##6pJit=l1U9SUVwX!;!HzH2P?>;Op+*Yh2 zlekKc*V9>yf6|$;<;L%U*x4L0rjbcFfur#`tziMkJd!D$D|Oex0P5eSXFEULYg85x z@DPoBAW;CHTami$2}E2%Vs&LD`&I7@l*8=$YMm!`bmou1;MM4wk)Ceyp?NyMJ2>&i z6Sbxj1vzZT19p`aF`B9W6NLe_k08w==<;)exzM|L{1A=(lXen{q}L=^RcNkLGRL-+UVy;V3)yPTk+ z+v4w2oy^S%IqUsBOBE*3ABFjTd_@?#Za1+0SR`%gZ6+Fx42;g-o0m*_b|oV+?!r@Ipw z6@`C%?|tuVSAzsp4rQP8Ah?G6Kyj<~21Y_O3l?u{X zUsI-0saTks%j4A8pXBehw6ckUMfMnS>CT7O>jWJ#ElL~l{N*l6X6*!d?|J=o#JFEh z0}ro}g=>F0Cu}bB!wo>Q73J)_j!=yTv&q4fx7o(B_V_(EJFn?py=vgo!e@xjOB>Nv z$!dABj%>9(E<68T&~vH07|;`Xa!P8>L~;BUtQ{5>mf_*yaw5UC*2Ax>tA-pRjD?#j zJ^i|*?Ew7?xSzd2ovi-lG&jS|!?QbGHJ-?Cj>udWX+eT&pA)u09z)23^m@AVB zu6!0}zbLk6uTLma=d`y0H-w;?juhflw00Jcm!zRMCt@VTIdO5FGCJI&F_!qz(rcPX zx}80))9AiA(-yqHoa{}fEL)Dtz|ePf;V385xcV5+bE0oH3t@){&2zd-p8ghPw|e3w zq|=pa|KO`=HO6Lk7Lmt^+i+ZXJdewddr|>Qx#}8qTB;jX0LSvR3Ah}6T+4SENW7|6 za)xFvYH%VedzBuB(a7x5^e8q}(N#ilV9bb{C-rE4|6^^0AhhlS4R-v`S;GYVdwLs(as^9 zu{sxH!+Gb^!s`0^OK@~ytwtWhEqcU`isqi6bLTUEHsdY$p$ahoPDBEB?r%QWXwNl( z6QiOcvxn^=&QUPQxD$CZD81tay@sZYjt`f!lK5N@fRTU?adSIe-useo*>RB0^{^vw zc_d3_c_%aewQX(ohL)-6By61t?nhewjMH}=Pi+mX#vKqUMShm^dR`vuSkFgBMuO02 z0gK!nG3wPly0m1G78Hsuhh#G^E#vqF5qmAQZi39(-QA6WG4DFo@ z{s$+rB)7SN=8vyPml;VF&@-Tts}#1se+$QWqH6&)2W&s!`s!qXT8i*=(^3-E1ra__ zajVIl6}1dJztb#ps~P#X*~Krv;qO0vGodRcdcP@Cz(Z2{(iU(XlMgq$ypHpY2|apc zyiR-7CciYdYz;+kUXyPU+{Wfhpx-qQq=J;__sG{KkrdbSptCQIJMek?#M+z;iDVwq6=IpepQpHpMHaa@jD39f_?_tJIo`h18{Bh-IeD^WH#ehfpUD7YN z3>Q59zZDSG#88k96bQzy_HBK=oaC7-C)4GJOKvauo79kKj2p5Y4O^U6za{miDiUQ- z#%N_)x;|1cbC8_%1iiAPXW50%(Z0Z95d?hUU|ZHob4YAAPbuoggVyj|(}HT#28r?^ z8uNQz@cB8f$l1q5benH(555%)Ti^;HQg+pO^XQ>G=KP%pIh^^^Hxm|kr8?m4v(+n4 zDW%3cC41^Gz!xadz%eRpMW|R#4?GCK`@!fer?CNSh@|v1q+m+Q=I5h4IZ<;=;ZYxP zZ;yVmsGU;Z=$iA-chxy_S`~`GJ8#5sJ;Iete~{H9<@kcd^2a0nE&xJ*Jc7~Rf4Ys` z;DdAk75?!IDd*Gw@`KoMG+6fM*P^IHBcmzWmx`YK*=J@`<(qA=EK2#t#KQiT%lO)C z!{K*z;jI(t-UOT)8w!VBCOcc0h+AFT46NHX7Lt-E(b12hUmF@38d9CaB4mbbuh0Ri z6$y&#w9$Y3ggm7iAKi(0rsCx*S{Jv%(<3wjL0xerrHEqTD{s%EgWI!3B`*zqgtRa& zr+6HQotmEA>4K@JC?|KA#F&(YM@1#f8Ru~>{*hntHmV}wf<2xsc-1SZpT;!X(qcNLJ{GK>43aOih&A_y*N9mi)c;%@AYmp+p^B@^OWh14YxM8 zR@Mvx$+&nZPF!t*1)ZLL>0acV)^&x8a6 z$n-@lqd1jMSFCP+CXAB=@S>jBC9sylLqD0R!e;Gf&S8n%sa+XUydbwTc9QuKpRP<2 zCpRM}o#6i3q(TP}_txe@GlkdIjK=j|?5`S;2~_JyNmaNq$E#Dz#M)48@m25{>_4LB zZ?4j+h>@$|j?wSmzf7lE3>MaGEO?b`UP4|6BWASxu)p~bpiV@9&*HA;-~XAOKr0{CXf4>5i15WOz_NArsUDeIF?;wI)WLoK+RlU3pojQDrwXR*X05Ii)jfpSQ}I+Pheleq9)r5LNhIT$;+e-c_r(z0I;OcNJhzefbXnp{=a0 zGHL##r*mE3S`*fSq%(!}8P(OeH8H--2O1w>toB9&niXRlaCJWN6(Dit=H|YNVoLcg zmCc;0UpT3%VQ6541F^8kf5G?;ebm6p&~Vjy9?y0UVq7+9PhwnC>(bUngAI{Rn&NH%cujg9HR@iZcm+|3Da zL-{-q+hGH(McVl9IyCES_6!W55kPXwKF(=p&GSO6YdqrO;7|gvk(PEdo@#UR66gJ+ zl;71hEW_i|vm?{D``fLm5Qc{;Sz!J!!Vjp^KuM(@HyXzYHR_LkVdKW31masGLqUn~ zXh#(H8h>*^BwOySew3b{pAW?7?eQW-BSt1B(Ru6NkM23sv zp}P;8=dVz(>Kv{T?+LnHr%G=Va=SuIO=;J6t70qH`;FK7oj6%oN(tCMT;)dw4~M2twv# zcv`9d>`5+)nWCtW9YV^Rd?As5)#6z!`GR(vLDAMGzkeGKF5Ymp*fIc>nVFeUk&(V+ z6B_#7UvhC22{lA~vE|jym(k|tudmpxh0F-8q{kD5s*J*aoWCB$pN9 z?7^5E1G10x+*AC#oE!nK!%##J_HeS$y~I8Nk88;*n@1;+uml63um!r-K6|Ei{rOjq zN{wVW*+9Ldm3z;*N<6a9{=8Q)0pGW>*52N50nU`)K$`wm>pnWx-aXd7<=)yhhS z-X1~o6c-oBoLq?Y?Fw&fdst(QixYB$j;!oiVRf{%gz$!H;s+Dv%{$b>-|;Au?Czh& zC6gy(6&0CU_ix|1x>%iU=rH(rwnt^sZEIp$0S4JFnuCdwosUrFQ6ap?q*Zk@i)Il@P>nT|$%!0sjCJ$-<1 zn^x5@Gs})U*~K9&?a^&lOzZ>P^=ixEvtONmrDGjA-q%P5ElGy)kx_0p#6|?xASpdnYOcoBgVq|Zl}}Y!d2I`yL8<_9YB>>CtN^EO%eQI*Zdd3xMnpo9=Jy<_ zZ0}&Fwl*atCA_aFoR(ANxw&Qob61Ib+Yc~zigI#vxjcW4#H;Z-q1BVBDk)VM4|wiH z20r75l;bI3`Fi#cx_uIpOGWOgA{M%$HbLEJ(P*%n`~>EigM)e^07&KSg|inM<|&gB zgW=207nK_$Sp&=M0b@|v{n=^flOKi;HTtS}gff&A6^T)Kcea;@=4T`o-p-C0ZLD;` zIRd{V&rRdv7DHW9id$}>%J1I{gGf*C@I23Y)|n*Y@hdIUlw{A=+*^ekH*xQz_58yN z5CaQ+dhMAghd(gWU4uhVZh9J6;2jKd(Dj{P0&`Z~;^JVrFTj_dy*0n^{gUo-&|H%_VZ8fFUwOSD+r4!};UBg#n@jRZY-eA;>0HbBs z7@N5F(Ekbf`^NhxU|}t6IwlTl&Nf_n@PUyd74+P?obFx;XGf@SoIYV+eF;c*%;Lhz z`gRG_<=3p+Ij`d`+SEcvdY5}%8m;AaWrCrhp=V?2e7?$<_v$6;7C%V> z93Zq84{^ZQq5Av-KS!f@Vja((P?5BGg#vV#fsy6FdxEVW0}8FzcZ5{Z^xIU|yn2`> z?*W|?&}ccqYNc_v?~*H928M>O=;*S?JzV2Tp;PJof$$0MVi%GPx^)dJl5TE*|c>`iHUTL|~ z#ugfQ7yJS)*tM-|T`ii8H{Ugr|G?G6CG9W0fh?-c=Ow<=1^_8EQ^r$l11IHMNu9}$ z+>x}RMA7=lQQQ5(6abtLay?ib%-zs1*;{my;B8^A7^Cq`boCo*| zMCFEfA>Tq%U#y>aX@Rm}`dg$=Nj^WsCH#Ng3vi9AQdBO?&#!l;%`GkcU7s|07?wpv zLip?a2h%Yc(i;a*{gIUc$&ZkX$bpIL;`e#jR}{2*dOnY-mFkIXfWM7pNS13tdjA#A z+Z5J<60>$7pXltT2A07nBMDGDo{8^0Toy4-*T#BulrrJXslK{*?Dr0q1#4% zvHZ1O)3$;4P8p-VY{2Ct$~-WFAq!mr-=IDd=%wbTN^H}U zv*zG{k_lF)%@#7u7b)7nbJxEHrj?e4f@=9_Y#HU2UAcdrs7L?XM*gwP0K9?dquHp% z@)e2f4Wxt3M^8dT1)d_Q!<>!IDq{-I&QJE>cp=W5CrX%rD80aTt`a- zerYiH1)@%1*Sp8Sj&s6L$^U`+KkWk4Uq(g#PFuU*H9Mna$EDGeC|k4!&dE|5_Zn1= z+CK-+20XtOi{16?)Vdg3yMM!A(9na@Z1s_uWK@{u-(ch|rs(={A|pq~#f`qsWOo}i zQIP!bai=N))a&?U!qTto;*x!JP^OlKHWpp{M&2-s5STQxxdapBSda& zpy@o>76YZQyxhtc-k`dorKV;$R)tlO3w$B&?sr=jGjqcCarK;&4~6ZIZE>I(UjiQs zO)Kc>EfaECSy({*UCs3^9YFDRvur)SND&ZlX0i|Gz>WbF(hZbvan4w^fC^NM?~0?+ zGJ1L~t;7^xxkWPBM}~wfQhJ6XV*FT2Y;Sc;{>U(UP#ubz2|=BzYB%jNrNw&uC1q2! zQNic>U2E077_v}y9~GT8``pLuj?#f;Mv_UTjtLjC(?d@Ct4Tbb)pBVfGgKGOH4Qfh zpAi@D15#MI^}jLuA(KRKz!`A95Vl<=fxwPCa~HE&C%LIAB;^iyx{P($0;Z?_F15cV zZd_mD_UoR}zE_L_pRw(ZplVW>0m!ff`4QG!>&huZkDUr#5&CE3D;DcI&I^8Sa&aj%R zZ74pFQauX+_6f_m+GT*Nbr(egNd=lm?t|)J)2HN)pd@U_7p|K|`-?Tg?WKk9vI*Fb z_szaisSzT`Z*e%KthubmB(=4#f46m}raBc`X+t}l5)Yi&Ehd;>I-Be1v66!-f<36X zta0~AOG;*vDG0f-#4!9jQHddq|8s$;(nqGHeT}P=k+dKtU)jk+#dN61kiZ)bx;sCI zlfE%q2daxe=#WX`o*(G_=w)(No)bpM9&A`<_%p!O#r1-P*eX^$PlntVg;0lGl&s~> zlH1Qg3z>7oiTTG~4#1v&_F6!`1q3Jom3iOeY{2{YSoL%jW_;899F6oNvAO0904>gL zg*4vjl>ihkd{?EbG`mewTEg7FR)cVvMfdYHRwb?p9ArF zu{8a;7fUSmcb?4CLf21Hcip%j{+a zoOxlg=EQ`Y{tUl~@jfb!O;kx9SmMIGzTA291?Z;-;|&`4{pO&QRzWMSr6naM#=^!H zSGM8`8SZ_i;LN3FZDJHf~FD7$y{Y&eumXvUYAy74*K8=7r;f!lLU6u~eIJz9s zP(1_W0jvi#weyp0707#2)13Nx&6Cia0c`JJptpl6l=lzuos1!Gsgdcwk~`Mw%9N1A zkT#cu_}I0Tjb;PM^S!orz!S9~bPp2~vs~TWacG~OW<0p;$C`dv^43{oW?|-(yc#zP zZHyZ}-C^=GWL-BV0fCYvwRuqYiHnKpkK4Dfnj3FU&Wewp0X#E^lz#{+Ys@;s9-*8B zd5Fc{Xc8zu%6?CgpAxZ4i_a*6aIJH5y#QRsaevHV?u(b30T_AQKjopaVxmq1H*l8pGP7 zAWt2HX;)Rli~9=t9Y+at>}QV2CN%8S)iNBH9n!bs9daQfq4*_hA{Ck3;Gp^1AHR=l zm+M<>`NOvvWQ6=$BtvU90a{wikLgh7MbIu}n33LtIvmn9C_79PY@ZUJO~UZ?m~N)4 z%={Z~uFg8{a%%XxU4fDXsC;^bKd-h~(-=#1-p)x$xPI_#YHNc1C+@&)*L+2x(M4yxTUOny1E>oBYmBnM_3QF8@mltubinDPdIk_ zT=C2_Ww z9B{tAp$@5uJ9?!a!otGP)x1hhW$hYkf=l5WLdN`1)}y6o z&tk~D2!TZdP@2X10za4ct8)O+TUh!|O{pHv+-NR09*@X-YcCP~G%;oqdP|*s&xeP{ zWbIxbosd$Kr`Ew@%MBvd^Cp%NBplYsMneh1t=;38K>viOBK1R}b%_N@$WvVtvl}dw zFbc)N$*(c^6-y1M|1(g`&bWaZhzk4tWU#k8WbqB5P7Ls8#3Plb_auqi1svmN;F zfRZ;+;YJq5vRXF|5~WT90LfaTZvA+J6#0-q`m5HBL~zW5#Mao$!$Wf&+AaX0v;g zAo2O;X+~0H>WTcxhj+YjXoRdnBrl;uLTqFv%4oT@fYW)IRA+V60^dQU`E>iJVFWDo z9M}Xi$2`vw9ONvMg3KnCXFR=82W|of8vuSR2dVYY71=NpzRIqFOAZe+srkE)+_F|C83rU`942xSQ z!`=Zt!Tj`aP`MkPS60HZK1ZK3zNxKsJHK!?F*D=yyo8=tMRd`c-pa_U^#(q`w+C%w ztFqg>|G;vpLI0JL*5C5^=9^!9l3&vQXMDb4K9Zi5bC1JiD}PH42)928x#?+XBV5O% zmEo9p{=y!{af>z>xr*4aLMi($h%}j%J9^a~A|lGBrl#tyMxX#4?*ofB0#%TH>lSQC zHVUr9LGmkF+8AcrsV$|R?D@(VF6;jNX-7LjmORoma;jGsMq*-O;#*o=AD-$z z1|{6TK3=q--grm(=hp1EV^{Do+Hu^O(oj=+wy-`buSUD>xaa+Sq zU+d_Gsu;@eZ~v4v7PMbXx}YNU&Yslgt*6p#zC@w~j^R5<>4AAYxr|yo))Unk08rLB zT54)3`^URFYz$tz-`_uF{>=Rs5kr#S1!1x9VS6fyq8%I&sTupWZkJQ$FkP6@k5OrX z4t#P9uBVKwTjB?q^TIFv+Vo7#%+fQA$Ao?kFAe^>0y$5@OG8Opn|xC>IyXDp`J^@( zzWU9a6le>~ej3R_xnL~=J4~$2cUyUC9uC8ZbwRm2D zPKDO(p`ZKwH|;8K5~8{F&D<@ZfJI`g%K+QVr!q~s5}%+b4OemZx!vC223{alz0S*& zi6h1*ib!&T?d0h1PMh0D#=%)?@NisCrN>eZf`KzDS_Sxy!{WlYJ!dw4LbrbjUC&Iz zv<$7e7!h`@v%G35X)ktm+r{d&*bVK}LlQy^2FpZ20r0Y(C_vvv&-mA} z67=Zr*rHOxzt+1BcG}9!{=QyDIq8T-7pAe?j;@_psNMJ(l)>J%JhDVbXXfI{BTt`X zTj%M6AE6Z&6FM%fOg1BtNt;UY{88q;uKVl4rx)Jb+|mr>8`rLS71!7QzF}``&EZ^} zy}~R926_ATt0~)>EEXyB{vMJ=2;(@|}=RDhE+ajLD$cC33<;v?_L zAXHYSp43v0Cm9$%fM-mN9z+3Jrv~;>Ir5Wj!4(G~@_7^PJXLySb-S6P2=lN|g&fQW zScJt!qjs<2LPE`=l3DYre(S>Px6#C)p~x`ezFx^J$v7$#Cp`a%M8f^Gy%y89-{;bx zA_Lupe$B)&pLSQ;W9PARMFqV^|W0=mQ zAD+YT6%ejq&e5@rlLlgl(Ho#lc+P+<3Y;?GNo}tDa@1r?<9F1ef`jgpkAj zEqfn@T#3CkkO=}R zGBSN@)#e3K$m@uWBqKi5-H%Y4-HPaWaJ-+Dlf&}MYA1e@&2e{5w9HLdxb1UsOQQhk zRbL-F2h`HiS31#RARPyYH1rPIFBOYGm_%wGcu@7`-naR`(cKkBSW(IUHnT2>?*6?X zAAM__9}s*#(J?KhCPsVFUXamLpr@T6`};SR*ZHO4ci3;xx`d8CA0Je$%I{w|;5ZcC z)iOHUGvD!6L17sfuKJq_B&EgD<~{yagm()_NKPAR%*~ab(7v_ud`dzGQC(i@r_5(x zM28EcqL>$G_RSz3(S87Ql;9E@MX6NRrAMa^_0_TEMlLXI8@EN3R ztlN}A2-I@$N6r_JYq}R{2XEg2IpBY*W%1KT(~08Gh0-WuqJPA&C%5*Lbcwo3OA4mM zkUtGD&+ps@<(3wY*~$W;_$p9EkRe^;;qG6ekNLm_SC>pT_;SGogkQgN?$E$5w7E2G zrFCB*X%38eKo}1T38^7=vHCKrdgybmu)tm!nE)S&WglXsV&SAE_w6eT@~Zb7wFqqP8Xo*yhCMSxh?@-Miq5+ zU++}?mG$##9nlbr+4_zlKRpD=&iH!yO3^41$p_g~E}qXRh6 ztyeU9YmZ8S6a2XP`w~MKxvi2E*+VA=z4$8jwy}XBp>vsDE+izvKddnLA(4qGsl%mG zLWvD*F9RwRh-YiEtL}#AH6OY0v+orXWFC_*%!s3E@n|6 zjd-KK=AyCRiI(GH4O`Yv1IBx9ro<$BHU>_FJYYI5wb_hor1O1eoHbxF2`^-`yI>=M zuLt_tzqrZ|a(f#UN5_{|=VfxUj2Yp+t~lt`pjJo#XWDjDZz#Zc!a0vh{_n+wUuqox z#jeD;rF2nq2k8wKfT(99V^-@Wo&}$U24?E(9kv@11w53O8KGK(Sp)Ib(;^aLVzk^; z3>WPTpxgHH@}gbDS0<6q;o}N0;Nu>QLDJovG<*Q%NA@1lu4K$hM z<c?ATdTW$u34Xb$_>yf~HXD->W}0gApdmH=G+vizC-BOgDYPQScT z7vBY^jF@uR!y@Ac1(s4v^Fh#1m(#nqWCeQbu043U9#{wX*EN1<3=4{i8>w$Q7DE5= zPD?A`A6mWVJ|>n*M~y#0Bz$2p4PL8-Mh-f1W#aj8D!pVxj3PmU>v}ieEsz18^YQBH z2IoV&DX3UhAQ>rpYh>oTUPTHpH&SRcz+#raduNUE5ppRX z9DO`F!gN1c$uT7h13n%YK7*8`E8OQZ$|bd=B3zm=i8wbb^$fUdr!H&Cu)KE!oUVU&$~pG?uh$i5 zu#H*S&Gzxf_5of0(u2PyE;7_!4KbUx>LadvBQ0h zxe`+an)5iM9jJ{h67_(zT|LiA7KMnnj{9<#ki%?+-FnCm>qeuocXGZ%zxFE*d8;j4 z5}2YG3rSCp_TvbMkb&pO(+UY`5Hw8xRg>o<3qKc^>QOB-dv=1nFzvMGetty7z|hh< zaj=k*)-KWjba^0J1FGFGp+ZTO^#r2bz^J;sRB1GNw3QSG%E?!EzkoV41Ql)W@}hq? z4vn0>ZX{pt57SVAqZ*kTLn8Lk)~LCX(r83a)B#lWPtBe@J$r+M+{HY}yt8wq)F_zrDfbzv?qIHpA_rjz~-=VM+xz(@^^^l61UOFX}_0T!2Ntk zU%%%VGYxF%9^DQNl}9B9a8H+3wnw*SP$OViExn)&9ah8MB>v4 zRbkBq4^2%|)6FI$pIAEBComvf*0TUkQPW>`POzkLTF>5geik24h+>f~2N{(W z=``IQqT-o2$0RT?oMS|7=^b6hQxx_m`=2GgHF+R0p@7%-y#$`tZ2Ekl-jH=PCcY#O zzvn9Qyc)XhuCY@8vrW(A^6WeI6FkqA4-*1(NPlO4%3qxUZ9{(d2|hLL&DPpzZ*M#4 zl}fmZC{I^ff+7i685xk7Tfj@qTo8fcDQEiY}Z|S3) zbcqNFea42A@%GU<-1?W=!o!crY%|B>TXXaBXlZGUjEw9fHD%t%a_ggqc_s_w|5xvn zj2ncbiL*gy8H{O_^*X5P;=3*^gtoyn*sUu~dmM91X2`;G2E2YSs1M?{of{0mD%+cL zt1=>;U!+9+r!Fts5KkzYWKGV&8Bg7hfluMlFw5U?H40U%1MSb&clOCl&h$uabQg&r z??HhF7}&;(baHSZ+S-9)3@--w5q&QhHPH`XM+Zj=Dhk_EN=dceO8B=s?~t(W+dj9q zZ*dlVERKEx>2I*vhWaOFqJtzn`m6rNa5Xyd53(SOR!p!Cuo4zP%9pqO0UG1`+y`ar zOwl_>r}JLx>w?UzTZVcT)vg6ZgLpd{ha%NT z`t~kWJem*)eKt-Fkxrf)+Tu*r8bR*9gnbJ=Jp&e#X81f;0zdvD8G)w$vbhF;J>Zb-g+EA!du5vS}QR4Chsu=MTF^jQ4-|WBiTQ z{SYH-GQmnoXt8cd&;Qrg*Q?PnF-HtZ7rZ54ctMT`xOU0JCvTmpx3-$oO4Rzp680SB zL|LPblyS)k4Nw16mX8Wg* zEq5w7KD2VqEn43WKjQZr45!^8P6lzm?WGO$^=M2|39>G!S3@5cL%|p|waBBgH6L%^ zjy4*0d6RdRvVU+k?~BvB+)dP~J-2A!9_WGe66?yr$?Dy)8l3L;Bs?LZq#hn-&G%EE ztBz4nRu*9pljxR+Wm zYxS)y*-)ZM@cTQU)$MHR-xA4TGfQ(zG5%E_7g!C&;}otl@&8sX&dt6`Sp-c)pkrma z(2__cN(oeiy%5K0vfJ-SsR@sz@ED#nDi>*TCVL4=Nd=%e>VsbJ67y4mMyX^nk47KV z(SxnsfPeL~J+72{nDq)rFW!yA3eR?NIC_ZUgx9Iojzc6n)aS=}7Ktt5$!#R=#&vu& z2yPakhg&@)Ec?f7^L zx4@*UC@a;}6v`Ob}~D72q7w zT`C8zZ{#zV$B?zYIM_vHLVOn9?nFgZX)Y`9ZfBIr_wUZ2;bh6-`<+)7ioE#ADzmOK z|EBzXuD!$Q(dpqJ6zY6=mIJeX6{awJW+if)Lv`oCRDgOE9Rq`u!~p&InVh#HOMD^6 zll_^rdHVlUk-OeNBIsYPZH2AV5ZmqrK2`jZY>z6{;*)TXou*wq@NQqPF6-#C#1d2H zpeE0?Y0&0t^!oMrxhoI=Y)-YW1GU_~aGuFcThCUO<>&VfjF)AU9u;VCYtLO@z%8EwInd&Gh(JG4G`SelGv|{(=CIJ%V+UNOu9!?&BvYy<^%ELY*wF$28d9Xj**|WMt ze%#g7ywE%O=m6N~@&)YuiRQQG|Fptwr`pgS!-A@z2&$~wP6c6Q<;v95FRrs$Rb7Q7 z8V`RW#)Li{v}g^~xiY!}m)ILUa8m=M^q#P+fd`K&BR}GP^bH_*wTZnI2lxhntpG?Y zFBM7f;DK(Toc@+kL!~Ij1TKpid9drX>No+@_bO?^Kx&pj1$+K|)Q=xOREjVtNsvjl zY?Hi- zw1)NQcb`AKa)`zyi?<4$1A{h+)RM6#QK1BJ;n*!k zLh^g|z9AKr^}va?z@23p$(-EW(D!`dI!3;4z`ZV{uaDTaj7^?PJ*;!IFr8JmM@VKp zD_etajoQynML_Mqts>&S-aFmFtav8C$-!|2x>I^0yHAKXiV!5y zT6?Cat{i|G`Ez!+qkXdX1ER*`P3%{df7Pqz*_GR|l*SS>?85J5{ zimqhippBl#K>vTi6kl0dzA)#LIg%Shn1vQbBUSyxArYMdfZN3u3*g&RqsOaA`_B#^ zG?{-dTI4z0q@fLx$pi@}gVj!KXL!v>$TE-b3r;_!2D$p|*YbiISJHB&1{Z;QSTz z1DW|TKUwq7L{7f`4^6i(sFZ}Ju|MH9?}r#^&#lab$9`__I)+>vhR@7c^;soY?GgJR zGInE+l6!QLZEhf-*_;9mOaZ2_Q`yCe9nPMi21dos4 zlbqamd-J>T+OQGRj~VUe5DEva@X0I;m*|B6Rg`1?ys^)9n=4cW!_lfC~qrJ`v7ehaJ0M@~1v;&<}Q7VFf$h^70 zhXEhL-C%L7g6SV^V|}mR3$ZoM`*4V4vQgJLQneDyxzS#x^|DNFZN)6S(oD7i+iE4r zB6CYy$X2`Kk79buVtTG644-tF?WF^Ydx<-^<_L?r>@r zYNs@pmDbx>X&Ny1mS<;E(N1Wl^@L(!OThI;H?q6S7s>P*Dz2w@&&ECSXz8WPymj1C zdt=X7q05v(65n$G9cbWH%9gXaxV5yhw}y{`q5F}QbaTRwwB*r>#~VDf9c=t( z2Bw^JxB9a3I$4vght73L(fBnQVa7={}pYHK0La&oP=Y;Y(MQ82EsJvpnHNVvv&waTiDkZgduPPKK8t<_-jC5e;qZ$-0MjBp4RJhLp%QrE*s%w3 zvLo`0lE{b+81|M_JwAd*5g<`vFFbCvW| zmtjcFIdCsjl$U4AQPML;y3|@JL6b#3b{SPw zT&S$*`V_FtPZ?R^`b4>uF+HnVx3;!vsB?k7r$0`TiHR*RKw7O<|8>aoA&HD{342kW zlioS=9d6JPT<{D_>}RUVZ%Xq>gjIE!VV>@d=4MrrX*nSZh`fINfcWHm{%$p4U}R=Q z{PmZ@Z#YIG;^GLKM{mngWIu(iZ3I*}E-(vOS)lB9Fl}>3he>j2dJMxS05jr zpB*gD57OEITn$L+kZ}gw)=si>6&;+1E2Mk+>YUe6_(}aLiaNWyNj*nKlPj9#59@>%K=#?DIN>%GL4FQh{-d8;m|uruYGc&^A?pw8n)O$RwzrNM0-CQ7z} z-*ZJ3FwCL$_lLm4`&SA32V5pz!}ALN@X$J65`>VmS5_P&1k9+#AAnXXbDeh<9K8aa zB9sUyM;U>9M}|MpTJ!Z$Yh8Z6N!Vm-k+!fAqD~ObZC#**^w*c9rIlICU+f+;MTGYl zDqwyhPoJrEp36g%{@51lZ(ZGv$5@X!G$oP=%QTSABe&`(H7DEQ6;;2SN=Hq<+WUlQ zxbj!)yb)vQ&GRSY<{odI*yx$W(AE~TLzb44OC3yg3;X&tJ3rqE)X@Ry!TpplV0;F! z^v5g1)ab~h^B-AQJMG z3ouFp{0uB#@8A-dj5LglXwFT2M3Swm+2#ljx_Nm{Pi=a8DRyQFtoClae)#G$k=`6^ z9dbat&j+2Qj?k9X-MrgwFp;LK~o69 z6kA%>GFTrI_fm@1q|hQn@rWDB?B294AMacuEOp3*Qe%6XMAF_oSH=trMMQOg3%a&R$dt0Ix| zDE$tRiAPd}k(-`z9rSmg3cwBK?W)V6A6Cfv*39(t10@~e@E|=^6)F~LooVX1^L5q9 z_DV=vbw+)1lXDpEIUtdean?V)Blj%DeoWe8F*A+c9xMNTw#6>gaD-8&XmaO7ToG*7 zfM89IJ`Fx034A@8n&Sr1*IzGM^LFq#9XOk;7^9mo)+K%IQ-vtmG+0^9p5fu0p0- zpb#e?0L9P~Bd6gS+4-TGi=nrh;T7EKDmD%-F7U$XYWBCS%jwsU&>^HbeE*r!MLyKp z(wbDrZhJRJFhk&~y{wvz%-wz#HuTbnMtm+(Q-?nh*6gbMBMW{7Jr-^?0Z-r2!MPrPjEW_TehD?ig<*Ac>h z%cygZG|8MP>XikqH{n*xF3{2!#h`Jv}De4eMaaHhfrKz z{2@CR7Z10UkaJSe?^2i(Vh? z_v)!i3&+?oC%s*+i?@4Nh;ogldAbg{i>YO72Z?o>>}YU>OTta(!!K|!dg7%Rq6DVQpAKh*dcr+x}KS$qyhl*)sK2PsC zFzes-<6vWfNR#|+TXAf~c;4&_*?8yRR?2cKj(WaWuwgKboIg})xCC2RtvEq1cH-?Z zw;Ol491S8*=bMKu?hs|#Q%Y&qbF~`ch9nXF`^HU8TM;rcGLo?{Se~wM4`E|x=jN*N z^1diMRFkpUzpZ~%B=a@-q{N4+FA{}GC`i}1)^>Mterycu8Cp_an)S7<5_e8u*>o%3Qlo<9K2|9yh5Gu^2VBidMrNq*S-UDNk|&wN7t04Oz8w>JEiRlfHog zYRr8Tt6?$T4_<$1j?vasF-sT0mL+m})jD=ygv&YHoi5RnOR?Lbcuq}4cdXLTX4ISW z$}KU+>6{>b=Jq1>JtG>^7|PHpLP<)PuI20%9cbml_sBP;X`JTqHx_}L+_yTQom&QQ zcqE3Hpoo}|1qqSP@#r^SeD>VbH&PelmcDtC-cLls%uCC&)iv7FKOCncDlT3!X}nb4 z!~uD9Z5upBewUl3HaIP~y|vYLK}HOD>&N8Q26ewY*oO@dF$j0; zv}1o{#G(DpwNLot0hIF-zT+eE_AMZ$U}*xnjEeit4OAJgDjtHr%;GzPEP>zGXVV8@ zg8Oq-Lr?t4nTCSez`8HOeqTwdpPzyc^y~VcU+`)i_)_c)yEdg|#K3H|nd&d)`6qJZ z)sF`-N!|D3D~9>*_}h|u9n5?uNlaoLlTQ{@yF3CL;GONF5~rQsTi(G{`Rjq(lO-KP4s%pH8uk%Ug(Txj=K=gPqHg`3V=gCvb$1q+`@(F)E?6awq3czg+FvI?# zM!7oMB&DHoVq(oND46SD4{iEzfCXCipLX)h=bi^Yaq8ixr{>1T#)v()wzg0OXl+;} zAio|11!WJSP^H}`@<==ljkZDP1F8U6Q#5-kZ4Ymj!#NJE*7L8^c4H&8xG!}=L(Vg3 z6q(5hFn&Kk6B!J^gY{UPb|MLYXmSV|NQ;W3qG5Jl5}9~>OGjr?k{WjU%w8=u5++Z zI#Tk>v<#?XxnCpZ;C#ATPZ8t1Ah>*NSQyi^pu19dZE{khTLitvHKn;vh$@eoz$9Pz zyt^hXqHnvIUQU6}I*THnxgjoYV7znZ5Gyh=a(b)oPJ#}Rj6Pt zOrzJRgpxyng1W8y_5NN^Q-j{tU6)%}7=SV~er^B8ZYL@w1?|aO*lI876CRuK;9YH@ zI~)`YZRQZ0=Y-5P%@LS|0Qfa@17qVjRy{t88l&snv@9HqA9Rd! z*o;;G(gJWe@6~$YBW331KnyqVqz2gI7%jp^&oozgYPC3D-dcr=00@Ct5oGYAyj!b2Y)62*Yu>ZOz%A<)aoOBXbmE>KX}yS)(<38zb`b;i;LIr5>;S=f z&VLw?=J62fGd&FGegmwxSKIr*`MJ3nOuV-rr|!@(Cik;t#(>gTKf9n(UnyQ&;sacK)_r)>9=AJDE_^}^x%ME z;51VBrY^zB+G+gIB6L3jJ*VP`UU?@pBHFd#Xsl|OQgj|IFx!V(ipynZd_Q*K)%=qC zP8WB&Fw(Ae(TJ$@^~V+8?oBE%duOC4l*MQ@1tq7{TJOavlY5P)rZyi0!JCMvs9f=P zpf?LX+FbEu8MQLj(-3WVHM4gg{{U;JrXJ^818}bp!T`#L05Y%t{?)cHg_e^_NwKp!s-s~zNr z*q;u0T}QAF(ISS)>@kLfcrQOXE7OQnAR9K?6wrUMy1zDGO8%2p*T+~(4CH9x!~1hm_tBm*QM zCIdw486KPf&p`b%Fo-|LWvqp^UQBRT_)C*@fT|%`&hwgn12iiJCgw4MKQOsc%t7a8 za-VGu&jUaUi)+GcYNL$TF|zI3=Hl1E?OL8lT9rmc=|T;73!igBalU(mvAUXqV<7T6 zbUDmxo6Wcgtcnp|pB|hOBUM*(RMl|8KK4>p>J{O#)#@*JA^6B8X4cxq;z(%^4Ik~J zDJLs2)uh=p))a0^V7L^BzhshGR8g6)t|}~z)}0<1!NA&KutySjK{mm_!7?;ssd6(2 z!oA*s^1*MpxcKFJIoi0mSwR8PL(uduI0nx98*Z0Ow-`B-#ZFJR9p+tgvr}F|5$ou1 z6x79Q8|%En060`nUmtP(TZhdsFO6;X=_$^i-JQ@ECgcQ2Ims9*JjW_$TEf^%l7U}d z6SCQ)p?mj1@j9Q_XPt?7z7uRoY)IgWMZvD=>y`t0@tSj@$|`y*wPN$`_YG8RB{_Su z{19=FX@kGX5f=Om@|tXy&mhuZ$tb39{GxTJYN@r7Ya>v6Jox23uEodLNXban3_g@| zb5T^5IS@B55lgT$rF*7SKNl7DENu9V@6OCKtEei^DrMJ4S=md>#d!_uQhAldMfFdmCl zLoHUlSG6|+0HPcpjjeNGH&cuJ<{Va$0Ni;$ySg+aBy)3f&kvuj%vyR1xAQn0VGv`~ zX`kQLaia)GP*_!Mza*S*1Vz8+0PvkEZEex;%)lEs&qckc`8)K<{5H*EXopllKRpxM zqsbmbg$leNKD3u@{y6kr%XX);w^tZ0p3lnl)!nUWfz%u6Xo-wM&4KN$XURcJcwpO= zlgu>G>A-pT<&}gKV|D?U*t7CpGO_Vkv9+~MFw*l`9Hv0?I*Kqy%L45Dp}RmdBG4pS z>)T_@A3Q;V9eoE+H#c@xUtS)3O(DeUDME<|d9XCKv+I<)qx-Ir&GX%B)3wD)&x=&i zH;tzBQh018piX%O=jAC>4=l@y4A4Dsiv+BI*Sqo%nR2P85Ab9_>xp*GAE;e=Q^%zr zEFKwR*`L6hnqqgTp|xk)S5zaEF}juhwrK`&<~dvl`KK102FLw5)8^E8u3H z*4MALtSrK?8Q?+->kSLPTO1LlWpuQ2oPmRs8G+b(Zxq^wb(A&N4QoFIOU&x$0_Gn5 zx}0oV0a(fFmF~y?OctS#xfwFyEkQg<8#y}+C`a?s(h4(Gm6Rlm{UT{?i8LO}0nt%) zjN#pF*Zs6xGVMnqLE*7a&bqYOJsN0)-Jd8X-r#&G26HGM@`@)_0B&?_?BBrCh@&_w zUP`m}*yWT!4cbNwIK_f2Ch9{a*pKhU;slmnLuP%k*%}mdTOX#zUiVuFNdcGO>^KY1K(;Wi$;rBP7uDrR)WLD3% z6q$?5@h=XOHPzrVL)CgT6W!U8nNkbhlbz?gqrQBiq^O^sD*rS+5=dv35JZj~V#;g4SYBDB^Ctq{%7SHHCz9ccKPU zg@S0Q>B%()G5yzU$cCN?Slw!eu7&1sW_-gC$f|=Zvn$%&>{lou5bR~Ffi(8KJY&EF zoF~QA;#jHj-dvsJ?T4fkdohXeciOQq~>EN8a2_A}>`g zP)6tG8i8B&P)1vX;NaoGv%OY8Hi%=n&iWf1+Jzka3^#arE`f0_ZEMaYjO-n|znOlg z?6^Y0Hd}#aH{^tXf-*{;)U&I5|0S*j;P4zSq2ZEiZyu78J_1_oo$V@l_2qr&a#!G7 z=IPDke5D3f$RXK&F;SNrI;ikYV^dQhxH?yL2skeU5BHgQ2-tcmzJHI#by!Wt$fb_O zfaXlY;v+he>*0D{ z+rlZn{8nFNhBj4us9?L=iP08GsfVF8|b!?T`E)Q_)4J1Kp0 zK!o|Dn~InyoTs=vKRcXK*Tq6W41uRqE&Y=~smQi~$Mf*LAJI;?lI9`wgsYNxwG@Hu z#Pm$qdL55ok%yy$($YOC;?}%E_V@n-?M-vRUgkp6ewrL}C*aijHbyXKZNm6$&~qj9 z!`)#7wDc~Tlcd^uKE9-nGRsV6IsjNz!I|1(Wh=2`hiTKq86nTi z(9qK2UKek(R<_k0D&bJDAH3%BB{SsqAygyw!?}k~Unx>kRSnL~Y5Xi%r=q4_gy0(p zXjxjx9UJy1!Xgi46*z=j5-S`43;o})P+zkXbG2qCwrQ}B#Ef_llE|Z8=16d^ZIF;V z?&AfMmYGne?#fO=y|z%V?))j_A5l|x$UfQ_GS&d* z;E+FW$x9i+@FTZX_)>#kQ` zRt62@vp-7!NxX|A30~3FT;z++e)lVtQ{6s?-404|}$YpKo;XG3~cE^hn3f|GygOrTzIu*HHD#Im&1M&kNw zSm)Vb^0u<_@&e_WB0SgEhXuT_WA+6Txai3#DYA;1iQip0xx81FYrw+~7U%|&R6T%1 z6a0{*`laHPhbdA$^nGCN{q_F^b@_ksf~0`xm}mSh@*jcm>?-Rw;F8GY-9Id**z_hh zHUD(Ol@oHz?=@HFl$jBi;l@|bt@Q>tX4GGs>S{>Agil7$lxIPjmu)5W%haa}K0tlW zja~ON%y3~fK)setiGDD&3S#r>AKv4%0U+eH-mO2u(1dF971wI6L-2${P*70GS`VeE z+imF!Dry*LV+2H`L~b);pO($$7>Daq&fMK*+lB+>D=(k((eR%U*PO5rboFMEFQQ0L z7wql;K~@(P6YH`pzD#g|rK6(&RwGd^`~g-l#iqr)m*45odC8z&uL9PXZkoF{5Hywi z$Hz~qBMMzJTuuodLw%OMN2;yK1zRk3cXx|?f~~Esah`3+#hRaJAW0@ZP0%Fad6 z#g|9QGs}NLiz8go$KGQ_4)u|GCh+AbrGRvcnLskjD4){7P_=l1n1&ew%6F?wX(WOiDnlgH|Abip z<{}b+_ZOf=yLovIMFPR#rI)ubztkUefDU{b9f6%dCygyIvV!oU;tAgj1kcp#rKT zB4Q=zcC#Zll76PJHX4lYbT7{RC-Q<43jTc&F}NW7#Wg$?#!8Uh1DB+qXxuHu1(2b*S-%gg;2bG>m4JBFO47K2R}Y^HP-8r4y0Ki zF80RmT!_gGNp#^Z``EEu^XA4i5CnrJoCp{{eN8GIlpe z7Nelxq35zl0J1O>3m^--n30tX3+$lyLjF|Le1ORcIh=-x z-sA!I@&(8kjR>f8(TCzCVa&i&9YqV3to(Nd--I@jbD=hJ_VJ8Sj<3G7D@R zMFax=X8Oi`YI+*FKX9^$lAWE9*cvE-K#p!r71yUv>qMUK9UYl)0xQhsi9ONKLMX}c zDf;wYM%TN(F3dH$*!uV~`X4L&rNM)rQIygNB%Xk5oNKUywFuQkFDtWw1LrY1)?;n| zugWKi@TwV`=nyla!Bn}-{-TjlMf*xjtOz(sA{pE8^YR{}$$OERMs8M?u~J3MiOvxI zOB}@hi027LW9zHfB%T^|1#>&QH4e+wX)EEipRWJH2wiWz&;T`aed#-LbmrE_F&5?J z%!P)sDxer7@!x+8mdAmE z7xl_r9~jlt(t%CL~7aOs#=O_R;J07RA^*I% z@dXJ@bZDVg7wbH&I!inoauGJ+)qu>eKc$&`yFe|%0#cXw9L%NiQyt^ zfmT6I0mN^0^T=qZ5{z0?yye%*?=m*cFx-0149d_QTngD==oT zez+voz5wMQp7W9({jV0;`N}qanX9D#6wJ)Mxls2_(OTKVjl1q6_M@Aj*YS-yJ{XWB zfJlL=0<-~y@u=nbeTbX2|AdnC=4{RR>@;Bl3z%Vs!L+;y6Lo%Bfg$JbbfDCX>ZJh> z=o~MvHn17>6GmQCB?H6Fpzbr32D*E3!8$%yr7)oQYU5^rf7sFrK_U=QXLZG1b8%&O z@HH;ae6ri^_28 zoo}pj@)L|!c0tDFpVuhyvhH$J-c7LmF8=Q75`B zvJTBPbu>!d%XDSw$Q$PeKrsZxcmIX$%5aN|nbx{o7woL%FNDG+uQNwWh$9?tM9s1d zucO>)+3v+_aYmn*Rs1_F;2G-O{tAd$GC%DJFQJzdTdl0Dda_+z*_>*+K}>Y?8-qS3 zd(;&dqm5pk#BL^j7gDLV+ydkmt^yKpxj$303fM}AA-xXc|O0-1OJ!2>%|=zh2K zi!=;#%(|aVk{1tqL+^13@2Jvm1KBj~Q|<=AIczUGp=q^?_Af-cyWM*~FxlqC@J9%IuJusX)YL$sFA)$F}tu7J(^ z@JUAkA0++)8#^&8iO7smDr8@REq1r6OMB_D9G19CLVSL1_t1pkVQVbge4SAYvmTbX zy2%Vjo#b|%CtKH|`9BxsS$&!FZ~mQ=c1E_bwq99TV~8?~j8*)MQVnFvQNh7$p-sSc z_(r72XX)WhIoP}OYh_RO#_z5b8{d5qZ1w2^vp+}z9~;4cIXTl~)Jt6-!-+5Tcicki z*>eRXPW--lhz~&h^YUqxwhY^aU=D?mI5_E-XbMvEZT5OZ0hz+e0yCwgd;`?u@dp<} z?xGY5_O-m}=#-+aFDz+Bz|7MNBx4un^Xm0sgVDymEaG)z1z<%Yqt=ZC{p>JAD$AJd zT3^6YGvgAJ zP!Zc0!PGWsVi8ur(_LUpeHFo*+=M{)Gr*eGbL>@Fqt;R9G)l(!g_@sZbO0))0l7Sw zc5bz#fFNFTS#(3tfRBpk7^73;)Sfp0? zJRKbY913&cscOOc3hMel2%ZF{Xa8PrJ7_NmHu(L!S}RYr|4yOj-!w{Azv_D;K4w1@ zF8s)Ygx>qD+}lr$%aqcJ`5GM%^O*Im(~rpyHna82BIkpA{W&Ymur+(Z_?_m&*G%jM zNkSFf`}XylKMoUo%`kja&f>Wp6}}td-|Hq zV;YVpKmeYWO#A?>sTF3CurOW(!Lu~>&-Tslb!ej$8adE1QbDNx;vV49gE8zRYpM$7v5aW{|+#$9?Bl%`-*l}~2`PGnVfco6ZgXqFBV^*1#3Ys$f`*+=v$ySs9s_Dr# zld8QzAqzNJ7B}pHPFXGVnyNzkg=+j2co8v$R}sM#!Qhpzv=)HX2#{P@|Dc}&K1?}~ zS+n?IVZ%cWOuuQrR1b}jpT-j&8SyCY1p2*`k;%?2looHmCn!<<&tLt&BaNaXZZZFt z7J%_rArC@%{zqNaZ*9|6mixJ;=^3WyyWjc-E9p?{sFljsVl$LoVc=^?ywb3} zGxUeHFrSj&UUD~v@pwJ+DLa?f!Cuko=ZB`HsM@bEn?F9xt)5_zAOnW21rbX@im~NO zKc(x#g_aDli~&T1grwAbh4*3XSDA!`8r9|vN4isO%wUse{qPmsUm=Owx@B=%&2~l` z`1s4mL!%zn7{GABTzCs~4LhJbu8yJRgQ*wg?yy}0T8&mgm#Y&8kU^6hfNo(|6?=TB zeW;}gG$&A>?eDj6fAv!hd9mtgbZhKv2-IqFF}^?~E*)rc1-jSW!5Z2O3FMGKjrG+k zoxz7oI?Bqpxl~wEeS5$$<9u5AkIetqDe}?3JF&{bnZn=uqWJ&4IF~q(r<7CJ12&|h z8FG$$rrc0Kws^jrE*{rcqYh&UX`lbQ^N?r_~6(0lg<2~{MjXyVp4B*&P?*5}RAx>AzI4VA#l%*od8#D+M)BU1GgpG=o z2DCo{KR?8|TI*!x$3Kdf#avCFnf}uB5oi%;?4?wvucxNC_O8=$5xv*Nko#G;kB<<3 zsrby!&Sq;Z)MbxEJyF6tPfigW)zw=RpM-a+?N#@5urtzd!xCF>op64yzJf=t06c%r z#KlxP2^}55v*)KPopPS zo^F--`*(TU00XV>U!(zK8p7$((i&-}1JV@Y>XJVylcETmEUk`F1prG+IMC1#n=AL; zR!Us_o@gF>|D8Pj6CAOTQ8xni@CCfqk@u5gz<@I#lLXO@nh(5Tt$|AkrrLa+OzMjQ z4r$N>hg{E<*3@vWudQi6{P5q@?WU^EehSy?Z6?m~*1CMUrwe${|FUc0Vi}C){BJq| z3W|!0Kdp1WeN1)5X{zIOzOZ8vmy9>0FSe9E!6L$V3z2qijHt+)La(E9#FafuUHjz>5!Tu*5M=gQoI9jEu|5HqI zwzYk0z)l*@2HaJlu3C-#t-Q+BYPaG`G5aBUv?0e0%5Ytrw{3)O2;rJaD{EJa1ew@! z!vgL%58ayqz9$4>9CCratA`6`Pkw!bW}w53%&h*FKrR`#J?@>FrH4~&tgQr8D|yc~ z9*ve95Mr4fK-xw{&DH{{9pQA9(lCkscN(6ef<%(%eqKQWYQQXE)Hj zvi+L17==~9$_yZM%Y9p41yNY#BI$FTB4#FLoIvd-!WfQJz%7l1g;h~rPVt;~gq#u` z`u1}F5rv$;?g#mJmA%F6!a^fcwvYRJQC8~=o^Rg_=Y^WVWo;!#OK^QWV54jsK8%}j z25c<|>jww-7K8HNJ~^b2jL*#4J&jW-KKgsgcT58bFWsoE$MvPh8i8pKP(bmewf3b} zEt^QS>yjw~&~@c>=Dbc{?dLnFewmmKbxlfxAOA_*ke&i6fG zI@R|3w;3Q+QJ?HpZ6ZchS9O5x5AWTIVFz4tP7XEr$Yi&~o{lFQUkU+6l##qBJ?q9d zrsdZxF2Xj2IZQ*95s>@oE(vmpN3hiH>SwROJr#yT3s~=D!@(Fn_S5{C4 zvS(M@C06$8mJBnf7ZsJ47L`j>g;LATZNQ4MDn%J|k{j}Qq1k}11jp*3<`hlt-r^&B zNcB}=!!6s(n}aV(0I?cq(oj~;W{ywcJZ8#;?Nty+!%V8Zp$~7ew$X@*)clOn)y=^8 z@+BkCSk)(VJE>3>BHecZiu*1=&(L6g+nk;%6jD;6DdBvRhcL>{V$OkoEQ$^eng%)!KuGr%UH@bER%W<0dMTpa{Y908Kkt zqT7?eTE`qeG&sg(x0VL({p{HzlRVnWd4jhQ(mBLLzgCjw1z>66RdkSu`_Kh^GbJT9 zHp)dCT_~d0H|M zc)#1K1^g0}$SWW~06=H6z#~urjpfgWg+|THjMPpYuLE&kj?rA2n#d|2ZX3rx)h0a2 z|4^G4)Fkrj7JzI%VakdDlsnc08X#_)wS6}m&jNjW~c_e-;(krOx`h~3d?;+yGZ_+G}f$Ak@y0JO&vhjfO|^NyST1khegg$pcFnblN_ z;G>8LjP8B;p4f)Us;Vl`OZo46>HZ5)()gizB<1bIfyBVIRZKLw6QM~-7>~iBApuIT z*p~hha9h8G0pF%M)8E9~@Ic(2*K_jYAnTV3`{%eIFf9N*QSuZiIRQ{s4#;A@OJB|> z1p&{YI6zGgHo(xJvGOyNfJ;^H)BPz_;Koo;VfU6)V43(Y=I{{WRGy~&OJyC32!;sY z0zbTTElv}>-~x(6oVmMuYsHOf<8SKl{uclL{1(+^)fKX0@CTG1@9!}{_u^b@oK5Wh z%q+4eY>i2(HHvh{@rD8SP8a?sETg*kim81NrJX8^bg02XQAte?;caDn^tImnD7<>BSXkj~=`VOS^JSrM)M9 z)8c&K!+jdcE^Zrk@pa|!O0u82(%he~_PNl{5 z5e50&Wc`LKZtGiYu7zVm4R$quzP62*WkIs%IiK9;D49 ziXwS8x8r(b{3m)83JN7!e%|aGIl&{SyJsarckz`wci&@fF1MsNVa;@al=RP&9}j_3 zX+OI?g~sh0GjMBNKhG$>^cf!c^6VfN0!D|SK9Lip_NHmx{(@pN;T8v;@s@>awT{I~>G?n+o;tHmOb zQAQ;$#xKLTA4ZO5;w6C`1M;`y0r1695=WWlGb;hujf@1leRn)S?9G4+p!1|pp<2^g zE&PIRcmqcXlSc`-32cpn8~v~SO;X0R`OT2#zXGB}`ep3ECEVTheETNzE|+G=n*%m>uRq||^yYvm=hmqlheEt zd?nBCAKK=&7OTpzGPHk2ymxDx*`JSXdCNTSs}cgB#xGy^_P;tD8v{&jD~xDzr*LJu ziqA^8KBm?s|HJ3opbsN_(ByC5QiMmlZi-1h-OEHK111zkP`Z3J*KL`5<}$rvrvXiT z5^vaTmjjOPzQe#wHH&TEuEosG0ox<2p1Z{P-s%2WtE--lbNDk*0_ywT1r5!>o|_T` z@pG6HArQ0JhqkA}u2ySzpseHb{4g5t+jV9=t~cxbsjnt=w(4_kmdN2M|EUpbNCdbP z*Vc9UTw^7;temQtDwq~s1z zz3lHR&toxL4;IOp12)Mj$5j%6jkc0&z&g(aFQ~S*N-yMo=g>FQvgX|$00RF-snR- zffc={GUjTdDV`>hUP)E?h|e?oV^yrx$J;Vtn9dAu;p25vbiFxV zaHJcIu}KKm+`J!*V&Yft7I8XR=vzJcMkPlPz-7*yF+KC5_Y)&dt2&syFZa)3kcSqW z@aRTQP*~rpS-(dcvi?{=+cVO<;$MoXk@o1#vxb3S1{DteWkc%0vB3+Es4C&B=ej-L zl(s5goL@zBAn$8%+-(me$GCq21~{XKU~csc)wMN_KNHq^-5~7tlgRTs&TU!i0fXm2 z3;WB?xAXSXBVx?l8{@V|D}?}j28A%i-ZR`FkYQGB&J^U-TtF~wQ(6|M{$5F?7ns_q zcxX|GPXI*NvB^v|tr7oknS+Q}>ncE|cyWTXOO=d!FWUr4I4oJ0Jj#V8Z-amcpSqmWGuw=6 z*?Qwl7-(ql@K{liO}fxbH5%;!(!1}^X{03QZQMASV1QcW+*=Rjv?b#`EW zc#M$1GD$&vcmYCF0|VRrc+H(tKQK!5+ZG5K7$|Es6GKBg#2S>dn?+n-J0h6GFnr*m zTUvj_hZe&t0O#ce4SZ^`(W-=g;uEOoeGr_788GLo^ity3CR4R0#cibko7d})`xYMF z(gQCmKP<7+6Dnm8;}9Ad3C`I&MMh+0t_Tj0o+%@>ys=0B3bWTWY6O3D zeV4D1@r&bmwbyzK`lQ53D)zH-b2AN7fUXqeI%3mj06DbD>7lT1lifp)CUecb+EK~{ z@B!hH@2(pZx3&y5j1*Ck^EK+0)+02k9DsTgu)Jn7E6cle#7vtU0>Hn*#X+_N_(Zs5 zKo225pP(y+3-6rSLO-~&Va>4nSJFu9-Ntf&(l%xrEdy#9=z$3M!WJr9lL1X5K_Mq?mzSvdL*#Nr>t*!wJ$ltzh%enqccdOn z@rdH>j>fxpv~!Jzz;qbwKdCNvyaqlsm^b``Cx?fIEKfFyG;hOSlp4%^HYoQ^M2-^K zIEN#~z^tR8q(mk@+0HI`1ao4ix#vu`&6NQ|5x!YJGifxt1}ZVnckj$E03U2$bYyqeouHb4K>tYe_|Ifa&~eXYhoy8dTL-Vd~SHv z?jsz90-SHdluk8Xkui<%$}IVZX4*`-iS)-4WbcHz!RsPAs)zk^QRk! z;VUb5AGX|1w@xEyq7Ab3@$KypjHMU6E%Tj?-0!&x;gMA#g-uW zKq{V3&roY+sT_=*WhQOc-=Q5YCl^lw(xvzl)j$se0VHB#{OxfryyKml%Ohyo3-+jl z9LE1e{3Zl|%-O zFh_5$`~<>E__Z&utQPt*)dBrX3D%R@yr>o~Zv~)ipI-iO*M>NxJ5N{jzcVUZ=H?SCQwWGJPzethx7f2e!^$ z`r=eb^V-5KzbNaNw@|F4Pg6QxeSMYFvelfot_aMS4KCMxj07f2#4sKfz^$7c*<5vu z4U9`*(hLuAxe0O=7WT=@qfI&VHo~q*>YG^FY@|HCjI>Xf#`I1~W3S1>hm-R% zgF?u%xL8@4bH-f@@qr)xv&sUKE4i{4T98_9LaK~!1J8Viq3;e5XO)|V@kd#r~_5w&~5XV4FD;%0`9GofT6&o)1-SEKoxBPr?d>pc#9CLLAqrf@}lBrSdKpv6f zStE;Z16+n3K?+YqYiqx7nxWU)Q}hNA%(;3OpZi23tG-@35WTUshKGk|&JRV~j)KB4 z#>#Tj33)*wpkJGPIO|U>fqM9COJev$6~kbmHH(l~$5^Maj@Kf^Kw*{F`Dvks0??ak z&LA5zNB6V^V4dt2f_Y<(l@-;k)Vq>f-U`mb!}`6oi7r>TkAIg_%KM4Ax!Y;8$PB5n z7_L$3Rk!)Oz{KYy>Au*I2+woVbxIxu5SLaU4^|J3UdP8DuWqkwY+PJgRyuWO!X*Qr zzTE=5_M7c{YDnw>^L!lrw$uO9+;x97wRG($RzTsZC>=piuA)SG3BslKYQO*rA^{>z zDbggsRj?BQ1q@9=T4>U{p(scTN(`YHKoAH40t5&(`38M|`2K-+t#_@gl^@PNb7tn8 z+0ULmdp{empU51ucwn!Os#p}QWkmQ*`>Y*KmTJk+RYNb6_jAp~93{cR7WUGYG;h;D zNTs`SkkYekALqCD5Qf@<4oGprra1h>h%$H%4c6Q&0%`#Mt2LlPHfLL{!>i@=izvV_ z0t;J9rSDTp5dofRn1XZ5@AKuMs|BCAH0Scb*=>5`!7K?Kufp69*JeTR;S+;fz-(w< ziAMirN(YJkK*H5ueu4bprt{C~GuD+rT|9Am&#A7a297vYRl3hyvA7nRHCKOA4U2sM zR>~)#y_w%x9FHFCtp-Ur&^xC+DGjP1rkA;({#aH*UndQPML&}`lFGkYJ~*f7iB^&q z(!6uJi-IQjRU;3&V8%Sh?x;M%NbcLe8LO-)D(CuvUeyCgt9FyLNQLWocG&7HiPjY9 zt@G%%y}hYD9<6vc_4jMi6&$?i&~K6IVLaK~Lqd&yymt9KEW__^?0h#!0 z>OB@oK&RjjHGr^MzXZJRcUx4TX4_Bok1RXI=7g+EOnlu!{@{md1bgcM>b$CIh%aT^ z%Jv?Oj%QD4P)0@?JW5T1gWr;e;ICgZ*XC4f&YVqMH)C`1ko8O)LGFOL58CSH6EM*9 z0_B&s=xHClJ07mrJR&nQT@ZssuhS)apWd4r83yDSf1Lzmhxcjy-uTFu>t_x=egwh~ z6%`eWuGjm08T*GsQk*6@jhL*ZCZFn&xZ0?52&{-&(z(-e5-R7E*-cTc+Q)%~mt;ud z>=8PPwz|;Wkf`A~rSOvrH8ey?N~E|#d6!CcmSTWcXy(o~yE>?(`R;3`NPC9A!@P05 z=X~ctTc2^2*G;cmw;arCxIZa#SBlsivyaz4D{qvGdi2UcUFTf1>)UzLs0vd-IRW9J zKJ#-rL?e^t^_b>UA4;3slD@h;xJbLiH&58TtY5b*U^~?jZ~(!5ep41=>x^ypf6h_H-nAMW zIG7-|-P`O+2}P?;+=pGFo&06Gc&?)r15>-r;6jhJ*V$!-*1D?SB5B5n{W#vhlc7jp zvRb%g?Q=Fh9mn(}U)dQbo#4?}p6Oz5^nH0(>o3F*Q`!@`d|FR%O7%L2<@1ls*Q_m{ z=WI1Pb#!TmwHy^eIklMt!kCW^-NoSq+j9MDee0+(PB1o6kBnjZ#Jkwcu5u8tL1sh( zS()5h*H6_phA=rHorljfHGOVexe?fUbth)9^*Aho*@0uLTn&$Yc0O5bXYnBUVk-N) zJOI97^{{)b7*Td}tcb75_3udO)lJ|$7(1jNxks7v00#!P-858L;BJ~hA(N|-U2E>F zg>!GZb;(P9j`?IBl~}8uClfdJXsL?-;qGvZg1`Okd??m}?7F=mHGB5}#}#OibD#6> zf8+(;$p2vh9C1IyF0p-LDfp@xNx>|E?=#g8^!jNm5?fbHi%BQF@H$HiP;KJVh3F5K zdH;3PPN+`&VVZevf{soiQtdjRQqcMqhtz|gfWt2+Siq4;8NuW6lL1yueE&f7L#*M7 z!bgvAe>&27r|u+}j7&F#Tfba+sO_P50z(y4VpeJ1JBG=L&X;o8p*W%cyof(gN*{K$up=VjL8MPHBTkXN_U-rX@Akci{&oV|Ni4}?liCLjm1 zP**ZaGFyZ&?S5N<*U1V*hw%>A)w@CvYx^Qw&OovX^Kfp0r&xvvD&w#N_u2T^lfXl0x%a^F z!$yXn+ddf747TmL)hoWe(9Wj@L~ce4v}BZSkxPuV1uj2Jxjt$I9(TSPm7Him6fQa> z4c(P1lukrWDJk|OkV0;Q=A5<5>K2w9lNnx!oWc*0(w&@p_$*#pKgnWx>b; zokIS*t07Y2*rE0C8yPYtnIGt4W!_z7Hu+a2I+msH$nM<@xv-SU>Hj{^A}T0o>@Jss zG9P>T#QMZ%TG3)icsi#=L_|g8MGmQlzl#%TS>@&Dm&z32HPsYgjsq(f9zxChJv?ek z@S|1pSS+?h>F6uY-;ItnXf??mRu_DBof@0@Em`uRCT~rj$R54NkX`SsO7Aoy`z&qs z1vOx3dez+ANz3Zb3M3>*{hiifYVJfe)sN$ViVv;X(wAWeLK(O6$#;X{Awu{GSj?8qn(+^uswcMb7gGj zo#m>OkYm7)7R_x!HGV72*W{L_n|z-=3uJIWl8_!A!K*kvt|=#4fVftvP1+@hw1j`k zRB{gKyFzYO7UNm<6l24-XtT55TRk*Pv(&qucRwhE<)~|C$LudsSMsXSiTlOFV(R2} z?Rk0%XtG>MBP?-Xo${{LUr?xB;6qxCafU_wd%(OPnV=Ib%?n%(NdK zYR?Dd7ke{6e0dp?z1EfVkQY>QjM#3ZFN{Vk?wm1*=Iu&J>L-)gGulnNoEgaBBWsdO#PwjZ(FFJA4=dIqMJ>)*hSY zOS!w{{S+sx&Wa-bf_w&_zdqGY$4PYia;`K5nCPDsx%;x6tb61|~&Q^I1 z-f$AD-JBJ`0TNsugRINqpLQaa4Qja}Sle6^r}{}h61M8f3+ih_s8V>az{Vc4SS-66 zKjc`disOsdgS_vvzg&)qhmx;`@zzC{sGb>CPePa8fk)e$35r`HQt2B>OSN2i4`*X6ME(!qZt>Ishd&G_U zQdM6ZJlYU88_@M7JtwEu1kAoC^M;-kF4vU0u(11^n{ljOSaXD+H}FnHD;r8aBfKy4 zWmUaZ0ONu+^^JT9p-2us%Bvc*usy9(Tg^Of6pu~1C_t^qDyQWL;R{hi>U3dY)tk=F zP<&-!F{UBm@7KnM#c?_|%b0!=2^{~wxc}p;Wd!T~D3Sug1uRb#r(eD`(Y8xgSHWgS zNI@164F?YM1_oAQaiSXcU?-npw$(#dk`0K!(E%V*d7(CJtuV$Js#1+Ihh2GD-wA!b z7E7pR&O3pQTjqssU-BBha)12`j<1@KPU1bZ@1#sk72y8Rc{Iwtf3CVZ$T8^0zj4UA z&`^STQT}1LT~KUkx~)WlhebuMiGs- zqkE@ms>Ai+?F1{bs3z+lGnIy=0vdbA4o`3^pIGsmoVnapWm{MiIN75=T!p{Vf9z`# zthT5qoYIgJOE4FIh{9^P_r~s9F0~)7nqO7)w52c)j?U~%CWO<4*Joo!J4A*+fkiCo z!hIyeoPwn$}6Gs ztGm{Xbe7O<4)b{#VW?_azdsxS&&W?6+wty|?Op{?KGVc0TTnH;cDWm0J zShKTMyslDO=WOWB;e*Ei&IbH8Uvc`_{P-jJL{vrhD~lygWt~H&yoKz z5WolWbk<6t1j*HPY4LndqPIhpr9w$z-VGiikGR?PhE^Dbz5~lftE0mLA3hxl!zT8)`5PdC#4>c( zQbI}<&~8&)-?_?B8RmUlzrdUrcjc|@KGirwRyAOJ$r%n0b~x6_4P^Dmf$&=BWQuXN z%+37|_82?^XfLgnVTQM0uOqtT7*3e?(ztX*;fu$mp?~*5d#Qqv|9*pE$u^f$1v^It za7T^eUm53?*AW=Imdu7LV$B2FJ6$PrK@>ABhFgJWmkVfgorZQEeCGVF&{ZB00e|fl z8~~C{FO&v%Pp@uppfOWcaOBADhGgV3w7W3f?C4pWH&k#Wtn-noILGgxJ=z!ciYfb#lZ*oktXrFu#?PS1v4V-ijx)` z8O`?r2+Aj3a7$ zd#}CUZ;bPe_n+^ZW2~{J6PWXP?zpaB-SeZY^mFuE4{jkLA)&tz6P8Cpx(-i~zo1-! z|IPE^FChM9EB{;&DX)ug842kj(hK2dicYa>6YiRwhnM_YDk_5XgYW6Ps3KB^P40@v zJ<|J>O7_0911sF$k15LkfOP#`S~yvA9qw%*dKzqz2y$~J6S(Z7cPpk&X7}ox>f-bL536@q&iOV|4!$06BEvPn!)YvwhWo#sdj)!-KK<+E z%xjWff4wR|_VNnaUoTQ4({S^7eUr)pS zKlql<(&9K?f6X8HR%diIi10$qW*vN|Ej zu^A+BALJ=f!KAGS9cdTWP9nx1Clk-^>90AN59ZV=*gYR{hQX|vhfxV*8*G)6k_y1G zId@4P{u;rcGg-Ayu+K%ut7T#N?Ai40%Az;c;%oge?iU>_7qvZ(4+nHS&-a_&ig;vS zVPay^;qlyF=!_{U+Br%Hl8%~jnRZJqDu%gmiqXA-MlCfZ;Mw?L+B^6Y+BWJdBhhey zhl$!c67}?D2PgYzD@`1W4hcwCziAj*chpHl(BlYdl1p=hZApk4odm{Ru8$Ni#;{u} z=k4Wx{VMP97N*dePSWeyKmgIAFiO_fuP3|R{2~z<89FICQ&sz8?GX$jLq?k2554U+ zC*Aj!hQ}v33oHV^Td5 z>D^a?!*1S=`}ft7+w--mrBMn?38YZ&pj?Z3WF8X}V{2oDCAhY}UQ$}xbfwPi*ru;J zn9-re@uu1*V#9g|%Yyz@&T{Krm7CXg2%GD;f9f^9%FZH@y0luPFEnMdze=}%^834L zua2QEj`H5%cu2@EGKo6Ei;J7?oj3Sg6h*CjdU{@MUFsQEIDf*|gvJ~V!O=9 z$&pMJcx^YAA(N1&zHDu3%G|GaMB6>WZoP0vP`f5`q(XNWpL;U#%>s{a;hpL_Yb&dC z2e+ew$Wg~xpH4kSf(H+1JEk_x*jG0a`d{qu)INrPwI zh`Ndj-h-3e{*xkpN_9eFj063e8e=-ODpet&ciLhT0fH!0p%b_;-94ga`DO_;+&7U7 zu~Dv(sE*b+$uYkUX%FIWmc8BH*48}Ci7j}r5rBb?UhR4LJtLuOqG+GMY`rtanR%QC zg;b-=+l^~;lj{DygYyQ3tw;AIFaM=u?;{SvuH)T|{k{DqGGB~ltKkAQn=6C$p7o&= zL8}By{>``w@-8~cTB<&2kE^Sz4Gj!L2c65Bfl9!X)ZhG6~dG=a^Rytps zSN}kCY%J(=7!r|l*Z4>!C;P_u@uke(@?h>*t3pe}X&$zg7)sRqe5Jc9{{E1(px6Jit3uI;&I%|%1>z%gG-Y*&HHxH|+2Yv_) zypzpv`tEJ#RxmZ|ew*>`JuJaGb-WV0te~7un36=gSJ&|s{JId;j{BP-~p0z)%r5RSjYOhjmDX{qa>s7|*Sx69to%-+YSr1SIh zpFhj(v6Wk$mwB8wFDw|*N8r?%FNS4Pwc>R%sI3TTT|Yml=U$?-K8v=W9jb4S-sv^y z)gddyl;Cz|N-|ej&z!h3l&2&0;sq1Snvm9%cA4EViRbvnuQUk(FP)vH-Q}UYHNT^- zj*h+gb`^g-I_Hx;Q~z9-oyIIjJJ$prdmb{fWvCx1dGXF}JgZIqc-4;2)6+6U*8_Wo zhA6xV1NcRC8f_gDo^`ThnwORAE;7jO4!4F(n2p)vSGg=NlazZ9aHSv&L@v zS6U;h`4tvc*3GHv&0?plrTOXr0>O9{{-K^8)oKT+l`sk8ZZcZcrwLdgAt5d-7pgQT zfetH*g6gBCr8?KO>tfxO<@H|vHj|R-jE;`b@u&=`^P*Duy4FzkIoU^tfWX)NLB4kF ziOt9kUbl{kiOIEVM_M&@q-11NlqOPE8vzv+kM%^_?PUw@6NmU+(4LsBy9mN;cI_?q zsj~CH%>8_>FoKFiImNM9XxtU+e!MfVS%0Z(%K6q~Wgt`TvFqN_G>^x45I=E+=jAgs zwfhn6X%r2c7#=D+Z^NRaM?WX%OG!$ikQy1K^Plg{s%D@nDJfA=MX+0)M31IJ^{#7= z*tXuSKbHBBMHQi5VHGE$t*z~#+%^A2kt;eWiS)cG=*^p@{E%VawEdNV-Qn#7s3RhH z)i)3oBb4#+Hr{N~QCz(Nvw0cd%)m0=wlcQ!_L1nqUKc zeW~{@y9-j{;?$&b4VV-MYa^kRV;{$%<%_Cq*29GGi0n-h2A#SSdN*HRU+y@s zXC&{wv6_?cdz|fdKgVOxrnLUANhG<-R{AnQ)a|UWsK`c8OzfxV318rMp&P3!b;Zy< zRC{fRa4md%BNIHhD(3lVn{{LrFXW#UuciBMn;FsI-pay6;tnEt zj#5}$JkZ-q>YbXQm9n7Uuc4cz<2AR`m||4_C7#!HbTp9MTTziG9S?(m&8{=r>ni`b z$w~dDPXJl~3aLe2zW9J&L04B-NMDcw1r7=+8{6O>fxBN}A-pX!>687UFRh>ODJY0p zucy@TS!7-U?cYL)GuPRwm! zVX?+LCc!eg#yRPJvPbG2%jX`hZDL>`hH^Z6ux_l>z4ZRgo9y~YES@||9sj0znD}93v$Ii2XX9Gr zhQ6#3HET-N*{!Sl99rbp#FRgH@W8+wIYgIadyHd$e?N0fxhb5ToqchBg8HO*>Eit6 z{QTX+&8fxR+nL=@%G2m=-mgzoN6h{B@q-_gwEn_HVNfV2bJeIrI3v*;3w^)-a!B-? z=1p?i@!|3Fhi8|Sm7YAaztY;%(tAigUdv0!6uQHeZWMjhB z8_S%4#(w|uxIEFvr}?KG8(tTMJb|p6+dcRFfs@n24Q`H4_I5J?#JpyJavqDK;hm4$ ztg32g_|wU$sFW8L@;Pp}Z8yv)r?&Cs2$r}XF}~Ef&1T9|aT$!oWb-9pNk8) zG;Y#681`JrpT(0ICt6C0*mE}qKDoHKV3Vem$m3ik@*Fsj9TKn$ z6xODIlM7!TA0Jo;c{=S6y*d1Oe*0D7L8puEW=OOO4L`XqMr%1$$Gmb%f8f3K-#5OLRA+B4-2mYNT>Dv*-|@HdNOopx*s!GOiQUk0pVsC?_2p_lyY<8g9p|#1 zv$ON7EgzM9?cRhli|bi^a%O@O-EDJHVTP(V1d|GyEJsZh{q+=XADHefjm$dl@2W7Q zov~*eDCG`gJ7eBDXqYvfpTesJ;p@bGBAS<38cYwZp6 z2OK6n-_(kY@^mi4PCrFmzy97Aqp8&JireEul{W$pU94^4Vbz5$D0Yc_t{z7nQ{atd zX}LZGTRk{ZT}4r`B+{8Xz)a4<>^mR20{tP}HP8j|dtV|VD9TdpZ(fg?-adZYt(hV7 z*n4lO_no@|+`9=Y&$ZiLvIz-uoI5C_{2Sao!^4@mxpXHTPh9xU8ZcciPF5M9f;MVv zX%UeM%jn4Lp`V0O$k1zvf3D&!9f_&Gkhf4(%gldCMM)`nGS%{UU~sVO)o$eF2p(X` zw!5<0fTUh?5DNYT`jSOB&hKD8gpEqtm+mg?uB&u*=^-a|*8Mz-;j6uUoH!j7Ev;sW zNo(pyg*?qlaqGca*TcH=6Y)usuA)tou&^-S%R_D_4B}5|8};W)DO5Y@)GDfiA3lC$ zBz?lnEKzdLadWcTg|)V+<1XtNenHmtQx}4y zhqfMizpB)fXus3nu!ty;SAk1!v9BQK_V;~VTeGNk+@!AxcX_C+ub+~`AfUH-KD~KI zkUm!CjL+t9g4@yGUqU)geCxqJ|9V!DJcCYad$p3Xa(ZS#QODjMK3D%+tRjn% zo%J!t$+}JkdiqKy#-=gz4Z!0O3>jvQ>(riU^NH!{Y!jVfSVa^ro5jZ6{r&w$9g&lH zWY~f{#+`&bPESdnI86)zKdDf#Ta@mNn~>wr(W(E8rKhXA!MLk$Ch_?3toiZ~bZ4|J zOi3{gpdae0suh-F<^BC1PNYpAwAZC%WoKIt7a+=zqu&PZxf|vMT``BPo@L%2 z=ym>r>Vje~mfg)>K;0eZ+-;1%eLm^hFiCRZ0n10EJaujAvM)Wrvt?~Cm!STk&dO}! z+$|a!4e=K*mVYqZQ;?~;IW&~8PXp0Sc2^e>D)$K^=ymGBX4iFV$+K==j3O% zZr`SmI{V}$#nt%wp2GaE3y;3XYhE-|mm2amK@8b6qp#)j4ue=v|vSv=tU zB`PB$qoB|S{CnpMrvB_jkn=${<-L3N>~u;FXY)!uC1dkIrvwsYu!NuaP%fZ?)ltA18 zaTvsJXaFD+nbj+QY|gcMTTN6=9I<8_%TP^u?uLIpOwP1va45jYyUu%XL0dI}+yoUu z;Q5ccFOin)%*?d4Ya#_vj<*^y{=^cD=e%d-o z0H1V`yTvMo)blYlLkH*9`_qGsjJooL;>&Z3r(VehhK8=4(L%h*9gfFEcOHwPTzmWD z?T^e%lD77CR8rf8E@g*6#Ed%u^bj!KK0Ef8;g6Ex=QWwEk+HDI35&z6iEI8;sDW3* zW@oMn8dXHQ@`v30y}hHozDjX%bokrRJLKPxdem_5-2;%HQdgH`U0-Lr;N-d8wAj{# zGHE0cPV4Zh;Icje!^n7%$61~V_ZB+Z9%w_n#?G=jeh975ngrSe{2v~QSBT#t1XFnY z|5$QN%v!sK#C5&&dCP!AQ0Blmc|J{89AX5#W=sffxz;l*ajX2aS81*(tiA3l2G!-x7aq-G3=-Y8K?tD?9XU4G(@k>7q_zA%}O7 zrtBa-@)3y=ha7&ZUjoy7?_7064e?oa*E&6jSJHgL;;wr!{gE7V7clo7Y2n}SQ-SBQ zL#6VrpYzvfk-nhfyp*-fPngM4fuAHk>aV&#dz(R^3H}K2M*ky|iz_N~Ll7mQJ44%! zI*yqp%goFyHa7MPc0%_e0X}}ob1EpPPMfudKA0qvWv=mL{ql#l>&62WT+f38AUe6b`*ZHxGR)TO}W4FQDZ8Jw3tf ziWL2=eF&EL(A$KX8`-Pe_w(mFq;n(1#(U$~C#T2GR^g2MAaLeQjUR#r}ydLO$Se}8w=($bQXFfcA|0-lpO;#QZDyC_(xt49X} zp!+sNG3twoh+MaovhYin#Y zSQ{>U@#2NNhAPW?WF)@1x%uPAkMZ#E3MKK)zJ!G6>Fevm6)!9R4keF5(`tkALqtf3 zLJGxoa&po_UBIk%lqp$KN-Btulj+rO0UDa@v$L~;f&!28lK^;$ojqbwQn~tt!<+uS zr6RziUqVCm;ZrOuI%c=K;(2MR-t^1kALtR=e1T$qe0r*(stWkY+Ill21bbn-J2ti7 z1h@CyBWC8}rtjT5sxbUs4sTJPdf7Q{jBjskEsd4uXJ@YhU%|z;g_gm8wk2d^W23J> zyE2fS_5Ku?WC@7(I-YTHakb973v?P~Yd|Lrzkv+z;_AwvS@D#YH?DpD#;lpsLxr(Z)sr=!7K4FKWpZf?-X+S5e=dIx^|_%Se0T3R|UKOYkf?MpP8AynDD9bVUi z0#oFyBp7n-dJp&Wll|Lx^ur?~ozbk>d3k}+()k+YfmS!O*2zn68w`Ar2byHm8J(+9 zzA!gO3(c@KglsSOH(G5&fr@`Pt(v^5Dn1@wM0|W+N=mWW0JT}=(l`Bt)Etw~u(0pk zNlHor$dKT+^D#f)+F$5>XCb0$uiq>exGGkz*W?FqR`BQk>QDrohQszuQ(4P+jdO8j zB`4_<4i2Y_vtw_pHv(JhCdWHQxaQvIok7=jHh!umf`Mz4fv3nwqm1>pI<^Qh6+VCrc^b z-q&1RT?K!_W(C2GN+nFh)Z84j_+O4mASyf;7G4{#wEdO(!aEoiB=G8u@k)ik$N8D- zu*}KK+cZ-a78Zhou?jElO8CG$uouqLm3j5cTHcrI?CjKW-@hBtzQ4WwF(^o<+QIU0 zV*+L=T_&Mx+)BP$Kv{~)da_2X-s9XG6;vJD#V+@qxz;?bYI4cQZ{yrW2O+F%!s}D@ zI+VBvD+B&mMNZp#n3$MmmHmiyonvz4%|j+88@O8%_q{u;im)FAg@mG9lbVnb)pGq7 z6szT(ot>qj`pb)IK|PH7Ox`ZKCMKXkNT5)`M$5^G<#jDfUzoa?BJl9#W&ChQheg{L zDi~@jE33S`y#BqcrpS=Zi?rrDO4`~mA-26Q9^2Q`T&?`I1&`g`u`){yXXoS281}Tu z(sm}LRu)+BEuZcSF+@Gp{Q>yPz)}bFMJ+A5(sa5(u_DhA{i!R-qa4W;E-1`5T=I{JxM~Ir|ax1``_MNy^F0dI2%Z> zQ#TGQ{~miNH5(fnOdk~$LR&uE*|~*^YN{ov_FDL3SBk2KEoM7Qa}deY@NgvT`G|;? z*=;~>W0BO%K7)xXKV=ns9+b|%R<@Fy!X6fUI7yQ}qZFcppJW1e1p1mzon-y0j+ z8XBw1%gb|fskymQI>=TcAw|h@SB3UaCs$T3ce5U;)%G0xnWS8wZY0A~wEt3A+NWGYS;KnC2gexj1+hQp?w-YJDbi4s;8tXc%$B4ck^02PA#~t+$8uUmMqfT~FVRo<-_spa zH^|I?_WJqzGcz*>5pgf9u5z3HN#-kIgY5#K-^zY3{{8#+^z`(tt*w|Od_3+aEc<*hhLUpfvmfRw5khpf3I#cN z_?ItdAnU$<{ko&FHO9x+x1~4b`R?wnmX_972sLRcNFC7gp+d51hxCqr@h0&h`R}++9m1R+uOO>pADEgG|GmrSO}KVzsP!RP#Tj%|5DnzFI@^m zELtimPP-*pMa3@(2_&{uXs)dfY*>VZgoudZ8hkM$!o#&;-|sGT(wftia;WtJ4RCXF zJ3BvT(5g~YS9gK^4ot0N_;!)HHI%^q^*-3SJ$bKgvv`HjsTHNV9&YIB>S7Y}{C>p| zA0Hpm$IQxF>VA5Vt6tjH+uKW+doTVUS%A?|m)Yh3U>8)RjcskzPo6YRP1S$>3hHC; zUW3O-BQ6mm%YHQs=BXs5=-p@=bOEr7>vH(5@ zIu!>u_a;D;`bN}&;+f0=$uAY2C&Qw(Arr>Q!3xNLp;_qq%| zq|f1=I6clP5)we88s3_2xO(MEIK5U|dYinz{)cPVs`OAhcd%;4TToX)Av8Sv-oCku%Sny%E?j31ALkV$ zO3_)}ee!Y)uIejxf`H19+8m*#gMI^^lAMlj%G;hRm!jXle?LAxCSbFGIRp5BiGdN% zW&gD(6p`d02g2mFQ(0XN5T>QE5o8RJkxI&&>c6J|QkpiSn>GGC6pzBW@NR|JM-;8>jOV`)AMI6cxi?o1p&*Z3tk% zZP?n`DLUMP7jxeLKKilL+Oy*2#y9otn?Mq0TT*&@b8G91Y29Nt4~@~eTyM6|{#RoB zNfoP!-HFC$Eor6g4o62vfB$|-97KVI0uDST5m#yj%a}0fVs`nOm_>#y$JMXM{(gR= zR7F1;u6UXKfO4RF>(8SrmNO+UPy1nVZM$WL;|)+Zq+h&{6U&som`n@JxY=`So#iVY zy=G)g40L936jT(HVVD$vymz(5X(+ec(r9mOGWD|QUg%&-d%*~?gvB9!8*BLa^8?n- z+6eQ>etjIG&M6>ybhK2@)ufDPIa~=B^ zVq(8xC7}<4jiEmr(!Cf17^SHxDkkRi=t#DnnA67K_qR6yhGB)k#s&aJ053teU7}0u z52vD{g4RS%P7eJSEcp(#k0H^zW@altKR*Tzp{b=s!t2t=r|xgcT<-9%Apd>Ne?-S) zdI?NxWDaQ}D^g_uZg&q4%L@vA+f)MdCL<#Yac|*!k=08nCx>VQa8ppy+B-UMJB5`Q z#LD7neKASOii=aU!F(3f(cype=$vz>MZ&}6Q>@j59jDN&S>38IdkZonmS>*<9(f=UW?J2j%BvhuyJuj3rYmr*^a zZCI-cS*JyW;qt9vXbtp5KDQb^en>)&!hBIBh5yz+H-u;4>7JIbaN~zNk0m7~0X}JK zYSJp7fYHHfztRuFM)8X(os_FhO+$wE&eD6&2m1Q!jb>{cTAJOI8eAn)O5#D?9s8ON%jxM0;Ps z9kCuQSzgVr2W&J6OD~*G<6vV#0wwCda5_N&;PmDKGSbw4W&pSMDTh`;39oqd9ZKzB zjv5%D{bT-MiGC!5Y|Uz9WaQG)(%jq}kRjM*3pv6sjKol&)^=m^p9ROpjt>u4xa^x9 z^bV)eWtZyIxh=1+*S?zmvA1VOA3=bH^^k^FT}x{sn$^6_Y9cx`v>3_>nM8O`IWE&4 zRf9I2dXd2kSY(=-nl3I?;4*(z%1%8XYJXxV;{WN>rw<=c(9r>;p3jBKxVgJ8n-sY` zGh1z)nVFGSR8-W~macsctTmBfu`P@Syjz2j3AFd(M1r)KELr%0d~!w6ii3=g%v}L6 zDwvs@7Z(*}>fm5w^8t%-oN|x25EFU!?7MaSIYc%tfw3?;22(Z>+co&01JNM&#>dC+ zh~tJRg)M9pSS;~Ja$H7)(osxld3n+$O%@gwH_-4OMt{t4*B}hHlWHn?bl=A(j7u?6 zMp&L8_?)yAOVcK7I7?J{3MR-L(iGFv(||dkW#jg|;HiDW!xMXJV0_%d%F5$-$IwMdPcIo93a#Y4 zJo^1;T?w<|U%%vgYeC9J_`VY^q1 zZH~j$z$R+WXz4QuNThdQ!2Rr~P?pld#3VC6KSENbC}(cYz@;^ih#Lw)l!WfEM9#y) zd+GNe+kOmQlE#1M+}=K z6A0YU2;ALkA>{Gw8FKqZxH|0Ue!YyRB|Hti6h2Aso+#)|#;aGD^d`gVT-k5@h?A0> z+$fHQg7WIsD-#O~#ldG3;t#PJo0}n|1$T!*#Kl5Q4X@bEaipqS0IBRZ2YLvQpqI~Z zGQwF^JlBRM#B`g7);{wm*PT|gZ}%`?^zw_MeJAtvTgnnO>+RnT`SL}W4iDuT6xzFY z@AhwaUK|?>3wwjf$ZDb%&l_2tepf#-DNDmbLv8)>=vR4~rVE(@8`j1ws&jOFkFAtO z61N-p0#!9NJSY1QotO-lg+e+oFreT3DJeoS@~JMALA{u;hzLN+{(L2&Rm=f?vH&Ms z4=h&h2@9g^rz@DLb!b3O@U!Zkw?QQZ)(d_utT1j;VGWJyq@-s|JHezvnRwtrLT1Ls zFm1~O&6K&MEGlXQwn8juG2`PfL+k77BdIIDe+$$**w`dnb(j~*q-`|$l$ANi%gZ}B zH~>6_iO|=7Tq~ZlsV*t6Tmn?>>sM-HW8+?}%$5g?dv9xU*VR zZ3I*Rs13r*2LER!3w6^l?%t3mD6pqsVH1{NmG@5%WIe%`Q&33RkWI`>prD|*JgmR0 zbw6c;*-LL5XLaMNx7V*|O1IiZ2@^3(n>)urLlQ^84Lc!UjC0`nnL~hw6`kAwn-`Mx zPl@%`e}Nj6OrTlkR%t$zhjvH3&`<;0NrqCg)x7llXofxNTE9 z2@8C&EAA9vClq9$WC0}n7clHVw?fIK%nBdM72UF&6~pP9>3y!d@vyaM*ly`)dzOHJ zpt!ggwzv~dd|@GD?bnhLI{?d5Zo2`)<2lTPc7QS<^_aoeDJJ8^ZA2Id@0wqK(bm;f z=e(Pql9B?kn^W<^`{6dF*g{Nb=rlu70lK)QGv4HQY9b0mbPkw2>(!fe3JMC`c1yua zivb#vVNydSdT7k-_SrI(9bsk}{02yglt*YVihw%tnT;fahabJ~H;cp&=Pb$a9 zAfBiw;1;|4`*AF$^6u`u?dlSA(#k9tzI~vHe)@#w64B8i=@OQs9X#Mt1k(r(18i51 z@ru{p!LMhV)6&vAKpP!-x#Qt zke8DX7l*2hd-v}A;$llWR3Jm3)u09A;@ZJdhs_R1M=6K){}o}Cxo2;`4{-W&uTN&S zC5XZsgv9ORGoY-TTwFz)R+YC5m%iN7h@W1~G%rM(|ePbOMV^-)y)p#904%Yxuz=R8At$G+ua84S1j$navw;vYi7LlUVlcFRf4_?1JG;F6 zLZ%#~g)-}@I=!Y_pnQP*`qU!p6>U3q=POtcmY)V6spVQ48s5dmp4r^gQBq=c*)ut5 zjnzY^yk`m9CtEp}nvRYLBBpijr5cKyBy@!=g*&;o3DZ#>T$B1k!*-? zF8MviySo`^X)TVnra@K#iOo>KFsq4C`1Y+^zXk^nc6UMbBLvD}VzLy=X&dSKOnKE3 zz%DcME^LYrHK}NpWvFS2Ou*%!NeLze*S-9iUTt`n+CN9yv~WHus7~1ts~wu#dbPuP z+w8W>{)z}gDsckMiRp`#tKs52OD=~S?w}P)#jwdCH#9W7d;9hty{4FT5AtlVp1JuL zY=2C?BY~18Rb@YC)w1NURPsK*;;0;)&p9`~tS-IeXlF#b>r)3*CF8eAAOjn&y%1w};`5NhGZ3MCO+u=yWbQ0>3AAlE52&jU?h~qjyRkB~x3>q9e(#hHbp+sM{09%H&l-HGMJRDchljnry~VV<*J6*{ z>Ow;ml$64ju;&AXkY46*7r2CK+&uq$Wyu?s36fVEDh7swqhoh#t1|?>)YV5}k)=z= zjaJD5$&|M?Mhf4UtR)~Oo`i{;v5n*k0^aJ+M^Qh3%YgxUrRom^t*55=clw_~GDm~= zMnG0woqCnvofo>Jqa!41fHcr+RZ()|m4TMj(a|wV{9JAp3v^H3@hj-m=%B5`bMfzV zJ&7}j%lq^AA2^yJi^i9bpOKOA%>=|FKfl3y*5&b4!43(C*tF~=50W*nxoG9XBOx`tgV*~VefkQ ze5h<(+}y69HE5Jsj8r@3+pLn&q-R2Wjn#b60`?&Vg)smz@V>!Q)1Bmn(;JT-Jp!!9 z&VCpw!?(S^pO#W+ig0C-jt=Erl}##Z~Rif!Lllf(5cNZv3nvq041pa~1olg6b0Pf8~ zhnB}?H69rjmX_nv>PMyKe{^&NHkQ1E!^XHX6g;?^_ED{eSO6$3rt0GInt;rJWs&{$ zEB=EdOCeafi8!V_Ig@kBxd<~@6p@9lu>@b^Z?;0_5R@kvp^=dhfEv(HK(_S`2K>CT zVg{Jg1&=uBdF@kX<`^bJKfq>iEClRSm?h1oJAzM)>qD~PE#U|S7>2o7$A_HH9%7-q z7bF{$P?mfFIAYJ7f+7Rh@xm7vh9xTcQVBpn?V^Z5_wr-~y^QN^bo2w(BpXM^{9Ht+ z!Oq48QCqhlx+Pmo+gqt@Ys-Aj_3tKwu3Bu(UoM17<=YaST7#x9Pwpjfl2IcA#B{+! zgh`)>(L8{n0O<@mFxru>&)QT%C^Gr56EF$Luh@eBL3nq;b9X-nsNoU;wN;)0ByAAY z2nh)RLO5(r(jBXk`^*f_zTyB-3z7b-mjKju7Xq*mD=+n*a2&qF;wz3?m;JV%KNB5W zJ30)eP!JcgmG49I4e3@oh`cuQZ9oLUa=v}rABxYMwtbDri40-090gTH7kD-#(lawND=IjACO}*IOGgKDz!ZK2 zGa74lh|s!uo}%mGyd z5X|}68OT6j_!Gmm*e%PO;pyn;prZ$XU8Jn228R08#ZY|x)HJ(7sqAxFIwK?=5he+RFQfZd94cLQ{ESi(R6L4|z$ zJP?L3j@ek+KLCt`CoZ#p%Jvz-G*wUHFWe(slO?A;oUikv5|p?QOEWb!m8(zB$mot? z--I%_9{L!n@Z#GHfp>ll#$Lz*rPprWgaa{)b8|c{dq5DOz1u5fNGttOl977uAi6?k zcw%BAa6>xnnhG$cK}ZLah=W6QX2sHtKwP{q~a1v0Ghy{3IxIh;u(g zMNoU>9WLMf31?7p-!97xSNypF#2Zw09%7k?Si@suBwTi4uT33p*%^)vo5T%5wrkRL zvv#_{7aUwif!EgN%+y+Neh%8WF^&2g3eiIOQ4Xu+#>fVTtzKlLtS1Em9 zcp;mxBvA(>4L~Az(9^re{cEc*Vm!n_ST_G8X;bXqdXmr$!EZRj1GEL2^=n&OXzD3L zOlw^Q)a2yNu#BM)G&Rj{OjL)w2VX@NjL&6=NqkbrCn5rHYpAEkK zAaw#7G*o`H(iARAdipMyo|cy9YbrjC2Kzbv)WxR8St9K}7I$y{dt4+sQk5{Pwi_$8 z$**s_Y2~z?p&q&s@IrgyQ@eXH3gITbXcWz5dsnplhARx2`|o3i-c?>x zIXM5NI~(xFqJVM%u^ak`)%A6V$_nQD`S}%r7|p~K&1R_%>vF8+29m(-e^D%jo!U0qWM4g?vfp!P}nrt?{gRv@u{j4){Jmau#qDqZ%!8hiy%l3XwU z8CW?;_|TTz;R+4g!#m@7tDBw}8VcT>o}U*f_lbzWJ2goLh6TYJe&a4ekhkI7S+5ev zy9jvz6bInrupf+db>%cPXtEs;Qf*%!s4sxJ2jPyJJPgGomAl2+_}U%9JB00+TOWe4 z0f~YLdM#>t`oMsId7Daj9`dQ7=M?Q(Bn|xoot!!l<~8XLL6TPt{`pf3B)GykNWCs= zY1cTBs{8=NtK)HOsH-~-6tAPRvmWB-(5Q}&jw&iDN)CrZOVvPe1`o+3Y}o*p!->l> zsPAed>DwIJ4>?_Wo^8qgMjVV~g?LNyjm>m1NnOE_IR$$4MVk>A1lAB&S?GvTNSCYx z)dPA6M0+4VAWawa;R8Ontd+Kl(D5M~rDth5aZrd%XZArs;e_Dn+3)8c`6H2LpQm}^ zlYfJ7%iy{19D!jLB%-)&=ERa@otAo%z(tUy#D!T!@G-%pr%#{ufF=9~8=mdVx9`z| z2VPcIruRCtd;*O1{(QIvpyMDBqg6BKfJgoS)NcssE+d9N1m|U;+PzX0h=J7t6wC#S z3a$D>9X|~fRnjCW>iZv{he8Tq;mQ3UWy!1ta3B}z1;le;;$f)-`1t`=v@;A130dj{ z!GoHb8b2LzKoNwVX}MQ^eQtmq`| z>WT_z<1}uF?U`}&snE5oMJ%5`)8mJjo?1NNjFBA-d!I)9AAT2Ybvj%YHE>rTxc%iF%>gLotMY4>D}JRSTK7EY8!cULUmkg0*1x=H%v*c|V1k`V|D9sw(xp zk)(cfi;jQCzQZL~NgMwb)Hygf=y>r}{oBSrvH)dbd4s|K5Atr?ug>K3^fHs)M}lJZ z_N+oI&_%N9%OWEUv_{2fag6$NLva5B!L1y02X*}q>6BwhW&S29ht4;&4pVgeN0I!E z6jd&Z9tOa00M3F!j@*i}JMx;PlK?q7wrUo!JqmRUK^9gu|}2&Ce|pw> z#N7}iGE}C;u?pg#HK#T&Mkr?cLptzdIIeAHX9w)g0H^Y9*h(xfy}0r2EJsku5i^(f)ETd?kT{JdvtemabVq~zoK z68Ud&B4C=jl@Tc^v+%)Sjxm|_Q?7iB191mjP&mo)3g8O|VPIXI2PC<^d148IzuCaV z(XfG*4LKorSx@f~(ISK)562W?axv`MMVYg;tNfYCZ}T;v2|gcd^af?<2=z-Xu}6f*VX-n;?D1D+&egS z9Co4s0MXIGAiRstWl#T@+gstG{1Aumzv{-&m4=BL>J3oF1LW>6f z7>xROKKE#s%^!6q$x$WAtf>#U9W0cT28=;Y1=sr4wYNt{PQYnal#KzPGSr_jJ$KU1K@l_S>QeNjkS6HGC}O zb$N!nD{Ji8Y?S$+{fyh9=Kg~RE1+HSxmA>u?17yN2gK6Z27mq9fzdfUtOr5{QaGII z#w6tE(X%RQZiWlX8p}XNik!Y@f+SK@UJiW%@BHZAx$euAAyD$*t0j18Y2obmO+t*8 zzCMM#@?}Iv186kx=b*Qxh{*eZ04Y1WJ#c-=-a+ge-qQVb|H5P1!}Q7VF+Rj;E7!bz-tyg-* zsH2vF2IUkn3zL&|fXiTCLF6ts6E9}E%}1|=c-IKJIxzVY2owuv=WKoNLv__G(KQqa zw#U%Ttf`|oBa_zJDKV;UP2%)3^F6W@^ zoO1ija;r>P%sQC-WDhABnFMxg;`6xS9_a^|+3c0mi8lt`gBX#hegl)3_TD>!rXb1Xc-QbvW{q{Es*JZ&@kr zp2iI>R3FmOgWh%z{1O*Q>QyX#EB01(8lG;p8x}zhuG=&3A)gHe7={TRP$p#ZxuDF{ z*78QQ$1xeUfqT--Bor%zBw!EpJ@F}I#%o^BiUN>VRt~SPzl0M6kmM6XS^jehLcIFk z#ES(F%Z$u2dA)ZZl&Al84nkI(?@PInw*Uc^nPlDmAucXA zKVJrA1O^={jN{tyGn8Y9?k{vFY_6|Mp{N0V0Rb00o=FI;({LLic}ZV`(^|Mf5EjJR z*_sw|`RMEW+{vk8X~GcZ1;Qg_WK95pfz)<(=H}#ln&f-*NDpF6knjSk0!J^?BS;`w zI5-&IFb(FJT*Q~ACr_SiIl(0ZM~5Q>nePFTgFeIpEY02?zAop^sfpfY;k{Z``oD2# zPI9FYP{!aK00{|6>sx@>fG8o$3gI8HA86DF8`#h~DYKuMgp|U!mcUuLw$|3d(o$A7 zwuNmc5JK-xyie+V;u?_m<6lo`)SvD612=&01abiT7!HJ_(1<{ZjH<7%fB*h^MEm~1 z0i;zvTX3n-JvMjDLjPg(vcmu%%)A=REaUZ2p`<;K&H-Rsen1vE7 zU#uhep{j~&fAbSS52%`OG@(}mlya>~8xb>dn>ZnSX`LdB`##}cMo&ZLcwL{CL~2sp zbiO2P=fZq?Np=MZLO!R2{6}&l2|gUGNoe5ika(UILhJ*qR_KrhmgIgX!h`HnZnmIC z0&8_agm2&*3bOEkK!UmjBi`EG?fCjN6f2BUDY#E8%x z9qR7~k7#YO_7oHuNLR)1y0Y1JjFnqMA{_uJsDZ1nBlXhOpwj|L1m^-I6h1(45Sd>l zPu6~F{W$x68rz2@>a5ZV_z1A7Lqq%0Bq9L2!)cyM%?)_2Zo!gOE2@%IR~Iim3!3Zy zCeZzL@cYn4LsCrs1Fxm849E%pTv~1Lu7D6#kC&2_L&y=%u%Lk;4Co0I9XR1sSXP$4 zYY^&HL-#o9sSuTXO6!9;@EVH>3dF?4UBK4_#1G#M1TZRUl|DNcb}~4nG+e(BetRHy zctFF`zm`jfvmYC+`;uJyeT+ho*FYD8V@|;6z}Vw+KXGz$lFbI)2<(+eSTvdo>i!#) z*>PbW@`n6d_z%<+0dn|~cpMF==)m6qn}GCq@2;hh(E?;KXoh}&j!w$yi^vfYRhD4d ztBX{Q<;7Q*%nN;2;~8iecT@EMLa6_gNs{#1PWi=;hVvUx%<4r$Q`7rS9b7ovayeYR zTS1;ziuoJoO0u3MGHOwU=3!c%>h)*1*JzYdwaq5fHF8}ikgkV`f7U?GRc=Htz|**{ zvHk$>7UhSRcTxv5Ttrsd9{ql+ii<*NFv*`D=V--b%Y}oQ|f*B%9(l?Af6J$`WseO4XBR##SsmyY00m|t{Vo&Dlp)G1%TGfJwPoD-mZ!9lY zx*l5Xqmb~q{q#^o)TiQNoCMw<8{=Xn(Wv8h=5k}7PJz2j7tua40kycTk;+5QJnVj$ zS8MLpU^6#wq_-_MHZd_AaTAL7^VTf1^@%ctLdl4H2wiYO!c?WLaagS#x9?Vbo%bWW6+Yd)N;^JR6hq0g z)@Qz+fvAhf0gp2oRFP(Ne`B8A!1tPhoinnCIGq!z^#r?h4H5l}*Me`Zf*_RDNYOk1 zSdh7?n?UVs;Q8EY0P-3xBDV~fig8GsaUX`xtFmJaW)s+sL0*13rJtIdKdMjp-8l0U z%CBIOL%1J=8a_TgNc@5wb59`yY%muk@PXhx#x=-_-SKopYu|AlzWuKGpzW2tyHt&b07q2CsZYOoAYZC|M-AeiKqeph}etK2S=#k^MtStpY;kXV=>qkpHV91~jdDn%e%m?Ce_o+S# z6^gu}o~B};TspJ79QFA#BS5p`cI7!b+5~BV~LjPtauBji- zGx4Y`U#~8%KXmSQg6RLy(9q(-0!WL!O-*TV7>4@#7x8%@t)Ptpl3D-{6C&Smtm1#Q z_8#C^_kI8P*+e8EN>n5yvPqO83E88JY#Eu6ky$A#NwQZ+R#Ij{DkU;Q*;MvkWsl$M ztn0p?`?{a|_Z-Ln`Trc(akcoK=lT79#{2zRAJsee_wW^mibQSEsr!>1Pdh76wI%ueLI`EPgGQUriR_8Hf5TyGgL1wS8iZ<7>dR*OknI5z+W#Jzg?QczepN9UoODafx6d8W3u>z|Hfn_Rxk&jVZ?A|Le4L_?>Ag_fRPcdsq2 z^a;(%>r~-(<5i7mm?wr3L0P>ZZ;)3c}K3FZ-hM8GdM8(F| z*Z`}(OKD2#L;bFU{H&%X-Lg2yFOY71l-q(Bm^o=^Xiypz=^l-!PF09`qW1_mHXa&u zdbOyuh?cw6j(9G~%cR8)G)Wz4{{BJLU%wK)DnM$+!ttDj8NCa#LUnd#1UX+vwTAr~ zt@m>w;3wCCpdXjXDcPXg$Mv!x6wBVxx<` z1H%;RHPHlyjxQs5Z(__!W7V~^6~rYe@M;bNHHP#SAP!B|hWUhrp&=HWzo!rJS@M#; zX3IF^JGUj4SQV{KJwNeitS^4Lw@2)ZTE_GIHTd4lk`V_o<~+M%tii;!x206_l_;-3 z+4Q(go*3w623DX42d~5M!?UXCKg)MW5Y10YN-!Z_N527K`*Fvi17UK|F=#%$$Q)4( zj7NZL!`<*_^|fD#4#8_AX}mrAb-VO@YIx=jyqwC~?T;9gc& zcZ4ElAi-;TXU3VFzn~9x_K1fM-B*9L;EjAuq`09h>EiYlN_3)z3Nkn>d8n`9@sS~J z5FwkOAUpv;+tZUs#Vi%`M?vy3hDrsvG1khim-fk;Z3oBd6#Q(G+1P}SLTm!DIc&gC zJAiZji7mXf%uAwUi}j|4f@@cgNam9%%s^F#iVQ0moMNcA;qYt%$WmyYqB;!dI4T3p z%u5uA@ILub=%hq8{OxI?yeTeTrq_4>4wzo$VREuDbnfT}h_=VN)C#8$33NU)Pa{Gz zDtyS}B7BTs4WCEBw{g=Z5Ij&b52B~UhAUtT*#epav;uVW^ibjbdUu*>WW zU3x@jO3I|JufKNn!53j)+z`;I^4?;uB z^ZHSZ_Eqleenw_`r=(a;Qm}6GuWznL*ePTHbfHGj^Z2C^b$+g5uPx-geo+CCtVfHx z=1@j`kGm?FMf!zJunOoEB(V*3abm@Y6NkSe))_-H3^-)gt@BJU8x-ql^gLO;;{W`X#AG*n-?<<9jQ(v#0Q{kxBPAN=L z%;@aOk8_cfT?1lUT2g|xxD$69Xpc?u)gt%iG!CdFZ_9mklrIv6Q_g4EZ4-*>i)F1r_`X3_?3yl(kMxNgiN$b<*Z8{Sy@mJB?{;tI^8T%WA-p+Y@Y^Gczu&q6tJ?1` zUeb#M=!Ed)eH!oXk*WHH3wZh`gG#}Da&d7*@BHJ7Q^vRDMIxe6l$(3JZS2Fl_TQ1i zr^In}?YrnX1v>sjhvePf!h5P33g@Bbbeh@s-Q6eAS>v{#Z~yoasjhbqhekyW!`F7@ z%JM*rE%YFE^G4{d+_2_jl!JOhkQ?KC7P{47aMSp)j*exRMQEj~`mfT{(+4EsT@gKu zIugI%_H%q@b5{s{U;qH?iUJ$G6Qse|_uLok(D?!@tpD^WCpVXzlvKIx3Un|qMZyn_ z-VLhcI_y<1C-EvM`asL)qyL30hE`f3_SiJq$yAOJz`9tY7)D8mFUMHY!k#c>6srz1stlUP0o9opk5U zw{)#oYUOTY(d3W1o5X<)J0M9;UY_jNpNH{!!&Vp0zm=)ih8sUXSPruSI!-j1<`{>C z?)VUq)ZIMA}=_ie%B65mDbf5yWY`fR9O0WJ;H#qFi0e&>-1(jbW= zUHy{{AOBK9d1#^J^k1(^_l8jKCz<#X)p~BO1017ReJB}^z3~7|@~=C$#naGYPPTt} zrGtPp0L9|wqqad@!}#Z9lKD&jdGjc%I1cQFm0A|D5ZA8dE3X3n>RSu{J)GVcU_uk> zD^Vt){DiF+`z%`6BHNymVH=_G!R-R=hYgL1&j@|)`=?sDmDij`nk|6e!}5%VED(fr z);e4Uokuc%4||I6K9$-{9v=yhL@KTZ7UVu$y7z-ePyxpG=*UQ39{8-#S34jh)8ivC zJta$Kl{xur0;h+}hDRcpYTsOUGBS$87KdTf^Xl3W0Rab4y2Lr|to-{%XOUnoy6A1* zvIV8`QQeo%laeIaLcwK2HZ&^6LHr)?ubU!H-8${|?9Z%qX}2R2+^irN;#^yE$kX8Cb^I+iR!eR3zQv>CW#{0=X!^qncWd^xz- z4Z1`-yXWvZsirfYxc(E>gwD~L!HpelsmJ@{@6aDIu_;!1OOkH7$C$C&(psI$DHBIWB- zw^BzAdnm?%k3pXW7)n|NavBJ{#1Ui?SeO)JHv4&{NSh#j;jQ=~kSX>x}zkqDtPjwUeC@AggkL$4-!Iy9Ha)ssfhw* zec_`7M*#dI`-H77Dk|PnO@~gzh^`z~!xraALOXCFCv*^4(SiJ3F)@LZ0dXlr+a@aH zAu&PoT1>9^v-v3I1Qif|A~G^lPKfb)O%!O&WBZm(KDMA1s zk#`33-*;9>m`L)-hO%+%zt%mk=%VH^)W8ho{J7=&2PGm#tyDp zl1OcO)s#yB60R;-{9Jzpee9iEY<$Mka=jDW)<-Ca+c-#1)f!K04@r?TImu14%JW=3b2CH#~o!3Coi+6z-?(WLo z-d?0r944xSV)=~kEa@GOm1-W8a8-V965r5ygqp(UA6fux6fiG9KY|Lo4{eNn(~-4D zbQT!-o%=An7_jnA6+@!~4gfGa-~l8Ub6&>IMSppNJCICB5TM_NIE!CQEJka`Jg8t? z1=JkkU0^q=tgS^A-iyu^w>(v~9+FTq=(-Tt0MUe)Sh2S^VJ-_2N@!cK8p2kI%SX3C z8di#nqLP755io`USZAowSc>sDm|*d(1C>V+jYbZu zAo>7MV;?#KfV;3KxL<|D1oTJQe>tc%kQ_MPGQ zg0=s`Gu^{HJZ9l1RMQ_a-Go*HqRoM$pZ;xEE-7age8}LO0Ad0;GWELeckkI#Wz`qQ zYqZrI7%e~)T4^jt7HFU0OM&SoR5jhCWgqws|1&=XO za{!`18e!I!V`_A>Ma#k>9Wau>kqrcweJ3(py-D_MT~=n5Gv9zWD!3klkYr`PXV4p> zq`CQI7y!y^Xr2TWh%D#>NN5acv@KLAZ(Y z>fv|l3||q&5RbQ8_h}?EETZ?J^M;r~p$S_u#xA-VRADH-Q2qc|pkp|BG)PLe`;zHn zAE%uXr?^s7qwe2tz`_E+51a_rY@KxVoDI2~9;09uVbawNm1+DK+SN4sgAjCQR$>MnJBF#Q2umO51pPUqQa^kXqIQaR`IxN9{n2g z6`n&(y7!C+rrxQr%Kcp1Ktb#a-`IL@SU^f|hzG1vWr1xU+S(RT=i?%^b#<2~ocn+L zc(-DQ^MO_ayD`#Npr>=y z`F^KwWaN{ccFl@hkgKH4!v={KP za7O+pB#e62giVcw5 zCZmIc^n3OImGb=lZp*JL9@oSUjo48#*L(3bX>jK0 zk^O;)6KwRn3C4|0O&HkK6Cd1o!hwR~J0CuLh}~B);UuIDca<;3RT|Z>vrY`MTCX4V zQ;ua=PE+TEzFu2RO~ATc5P}HYPf)p%_l@55T0iV;z=S+RO@vq464WeXXbP?%P6oaF zQBF>nEB5jlco!GD0hE$VghzTK^9}}kXN!ReT_d){20i0(Tp1RIa_4w-xDama)al6S6Aul*C%0G!HNwW03VVrH==SX z@3`;%!Lmp?R|k$}MhBK3-9^zwr7WT@MN&sw*`;#~4hPj_WIooPTz-l%4{I}|5U`A5 zM4wnYtI~`mO@s5_k;FwOHlPOBS;vBZM8;%;jq*uKgKd)6YwlLtGtbQ3SZt7^1pB>H zHK3g47^*)j5*K(g00Mv!axv%tt@7$0o5FT!lmHLYb_T(7r4)%OSEY#gV`b~BlMrv@ zl)XOK=X2jOAPN2qpuSMKV{*!xf;p0c}4Kls&uY|mL@2FLHt}@Gyks8Yo|F~wc2%^@*S^)7AvYE_|zQfACW7{^U?k!=acX2s3`5M+2tVp1u7neq}p*?=u z?W266#6Dmw`8*p&7jPnFFnS z4EqP-nx3l8xjI$81J2Z@rY3M1`xqHZpn=9nGmmxQriQU^l#Z-uS4jEe@z2b!m$^@V z!Zro!(uDE_@b~4#MgORv-_NshQ$i=^b`O*ReS?E2;b-SA`Szak1w6mf(t422mhyJA z03V-Lo_Pr58R=@N=+wOyzWZV!x(&=ztkhRJ z3dXTov~eF|#1u;5u!Oz3MhNOc9y;`Z4G-Wfw}z)@b<5#pV}pTyOmUFQWl(THw}n+q z5rbYUL#%l< z<}MXjMX7UMLVgzHTDNXVoj+d#54Of9(k};TQzK7CM@4xoj~8My$LsDBG*^Z>1N!Xd zVxqqp<)um00}P5e7~a^}&JK}lB%b{sn1_mzn5PgeGz!9nsDoo>mrTEmT!`--wq>TT zH(+AH%k;06n={LA4;#}x$`Ill?M7XI zNESRB2$)tE2NMKnF7{gWb;%pQlis)B(WT)y$&nFl zEv@v)Q=8L!BxP48vp3Q^*lwIrsMfa3raRM=hbIIC2EEp=T~Y$W;Zg%%o3P~6R6l+C z6n!V69cPE%lV)iV;fnpGOz#NSeNn0qPUQkhbFd9sW29am%>Mr28s;Dx1L#t&+VYqk zz?j5{l#-N0YiZm0l89|sG_rb-Y(Z207T_d75aS$<$-vji2X?v^I=LhrWMqaZ|` z1Y2ds{{~c+FV9{=XH4S}DV={Kl=$=i7K$X|7zDy^^n)8xnc8>n zz!k>LcR>&fzg#L)d9FoD3RM#KZ=^AFVMa*`XcByh3p0HaLsW|>F%dkAw0%Ucvsup{ zYADb*v1$?2?8q6S?3z)Vk(hgSCk4aBnEb3;%* zbMbDg`#+F|m9|u((F&8`o}b@2Ma6Kr6z+=xh5Ge5?Q~Z2q6sPWt}a>ediOfbM2D1y zslIMw6D5@R5#dQ$>^b0%hP7?y0Q9jRKdyona$3e} zw7R;w{A&~xo(Q%JVqmMpi;jP7-$(MLWn^HtY6TgKpdoP1V{`uwwEl>>U)_&=l2#gw z9Qwb99bdsgf(?lp1l@w2*c2M;S$SmQ7^+NABr~d^uTiAx?h? z50vEP9e|g-c!9PW$(+Wc2-=tj&4Qj0>p#*YM1Q5f6O(rxEQwSXcZTI6{{ql#=jAq!d?PMC3vF4hM44 zbMF`rP{cNHq?sw5pJH%kWi0v;LwEe`%$@fgRE85fuO1rUy|Bl8+Mb#;&Qp5sLdO8% zFOnQmQ&i)arkOx;0Aoo{9Ezw0TpWZt&BfJq=d+v8Q!FD?sxCpI42v+-LPXTK17V4} z7cb)W!ygPEb^!tmE*DEC9>aEtC5q_sRQ-aU9Xk*Gu3ceqaVIbp;8{X<#%~Lv>~DDY zkC@0m9l4SUG5-r;o<+5;E-nbGNhv9bT^!>Glf$MTRR|A&_=yuy^@eE25gF&8s91+? zfLNY~f95!T{5YC8adB}T9$TVGq~+NcVc-7?u8}kOA8-x67wM_e98o?~7ma>^*kbE2 zva;e5EtCv>UtOJ9P$10C?(2Fuq8fR}YtzAAL$TW>vo&wsvr=IV7IMCUgo_RX^0x1&;_)j&`Yc7v%YyUTaD^hzR2!^3#r`;-bce(#htS4LyDUUNe7nd7mV`~Wr5?>~>^lxYi* z0FDl}-1qH<@7t5K{?yuUuoKs=4}Aa5tbTVCau^5*5QWC7&;$|~zjvSM^OuVPT!!E~ z00Pf-u#pL4;T~ATZN!=vH3*F-YVNV4fV4)qL81Xb3C&VSS4UW$hPpa$F>>MgJCM}b zg-qS7XoG?&CkJH1z_28!fIdar6rnO_{g68L&sEZY^;1( z>KvP`%h&`EOxA`8|m>Po44x|9~j1rI(rY zjTr63J*~Lt+NkEQ;~FNNU~T$wS-s0LlaaW=E8M%$H%&NZ>FYXx$I_X z$yscQrVnMe(Va+Vo*~cinyWsM`k0sn}O8(=5v?0I}$E z<IgOP-5Nx+`Z#o{{|MWh6{x46LgrXUiab3J4-Z5|P;emH8zTEaG9@PFC`qXrsy(UO zF26+C%<#6b`}!5^I4B2?9yzjH@3j^h8CmIZp~H&mdhI9{K*TXaN>2=XTq+*P%>!tW zlhasR8^ql^GQzNP=V=@1G~q1O+LeY^01e?9gnZNNc&0K(WmSvyaX$LOTqYBCUROWY zd1|RbbX20$QHiDD$F%!AJ2qOYla??5d*1IbPe#u@p1I7fepH$20z8 z?fg3u5U6|9YhlU|sB2UNB%R^a{UziE6N9#MwjCT{pHQ}cZEijvBU}s23*Lj4mWWOk zwH?c|ibS5wG>}puZT9ESSn%y|!oer$yrtUt{T?5>Z zLZjT&xjKq23JMd)e#|dL%52|5T}B^K zM{?2@gV%!bSfa`SvtTOs*sb$z76s`!q0i@0Yd$q8=+ynBE} zlarAVMeYrW<%qrf;>DB-5R8~f1KKjmO9!(EgVu#!qI208YX`b)zoazek`aqqa1BJg zE3cs>?3fj2p_PI0dy+3jBovrq^bUGNqb}gBIpN% z2{G%(`N`+q@p9UgRejro5AiGhS|RNZuW4;vs1@mf2X{XZT*wZ-#9EmP$)m^u6EHb8 zCJx1V(CHl1yV$dkKwWDi3VzvEmakf(OEv4>eXJIi6iTLdC=l;gLp3{*Vm~rsXTvPW zuD;js8)@=^hbMyGUg-=8bmkKLdcg7Kp}x=#s>Bu_-C?`PQL5DA#M|w4E&eirP`?|6 z+6pAFim}I3R8^55Ra2_0a1Qeug9*#j@`^PIYphftDR72hm>leCu~78@(}SoAZCTdE z7dMN{oBmyoQ*jnL8t85i@rXziq^AFZ6$5^7-h?}@{qjHU6FAQ}KV0e%4!EN$pl|E%t67knMa6GapMEFy_x z78H8D_jF5)e=qJ_%n6-$NK4rUOh)hVrCYRKpazCp;c(wYfIZ8-J+Z=bU;l6OL3AX z``&AEDZ~Kz?AJ>fc+wFOEl@I5IrCEYoI$(>Aa4-&Y28ErCY0$P9j)em4r~B*Hj-W1 zzI+LD6H7ztA+lH4nqge){yLA?U6V>GXhZt@fs=l8qv4XIw1~!8a6C~bq2Cv0VM#*# zUMV?VeD5*4M|g2mlOTI4zuOysdxEM;@_YJE_4BbKQspr^GpvRKRo~v;8mx&b&x#t4 zz;YBT*=bq(g|sV4*7PGbTy(ajOCy>5QDZ?O-RERwzn7BHIUgg<_m|E8w3_!)MCr%Z zgMu$yX*e9I_^jjprcn~x5#oE%oVeQ-4ANb7DEYHsQGJT97^oDZzNZ_s>En+RZ>c3! zZO^5(^y&JG))X-{b1J@jN&dSqPHTm{4z+Df2g}eFo13?NZ%DABQW|pGPWcyuzu zoUrt+GxY2G_dc#sVPQg$_G6P85qlP{@>}%tt}}hYVlqXbEBZ>;rk0%hM;elsq|OGN ztRFJjIK}wxPy=FE+z~T{9O)7GvBAQGMMV{1YJt`q7UO83*u=i?>K4Kyo|nYLCvp9o zH*W&c!Lz%lqQV?ng-3}#`WF+e`JEdyJBl_E8t92F@AimO5N~*&ev4lC+n-(-4eb9n z{mt*5_fOON`?tR-fAc*=0)PDqmI+#EBm)rDSzCTGu}KJ@D|M68;{4qKs|8+IF0q&% z^RMstd+QrxKE2Z`K3FJ7o${YP$O1_4`U;w?bkrf&BgJF?3-iI-q}1_B|HYA0dwgtUcutZmXQVTFx?Ou2 z;){BA_e~U2j_LY0IU=er5qWT!6fVAUJe)iI?~P+|HsaM`%7Lbio?H8|o-4pCAY{n7 zt+>Y&^Wed|i4UtAeYblTUJBzs9|&3+O(v>h0JdOTYW=m+BmOnIJS{30~ zAOxryD|I53MWt2#y?ebL_d`rtMI90PptF&gjw3I$R8$iA5=x}r=mcxhoHBQQ2D$-@ z<~2-Uq;~*ouBn)Oz5EPYyIjfxS1oOAOXPIL&`EZ?+`1ba?Cj+9gyR#uw;|a4AwXmvj#kw@PoRam=I{M`XLmZQ<{@LB<3e@r zTPNFYInxpu4Wsv@*Z@)4VSf)XR*uSp>GZ0jqe(aM^l(JAAtf^^0%Z?ffpKb zUL^IgZ01qFm^K5p6(L199s}hiq^Mb!iVH+HO+#^sCsvanApuWYUER?G2Tr-4EOHs$ znQ%U_OJiYi(PO5H9R+}Xj!6~rzrfub4j|^irl(`*8h!#;jvVz(LN z+uC~3S|*&A(TG%m5M(&Zre=KS_BMEko@wQ>L5VB7j9t8~deA=$L;L_i_RMMZ>twfz zfv%wkg6;{0$_^wv0JX>JYo#;d|E2YCh(Lnf+&8A%|3=tr8&h=3jzW)t@){>tU-mc> zCfC-a{#(SHTG2_(fFPfS56RIaF5e8F?~qRNq2smxab~s*Jvr$v<4a(5QD@xi#jL1t zf}ps7P{=!r;Ld+|OEmByfwLF|ViU~}X~B!5Q00Zp1yW zAtFG|5KxKo(QsmeHbj8ItT;RS$GW3ntrcCpOwZee%2Wf=tRNp6Bm=l&~%`*MpnWyY=}FW=_AP3ROxZ zdlTN`bYAFkWFetR7fqYUI6AgILZnsht(1RI!#W{iYb&Ck7rPiDqR)Ng2odr{T4PYq`tf~Xa)%U} ztTuoH=q`n41EgXrH%P7vi_z!Ia6Fx1Jfuu;#twX}(Mg1cQ%+6}+HkBEC__MvGqXw> z{=%7V)fzTY)w*9~&km_08wDd5j|;m7SZj#mvR(-5mHhHkdQ!>zG7fODX*TiP-G4QP z++0d|>{DVv@jyN^#QNkr$1lHckFs}>Zq(Z+aa05c(%e1a=UCA{KjOff4CvICjAJo- zU0}B37sZupTVdm`sjQ3?x}u4u3x*0L9H1*iJAIyw7@v-CYUV;{<1y{|h*VQcnb$g^ zii2F?XxS0s=FgMR5p`zu;7XGKGO4uQiHQk(UU*)x z%{$uL4+Ec>yysKmPo|2GyOSX`Q`0zuuUvAA`bwzoRR;Z1X z2mc2*M%qKG0VFdK4s7+@MDd0P!rZE=bO7_9cGTBbtp)5Q-n6y1!>b$~5i!58S6T&) zB3p|AAXBW)YmY;VRBC|}as;4X+B8d|9y#7w{7rE1mhr6d0OD@`PEP_X$yYaI69pfN z2{#rF&4^&C+P2$2pge(F{V<$;~z#_Y3W}92>IV@*5^aM9I zy6MjfL**LYFhYU8;E_6~Gc;Z{oyP)_z=TFbMWxSd`Zlni2@jjaa0A7g`r6uYU`+rH z@Rl)jxpj)LC;!8Q07x4|7L=5LfYA*?F@Uw9#f2{yyb*${4GauW<%5a&uLj}>*}pXq zbsZDA!BO&TQ29nN9d}HFX#j8tM0{51@2svO#tx{puBz$`1mG~Hy%de(nJ)9>NfmI7Z4Pf@L+qYwr$0>6Y z^Hz}h*>n_S;kaAu7?#rl`a@%h{M*n=HZyO%M%45p6(cGZ`TW3Q8wI-{PT(s#BnV1+ zSGqbU8}W8>Rbj_ly0_t!?cIJlYqQ~nz2e^VlnPDwbeK!TP$p-tEEycN0))3B=E4So zIQz(sJwi+09&Wiqj@6y8+vlI^e3jJ!DO{4Um1smG+~P%0HGB}zf&dsF5+k0SC=8~qZ%bw<-|4qZ{O^Rh<(Dm`k4y}Sk>b+cW;ZlDpPV;cy0`IE0@m1D zXUoLTEe?A9WFl&e-{d}Ww+rz!ef~O`(7?{+{r1t};u;&SlSzLRz45mzlCr}tbrZF` zOFmn8cMG9b) z9;yOIT=$8m+~ZyJx?Fo&-eP(Kbu<}I>|oKsV^8C|35OWZGcLB9e^faNoU3F@Yu_l{ zDO_!K{lrFsOFS0Q1B$iVlVg@2-YP$A;U?FvCptuvy!VBA?RM)-QTGK>g{Dq!U}LgM z_2!=5JY}8Jt<(Es^n>;6B+~K?WZt{4xh2ki)jpB3*sx8!K2YzdM^Ln!XS~9z`2I)g znwncle0}cNEUft+gpjh3f^rXmz>jBeCS)M{3AbLdbt*rPg_wT(4_wu4k@-=rqqThLT+~TFz`bmW*J=^oh>_0>+HM4<0 zO1$^yuZl@uoxFRs(u`JGHe>xr`WpNUpWf;mny))I5ew65i+;k?m&EM02tfs`*6&;9 z6UM?bmNiDddi3$StM{DTH28Y`w8b!YKoX?OZu28vYwr8hE`Lr+ITD_&njYoW)m|@Q zR(#KXw8`yF&7R3ll#C(|UcRiC5eph_OP_aXw19essW3W-pljDAyE4~1nl8hpZV@BWy+CH4alxgpvT$O8Cej%P2fxy3iFcc? z;OChi>lRxb*V67+`+&n0dOo;XP3o7 z_6;=_UsxZut>-*^7^3IeZDH9gLW%;`0_9ff35_gQj&N~7o4 z@u4^B!l3ad81{lvH6u#vxL=+u)yJCmJH=$J2*WZ6wqQrWIB zhfwL~oql1RekmLQ6UUSngBQ=PZ-4So>HP&^hp#^qJmu1#c~+Lx z)SbMb<=W%+$)w;-hQp0TkF+OsMqZ#L60@}?s_w? zZYpZ7=J#N%2472f)wxZwrN%pISadKp=2pP0zJ$E@**k{4vSr{=P5kx;X+ z2$O7irYPZYb#*Bphq1NM>oXd3Tbi3M7_HwJSLyJ4=#{F>A#6qZfMi`AQ^ znVI*K{i-W>aQ~6GiB@`b=8ED_1(i*#BscXBvuVv@iM7D`0^3!UwM$Y`+?jzy%L{W^W@$bX|vXo zTxDf(JEPM4D*x?X$*&1@$9}zCaa~)x0_~R2*XL$RH4*xZcRLw9XVhoV-K~jU)3&ze zHq@M=j=p@{?2fZsV2#uz>#jS&Cy9r6Mv6bx-gQ63{%qzAP#3V;SBtHa=eGFM$f5`s zM@o9(u6I8hIHh%s>R3mHSrR%c)#N!Y_zcVKKG3}&|HMVM#9EI=es*6>8(kci~5Wd{=M8S|o zZ~ie{`1H#GGXVf71#G3I$2;@I+P_?*kXD(SbJ95(M6n~-eSKAwRvOm+EhO3FU8y3{ zDw!<{JX$M>6_?DT*G$yF0Wc*x1LM@xjN=G+P-Q|ZZC{o^YpKHFd9>TICHq2_f_pb< za`|2i2Y~mtww6YR{h9^K9CmGPa0~h1{)L%u=m=r9o|*A%d&zeu)BP&VE*cv8ooiJK z(-Y9IkGH2heQMQGccQK?`P$xNVV_nvX`<<;fZd+V1-xPAXyJ^^Wl^bu)^JU?F*i7mJVYMW4g>$(~hO zMV8%j#?>KUA?ol+Y0metvK#?FUN^g3J$Rm5@>%m2{fA1-g@>zBDG|bgZAz&M zV*VM*EK#Bk6)pNqo|C1-B^UTu|5S)n=SJLqi_}K1#r~EDjg9i_rRw_n^;Wj1FNZ4b zBd#5$h}k%2vz^h;3kzpszwr%kPmm2o8_mYQ|9lZd27vA)D!$zA;%{&B*E$s*ae)X; zc6V;6sPKw|4)oBx!^P}wuS;5HreD(WplgnHeu-9|ByHAVeV;95%@yQ&@ME@KuJUah z-&}V&j#y#im#%r&^8-;eywxN`1I8-v zGpf%+CK_TU<|vD$El%9fIo0NI@9_e;?02^7era2FORF?>&%t+)3mvVkUN;YTKCiDZ{8;ecub|LzwWHtT=v8{UB4^3w%*Nein)&u2vrp_D z&u9(}2-~cY1O^1kkBrcQoN{0qjlMQ#Rhrc8QL?u<8BN@mwgC!Vff!F=Zc7~r=lqy8X`@l~&v@X6QguI|Cb zr$t>dRX#^N@V(8F8CGSoFTS^IZDb0=H(vD0@%gL=4;p8STuCS=^z+Q$Vya)ew!Ypk zg|PUK%zH(AHn)8Ja)?p<{e@|LFve)&z7Gjf#{;qx9+M=%JS1mC3U3XB$>*(xtAa|Hcjii+}HI4Uxo{6k@=&Q0rG+j@U zO{P)S^@nkB0`h_(O_~-=SVuRtdQ(r?JRY>V6GV%bd zPtDtE1lf1Mu-;rC3Dsj&XwNZEaoN=+vzgyJ%8z>1&WPHCDaoQnr&rrPWWVTT8C8)P zDn>}w?b{#H)hw*OC)7XiOx#Xr*k*u|xpGLv%e2sWC}Mpux#TgY(#*FD6LjsJHzxSY zhvo^>LiN!?y_wmRJumGYMw&&6IA~3-Nnwq*+v0LX=pPQr`ODI0<68gEErV~gBsf)jjF+#yL4@T+{rlmQO!1h(lj({ z+A8n}_8&P(p_@DLe)=)4pOaGu3FobaRekCu7EgM~$>Um156-c&D?NEpNOJJN`)tWf zOQC@vsxr-8414wjU1JK3oC+Jgcp)H3&&~Rb;rIO_wsb-J#?v~ec-?Tyta+*N(Sf8`n(d;*(6Y)uJdoO>Y7seW%s&eSbb zD)zcz{~P7u!z5MXw6A7IjX3vc}!|a8Z9kn$zl#HEaHsdlKg)+#QG+3P3 zv8uU6nN~wrH^*5CQIh)SQW~+9F~u>i?*9)$`q){@9&MM9I3U;@`$W1RZQQ+~z!N{jop5$3YuiiD zRWQLPl9CFFii<6t8n(@(sHUr69fx9_S&GDKxyuj_Fd)gr49jO*(Up(wkG}b5D>3jp zPPOOXAgAYIs|g6Ny}J;yz2|2(o^21R{9Lo(xMHWfdwSpL+|~W=*K)SxXQO;_90{MZ zu`09Ri9Cg!@_kVzGC!TdB5GqX0aY!ejZa8U2Z~+`thseuvIm41#*&mox6ATeTw?hh ztKjyz`t+vALTK~rR$q`|0X*7vZ`1?5t~4IyAj$=n{4dv|e&@wnJj~=?UOU8=}AMg*E4sS55MW zjT~ov0GE=pXWT@^Y>Q^R5(?nO$rSn1r{SAD4mF~$^-ABb7LDvn?(xLSp_TX6BmTIQ z`lVI7Wiu5BW*}+57Z&#Av8*1dx56teiaqxJzmh)gc;vjGsV3gHjqph5w_ceD15j-I zUqUv&F@*mY0_EQq`hO6=@aGNvH^(>eum4p>O>{6%Il_PXIDJ^w*f?1={jr61&v)Xt zi954W`vb##(cD_u`Z&nn|8@BWmw@MlJDT$8>R%6A9*#~roZ|D~T#9Nyl6k-bW%T_V z0hcHo5{OSB&nRR6jkPuNGoJ-l9}oMhr@MD5_q;BR3fXy-_V!mYfxX(P>`MD2uK&EB zblBgA|G{oq)|#SA?@o+1(Q20A=M9u`NjnMh)zuFK*vRg(o)wfoM2YG>`D_M3B-%?*zp zaiqkv;3cQ_8kk#KT3(4tSmuvZTP&B^vH!%=XK?3QSv6mAB>r4Ik&uL<(rKsxJH$P~ z!B@u)9<;Dl$kOtS__=rAsp<#f8Lp2ecN4U0075dvH_H!|eJ!n7?=E$&Z+_qWDZ{~+ zk|!!M@3ZsW-q#VL7Kpdl&|S*R@@THgpjnPFNKv)0GHQHg?dIXTwZVw^ zaWtZ%A5z!VK0}gGbH(HBzwbSPVKv!}hsdnT1h-~BIz)ZY)Hu{Ld84`3MS@gj(&L!O zGMD%6t2(pK+dpOGzP?2~D#V5F;@0J8oR&T5Eha+z zKz>b$^EQBdc}Q3oVVC%_mBD}*Dg@G$hHGl;bd4IoIYoNBK-UauyE@STfZ{7W)#D@_t-s&!LdB!)!Z~2&zk_V>oRS0nzU&%ZrcwV?r z^=o+ki4%jR97j^#v6UEGE0rbe{pt|!5TB}G5#J+P@4D~f$P<0$Gxqi`5JL(JGpj67 z=eI+qA@Syho!*A$KpPMUu547Kq|6zalgk_Fz>b{PDC9b>&U;`ZFNHsOIQXl2A4%rS zFRz5JX>o-sbL6QW{`0T+i1$6BpWrX^)2oeMbOy^7cz4PW?x^sYL(9>(C$uV0cvn>I zk!Lir7q(TL`Nuzei~k&UlW(Utad;87+#pckm%c)X_`tYZ6>hBDwAtX>6EH$x%1{z= z>s#TRcDSK|>u62;K(L0)s7jLk?$2w)X{vHl)^QoT3s%A%g*~35(=It(R0moPx7iTx zOX0i|u4=>{V((aAZ-WI83Fe4Q18Zaw6{vtQ;0fBInw+O(3YtCh=($$oVAEpJQxi#Q zl%0<(+Ht-WB1a(mzhG+Ut<3Rw^t!x!VEOlpL0d5%I#rNi0R4i5xcCauT~y3{YT^ea zuN}^^2{mJzF4&$2RLNJU+vzd#ynz4aE!2(NL3Hbfu8GKZ-Bi8jWhq#r2}dU8FU zkVqp5gZcgUa^FiwTOf2h>T?WHVK`-tclXnbjOznY#0=zci+XGFb?B^Y3ehI^&`F+Q z2_bsXiU#A|Mm&C*<`W2HJBV6<^i&@zn?kp%S7-3iYL3+-LQiJD$4}@IQ}r-We?ry- zn;IZ23rIqVK{^r=`dV5=xVhjDHI|OyI2mn_svXEff>c#q1A)c0P7dC>X9!zucJJMb zG&@z=6p%O2#P9Kjh+=tZ37T!3lRXCq`HtUb=B4fz;^j4XaS^AZCD<20=?_pATspW< zBukSq-+@Z+>{*y%lr=Q^=aK!ejB}0D_{7TNwu!~nfj!!M>n)Nw6YAMzAGC}rY&FPk zDF)6`e7*X!xg!=}5dPo_JR&2R&@lje%&J4J8 zO5bE8>10K3?c2VQ_ke0|0#P~2d$oUZmf}q3tPD#K`TWzws{a|BH?2te8Rv9oWYiC$TtQN!Edn25cSwdzvGQQB_{vmyx)chd z*UJ;dkbmo|Xs&rVLKbCrOjk!Iru~QGain2PCO)t3$LNvU`VD4(MFj;|$W=5nio5hK zUE=m}8H{sQCGmuVuv&y`l?ms*z_OpcpogQPG}SdUn2y;QEW*Aj0D<)vAPYsSM$-l`0GsTLhaj*t)@J&aQ?!IMMez~ zGvY7=bas|tPqZrBQmL}p;FNhZ1d2t7!50?V^6+CX(j~^n#?G@+<5V~(8Sn*SAG*?X zLT6JG&OHH`2RHNuM&U8LV^1|lZC-CeS{ZySPj&7*}Otf?79Z~y{L?ww5r znOwCIDH!J@bRepjNl)xE7=yn0XQ^kIgb;lTY@tvXP0W;|S`qz@@Ms1`Mw}Q973Rio z1sAuHQJqZSp$i=EEXuX4!ufuCg3hjbt`q&jRqP1}X~9`DuHx}Ott|MXVinC`YX*mT zQa~WreOC?_`U^LVacIim0m9!S(xMv$`3c%^)~aDgBHCIt=!=*poY{z0Y*Mh%0>}kU zC51r`PYT|Cd;rBBHy9l8EZDDrIxkWS#RENBjJ$pR)sw3~o7!y1?>D{NMB&$GKG+x6 z_!u&4Sj`aJ2^qVyqa%U?eagQ>*;@kT<(`kY&koR=;SdEVXLBxcRX5{MJhti?u-c(V z_TpA|S!^5HMULl64EJ^=xv26GtKG;e8{rsRH%{3HSayja6Cid^{%nwf#05E!E|!y+ zyT^EWsYo~D&?|kn@%%nfmI{2vl9xcJdGel=hOVrvf18z}e&_UhYKA2jUEmp(9IlvM(gHCTj^Cu* zMd3%FkoxfvIcI%)VrmOszT^;8IH$_H8#A#fPeZ(nt2!VlQi1J6i1MMT%eh&Oo0&Lw zQ*GFN=lvFW%oDSxnpXrF!c4T91ap%jFZ`ODRH%AepJSD;Eii{I;OE@j6YED(TQ(UD zNl*mt$1yAS^&t?tCfj%@{hW&C>Yhtl;eoW$l{xqOAr&?oQ&1{%OfoR&+;E3^_Bm~LePBdekDp2jcIs!Zr48*kSU%y&~uJu>8IfhqVn`iEP7n)0;l-!M1WlAYxqD zZ7JDg+lJj0@8}usB+>4&SPHrl{)$S|&4OiLnM+l|xD!f+zHqP99&&n*SI^qUQqn`} zUp=dq7Uw6E3Zav{VO6-{q7a`Doz7i3)uqrkMso>XH35q^wrdDqNq6lR>cNk1JI6)0 z{Wjg@%c(T}?>FsGf9#y(c!`!iTOjIuo6W)JmZWcZqwUO3(@V<5yjG@WVWcFv)$&Y# zN2aBC^*DxN<)Hv0OdrTuG&2>H_O3h~l|1+Ea=uxi>zff4Lb*ANLl;RoI<5-0q!=W3fn|Wc6tftToDi;Atqn*hhC*>w7Bm-Qh>`>^Po|MzhL_Ji8(nCFOBu zpa-wBHN0($oPyJ#Gn~xTnwddvWxSjy8joT-XnvVt@#={s!)bavq);yT2dqb=F?4s) zjP83|x!_s;?K~Te!#r_ze%oV!{}WCn9)M~BU;jE;iGTLKdFoG+AnoRjnD99D@c_0+ s;&1+{9SIzyn+=G6K6U!PU1E*ol;}}MZH5@45`rKrt$5~{q`}Sq14#@=u>b%7 literal 0 HcmV?d00001 diff --git a/frontend/__snapshots__/scenes-app-max-ai--thread--dark.png b/frontend/__snapshots__/scenes-app-max-ai--thread--dark.png index d0f525ffb382c499ca75b8f079466ff7525d1639..80aded4c7943361827c7931249acb992b26048cb 100644 GIT binary patch literal 68501 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¨2%m2rlbmp62fGa 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 literal 65533 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 diff --git a/frontend/__snapshots__/scenes-app-max-ai--thread--light.png b/frontend/__snapshots__/scenes-app-max-ai--thread--light.png index f8d64397cb918cf12553fdca4771f520ed96b987..22c88333171fdef1d0e0807d4096ffce1adc38d1 100644 GIT binary patch literal 65884 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

q`~s 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 JbOqyE{{xEA9G(CG literal 63577 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

luZ*&FzityXwb+TQySV<#fEJUA?gw z(!Re&`_BKMa*(rk=V5nqQYgc&7ZLdyc>B=`1u(Vg29Hk&69DHxBzlsZ71eSSZi5p9 zJ4;sQl{i}ZjAIu=h?f*>jir50zEteNbfN1YkpYf{AkN;NrKP3uBQUZ4$;FBkRV~8X zB4NU`G&O7M>gqtKgCAGdCtO^162s%;3EmrXbAmeYxfODYTVG!{HhKfI09yv?CdlT{ zaT_E-k*3V2)&!{T=2in#*#Up8N|e4K&0-z07h5n@kV35XJhE3-MgYKq9s{6GT3Q

U@3s! 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 y`E4NfgZH_AY+nEWAO8OX@doqyzqt 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 literal 0 HcmV?d00001 diff --git a/frontend/__snapshots__/scenes-app-max-ai--thread-with-failed-generation--light.png b/frontend/__snapshots__/scenes-app-max-ai--thread-with-failed-generation--light.png new file mode 100644 index 0000000000000000000000000000000000000000..da0efa6c70d732c85004dbc02fbd7c3375fa723d GIT binary patch literal 16249 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 literal 0 HcmV?d00001 diff --git a/frontend/src/queries/schema.json b/frontend/src/queries/schema.json index 757097fa12025..5c28b52cf14e1 100644 --- a/frontend/src/queries/schema.json +++ b/frontend/src/queries/schema.json @@ -617,6 +617,24 @@ } ] }, + "AssistantEventType": { + "enum": ["status", "message"], + "type": "string" + }, + "AssistantGenerationStatusEvent": { + "additionalProperties": false, + "properties": { + "type": { + "$ref": "#/definitions/AssistantGenerationStatusType" + } + }, + "required": ["type"], + "type": "object" + }, + "AssistantGenerationStatusType": { + "enum": ["ack", "generation_error"], + "type": "string" + }, "AssistantMessage": { "additionalProperties": false, "properties": { @@ -632,7 +650,7 @@ "type": "object" }, "AssistantMessageType": { - "enum": ["human", "ai", "ai/viz"], + "enum": ["human", "ai", "ai/viz", "ai/failure"], "type": "string" }, "AutocompleteCompletionItem": { @@ -5534,6 +5552,20 @@ "required": ["kind", "series"], "type": "object" }, + "FailureMessage": { + "additionalProperties": false, + "properties": { + "content": { + "type": "string" + }, + "type": { + "const": "ai/failure", + "type": "string" + } + }, + "required": ["type"], + "type": "object" + }, "FeaturePropertyFilter": { "additionalProperties": false, "properties": { @@ -10875,6 +10907,9 @@ }, { "$ref": "#/definitions/HumanMessage" + }, + { + "$ref": "#/definitions/FailureMessage" } ] }, diff --git a/frontend/src/queries/schema.ts b/frontend/src/queries/schema.ts index 8fb58464d3ce4..993b393eb7fd3 100644 --- a/frontend/src/queries/schema.ts +++ b/frontend/src/queries/schema.ts @@ -2101,6 +2101,7 @@ export enum AssistantMessageType { Human = 'human', Assistant = 'ai', Visualization = 'ai/viz', + Failure = 'ai/failure', } export interface HumanMessage { @@ -2120,4 +2121,23 @@ export interface VisualizationMessage { answer?: ExperimentalAITrendsQuery } -export type RootAssistantMessage = VisualizationMessage | AssistantMessage | HumanMessage +export interface FailureMessage { + type: AssistantMessageType.Failure + content?: string +} + +export type RootAssistantMessage = VisualizationMessage | AssistantMessage | HumanMessage | FailureMessage + +export enum AssistantEventType { + Status = 'status', + Message = 'message', +} + +export enum AssistantGenerationStatusType { + Acknowledged = 'ack', + GenerationError = 'generation_error', +} + +export interface AssistantGenerationStatusEvent { + type: AssistantGenerationStatusType +} diff --git a/frontend/src/scenes/max/Max.stories.tsx b/frontend/src/scenes/max/Max.stories.tsx index 27045963c6e42..88ffe32ea7559 100644 --- a/frontend/src/scenes/max/Max.stories.tsx +++ b/frontend/src/scenes/max/Max.stories.tsx @@ -1,10 +1,10 @@ import { Meta, StoryFn } from '@storybook/react' -import { BindLogic, useActions } from 'kea' +import { BindLogic, useActions, useValues } from 'kea' import { useEffect } from 'react' import { mswDecorator, useStorybookMocks } from '~/mocks/browser' -import { chatResponseChunk } from './__mocks__/chatResponse.mocks' +import { chatResponseChunk, failureChunk, generationFailureChunk } from './__mocks__/chatResponse.mocks' import { MaxInstance } from './Max' import { maxLogic } from './maxLogic' @@ -104,3 +104,43 @@ EmptyThreadLoading.parameters = { waitForLoadersToDisappear: false, }, } + +export const GenerationFailureThread: StoryFn = () => { + useStorybookMocks({ + post: { + '/api/environments/:team_id/query/chat/': (_, res, ctx) => res(ctx.text(generationFailureChunk)), + }, + }) + + const sessionId = 'd210b263-8521-4c5b-b3c4-8e0348df574b' + + const { askMax, setMessageStatus } = useActions(maxLogic({ sessionId })) + const { thread, threadLoading } = useValues(maxLogic({ sessionId })) + useEffect(() => { + askMax('What are my most popular pages?') + }, []) + useEffect(() => { + if (thread.length === 2 && !threadLoading) { + setMessageStatus(1, 'error') + } + }, [thread.length, threadLoading]) + + return